From 240f7b5dc189a26525a0e8ab9a711995d1ebfebb Mon Sep 17 00:00:00 2001 From: Alexandre Bobkov Date: Sun, 29 Jun 2025 18:18:37 -0400 Subject: [PATCH] ESP-NOW RC Tutorial --- .../pygments-2.19.2.dist-info/METADATA | 58 + .../pygments-2.19.2.dist-info/RECORD | 344 ++ .../pygments-2.19.2.dist-info/WHEEL | 4 + .../entry_points.txt | 2 + .../licenses/AUTHORS | 291 + .../licenses/LICENSE | 25 + .../site-packages/pygments/__init__.py | 82 + .../site-packages/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3484 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 803 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26568 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2653 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3246 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4716 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38780 bytes .../site-packages/pygments/cmdline.py | 668 +++ .../site-packages/pygments/console.py | 70 + .../site-packages/pygments/filter.py | 70 + .../pygments/filters/__init__.py | 940 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37951 bytes .../site-packages/pygments/formatter.py | 129 + .../pygments/formatters/__init__.py | 157 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6937 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4235 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4228 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7328 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 41397 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 28709 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6049 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 20143 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6871 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2976 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 13808 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9135 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5801 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15141 bytes .../pygments/formatters/_mapping.py | 23 + .../pygments/formatters/bbcode.py | 108 + .../pygments/formatters/groff.py | 170 + .../site-packages/pygments/formatters/html.py | 995 +++ .../site-packages/pygments/formatters/img.py | 686 +++ .../site-packages/pygments/formatters/irc.py | 154 + .../pygments/formatters/latex.py | 518 ++ .../pygments/formatters/other.py | 160 + .../pygments/formatters/pangomarkup.py | 83 + .../site-packages/pygments/formatters/rtf.py | 349 ++ .../site-packages/pygments/formatters/svg.py | 185 + .../pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 ++ .../site-packages/pygments/lexer.py | 961 +++ .../site-packages/pygments/lexers/__init__.py | 362 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14707 bytes .../__pycache__/_ada_builtins.cpython-312.pyc | Bin 0 -> 1265 bytes .../__pycache__/_asy_builtins.cpython-312.pyc | Bin 0 -> 17658 bytes .../__pycache__/_cl_builtins.cpython-312.pyc | Bin 0 -> 11694 bytes .../_cocoa_builtins.cpython-312.pyc | Bin 0 -> 97598 bytes .../_csound_builtins.cpython-312.pyc | Bin 0 -> 16406 bytes .../__pycache__/_css_builtins.cpython-312.pyc | Bin 0 -> 9415 bytes .../_googlesql_builtins.cpython-312.pyc | Bin 0 -> 10853 bytes .../_julia_builtins.cpython-312.pyc | Bin 0 -> 8280 bytes .../_lasso_builtins.cpython-312.pyc | Bin 0 -> 76758 bytes .../_lilypond_builtins.cpython-312.pyc | Bin 0 -> 88436 bytes .../__pycache__/_lua_builtins.cpython-312.pyc | Bin 0 -> 8417 bytes .../_luau_builtins.cpython-312.pyc | Bin 0 -> 1079 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 66981 bytes .../__pycache__/_mql_builtins.cpython-312.pyc | Bin 0 -> 18039 bytes .../pygments/lexers/_ada_builtins.py | 103 + .../pygments/lexers/_asy_builtins.py | 1644 +++++ .../pygments/lexers/_cl_builtins.py | 231 + .../pygments/lexers/_cocoa_builtins.py | 75 + .../pygments/lexers/_csound_builtins.py | 1780 ++++++ .../pygments/lexers/_css_builtins.py | 558 ++ .../pygments/lexers/_googlesql_builtins.py | 918 +++ .../pygments/lexers/_julia_builtins.py | 411 ++ .../pygments/lexers/_lasso_builtins.py | 5326 +++++++++++++++++ .../pygments/lexers/_lilypond_builtins.py | 4932 +++++++++++++++ .../pygments/lexers/_lua_builtins.py | 285 + .../pygments/lexers/_luau_builtins.py | 62 + .../site-packages/pygments/lexers/_mapping.py | 602 ++ .../pygments/lexers/_mql_builtins.py | 1171 ++++ .../pygments/lexers/_mysql_builtins.py | 1335 +++++ .../pygments/lexers/_openedge_builtins.py | 2600 ++++++++ .../pygments/lexers/_php_builtins.py | 3325 ++++++++++ .../pygments/lexers/_postgres_builtins.py | 739 +++ .../pygments/lexers/_qlik_builtins.py | 666 +++ .../pygments/lexers/_scheme_builtins.py | 1609 +++++ .../pygments/lexers/_scilab_builtins.py | 3093 ++++++++++ .../pygments/lexers/_sourcemod_builtins.py | 1151 ++++ .../pygments/lexers/_sql_builtins.py | 106 + .../pygments/lexers/_stan_builtins.py | 648 ++ .../pygments/lexers/_stata_builtins.py | 457 ++ .../pygments/lexers/_tsql_builtins.py | 1003 ++++ .../pygments/lexers/_usd_builtins.py | 112 + .../pygments/lexers/_vbscript_builtins.py | 279 + .../pygments/lexers/_vim_builtins.py | 1938 ++++++ .../pygments/lexers/actionscript.py | 243 + .../site-packages/pygments/lexers/ada.py | 144 + .../site-packages/pygments/lexers/agile.py | 25 + .../site-packages/pygments/lexers/algebra.py | 299 + .../site-packages/pygments/lexers/ambient.py | 75 + .../site-packages/pygments/lexers/amdgpu.py | 54 + .../site-packages/pygments/lexers/ampl.py | 87 + .../site-packages/pygments/lexers/apdlexer.py | 593 ++ .../site-packages/pygments/lexers/apl.py | 103 + .../pygments/lexers/archetype.py | 315 + .../site-packages/pygments/lexers/arrow.py | 116 + .../site-packages/pygments/lexers/arturo.py | 249 + .../site-packages/pygments/lexers/asc.py | 55 + .../site-packages/pygments/lexers/asm.py | 1051 ++++ .../site-packages/pygments/lexers/asn1.py | 178 + .../pygments/lexers/automation.py | 379 ++ .../site-packages/pygments/lexers/bare.py | 101 + .../site-packages/pygments/lexers/basic.py | 656 ++ .../site-packages/pygments/lexers/bdd.py | 57 + .../site-packages/pygments/lexers/berry.py | 99 + .../site-packages/pygments/lexers/bibtex.py | 159 + .../pygments/lexers/blueprint.py | 173 + .../site-packages/pygments/lexers/boa.py | 97 + .../site-packages/pygments/lexers/bqn.py | 112 + .../site-packages/pygments/lexers/business.py | 625 ++ .../site-packages/pygments/lexers/c_cpp.py | 414 ++ .../site-packages/pygments/lexers/c_like.py | 738 +++ .../pygments/lexers/capnproto.py | 74 + .../site-packages/pygments/lexers/carbon.py | 95 + .../site-packages/pygments/lexers/cddl.py | 172 + .../site-packages/pygments/lexers/chapel.py | 139 + .../site-packages/pygments/lexers/clean.py | 180 + .../site-packages/pygments/lexers/codeql.py | 80 + .../site-packages/pygments/lexers/comal.py | 81 + .../site-packages/pygments/lexers/compiled.py | 35 + .../site-packages/pygments/lexers/configs.py | 1433 +++++ .../site-packages/pygments/lexers/console.py | 114 + .../site-packages/pygments/lexers/cplint.py | 43 + .../site-packages/pygments/lexers/crystal.py | 364 ++ .../site-packages/pygments/lexers/csound.py | 466 ++ .../site-packages/pygments/lexers/css.py | 602 ++ .../site-packages/pygments/lexers/d.py | 259 + .../site-packages/pygments/lexers/dalvik.py | 126 + .../site-packages/pygments/lexers/data.py | 763 +++ .../site-packages/pygments/lexers/dax.py | 135 + .../pygments/lexers/devicetree.py | 108 + .../site-packages/pygments/lexers/diff.py | 169 + .../site-packages/pygments/lexers/dns.py | 109 + .../site-packages/pygments/lexers/dotnet.py | 873 +++ .../site-packages/pygments/lexers/dsls.py | 970 +++ .../site-packages/pygments/lexers/dylan.py | 279 + .../site-packages/pygments/lexers/ecl.py | 144 + .../site-packages/pygments/lexers/eiffel.py | 68 + .../site-packages/pygments/lexers/elm.py | 123 + .../site-packages/pygments/lexers/elpi.py | 175 + .../site-packages/pygments/lexers/email.py | 132 + .../site-packages/pygments/lexers/erlang.py | 526 ++ .../site-packages/pygments/lexers/esoteric.py | 300 + .../site-packages/pygments/lexers/ezhil.py | 76 + .../site-packages/pygments/lexers/factor.py | 363 ++ .../site-packages/pygments/lexers/fantom.py | 251 + .../site-packages/pygments/lexers/felix.py | 275 + .../site-packages/pygments/lexers/fift.py | 68 + .../pygments/lexers/floscript.py | 81 + .../site-packages/pygments/lexers/forth.py | 178 + .../site-packages/pygments/lexers/fortran.py | 212 + .../site-packages/pygments/lexers/foxpro.py | 427 ++ .../site-packages/pygments/lexers/freefem.py | 893 +++ .../site-packages/pygments/lexers/func.py | 110 + .../pygments/lexers/functional.py | 21 + .../site-packages/pygments/lexers/futhark.py | 105 + .../pygments/lexers/gcodelexer.py | 35 + .../site-packages/pygments/lexers/gdscript.py | 189 + .../site-packages/pygments/lexers/gleam.py | 74 + .../site-packages/pygments/lexers/go.py | 97 + .../pygments/lexers/grammar_notation.py | 262 + .../site-packages/pygments/lexers/graph.py | 108 + .../site-packages/pygments/lexers/graphics.py | 794 +++ .../site-packages/pygments/lexers/graphql.py | 176 + .../site-packages/pygments/lexers/graphviz.py | 58 + .../site-packages/pygments/lexers/gsql.py | 103 + .../site-packages/pygments/lexers/hare.py | 73 + .../site-packages/pygments/lexers/haskell.py | 866 +++ .../site-packages/pygments/lexers/haxe.py | 935 +++ .../site-packages/pygments/lexers/hdl.py | 466 ++ .../site-packages/pygments/lexers/hexdump.py | 102 + .../site-packages/pygments/lexers/html.py | 670 +++ .../site-packages/pygments/lexers/idl.py | 284 + .../site-packages/pygments/lexers/igor.py | 435 ++ .../site-packages/pygments/lexers/inferno.py | 95 + .../pygments/lexers/installers.py | 352 ++ .../pygments/lexers/int_fiction.py | 1370 +++++ .../site-packages/pygments/lexers/iolang.py | 61 + .../site-packages/pygments/lexers/j.py | 151 + .../pygments/lexers/javascript.py | 1591 +++++ .../site-packages/pygments/lexers/jmespath.py | 69 + .../site-packages/pygments/lexers/jslt.py | 94 + .../site-packages/pygments/lexers/json5.py | 83 + .../site-packages/pygments/lexers/jsonnet.py | 169 + .../site-packages/pygments/lexers/jsx.py | 100 + .../site-packages/pygments/lexers/julia.py | 294 + .../site-packages/pygments/lexers/jvm.py | 1802 ++++++ .../site-packages/pygments/lexers/kuin.py | 332 + .../site-packages/pygments/lexers/kusto.py | 93 + .../site-packages/pygments/lexers/ldap.py | 155 + .../site-packages/pygments/lexers/lean.py | 241 + .../site-packages/pygments/lexers/lilypond.py | 225 + .../site-packages/pygments/lexers/lisp.py | 3146 ++++++++++ .../pygments/lexers/macaulay2.py | 1814 ++++++ .../site-packages/pygments/lexers/make.py | 212 + .../site-packages/pygments/lexers/maple.py | 291 + .../site-packages/pygments/lexers/markup.py | 1654 +++++ .../site-packages/pygments/lexers/math.py | 21 + .../site-packages/pygments/lexers/matlab.py | 3307 ++++++++++ .../site-packages/pygments/lexers/maxima.py | 84 + .../site-packages/pygments/lexers/meson.py | 139 + .../site-packages/pygments/lexers/mime.py | 210 + .../pygments/lexers/minecraft.py | 391 ++ .../site-packages/pygments/lexers/mips.py | 130 + .../site-packages/pygments/lexers/ml.py | 958 +++ .../site-packages/pygments/lexers/modeling.py | 366 ++ .../site-packages/pygments/lexers/modula2.py | 1579 +++++ .../site-packages/pygments/lexers/mojo.py | 707 +++ .../site-packages/pygments/lexers/monte.py | 203 + .../site-packages/pygments/lexers/mosel.py | 447 ++ .../site-packages/pygments/lexers/ncl.py | 894 +++ .../site-packages/pygments/lexers/nimrod.py | 199 + .../site-packages/pygments/lexers/nit.py | 63 + .../site-packages/pygments/lexers/nix.py | 144 + .../site-packages/pygments/lexers/numbair.py | 63 + .../site-packages/pygments/lexers/oberon.py | 120 + .../pygments/lexers/objective.py | 513 ++ .../site-packages/pygments/lexers/ooc.py | 84 + .../site-packages/pygments/lexers/openscad.py | 96 + .../site-packages/pygments/lexers/other.py | 41 + .../site-packages/pygments/lexers/parasail.py | 78 + .../site-packages/pygments/lexers/parsers.py | 798 +++ .../site-packages/pygments/lexers/pascal.py | 644 ++ .../site-packages/pygments/lexers/pawn.py | 202 + .../site-packages/pygments/lexers/pddl.py | 82 + .../site-packages/pygments/lexers/perl.py | 733 +++ .../site-packages/pygments/lexers/phix.py | 363 ++ .../site-packages/pygments/lexers/php.py | 334 ++ .../pygments/lexers/pointless.py | 70 + .../site-packages/pygments/lexers/pony.py | 93 + .../site-packages/pygments/lexers/praat.py | 303 + .../site-packages/pygments/lexers/procfile.py | 41 + .../site-packages/pygments/lexers/prolog.py | 318 + .../site-packages/pygments/lexers/promql.py | 176 + .../site-packages/pygments/lexers/prql.py | 251 + .../site-packages/pygments/lexers/ptx.py | 119 + .../site-packages/pygments/lexers/python.py | 1201 ++++ .../site-packages/pygments/lexers/q.py | 187 + .../site-packages/pygments/lexers/qlik.py | 117 + .../site-packages/pygments/lexers/qvt.py | 153 + .../site-packages/pygments/lexers/r.py | 196 + .../site-packages/pygments/lexers/rdf.py | 468 ++ .../site-packages/pygments/lexers/rebol.py | 419 ++ .../site-packages/pygments/lexers/rego.py | 57 + .../site-packages/pygments/lexers/resource.py | 83 + .../site-packages/pygments/lexers/ride.py | 138 + .../site-packages/pygments/lexers/rita.py | 42 + .../site-packages/pygments/lexers/rnc.py | 66 + .../site-packages/pygments/lexers/roboconf.py | 81 + .../pygments/lexers/robotframework.py | 551 ++ .../site-packages/pygments/lexers/ruby.py | 518 ++ .../site-packages/pygments/lexers/rust.py | 222 + .../site-packages/pygments/lexers/sas.py | 227 + .../site-packages/pygments/lexers/savi.py | 171 + .../site-packages/pygments/lexers/scdoc.py | 85 + .../pygments/lexers/scripting.py | 1616 +++++ .../site-packages/pygments/lexers/sgf.py | 59 + .../site-packages/pygments/lexers/shell.py | 902 +++ .../site-packages/pygments/lexers/sieve.py | 78 + .../site-packages/pygments/lexers/slash.py | 183 + .../pygments/lexers/smalltalk.py | 194 + .../site-packages/pygments/lexers/smithy.py | 77 + .../site-packages/pygments/lexers/smv.py | 78 + .../site-packages/pygments/lexers/snobol.py | 82 + .../site-packages/pygments/lexers/solidity.py | 87 + .../site-packages/pygments/lexers/soong.py | 78 + .../site-packages/pygments/lexers/sophia.py | 102 + .../site-packages/pygments/lexers/special.py | 122 + .../site-packages/pygments/lexers/spice.py | 70 + .../site-packages/pygments/lexers/sql.py | 1109 ++++ .../site-packages/pygments/lexers/srcinfo.py | 62 + .../site-packages/pygments/lexers/stata.py | 170 + .../pygments/lexers/supercollider.py | 94 + .../site-packages/pygments/lexers/tablegen.py | 177 + .../site-packages/pygments/lexers/tact.py | 303 + .../site-packages/pygments/lexers/tal.py | 77 + .../site-packages/pygments/lexers/tcl.py | 148 + .../site-packages/pygments/lexers/teal.py | 88 + .../pygments/lexers/templates.py | 2355 ++++++++ .../site-packages/pygments/lexers/teraterm.py | 325 + .../site-packages/pygments/lexers/testing.py | 209 + .../site-packages/pygments/lexers/text.py | 27 + .../site-packages/pygments/lexers/textedit.py | 205 + .../site-packages/pygments/lexers/textfmts.py | 436 ++ .../site-packages/pygments/lexers/theorem.py | 410 ++ .../site-packages/pygments/lexers/thingsdb.py | 140 + .../site-packages/pygments/lexers/tlb.py | 59 + .../site-packages/pygments/lexers/tls.py | 54 + .../site-packages/pygments/lexers/tnt.py | 270 + .../pygments/lexers/trafficscript.py | 51 + .../pygments/lexers/typoscript.py | 216 + .../site-packages/pygments/lexers/typst.py | 160 + .../site-packages/pygments/lexers/ul4.py | 309 + .../site-packages/pygments/lexers/unicon.py | 413 ++ .../site-packages/pygments/lexers/urbi.py | 145 + .../site-packages/pygments/lexers/usd.py | 85 + .../site-packages/pygments/lexers/varnish.py | 189 + .../pygments/lexers/verification.py | 113 + .../site-packages/pygments/lexers/verifpal.py | 65 + .../site-packages/pygments/lexers/vip.py | 150 + .../site-packages/pygments/lexers/vyper.py | 140 + .../site-packages/pygments/lexers/web.py | 24 + .../pygments/lexers/webassembly.py | 119 + .../site-packages/pygments/lexers/webidl.py | 298 + .../site-packages/pygments/lexers/webmisc.py | 1006 ++++ .../site-packages/pygments/lexers/wgsl.py | 406 ++ .../site-packages/pygments/lexers/whiley.py | 115 + .../site-packages/pygments/lexers/wowtoc.py | 120 + .../site-packages/pygments/lexers/wren.py | 98 + .../site-packages/pygments/lexers/x10.py | 66 + .../site-packages/pygments/lexers/xorg.py | 38 + .../site-packages/pygments/lexers/yang.py | 103 + .../site-packages/pygments/lexers/yara.py | 69 + .../site-packages/pygments/lexers/zig.py | 125 + .../site-packages/pygments/modeline.py | 43 + .../site-packages/pygments/plugin.py | 72 + .../site-packages/pygments/regexopt.py | 91 + .../site-packages/pygments/scanner.py | 104 + .../site-packages/pygments/sphinxext.py | 247 + .../site-packages/pygments/style.py | 203 + .../site-packages/pygments/styles/__init__.py | 61 + .../site-packages/pygments/styles/_mapping.py | 54 + .../site-packages/pygments/styles/abap.py | 32 + .../site-packages/pygments/styles/algol.py | 65 + .../site-packages/pygments/styles/algol_nu.py | 65 + .../site-packages/pygments/styles/arduino.py | 100 + .../site-packages/pygments/styles/autumn.py | 67 + .../site-packages/pygments/styles/borland.py | 53 + .../site-packages/pygments/styles/bw.py | 52 + .../site-packages/pygments/styles/coffee.py | 80 + .../site-packages/pygments/styles/colorful.py | 83 + .../site-packages/pygments/styles/default.py | 76 + .../site-packages/pygments/styles/dracula.py | 90 + .../site-packages/pygments/styles/emacs.py | 75 + .../site-packages/pygments/styles/friendly.py | 76 + .../pygments/styles/friendly_grayscale.py | 80 + .../site-packages/pygments/styles/fruity.py | 47 + .../site-packages/pygments/styles/gh_dark.py | 113 + .../site-packages/pygments/styles/gruvbox.py | 118 + .../site-packages/pygments/styles/igor.py | 32 + .../site-packages/pygments/styles/inkpot.py | 72 + .../pygments/styles/lightbulb.py | 110 + .../site-packages/pygments/styles/lilypond.py | 62 + .../site-packages/pygments/styles/lovelace.py | 100 + .../site-packages/pygments/styles/manni.py | 79 + .../site-packages/pygments/styles/material.py | 124 + .../site-packages/pygments/styles/monokai.py | 112 + .../site-packages/pygments/styles/murphy.py | 82 + .../site-packages/pygments/styles/native.py | 70 + .../site-packages/pygments/styles/nord.py | 156 + .../site-packages/pygments/styles/onedark.py | 63 + .../pygments/styles/paraiso_dark.py | 124 + .../pygments/styles/paraiso_light.py | 124 + .../site-packages/pygments/styles/pastie.py | 78 + .../site-packages/pygments/styles/perldoc.py | 73 + .../pygments/styles/rainbow_dash.py | 95 + .../site-packages/pygments/styles/rrt.py | 40 + .../site-packages/pygments/styles/sas.py | 46 + .../pygments/styles/solarized.py | 144 + .../pygments/styles/staroffice.py | 31 + .../pygments/styles/stata_dark.py | 42 + .../pygments/styles/stata_light.py | 42 + .../site-packages/pygments/styles/tango.py | 143 + .../site-packages/pygments/styles/trac.py | 66 + .../site-packages/pygments/styles/vim.py | 67 + .../site-packages/pygments/styles/vs.py | 41 + .../site-packages/pygments/styles/xcode.py | 53 + .../site-packages/pygments/styles/zenburn.py | 83 + .../site-packages/pygments/token.py | 214 + .../site-packages/pygments/unistring.py | 153 + .../python3.12/site-packages/pygments/util.py | 324 + .../site-packages/roman_numerals/__init__.py | 265 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 10661 bytes .../site-packages/roman_numerals/py.typed | 0 .../INSTALLER | 1 + .../METADATA | 117 + .../roman_numerals_py-3.1.0.dist-info/RECORD | 8 + .../roman_numerals_py-3.1.0.dist-info/WHEEL | 4 + .../licenses/LICENCE.rst | 146 + .../snowballstemmer-3.0.1.dist-info/INSTALLER | 1 + .../snowballstemmer-3.0.1.dist-info/METADATA | 196 + .../snowballstemmer-3.0.1.dist-info/RECORD | 76 + .../snowballstemmer-3.0.1.dist-info/WHEEL | 5 + .../licenses/COPYING | 29 + .../top_level.txt | 1 + .../site-packages/snowballstemmer/__init__.py | 89 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3569 bytes .../__pycache__/among.cpython-312.pyc | Bin 0 -> 843 bytes .../arabic_stemmer.cpython-312.pyc | Bin 0 -> 46309 bytes .../armenian_stemmer.cpython-312.pyc | Bin 0 -> 15240 bytes .../__pycache__/basestemmer.cpython-312.pyc | Bin 0 -> 12127 bytes .../basque_stemmer.cpython-312.pyc | Bin 0 -> 30302 bytes .../catalan_stemmer.cpython-312.pyc | Bin 0 -> 36442 bytes .../danish_stemmer.cpython-312.pyc | Bin 0 -> 9345 bytes .../dutch_porter_stemmer.cpython-312.pyc | Bin 0 -> 18135 bytes .../__pycache__/dutch_stemmer.cpython-312.pyc | Bin 0 -> 49617 bytes .../english_stemmer.cpython-312.pyc | Bin 0 -> 28901 bytes .../esperanto_stemmer.cpython-312.pyc | Bin 0 -> 23598 bytes .../estonian_stemmer.cpython-312.pyc | Bin 0 -> 36820 bytes .../finnish_stemmer.cpython-312.pyc | Bin 0 -> 21059 bytes .../french_stemmer.cpython-312.pyc | Bin 0 -> 40002 bytes .../german_stemmer.cpython-312.pyc | Bin 0 -> 18051 bytes .../__pycache__/greek_stemmer.cpython-312.pyc | Bin 0 -> 94456 bytes .../__pycache__/hindi_stemmer.cpython-312.pyc | Bin 0 -> 9921 bytes .../hungarian_stemmer.cpython-312.pyc | Bin 0 -> 19133 bytes .../indonesian_stemmer.cpython-312.pyc | Bin 0 -> 12140 bytes .../__pycache__/irish_stemmer.cpython-312.pyc | Bin 0 -> 10156 bytes .../italian_stemmer.cpython-312.pyc | Bin 0 -> 29048 bytes .../lithuanian_stemmer.cpython-312.pyc | Bin 0 -> 21280 bytes .../nepali_stemmer.cpython-312.pyc | Bin 0 -> 11685 bytes .../norwegian_stemmer.cpython-312.pyc | Bin 0 -> 9509 bytes .../porter_stemmer.cpython-312.pyc | Bin 0 -> 19234 bytes .../portuguese_stemmer.cpython-312.pyc | Bin 0 -> 26870 bytes .../romanian_stemmer.cpython-312.pyc | Bin 0 -> 28233 bytes .../russian_stemmer.cpython-312.pyc | Bin 0 -> 19630 bytes .../serbian_stemmer.cpython-312.pyc | Bin 0 -> 160943 bytes .../spanish_stemmer.cpython-312.pyc | Bin 0 -> 28200 bytes .../swedish_stemmer.cpython-312.pyc | Bin 0 -> 10707 bytes .../__pycache__/tamil_stemmer.cpython-312.pyc | Bin 0 -> 35916 bytes .../turkish_stemmer.cpython-312.pyc | Bin 0 -> 74984 bytes .../yiddish_stemmer.cpython-312.pyc | Bin 0 -> 33710 bytes .../site-packages/snowballstemmer/among.py | 13 + .../snowballstemmer/arabic_stemmer.py | 1200 ++++ .../snowballstemmer/armenian_stemmer.py | 315 + .../snowballstemmer/basestemmer.py | 289 + .../snowballstemmer/basque_stemmer.py | 657 ++ .../snowballstemmer/catalan_stemmer.py | 779 +++ .../snowballstemmer/danish_stemmer.py | 223 + .../snowballstemmer/dutch_porter_stemmer.py | 466 ++ .../snowballstemmer/dutch_stemmer.py | 1342 +++++ .../snowballstemmer/english_stemmer.py | 762 +++ .../snowballstemmer/esperanto_stemmer.py | 588 ++ .../snowballstemmer/estonian_stemmer.py | 850 +++ .../snowballstemmer/finnish_stemmer.py | 549 ++ .../snowballstemmer/french_stemmer.py | 1029 ++++ .../snowballstemmer/german_stemmer.py | 472 ++ .../snowballstemmer/greek_stemmer.py | 2272 +++++++ .../snowballstemmer/hindi_stemmer.py | 174 + .../snowballstemmer/hungarian_stemmer.py | 495 ++ .../snowballstemmer/indonesian_stemmer.py | 316 + .../snowballstemmer/irish_stemmer.py | 271 + .../snowballstemmer/italian_stemmer.py | 715 +++ .../snowballstemmer/lithuanian_stemmer.py | 462 ++ .../snowballstemmer/nepali_stemmer.py | 248 + .../snowballstemmer/norwegian_stemmer.py | 236 + .../snowballstemmer/porter_stemmer.py | 499 ++ .../snowballstemmer/portuguese_stemmer.py | 650 ++ .../snowballstemmer/romanian_stemmer.py | 669 +++ .../snowballstemmer/russian_stemmer.py | 491 ++ .../snowballstemmer/serbian_stemmer.py | 3496 +++++++++++ .../snowballstemmer/spanish_stemmer.py | 703 +++ .../snowballstemmer/swedish_stemmer.py | 262 + .../snowballstemmer/tamil_stemmer.py | 935 +++ .../snowballstemmer/turkish_stemmer.py | 1837 ++++++ .../snowballstemmer/yiddish_stemmer.py | 854 +++ .../sphinxcontrib/applehelp/__init__.py | 276 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16186 bytes .../applehelp/locales/.tx/config | 10 + .../ar/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1881 bytes .../ar/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../bn/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1799 bytes .../bn/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../ca/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1799 bytes .../ca/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1761 bytes .../LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../cs/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1877 bytes .../cs/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../cy/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1842 bytes .../cy/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../da/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1798 bytes .../da/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../de/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1798 bytes .../de/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../el/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1797 bytes .../el/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../eo/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1801 bytes .../eo/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../es/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1825 bytes .../es/LC_MESSAGES/sphinxcontrib.applehelp.po | 92 + .../et/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1827 bytes .../et/LC_MESSAGES/sphinxcontrib.applehelp.po | 92 + .../eu/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1798 bytes .../eu/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../fa/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1798 bytes .../fa/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../fi/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1799 bytes .../fi/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../fr/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1910 bytes .../fr/LC_MESSAGES/sphinxcontrib.applehelp.po | 95 + .../he/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1892 bytes .../he/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../hi/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1797 bytes .../hi/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1811 bytes .../LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../hr/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1872 bytes .../hr/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../hu/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1801 bytes .../hu/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../id/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1856 bytes .../id/LC_MESSAGES/sphinxcontrib.applehelp.po | 100 + .../it/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1799 bytes .../it/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../ja/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1793 bytes .../ja/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../ko/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1992 bytes .../ko/LC_MESSAGES/sphinxcontrib.applehelp.po | 94 + .../lt/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1933 bytes .../lt/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../lv/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1834 bytes .../lv/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../mk/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1832 bytes .../mk/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1824 bytes .../LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../ne/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1798 bytes .../ne/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../nl/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1797 bytes .../nl/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../pl/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1966 bytes .../pl/LC_MESSAGES/sphinxcontrib.applehelp.po | 93 + .../pt/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1802 bytes .../pt/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1816 bytes .../LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1819 bytes .../LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../ro/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1841 bytes .../ro/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../ru/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1937 bytes .../ru/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../si/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1799 bytes .../si/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../sk/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1873 bytes .../sk/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../sl/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1853 bytes .../sl/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../locales/sphinxcontrib.applehelp.pot | 89 + .../sr/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1873 bytes .../sr/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1895 bytes .../LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../sv/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1799 bytes .../sv/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../ta/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1797 bytes .../ta/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../tr/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1798 bytes .../tr/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 2039 bytes .../LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../ur/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1796 bytes .../ur/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../vi/LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1795 bytes .../vi/LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1817 bytes .../LC_MESSAGES/sphinxcontrib.applehelp.po | 98 + .../LC_MESSAGES/sphinxcontrib.applehelp.mo | Bin 0 -> 1807 bytes .../LC_MESSAGES/sphinxcontrib.applehelp.po | 88 + .../sphinxcontrib/applehelp/py.typed | 0 .../applehelp/templates/_access.html_t | 12 + .../sphinxcontrib/devhelp/__init__.py | 143 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7361 bytes .../sphinxcontrib/devhelp/locales/.tx/config | 10 + .../ar/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 959 bytes .../ar/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../bn/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 877 bytes .../bn/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../ca/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 877 bytes .../ca/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../cs/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 955 bytes .../cs/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../cy/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 920 bytes .../cy/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../da/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 876 bytes .../da/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../de/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 876 bytes .../de/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../el/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 875 bytes .../el/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../eo/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 879 bytes .../eo/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../es/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 877 bytes .../es/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../et/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 885 bytes .../et/LC_MESSAGES/sphinxcontrib.devhelp.po | 41 + .../eu/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 876 bytes .../eu/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../fa/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 876 bytes .../fa/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../fi/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 877 bytes .../fi/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../fr/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 901 bytes .../fr/LC_MESSAGES/sphinxcontrib.devhelp.po | 40 + .../he/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 970 bytes .../he/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../hi/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 875 bytes .../hi/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 889 bytes .../LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../hr/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 950 bytes .../hr/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../hu/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 879 bytes .../hu/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../id/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 877 bytes .../id/LC_MESSAGES/sphinxcontrib.devhelp.po | 41 + .../it/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 877 bytes .../it/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../ja/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 871 bytes .../ja/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../ko/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 869 bytes .../ko/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../lt/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 1011 bytes .../lt/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../lv/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 912 bytes .../lv/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../mk/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 910 bytes .../mk/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 902 bytes .../LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../ne/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 876 bytes .../ne/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../nl/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 875 bytes .../nl/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../pl/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 1012 bytes .../pl/LC_MESSAGES/sphinxcontrib.devhelp.po | 41 + .../pt/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 880 bytes .../pt/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 894 bytes .../LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 897 bytes .../LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../ro/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 919 bytes .../ro/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../ru/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 1015 bytes .../ru/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../si/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 877 bytes .../si/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../sk/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 951 bytes .../sk/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../sl/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 931 bytes .../sl/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../devhelp/locales/sphinxcontrib.devhelp.pot | 33 + .../sr/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 951 bytes .../sr/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 973 bytes .../LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../sv/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 877 bytes .../sv/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../ta/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 875 bytes .../ta/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../tr/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 876 bytes .../tr/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 1117 bytes .../LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../vi/LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 873 bytes .../vi/LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 930 bytes .../LC_MESSAGES/sphinxcontrib.devhelp.po | 41 + .../LC_MESSAGES/sphinxcontrib.devhelp.mo | Bin 0 -> 885 bytes .../LC_MESSAGES/sphinxcontrib.devhelp.po | 33 + .../sphinxcontrib/htmlhelp/__init__.py | 340 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 18442 bytes .../sphinxcontrib/htmlhelp/locales/.tx/config | 10 + .../ar/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 1025 bytes .../ar/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 45 + .../bg/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 506 bytes .../bg/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../bn/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 504 bytes .../bn/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../ca/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 504 bytes .../ca/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../cak/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 466 bytes .../cak/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../cs/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 582 bytes .../cs/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../cy/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 547 bytes .../cy/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../da/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 894 bytes .../da/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 45 + .../de/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 503 bytes .../de/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../el/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 1050 bytes .../el/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 47 + .../eo/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 506 bytes .../eo/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../es/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 962 bytes .../es/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 47 + .../et/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 866 bytes .../et/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 46 + .../eu/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 503 bytes .../eu/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../fa/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 1036 bytes .../fa/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 47 + .../fi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 504 bytes .../fi/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../fr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 994 bytes .../fr/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 49 + .../he/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 597 bytes .../he/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../hi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 1313 bytes .../hi/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 47 + .../LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 516 bytes .../LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../hr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 577 bytes .../hr/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../hu/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 943 bytes .../hu/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 47 + .../id/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 929 bytes .../id/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 48 + .../it/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 504 bytes .../it/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../ja/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 1004 bytes .../ja/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 45 + .../ko/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 942 bytes .../ko/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 45 + .../lt/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 638 bytes .../lt/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../lv/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 539 bytes .../lv/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../mk/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 537 bytes .../mk/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 529 bytes .../LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../ne/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 503 bytes .../ne/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../nl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 502 bytes .../nl/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../pl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 649 bytes .../pl/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../pt/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 507 bytes .../pt/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 973 bytes .../LC_MESSAGES/sphinxcontrib.htmlhelp.po | 47 + .../LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 524 bytes .../LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../ro/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 546 bytes .../ro/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../ru/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 642 bytes .../ru/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../si/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 504 bytes .../si/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../sk/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 1009 bytes .../sk/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 45 + .../sl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 558 bytes .../sl/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../locales/sphinxcontrib.htmlhelp.pot | 41 + .../sq/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 953 bytes .../sq/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 46 + .../sr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 578 bytes .../sr/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 598 bytes .../LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 593 bytes .../LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../sv/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 504 bytes .../sv/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../ta/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 502 bytes .../ta/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../te/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 503 bytes .../te/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../tr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 939 bytes .../tr/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 47 + .../LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 744 bytes .../LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../ur/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 501 bytes .../ur/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../vi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 500 bytes .../vi/LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 917 bytes .../LC_MESSAGES/sphinxcontrib.htmlhelp.po | 46 + .../LC_MESSAGES/sphinxcontrib.htmlhelp.mo | Bin 0 -> 512 bytes .../LC_MESSAGES/sphinxcontrib.htmlhelp.po | 41 + .../sphinxcontrib/htmlhelp/py.typed | 0 .../htmlhelp/templates/project.hhc | 24 + .../htmlhelp/templates/project.hhp | 53 + .../htmlhelp/templates/project.stp | 33 + .../sphinxcontrib/jsmath/__init__.py | 92 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5543 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 584 bytes .../sphinxcontrib/jsmath/version.py | 11 + .../sphinxcontrib/qthelp/__init__.py | 266 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14421 bytes .../sphinxcontrib/qthelp/locales/.tx/config | 10 + .../ar/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1194 bytes .../ar/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../bn/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1112 bytes .../bn/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../ca/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1112 bytes .../ca/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../cs/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1190 bytes .../cs/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../cy/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1155 bytes .../cy/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../da/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1111 bytes .../da/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../de/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1111 bytes .../de/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../el/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1110 bytes .../el/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../eo/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1114 bytes .../eo/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../es/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1128 bytes .../es/LC_MESSAGES/sphinxcontrib.qthelp.po | 41 + .../et/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1134 bytes .../et/LC_MESSAGES/sphinxcontrib.qthelp.po | 41 + .../eu/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1111 bytes .../eu/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../fa/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1111 bytes .../fa/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../fi/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1112 bytes .../fi/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../fr/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1140 bytes .../fr/LC_MESSAGES/sphinxcontrib.qthelp.po | 41 + .../he/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1205 bytes .../he/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../hi/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1110 bytes .../hi/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../hi_IN/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1124 bytes .../hi_IN/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../hr/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1185 bytes .../hr/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../hu/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1114 bytes .../hu/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../id/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1117 bytes .../id/LC_MESSAGES/sphinxcontrib.qthelp.po | 45 + .../it/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1112 bytes .../it/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../ja/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1106 bytes .../ja/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../ko/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1115 bytes .../ko/LC_MESSAGES/sphinxcontrib.qthelp.po | 41 + .../lt/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1246 bytes .../lt/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../lv/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1147 bytes .../lv/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../mk/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1145 bytes .../mk/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../nb_NO/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1137 bytes .../nb_NO/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../ne/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1111 bytes .../ne/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../nl/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1110 bytes .../nl/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../pl/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1249 bytes .../pl/LC_MESSAGES/sphinxcontrib.qthelp.po | 41 + .../pt/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1115 bytes .../pt/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../pt_BR/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1129 bytes .../pt_BR/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../pt_PT/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1132 bytes .../pt_PT/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../ro/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1154 bytes .../ro/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../ru/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1250 bytes .../ru/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../si/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1112 bytes .../si/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../sk/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1186 bytes .../sk/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../sl/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1166 bytes .../sl/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../qthelp/locales/sphinxcontrib.qthelp.pot | 38 + .../sr/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1186 bytes .../sr/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1208 bytes .../LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../sv/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1112 bytes .../sv/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../ta/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1110 bytes .../ta/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../tr/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1111 bytes .../tr/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../uk_UA/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1352 bytes .../uk_UA/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../vi/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1108 bytes .../vi/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../zh_CN/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1158 bytes .../zh_CN/LC_MESSAGES/sphinxcontrib.qthelp.po | 45 + .../zh_TW/LC_MESSAGES/sphinxcontrib.qthelp.mo | Bin 0 -> 1120 bytes .../zh_TW/LC_MESSAGES/sphinxcontrib.qthelp.po | 37 + .../sphinxcontrib/qthelp/py.typed | 0 .../qthelp/templates/project.qhcp | 19 + .../qthelp/templates/project.qhp | 26 + .../sphinxcontrib/serializinghtml/__init__.py | 180 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 9482 bytes .../__pycache__/jsonimpl.cpython-312.pyc | Bin 0 -> 2053 bytes .../sphinxcontrib/serializinghtml/jsonimpl.py | 33 + .../serializinghtml/locales/.tx/config | 10 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 882 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 513 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 511 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 511 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 473 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 589 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 554 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 751 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 510 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 871 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 513 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 797 bytes .../sphinxcontrib.serializinghtml.po | 35 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 663 bytes .../sphinxcontrib.serializinghtml.po | 35 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 510 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 914 bytes .../sphinxcontrib.serializinghtml.po | 37 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 511 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 794 bytes .../sphinxcontrib.serializinghtml.po | 36 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 604 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 921 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 523 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 584 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 797 bytes .../sphinxcontrib.serializinghtml.po | 36 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 750 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 511 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 804 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 774 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 645 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 546 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 544 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 536 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 510 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 509 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 760 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 514 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 802 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 531 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 553 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 649 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 511 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 833 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 565 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../locales/sphinxcontrib.serializinghtml.pot | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 776 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 585 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 605 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 600 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 511 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 509 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 510 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 762 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 751 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 508 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 507 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 784 bytes .../sphinxcontrib.serializinghtml.po | 34 + .../sphinxcontrib.serializinghtml.mo | Bin 0 -> 519 bytes .../sphinxcontrib.serializinghtml.po | 30 + .../sphinxcontrib/serializinghtml/py.typed | 0 .../INSTALLER | 1 + .../METADATA | 64 + .../RECORD | 110 + .../WHEEL | 4 + .../INSTALLER | 1 + .../METADATA | 66 + .../RECORD | 104 + .../WHEEL | 4 + .../INSTALLER | 1 + .../METADATA | 65 + .../RECORD | 120 + .../WHEEL | 4 + ...sphinxcontrib_jsmath-1.0.1-py3.7-nspkg.pth | 1 + .../INSTALLER | 1 + .../LICENSE | 29 + .../METADATA | 39 + .../RECORD | 12 + .../WHEEL | 6 + .../namespace_packages.txt | 1 + .../top_level.txt | 1 + .../INSTALLER | 1 + .../METADATA | 65 + .../RECORD | 107 + .../WHEEL | 4 + .../INSTALLER | 1 + .../METADATA | 65 + .../RECORD | 119 + .../WHEEL | 4 + .../urllib3-2.5.0.dist-info/INSTALLER | 1 + .../urllib3-2.5.0.dist-info/METADATA | 154 + .../urllib3-2.5.0.dist-info/RECORD | 79 + .../urllib3-2.5.0.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 21 + .../site-packages/urllib3/__init__.py | 211 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7335 bytes .../_base_connection.cpython-312.pyc | Bin 0 -> 6873 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 22594 bytes .../_request_methods.cpython-312.pyc | Bin 0 -> 10627 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 671 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 38438 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 39760 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 16636 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 12047 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 3514 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 24428 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 52738 bytes .../site-packages/urllib3/_base_connection.py | 165 + .../site-packages/urllib3/_collections.py | 479 ++ .../site-packages/urllib3/_request_methods.py | 278 + .../site-packages/urllib3/_version.py | 21 + .../site-packages/urllib3/connection.py | 1093 ++++ .../site-packages/urllib3/connectionpool.py | 1178 ++++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 218 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 28241 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 8196 bytes .../urllib3/contrib/emscripten/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 926 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 10267 bytes .../__pycache__/fetch.cpython-312.pyc | Bin 0 -> 28657 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 1446 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 12240 bytes .../urllib3/contrib/emscripten/connection.py | 255 + .../emscripten/emscripten_fetch_worker.js | 110 + .../urllib3/contrib/emscripten/fetch.py | 728 +++ .../urllib3/contrib/emscripten/request.py | 22 + .../urllib3/contrib/emscripten/response.py | 277 + .../urllib3/contrib/pyopenssl.py | 564 ++ .../site-packages/urllib3/contrib/socks.py | 228 + .../site-packages/urllib3/exceptions.py | 335 ++ .../site-packages/urllib3/fields.py | 341 ++ .../site-packages/urllib3/filepost.py | 89 + .../site-packages/urllib3/http2/__init__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1771 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 17078 bytes .../http2/__pycache__/probe.cpython-312.pyc | Bin 0 -> 3722 bytes .../site-packages/urllib3/http2/connection.py | 356 ++ .../site-packages/urllib3/http2/probe.py | 87 + .../site-packages/urllib3/poolmanager.py | 653 ++ .../python3.12/site-packages/urllib3/py.typed | 2 + .../site-packages/urllib3/response.py | 1307 ++++ .../site-packages/urllib3/util/__init__.py | 42 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1031 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4721 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1243 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 8343 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 2899 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 20312 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 17195 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5583 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 13350 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11715 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 16252 bytes .../util/__pycache__/util.cpython-312.pyc | Bin 0 -> 2020 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 3466 bytes .../site-packages/urllib3/util/connection.py | 137 + .../site-packages/urllib3/util/proxy.py | 43 + .../site-packages/urllib3/util/request.py | 266 + .../site-packages/urllib3/util/response.py | 101 + .../site-packages/urllib3/util/retry.py | 533 ++ .../site-packages/urllib3/util/ssl_.py | 524 ++ .../urllib3/util/ssl_match_hostname.py | 159 + .../urllib3/util/ssltransport.py | 271 + .../site-packages/urllib3/util/timeout.py | 275 + .../site-packages/urllib3/util/url.py | 469 ++ .../site-packages/urllib3/util/util.py | 42 + .../site-packages/urllib3/util/wait.py | 124 + 1116 files changed, 178186 insertions(+) create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/METADATA create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/RECORD create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/WHEEL create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/entry_points.txt create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/licenses/AUTHORS create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/licenses/LICENSE create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__main__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/console.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/cmdline.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/console.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/filter.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/filters/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatter.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/_mapping.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/bbcode.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/groff.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/html.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/img.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/irc.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/latex.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/other.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/pangomarkup.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/rtf.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/svg.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/terminal.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/terminal256.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_ada_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_asy_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_cl_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_cocoa_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_csound_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_css_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_googlesql_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_julia_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lasso_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lilypond_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_luau_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mql_builtins.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_ada_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_asy_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_cl_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_cocoa_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_csound_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_css_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_googlesql_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_julia_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_lasso_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_lilypond_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_lua_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_luau_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_mapping.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_mql_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_mysql_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_openedge_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_php_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_postgres_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_qlik_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_scheme_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_scilab_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_sourcemod_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_sql_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_stan_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_stata_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_tsql_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_usd_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_vbscript_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/_vim_builtins.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/actionscript.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ada.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/agile.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/algebra.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ambient.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/amdgpu.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ampl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/apdlexer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/apl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/archetype.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/arrow.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/arturo.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/asc.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/asm.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/asn1.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/automation.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/bare.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/basic.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/bdd.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/berry.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/bibtex.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/blueprint.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/boa.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/bqn.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/business.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/c_cpp.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/c_like.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/capnproto.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/carbon.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/cddl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/chapel.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/clean.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/codeql.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/comal.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/compiled.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/configs.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/console.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/cplint.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/crystal.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/csound.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/css.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/d.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/dalvik.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/data.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/dax.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/devicetree.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/diff.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/dns.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/dotnet.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/dsls.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/dylan.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ecl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/eiffel.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/elm.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/elpi.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/email.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/erlang.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/esoteric.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ezhil.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/factor.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/fantom.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/felix.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/fift.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/floscript.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/forth.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/fortran.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/foxpro.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/freefem.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/func.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/functional.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/futhark.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/gcodelexer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/gdscript.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/gleam.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/go.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/grammar_notation.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/graph.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/graphics.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/graphql.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/graphviz.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/gsql.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/hare.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/haskell.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/haxe.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/hdl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/hexdump.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/html.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/idl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/igor.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/inferno.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/installers.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/int_fiction.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/iolang.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/j.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/javascript.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/jmespath.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/jslt.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/json5.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/jsonnet.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/jsx.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/julia.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/jvm.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/kuin.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/kusto.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ldap.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/lean.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/lilypond.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/lisp.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/macaulay2.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/make.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/maple.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/markup.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/math.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/matlab.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/maxima.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/meson.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/mime.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/minecraft.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/mips.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ml.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/modeling.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/modula2.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/mojo.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/monte.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/mosel.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ncl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/nimrod.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/nit.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/nix.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/numbair.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/oberon.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/objective.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ooc.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/openscad.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/other.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/parasail.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/parsers.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pascal.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pawn.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pddl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/perl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/phix.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/php.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pointless.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pony.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/praat.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/procfile.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/prolog.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/promql.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/prql.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ptx.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/python.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/q.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/qlik.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/qvt.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/r.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rdf.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rebol.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rego.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/resource.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ride.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rita.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rnc.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/roboconf.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/robotframework.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ruby.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rust.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sas.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/savi.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/scdoc.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/scripting.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sgf.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/shell.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sieve.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/slash.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smalltalk.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smithy.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smv.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/snobol.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/solidity.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/soong.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sophia.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/special.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/spice.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sql.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/srcinfo.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/stata.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/supercollider.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/tablegen.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/tact.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/tal.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/tcl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/teal.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/templates.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/teraterm.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/testing.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/text.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/textedit.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/textfmts.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/theorem.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/thingsdb.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/tlb.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/tls.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/tnt.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/trafficscript.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/typoscript.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/typst.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ul4.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/unicon.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/urbi.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/usd.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/varnish.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/verification.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/verifpal.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/vip.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/vyper.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/web.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/webassembly.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/webidl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/webmisc.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/wgsl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/whiley.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/wowtoc.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/wren.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/x10.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/xorg.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/yang.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/yara.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/zig.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/modeline.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/plugin.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/regexopt.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/scanner.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/sphinxext.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/style.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/_mapping.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/abap.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/algol.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/algol_nu.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/arduino.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/autumn.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/borland.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/bw.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/coffee.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/colorful.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/default.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/dracula.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/emacs.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/friendly.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/friendly_grayscale.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/fruity.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/gh_dark.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/gruvbox.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/igor.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/inkpot.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/lightbulb.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/lilypond.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/lovelace.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/manni.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/material.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/monokai.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/murphy.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/native.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/nord.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/onedark.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/paraiso_dark.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/paraiso_light.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/pastie.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/perldoc.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/rainbow_dash.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/rrt.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/sas.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/solarized.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/staroffice.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/stata_dark.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/stata_light.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/tango.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/trac.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/vim.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/vs.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/xcode.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/styles/zenburn.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/token.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/unistring.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/util.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/roman_numerals/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/roman_numerals/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/roman_numerals/py.typed create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/roman_numerals_py-3.1.0.dist-info/INSTALLER create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/roman_numerals_py-3.1.0.dist-info/METADATA create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/roman_numerals_py-3.1.0.dist-info/RECORD create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/roman_numerals_py-3.1.0.dist-info/WHEEL create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/roman_numerals_py-3.1.0.dist-info/licenses/LICENCE.rst create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer-3.0.1.dist-info/INSTALLER create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer-3.0.1.dist-info/METADATA create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer-3.0.1.dist-info/RECORD create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer-3.0.1.dist-info/WHEEL create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer-3.0.1.dist-info/licenses/COPYING create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer-3.0.1.dist-info/top_level.txt create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/among.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/arabic_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/armenian_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/basestemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/basque_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/catalan_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/danish_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/dutch_porter_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/dutch_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/english_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/esperanto_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/estonian_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/finnish_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/french_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/german_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/greek_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/hindi_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/hungarian_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/indonesian_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/irish_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/italian_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/lithuanian_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/nepali_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/norwegian_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/porter_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/portuguese_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/romanian_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/russian_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/serbian_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/spanish_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/swedish_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/tamil_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/turkish_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/yiddish_stemmer.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/among.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/arabic_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/armenian_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/basestemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/basque_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/catalan_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/danish_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/dutch_porter_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/dutch_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/english_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/esperanto_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/estonian_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/finnish_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/french_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/german_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/greek_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/hindi_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/hungarian_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/indonesian_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/irish_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/italian_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/lithuanian_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/nepali_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/norwegian_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/porter_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/portuguese_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/romanian_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/russian_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/serbian_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/spanish_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/swedish_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/tamil_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/turkish_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/yiddish_stemmer.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/.tx/config create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ar/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ar/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/bn/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/bn/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ca/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ca/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cak/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cak/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cs/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cs/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cy/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cy/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/da/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/da/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/de/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/de/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/el/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/el/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/eo/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/eo/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/es/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/es/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/et/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/et/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/eu/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/eu/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fa/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fa/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fi/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fi/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fr/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fr/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/he/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/he/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hr/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hr/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hu/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hu/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/id/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/id/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/it/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/it/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ja/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ja/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ko/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ko/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lt/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lt/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lv/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lv/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/mk/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/mk/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ne/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ne/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/nl/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/nl/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pl/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pl/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ro/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ro/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ru/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ru/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/si/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/si/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sk/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sk/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sl/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sl/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sphinxcontrib.applehelp.pot create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sr/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sr/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sv/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sv/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ta/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ta/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/tr/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/tr/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ur/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ur/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/vi/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/vi/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.applehelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.applehelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/py.typed create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/templates/_access.html_t create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/.tx/config create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ar/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ar/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/bn/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/bn/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ca/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ca/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/cs/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/cs/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/cy/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/cy/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/da/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/da/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/de/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/de/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/el/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/el/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/eo/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/eo/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/es/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/es/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/et/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/et/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/eu/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/eu/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fa/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fa/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fi/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fi/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fr/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fr/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/he/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/he/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hi/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hi/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hr/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hr/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hu/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hu/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/id/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/id/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/it/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/it/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ja/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ja/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ko/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ko/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lt/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lt/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lv/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lv/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/mk/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/mk/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ne/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ne/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/nl/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/nl/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pl/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pl/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ro/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ro/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ru/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ru/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/si/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/si/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sk/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sk/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sl/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sl/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sphinxcontrib.devhelp.pot create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sr/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sr/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sv/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sv/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ta/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ta/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/tr/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/tr/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/vi/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/vi/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.devhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.devhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/.tx/config create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ar/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ar/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bg/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bg/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bn/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bn/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ca/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ca/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cak/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cak/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cs/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cs/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cy/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cy/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/da/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/da/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/de/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/de/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/el/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/el/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eo/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eo/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/es/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/es/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/et/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/et/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eu/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eu/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fa/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fa/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fi/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fr/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/he/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/he/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hi/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hr/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hu/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hu/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/id/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/id/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/it/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/it/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ja/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ja/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ko/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ko/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lt/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lt/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lv/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lv/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/mk/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/mk/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ne/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ne/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/nl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/nl/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pl/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ro/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ro/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ru/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ru/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/si/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/si/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sk/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sk/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sl/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sphinxcontrib.htmlhelp.pot create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sq/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sq/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr_RS/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr_RS/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sv/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sv/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ta/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ta/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/te/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/te/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/tr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/tr/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ur/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ur/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/vi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/vi/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.htmlhelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.htmlhelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/py.typed create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.hhc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.hhp create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.stp create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/__pycache__/version.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/version.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/.tx/config create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ar/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ar/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/bn/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/bn/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ca/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ca/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cs/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cs/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cy/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cy/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/da/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/da/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/de/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/de/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/el/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/el/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eo/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eo/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/es/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/es/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/et/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/et/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eu/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eu/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fa/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fa/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fi/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fi/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fr/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fr/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/he/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/he/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hr/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hr/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hu/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hu/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/id/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/id/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/it/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/it/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ja/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ja/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ko/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ko/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lt/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lt/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lv/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lv/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/mk/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/mk/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ne/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ne/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nl/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nl/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pl/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pl/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ro/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ro/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ru/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ru/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/si/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/si/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sk/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sk/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sl/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sl/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sphinxcontrib.qthelp.pot create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sv/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sv/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ta/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ta/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/tr/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/tr/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/vi/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/vi/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.qthelp.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.qthelp.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/py.typed create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/templates/project.qhcp create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/templates/project.qhp create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/__pycache__/jsonimpl.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/jsonimpl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/.tx/config create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ar/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ar/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bg/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bg/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bn/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bn/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ca/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ca/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cak/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cak/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cs/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cs/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cy/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cy/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/da/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/da/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/de/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/de/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/el/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/el/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/eo/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/eo/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/es/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/es/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/et/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/et/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/eu/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/eu/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fa/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fa/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fi/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fr/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/he/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/he/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi_IN/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi_IN/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hr/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hu/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hu/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/id/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/id/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/it/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/it/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ja/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ja/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ko/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ko/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/lt/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/lt/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/lv/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/lv/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/mk/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/mk/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nb_NO/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nb_NO/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ne/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ne/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nl/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pl/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt_BR/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt_BR/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt_PT/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt_PT/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ro/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ro/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ru/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ru/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/si/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/si/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sk/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sk/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sl/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sphinxcontrib.serializinghtml.pot create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sq/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sq/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr@latin/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr@latin/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr_RS/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr_RS/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sv/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sv/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ta/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ta/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/te/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/te/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/tr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/tr/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/uk_UA/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/uk_UA/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ur/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ur/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/vi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/vi/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/zh_CN/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/zh_CN/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/zh_TW/LC_MESSAGES/sphinxcontrib.serializinghtml.mo create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/zh_TW/LC_MESSAGES/sphinxcontrib.serializinghtml.po create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/py.typed create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/INSTALLER create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/METADATA create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/RECORD create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/WHEEL create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/INSTALLER create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/METADATA create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/RECORD create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/WHEEL create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/INSTALLER create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/METADATA create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/RECORD create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/WHEEL create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1-py3.7-nspkg.pth create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/INSTALLER create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/LICENSE create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/METADATA create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/RECORD create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/WHEEL create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/namespace_packages.txt create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/top_level.txt create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/INSTALLER create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/METADATA create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/RECORD create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/WHEEL create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/INSTALLER create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/METADATA create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/RECORD create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/WHEEL create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/INSTALLER create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/METADATA create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/RECORD create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/WHEEL create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/licenses/LICENSE.txt create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_base_connection.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_collections.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_request_methods.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_version.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/connection.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/connectionpool.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/connection.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/request.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/socks.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/exceptions.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/fields.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/filepost.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/__pycache__/connection.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/connection.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/probe.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/poolmanager.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/py.typed create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/response.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__init__.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/connection.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/proxy.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/request.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/response.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/retry.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssl_.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssl_match_hostname.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssltransport.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/timeout.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/url.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/util.py create mode 100644 ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/wait.py diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/METADATA b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/METADATA new file mode 100644 index 000000000..2eff6a0c3 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/METADATA @@ -0,0 +1,58 @@ +Metadata-Version: 2.4 +Name: Pygments +Version: 2.19.2 +Summary: Pygments is a syntax highlighting package written in Python. +Project-URL: Homepage, https://pygments.org +Project-URL: Documentation, https://pygments.org/docs +Project-URL: Source, https://github.com/pygments/pygments +Project-URL: Bug Tracker, https://github.com/pygments/pygments/issues +Project-URL: Changelog, https://github.com/pygments/pygments/blob/master/CHANGES +Author-email: Georg Brandl +Maintainer: Matthäus G. Chajdas +Maintainer-email: Georg Brandl , Jean Abou Samra +License: BSD-2-Clause +License-File: AUTHORS +License-File: LICENSE +Keywords: syntax highlighting +Classifier: Development Status :: 6 - Mature +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: End Users/Desktop +Classifier: Intended Audience :: System Administrators +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Text Processing :: Filters +Classifier: Topic :: Utilities +Requires-Python: >=3.8 +Provides-Extra: plugins +Provides-Extra: windows-terminal +Requires-Dist: colorama>=0.4.6; extra == 'windows-terminal' +Description-Content-Type: text/x-rst + +Pygments +~~~~~~~~ + +Pygments is a syntax highlighting package written in Python. + +It is a generic syntax highlighter suitable for use in code hosting, forums, +wikis or other applications that need to prettify source code. Highlights +are: + +* a wide range of over 500 languages and other text formats is supported +* special attention is paid to details, increasing quality by a fair amount +* support for new languages and formats are added easily +* a number of output formats, presently HTML, LaTeX, RTF, SVG, all image + formats that PIL supports and ANSI sequences +* it is usable as a command-line tool and as a library + +Copyright 2006-2025 by the Pygments team, see ``AUTHORS``. +Licensed under the BSD, see ``LICENSE`` for details. diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/RECORD b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/RECORD new file mode 100644 index 000000000..87a6955dd --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/RECORD @@ -0,0 +1,344 @@ +pygments/__init__.py,sha256=_3UT86TGpHuW8FekdZ8uLidEZH1NhmcLiOy2KKNPCt4,2959 +pygments/__main__.py,sha256=p8AJyoyCOMYGvzWHdnq0_A9qaaVqaj02nIu3xhJp1_4,348 +pygments/cmdline.py,sha256=4pL9Kpn2PUEKPobgrsQgg-vCx2NjsrapKzQ6LxQR7Q0,23536 +pygments/console.py,sha256=AagDWqwea2yBWf10KC9ptBgMpMjxKp8yABAmh-NQOVk,1718 +pygments/filter.py,sha256=YLtpTnZiu07nY3oK9nfR6E9Y1FBHhP5PX8gvkJWcfag,1910 +pygments/formatter.py,sha256=H_4J-moKkKfRWUOW9J0u7hhw6n1LiO-2Xu1q2B0sE5w,4366 +pygments/lexer.py,sha256=ib-F_0GxHkwGpb6vWP0DeLMLc7EYgjo3hWFKN5IgOq0,35109 +pygments/modeline.py,sha256=K5eSkR8GS1r5OkXXTHOcV0aM_6xpk9eWNEIAW-OOJ2g,1005 +pygments/plugin.py,sha256=tPx0rJCTIZ9ioRgLNYG4pifCbAwTRUZddvLw-NfAk2w,1891 +pygments/regexopt.py,sha256=wXaP9Gjp_hKAdnICqoDkRxAOQJSc4v3X6mcxx3z-TNs,3072 +pygments/scanner.py,sha256=nNcETRR1tRuiTaHmHSTTECVYFPcLf6mDZu1e4u91A9E,3092 +pygments/sphinxext.py,sha256=VEe_oHNgLoEGMHc2ROfbee2mF2PPREFyE6_m_JN5FvQ,7898 +pygments/style.py,sha256=Cpw9dCAyW3_JAwFRXOJXmtKb5ZwO2_5KSmlq6q4fZw4,6408 +pygments/token.py,sha256=WbdWGhYm_Vosb0DDxW9lHNPgITXfWTsQmHt6cy9RbcM,6226 +pygments/unistring.py,sha256=al-_rBemRuGvinsrM6atNsHTmJ6DUbw24q2O2Ru1cBc,63208 +pygments/util.py,sha256=oRtSpiAo5jM9ulntkvVbgXUdiAW57jnuYGB7t9fYuhc,10031 +pygments/filters/__init__.py,sha256=B00KqPCQh5E0XhzaDK74Qa1E4fDSTlD6b0Pvr1v-vEQ,40344 +pygments/formatters/__init__.py,sha256=7OuvmoYLyoPzoOQV_brHG8GSKYB_wjFSkAQng6x2y9g,5349 +pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 +pygments/formatters/bbcode.py,sha256=s0Ka35OKuIchoSgEAGf6rj0rl2a9ym9L31JVNSRbZFQ,3296 +pygments/formatters/groff.py,sha256=pLcIHj4jJS_lRAVFnyJODKDu1Xlyl9_AEIdOtbl3DT0,5082 +pygments/formatters/html.py,sha256=FrHJ69FUliEyPY0zTfab0C1gPf7LXsKgeRlhwkniqIs,35953 +pygments/formatters/img.py,sha256=aRpFo8mBmWTL3sBUjRCWkeS3rc6FZrSFC4EksDrl53g,23301 +pygments/formatters/irc.py,sha256=R0Js0TYWySlI2yE9sW6tN4d4X-x3k9ZmudsijGPnLmU,4945 +pygments/formatters/latex.py,sha256=BRYtbLeW_YD1kwhhnFInhJIKylurnri8CF1lP069KWE,19258 +pygments/formatters/other.py,sha256=8pYW27sU_7XicLUqOEt2yWSO0h1IEUM3TIv34KODLwo,4986 +pygments/formatters/pangomarkup.py,sha256=pcFvEC7K1Me0EjGeOZth4oCnEY85bfqc77XzZASEPpY,2206 +pygments/formatters/rtf.py,sha256=kcKMCxTXu-2-hpgEftlGJRm7Ss-yA_Sy8OsHH_qzykA,11921 +pygments/formatters/svg.py,sha256=R6A2ME6JsMQWFiyn8wcKwFUOD6vsu-HLwiIztLu-77E,7138 +pygments/formatters/terminal.py,sha256=J_F_dFXwR9LHWvatIDnwqRYJyjVmSo1Zx8K_XDh6SyM,4626 +pygments/formatters/terminal256.py,sha256=7GQFLE5cfmeu53CAzANO74-kBk2BFkXfn5phmZjYkhM,11717 +pygments/lexers/__init__.py,sha256=6YhzxGKlWk38P6JpIJUQ1rVvV0DEZjEmdYsdMQ58hSk,12067 +pygments/lexers/_ada_builtins.py,sha256=CA_OnShtdc7wWh9oYcRlcrkDAQwYUKl6w7tdSbALQd4,1543 +pygments/lexers/_asy_builtins.py,sha256=cd9M00YH19w5ZL7aqucmC3nwpJGTS04U-01NLy5E2_4,27287 +pygments/lexers/_cl_builtins.py,sha256=kQeUIyZjP4kX0frkICDcKxBYQCLqzIDXa5WV5cevhDo,13994 +pygments/lexers/_cocoa_builtins.py,sha256=Ka1lLJe7JfWtdho4IFIB82X9yBvrbfHCCmEG-peXXhQ,105173 +pygments/lexers/_csound_builtins.py,sha256=qnQYKeI26ZHim316uqy_hDiRiCoHo2RHjD3sYBALyXs,18414 +pygments/lexers/_css_builtins.py,sha256=aD-dhLFXVd1Atn_bZd7gEdQn7Mhe60_VHpvZ340WzDI,12446 +pygments/lexers/_googlesql_builtins.py,sha256=IkrOk-T2v1yzbGzUEEQh5_Cf4uC_cmL_uuhwDpZlTug,16132 +pygments/lexers/_julia_builtins.py,sha256=N2WdSw5zgI2fhDat_i4YeVqurRTC_P8x71ez00SCN6U,11883 +pygments/lexers/_lasso_builtins.py,sha256=8q1gbsrMJeaeUhxIYKhaOxC9j_B-NBpq_XFj2Ze41X0,134510 +pygments/lexers/_lilypond_builtins.py,sha256=XTbGL1z1oKMoqWLEktG33jx5GdGTI9CpeO5NheEi4Y0,108094 +pygments/lexers/_lua_builtins.py,sha256=PhFdZV5-Tzz2j_q4lvG9lr84ELGfL41BhnrSDNNTaG4,8108 +pygments/lexers/_luau_builtins.py,sha256=-IDrU04kUVfjXwSQzMMpXmMYhNsQxZVVZk8cuAA0Lo0,955 +pygments/lexers/_mapping.py,sha256=9fv7xYOUAOr6LzfdFS4MDbPu78o4OQQH-2nsI1bNZf4,70438 +pygments/lexers/_mql_builtins.py,sha256=ybRQjlb7Cul0sDstnzxJl3h0qS6Ieqsr811fqrxyumU,24713 +pygments/lexers/_mysql_builtins.py,sha256=y0kAWZVAs0z2dTFJJV42OZpILgRnd8T3zSlBFv-g_oA,25838 +pygments/lexers/_openedge_builtins.py,sha256=Sz4j9-CPWIaxMa-2fZgY66j7igcu1ob1GR2UtI8zAkg,49398 +pygments/lexers/_php_builtins.py,sha256=Jd4BZpjMDELPi4EVoSxK1-8BFTc63HUwYfm1rLrGj0M,107922 +pygments/lexers/_postgres_builtins.py,sha256=Pqh4z0RBRbnW6rCQtWUdzWCJxNyqpJ7_0HOktxHDxk4,13343 +pygments/lexers/_qlik_builtins.py,sha256=xuJy9c9uZDXv6h8z582P5PrxqkxTZ_nS8gPl9OD9VN8,12595 +pygments/lexers/_scheme_builtins.py,sha256=2hNtJOJmP21lUsikpqMJ2gAmLT3Rwn_KEeqhXwCjgfk,32564 +pygments/lexers/_scilab_builtins.py,sha256=oZYPB1XPdIEz3pII11pFDe6extRRyWGA7pY06X8KZ8w,52411 +pygments/lexers/_sourcemod_builtins.py,sha256=H8AFLsNDdEpymIWOpDwbDJGCP1w-x-1gSlzPDioMF4o,26777 +pygments/lexers/_sql_builtins.py,sha256=oe8F9wWuO2iS6nEsZAdJtCUChBTjgM1Sq_aipu74jXM,6767 +pygments/lexers/_stan_builtins.py,sha256=dwi1hllM_NsaCv-aXJy7lEi57X5Hh5gSD97aCQyT9KM,13445 +pygments/lexers/_stata_builtins.py,sha256=Hqrr6j77zWU3cGGpBPohwexZci43YA4_sVYE4E1sNow,27227 +pygments/lexers/_tsql_builtins.py,sha256=Pi2RhTXcLE3glI9oxNhyVsOMn-fK_1TRxJ-EsYP5LcI,15460 +pygments/lexers/_usd_builtins.py,sha256=c9hbU1cwqBUCFIhNfu_Dob8ywv1rlPhi9w2OTj3kR8s,1658 +pygments/lexers/_vbscript_builtins.py,sha256=MqJ2ABywD21aSRtWYZRG64CCbGstC1kfsiHGJmZzxiw,4225 +pygments/lexers/_vim_builtins.py,sha256=bA4mH8t1mPPQfEiUCKEqRO1O0rL2DUG0Ux1Bt8ZSu0E,57066 +pygments/lexers/actionscript.py,sha256=JBngCe5UhYT_0dLD2j7PnPO0xRRJhmypEuQ-C5in8pY,11727 +pygments/lexers/ada.py,sha256=58k5ra1vGS4iLpW3h1ItY9ftzF3WevaeAAXzAYTiYkQ,5353 +pygments/lexers/agile.py,sha256=DN-7AVIqtG1MshA94rtSGYI_884hVHgzq405wD0_dl8,896 +pygments/lexers/algebra.py,sha256=yGTu9Tt-cQzAISQYIC5MS5a3z4QmL-tGcXnd_pkWGbk,9952 +pygments/lexers/ambient.py,sha256=UnzKpIlfSm3iitHvMd7XTMSY8TjZYYhKOC3AiARS_cE,2605 +pygments/lexers/amdgpu.py,sha256=S8qjn2UMLhBFm3Yn_c06XAGf8cl5x_ZeluelWG_-JAw,1723 +pygments/lexers/ampl.py,sha256=ZBRfDXm760gR1a1gqItnsHuoO3JdUcTBjJ5tFY9UtPA,4176 +pygments/lexers/apdlexer.py,sha256=Zr5-jgjxC8PKzRlEeclakZXPHci7FHBZghQ6wwiuT7A,30800 +pygments/lexers/apl.py,sha256=PTQMp-bxT5P-DbrEvFha10HBTcsDJ5srL3I1s9ljz58,3404 +pygments/lexers/archetype.py,sha256=pQVlP1Fb5OA8nn7QwmFaaaOSvvpoIsQVw43FVCQCve4,11538 +pygments/lexers/arrow.py,sha256=2PKdbWq3xQLF1KoDbWvSxpjwKRrznnDiArTflRGZzBo,3564 +pygments/lexers/arturo.py,sha256=U5MtRNHJtnBn4ZOeWmW6MKlVRG7SX6KhTRamDqzn9tA,11414 +pygments/lexers/asc.py,sha256=-DgZl9jccBDHPlDmjCsrEqx0-Q7ap7XVdNKtxLNWG1w,1693 +pygments/lexers/asm.py,sha256=xm2Y5mcT-sF3oQvair4SWs9EWTyndoaUoSsDy5v6shI,41967 +pygments/lexers/asn1.py,sha256=BlcloIX2bu6Q7BxGcksuhYFHGsXLVKyB4B9mFd4Pj6E,4262 +pygments/lexers/automation.py,sha256=Q61qon8EwpfakMh_2MS2E2zUUT16rG3UNIKPYjITeTs,19831 +pygments/lexers/bare.py,sha256=tWoei86JJX1k-ADhaXd5TgX6ItDTici9yFWpkTPhnfM,3020 +pygments/lexers/basic.py,sha256=qpVe5h8Fa7NJo1EihN-4R_UZpHO6my2Ssgkb-BktkKs,27989 +pygments/lexers/bdd.py,sha256=yysefcOFAEyk9kJ2y4EXmzJTecgLYUHlWixt_3YzPMU,1641 +pygments/lexers/berry.py,sha256=zxGowFb8HMIyN15-m8nmWnW6bPRR4esKtSEVugc9uXM,3209 +pygments/lexers/bibtex.py,sha256=yuNoPxwrJf9DCGUT17hxfDzbq_HtCLkQkRbBtiTVmeQ,4811 +pygments/lexers/blueprint.py,sha256=NzvWHMxCLDWt8hc6gB5jokltxVJgNa7Jwh4c61ng388,6188 +pygments/lexers/boa.py,sha256=dOot1XWNZThPIio2UyAX67K6EpISjSRCFjotD7dcnwE,3921 +pygments/lexers/bqn.py,sha256=nJiwrPKKbRF-qdai5tfqipwBkkko2P3weiZAjHUMimY,3671 +pygments/lexers/business.py,sha256=lRtekOJfsDkb12AGbuz10-G67OJrVJgCBtihTQ8_aoY,28345 +pygments/lexers/c_cpp.py,sha256=D7ZIswaHASlGBgoTlwnSqTQHf8_JyvvSt2L2q1W-F6g,18059 +pygments/lexers/c_like.py,sha256=FTGp17ds6X2rDZOHup2hH6BEn3gKK4nLm9pydNEhm0E,32021 +pygments/lexers/capnproto.py,sha256=XQJAh1WS-0ulqbTn9TdzR6gEgWLcuBqb4sj3jNsrhsY,2174 +pygments/lexers/carbon.py,sha256=av12YuTGZGpOa1Cmxp3lppx3LfSJUWbvOu0ixmUVll0,3211 +pygments/lexers/cddl.py,sha256=MKa70IwABgjBjYu15_Q9v8rsu2sr1a-i2jkiaPTI6sM,5076 +pygments/lexers/chapel.py,sha256=0n_fL3ehLC4pw4YKnmq9jxIXOJcxGPka1Wr1t1zsXPc,5156 +pygments/lexers/clean.py,sha256=dkDPAwF5BTALPeuKFoRKOSD3RfsKcGWbaRo6_G8LHng,6418 +pygments/lexers/codeql.py,sha256=ebvghn2zbrnETV4buVozMDmRCVKSdGiIN8ycLlHpGsE,2576 +pygments/lexers/comal.py,sha256=TC3NzcJ58ew5jw7qwK0kJ-okTA47psZje0yAIS39HR4,3179 +pygments/lexers/compiled.py,sha256=Slfo1sjWqcPawUwf0dIIZLBCL5pkOIoAX2S8Lxs02Mc,1426 +pygments/lexers/configs.py,sha256=wW8pY0Sa5a10pnAeTLGf48HhixQTVageIyHEf1aYMCc,50913 +pygments/lexers/console.py,sha256=-jAG120dupvV3kG3zC70brLJvSLwTFqMubBQuj_GVnU,4180 +pygments/lexers/cplint.py,sha256=DkbyE5EKydLgf6BRr1FhQrK-IeQPL7Zmjk0DVdlRFnQ,1389 +pygments/lexers/crystal.py,sha256=xU-RnpIkpjrquoxtOuOcP8fcesSJl4xhU7kO9m42LZY,15754 +pygments/lexers/csound.py,sha256=ioSw4Q04wdwjUAbnTZ1qLhUq1vxdWFxhh3QtEl5RAJc,16998 +pygments/lexers/css.py,sha256=JN1RBYsee-jrpHWrSmhN3TKc4TkOBn-_BEGpgTCzcqE,25376 +pygments/lexers/d.py,sha256=piOy0EJeiAwPHugiM3gVv0z7HNh3u2gZQoCUSASRbY4,9920 +pygments/lexers/dalvik.py,sha256=deFg2JPBktJ9mEGb9EgxNkmd6vaMjJFQVzUHo8NKIa8,4606 +pygments/lexers/data.py,sha256=o0x0SmB5ms_CPUPljEEEenOON4IQWn86DkwFjkJYCOg,27026 +pygments/lexers/dax.py,sha256=ASi73qmr7OA7cVZXF2GTYGt01Ly1vY8CgD_Pnpm8k-4,8098 +pygments/lexers/devicetree.py,sha256=RecSQCidt8DRE1QFCPUbwwR0hiRlNtsFihdGldeUn3k,4019 +pygments/lexers/diff.py,sha256=F6vxZ64wm5Nag_97de1H_3F700ZwCVnYjKvtT5jilww,5382 +pygments/lexers/dns.py,sha256=Hh5hJ7MXfrq36KgfyIRwK3X8o1LdR98IKERcV4eZ7HY,3891 +pygments/lexers/dotnet.py,sha256=NDE0kOmpe96GLO-zwNLazmj77E9ORGmKpa4ZMCXDXxQ,39441 +pygments/lexers/dsls.py,sha256=GnHKhGL5GxsRFnqC7-65NTPZLOZdmnllNrGP86x_fQE,36746 +pygments/lexers/dylan.py,sha256=7zZ1EbHWXeVHqTD36AqykKqo3fhuIh4sM-whcxUaH_Y,10409 +pygments/lexers/ecl.py,sha256=vhmpa2LBrHxsPkYcf3kPZ1ItVaLRDTebi186wY0xGZA,6371 +pygments/lexers/eiffel.py,sha256=5ydYIEFcgcMoEj4BlK31hZ0aJb8OX0RdAvuCNdlxwqw,2690 +pygments/lexers/elm.py,sha256=uRCddU8jK5vVkH6Y66y8KOsDJprIfrOgeYq3hv1PxAM,3152 +pygments/lexers/elpi.py,sha256=O9j_WKBPyvNFjCRuPciVpW4etVSnILm_T79BhCPZYmo,6877 +pygments/lexers/email.py,sha256=ZZL6yvwCRl1CEQyysuOu0lbabp5tjMutS7f3efFKGR4,4804 +pygments/lexers/erlang.py,sha256=bU11eVHvooLwmVknzN6Xkb2DMk7HbenqdNlYSzhThDM,19147 +pygments/lexers/esoteric.py,sha256=Jfp8UUKyKYsqLaqXRZT3GSM9dzkF65zduwfnH1GoGhU,10500 +pygments/lexers/ezhil.py,sha256=22r-xjvvBVpExTqCI-HycAwunDb1p5gY4tIfDmM0vDw,3272 +pygments/lexers/factor.py,sha256=urZ4En4uKFCLXdEkXLWg9EYUFGHQTTDCwNXtyq-ngok,19530 +pygments/lexers/fantom.py,sha256=JJ13-NwykD-iIESnuzCefCYeQDO95cHMJA8TasF4gHA,10231 +pygments/lexers/felix.py,sha256=F-v0si4zPtRelqzDQWXI1-tarCE-BvawziODxRU7378,9655 +pygments/lexers/fift.py,sha256=rOCwp3v5ocK5YOWvt7Td3Md--97_8e-7Sonx52uS8mA,1644 +pygments/lexers/floscript.py,sha256=aHh82k52jMuDuzl9LatrcSANJiXTCyjGU3SO53bwbb0,2667 +pygments/lexers/forth.py,sha256=ZMtsHdNbnS_0IdSYlfAlfTSPEr0MEsRo-YZriQNueTQ,7193 +pygments/lexers/fortran.py,sha256=1PE5dTxf4Df6LUeXFcmNtyeXWsC8tSiK5dYwPHIJeeQ,10382 +pygments/lexers/foxpro.py,sha256=CBkW62Fuibz3yfyelZCaEO8GGdFJWsuRhqwtsSeBwLM,26295 +pygments/lexers/freefem.py,sha256=LFBQk-m1-nNCgrl-VDH3QwnVWurvb7W29i06LoT207A,26913 +pygments/lexers/func.py,sha256=OR2rkM7gf9fKvad5WcFQln-_U_pb-RUCM9eQatToF4A,3700 +pygments/lexers/functional.py,sha256=fYT2AGZ642cRkIAId0rnXFBsx1c8LLEDRN_VuCEkUyM,693 +pygments/lexers/futhark.py,sha256=Vf1i4t-tR3zqaktVjhTzFNg_ts_9CcyA4ZDfDizbCmk,3743 +pygments/lexers/gcodelexer.py,sha256=4Xs9ax4-JZGupW_qSnHon39wQGpb-tNA3xorMKg841E,874 +pygments/lexers/gdscript.py,sha256=Ws7JKxy0M0IyZ_1iMfRvJPrizEwmeCNLDoeMIFaM-CU,7566 +pygments/lexers/gleam.py,sha256=XIlTcq6cB743pCqbNYo8PocSkjZyDPR6hHgdaJNJ1Vc,2392 +pygments/lexers/go.py,sha256=4LezefgyuqZWHzLZHieUkKTi-ssY6aHJxx7Z-LFaLK0,3783 +pygments/lexers/grammar_notation.py,sha256=LvzhRQHgwZzq9oceukZS_hwnKK58ee7Z5d0cwXOR734,8043 +pygments/lexers/graph.py,sha256=WFqoPA1c_hHYrV0i_F7-eUw3Co4_HmZY3GJ-TyDr670,4108 +pygments/lexers/graphics.py,sha256=tmF9NNALnvPnax8ywYC3pLOla45YXtp9UA0H-5EiTQY,39145 +pygments/lexers/graphql.py,sha256=O_zcrGrBaDaKTlUoJGRruxqk7CJi-NR92Y0Cs-KkCvw,5601 +pygments/lexers/graphviz.py,sha256=mzdXOMpwz9_V-be1eTAMyhkKCBl6UxCIXuq6C2yrtsw,1934 +pygments/lexers/gsql.py,sha256=VPZk9sb26-DumRkWfEaSTeoc0lx5xt5n-6eDDLezMtc,3990 +pygments/lexers/hare.py,sha256=PGCOuILktJsmtTpCZZKkMFtObfJuBpei8HM8HHuq1Tw,2649 +pygments/lexers/haskell.py,sha256=MYr74-PAC8kGJRX-dZmvZsHTc7a2u6yFS2B19LfDD7g,33262 +pygments/lexers/haxe.py,sha256=WHCy_nrXHnfLITfbdp3Ji3lqQU4HAsTUpXsLCp2_4sk,30974 +pygments/lexers/hdl.py,sha256=MOWxhmAuE4Ei0CKDqqaON7T8tl43geancrNYM136Z0U,22738 +pygments/lexers/hexdump.py,sha256=1lj9oJ-KiZXSVYvTMfGmEAQzNEW08WlMcC2I5aYvHK4,3653 +pygments/lexers/html.py,sha256=MxYTI4EeT7QxoGleCAyQq-8n_Sgly6tD95H5zanCNmk,21977 +pygments/lexers/idl.py,sha256=rcihUAGhfuGEaSW6pgFq6NzplT_pv0DagUoefg4zAmk,15449 +pygments/lexers/igor.py,sha256=wVefbUjb3ftaW3LCKGtX1JgLgiY4EmRor5gVOn8vQA8,31633 +pygments/lexers/inferno.py,sha256=ChE_5y5SLH_75Uv7D2dKWQMk2dlN6z1gY1IDjlJZ8rU,3135 +pygments/lexers/installers.py,sha256=ZHliit4Pxz1tYKOIjKkDXI5djTkpzYUMVIPR1xvUrL8,14435 +pygments/lexers/int_fiction.py,sha256=0ZzIa1sZDUQsltd1oHuS-BoNiOF8zKQfcVuDyK1Ttv8,56544 +pygments/lexers/iolang.py,sha256=L6dNDCLH0kxkIUi00fI4Z14QnRu79UcNDrgv02c5Zw8,1905 +pygments/lexers/j.py,sha256=DqNdwQGFLiZW3mCNLRg81gpmsy4Hgcai_9NP3LbWhNU,4853 +pygments/lexers/javascript.py,sha256=TGKQLSrCprCKfhLLGAq_0EOdvqvJKX9pOdKo7tCRurQ,63243 +pygments/lexers/jmespath.py,sha256=R5yA5LJ2nTIaDwnFIpSNGAThd0sAYFccwawA9xBptlg,2082 +pygments/lexers/jslt.py,sha256=OeYQf8O2_9FCaf9W6Q3a7rPdAFLthePCtVSgCrOTcl8,3700 +pygments/lexers/json5.py,sha256=8JZbc8EiTEZdKaIdQg3hXEh0mHWSzPlwd473a0nUuT0,2502 +pygments/lexers/jsonnet.py,sha256=bx2G6J4tJqGrJV1PyZrIWzWHXcoefCX-4lIxxtbn2gw,5636 +pygments/lexers/jsx.py,sha256=wGsoGSB40qAJrVfXwRPtan7OcK0O87RVsHHk0m6gogk,2693 +pygments/lexers/julia.py,sha256=0ZDJ9X83V5GqJzA6T6p0TTN8WHy2JAjvu-FSBXvfXdc,11710 +pygments/lexers/jvm.py,sha256=Yt1iQ3QodXRY-x_HUOGedhyuBBHn5jYH-I8NzOzHTlE,72667 +pygments/lexers/kuin.py,sha256=3dKKJVJlskgrvMKv2tY9NOsFfDjyo-3MLcJ1lFKdXSg,11405 +pygments/lexers/kusto.py,sha256=kaxkoPpEBDsBTCvCOkZZx7oGfv0jk_UNIRIRbfVAsBE,3477 +pygments/lexers/ldap.py,sha256=77vF4t_19x9V522cxRCM5d3HW8Ne3giYsFsMPVYYBw4,6551 +pygments/lexers/lean.py,sha256=7HWRgxFsxS1N9XKqw0vfKwaxl27s5YiVYtZeRUoTHFo,8570 +pygments/lexers/lilypond.py,sha256=yd2Tuv67um6EyCIr-VwBnlPhTHxMaQsBJ4nGgO5fjIk,9752 +pygments/lexers/lisp.py,sha256=EHUy1g4pzEsYPE-zGj2rAXm3YATE1j9dCQOr5-JPSkU,157668 +pygments/lexers/macaulay2.py,sha256=zkV-vxjQYa0Jj9TGfFP1iMgpTZ4ApQuAAIdJVGWb2is,33366 +pygments/lexers/make.py,sha256=YMI5DBCrxWca-pz9cVXcyfuHLcikPx9R_3pW_98Myqo,7831 +pygments/lexers/maple.py,sha256=Rs0dEmOMD3C1YQPd0mntN-vzReq4XfHegH6xV4lvJWo,7960 +pygments/lexers/markup.py,sha256=zWtxsyIx_1OxQzS6wLe8bEqglePv4RqvJjbia8AvV5c,65088 +pygments/lexers/math.py,sha256=P3ZK1ePd8ZnLdlmHezo2irCA8T2-nlHBoSaBoT5mEVI,695 +pygments/lexers/matlab.py,sha256=F9KO4qowIhfP8oVhCRRzE_1sqg4zmQbsB2NZH193PiM,133027 +pygments/lexers/maxima.py,sha256=a0h9Ggs9JEovTrzbJT-BLVbOqI29yPnaMZlkU5f_FeY,2715 +pygments/lexers/meson.py,sha256=BMrsDo6BH2lzTFw7JDwQ9SDNMTrRkXCNRDVf4aFHdsI,4336 +pygments/lexers/mime.py,sha256=yGrf3h37LK4b6ERBpFiL_qzn3JgOfGR5KLagnbWFl6c,7582 +pygments/lexers/minecraft.py,sha256=Nu88snDDPzM0D-742fFdUriczL-EE911pAd4_I4-pAw,13696 +pygments/lexers/mips.py,sha256=STKiZT67b3QERXXn7XKVxlPBu7vwbPC5EyCpuf3Jfbw,4656 +pygments/lexers/ml.py,sha256=t8sCv4BjvuBq6AihKKUwStEONIgdXCC2RMtO0RopNbM,35390 +pygments/lexers/modeling.py,sha256=M7B58bGB-Zwd1EmPxKqtRvg7TgNCyem3MVUHv0_H2SQ,13683 +pygments/lexers/modula2.py,sha256=NtpXBRoUCeHfflgB39LknSkCwhBHBKv2Er_pinjVsNE,53072 +pygments/lexers/mojo.py,sha256=8JRVoftN1E-W2woG0K-4n8PQXTUM9iY6Sl5sWb2uGNg,24233 +pygments/lexers/monte.py,sha256=baWU6zlXloenw9MO1MtEVGE9i3CfiXAYhqU621MIjRk,6289 +pygments/lexers/mosel.py,sha256=gjRdedhA1jTjoYoM1Gpaoog_I9o7TRbYMHk97N1TXwg,9297 +pygments/lexers/ncl.py,sha256=zJ6ahlitit4S0pBXc7Wu96PB7xOn59MwfR2HdY5_C60,63999 +pygments/lexers/nimrod.py,sha256=Q1NSqEkLC5wWt7xJyKC-vzWw_Iw2SfDNP_pyMFBuIfA,6413 +pygments/lexers/nit.py,sha256=p_hVD8GzMRl3CABVKHtYgnXFUQk0i5F2FbWFA6WXm6s,2725 +pygments/lexers/nix.py,sha256=NOrv20gdq-2A7eZ6c2gElPHv1Xx2pvv20-qOymL9GMg,4421 +pygments/lexers/numbair.py,sha256=fxkp2CXeXWKBMewfi1H4JSYkmm4kU58wZ2Sh9BDYAWQ,1758 +pygments/lexers/oberon.py,sha256=jw403qUUs7zpTHAs5CbLjb8qiuwtxLk0spDIYqGZwAw,4210 +pygments/lexers/objective.py,sha256=Fo1WB3JMj8sNeYnvB84H4_qwhOt4WNJtJWjVEOwrJGk,23297 +pygments/lexers/ooc.py,sha256=kD1XaJZaihDF_s-Vyu1Bx68S_9zFt2rhox7NF8LpOZM,3002 +pygments/lexers/openscad.py,sha256=h9I1k8kiuQmhX5vZm6VDSr2fa5Finy0sN8ZDIE-jx1c,3700 +pygments/lexers/other.py,sha256=WLVyqPsvm9oSXIbZwbfyJloS6HGgoFW5nVTaU1uQpTw,1763 +pygments/lexers/parasail.py,sha256=DWMGhtyQgGTXbIgQl_mID6CKqi-Dhbvs_dTkmvrZXfE,2719 +pygments/lexers/parsers.py,sha256=feNgxroPoWRf0NEsON2mtmKDUfslIQppukw6ndEsQ3M,26596 +pygments/lexers/pascal.py,sha256=N2tRAjlXnTxggAzzk2tOOAVzeC2MBzrXy97_HQl5n44,30989 +pygments/lexers/pawn.py,sha256=LWUYQYsebMMt2d5oxX1HYWvBqbakR1h7Av_z8Vw94Wg,8253 +pygments/lexers/pddl.py,sha256=Mk4_BzlROJCd0xR4KKRRSrbj0F7LLQcBRjmsmtWmrCg,2989 +pygments/lexers/perl.py,sha256=9BXn3tyHMA49NvzbM9E2czSCHjeU7bvaPLUcoZrhz-4,39192 +pygments/lexers/phix.py,sha256=hZqychqo5sFMBDESzDPXg1DYHQe_9sn294UfbjihaFk,23249 +pygments/lexers/php.py,sha256=l4hzQrlm0525i5dSw9Vmjcai3TzbPT6DkjzxPg9l6Zc,13061 +pygments/lexers/pointless.py,sha256=WSDjqQyGrNIGmTCdaMxl4zk7OZTlJAMzeUZ02kfgcTI,1974 +pygments/lexers/pony.py,sha256=EXrMkacqMZblI7v4AvBRQe-3Py8__bx5FOgjCLdfXxQ,3279 +pygments/lexers/praat.py,sha256=4UFK-nbC6WkZBhJgcQqEGqq9CocJkW7AmT_OJQbjWzk,12676 +pygments/lexers/procfile.py,sha256=05W2fyofLTP-FbEdSXD1eles-PPqVNfF6RWXjQdW2us,1155 +pygments/lexers/prolog.py,sha256=9Kc5YNUFqkfWu2sYoyzC3RX65abf1bm7oHr86z1s4kQ,12866 +pygments/lexers/promql.py,sha256=n-0vo-o8-ZasqP3Va4ujs562UfZSLfZF-RzT71yL0Tk,4738 +pygments/lexers/prql.py,sha256=PFReuvhbv4K5aeu6lvDfw4m-3hULkB3r43bKAy948os,8747 +pygments/lexers/ptx.py,sha256=KSHAvbiNVUntKilQ6EPYoLFocmJpRsBy_7fW6_Nrs1Y,4501 +pygments/lexers/python.py,sha256=WZe7fBAHKZ_BxPg8qIU26UGhk8qwUYyENJ3IyPW64mc,53805 +pygments/lexers/q.py,sha256=WQFUh3JrpK2j-VGW_Ytn3uJ5frUNmQIFnLtMVGRA9DI,6936 +pygments/lexers/qlik.py,sha256=2wqwdfIjrAz6RNBsP4MyeLX8Z7QpIGzxtf1CvaOlr_g,3693 +pygments/lexers/qvt.py,sha256=XMBnsWRrvCDf989OuDeb-KpszAkeETiACyaghZeL1ns,6103 +pygments/lexers/r.py,sha256=B6WgrD9SY1UTCV1fQBSlZbezPfpYsARn3FQIHcFYOiM,6474 +pygments/lexers/rdf.py,sha256=qUzxLna9v071bHhZAjdsBi8dKaJNk_h9g1ZRUAYCfoo,16056 +pygments/lexers/rebol.py,sha256=4u3N4kzui55HapopXDu3Kt0jczxDZ4buzwR7Mt4tQiM,18259 +pygments/lexers/rego.py,sha256=Rx5Gphbktr9ojg5DbqlyxHeQqqtF7g8W-oF0rmloDNY,1748 +pygments/lexers/resource.py,sha256=ioEzgWksB5HCjoz85XNkQPSd7n5kL0SZiuPkJP1hunQ,2927 +pygments/lexers/ride.py,sha256=kCWdxuR3PclVi4wiA0uUx4CYEFwuTqoMsKjhSW4X3yg,5035 +pygments/lexers/rita.py,sha256=Mj1QNxx1sWAZYC02kw8piVckaiw9B0MqQtiIiDFH0pA,1127 +pygments/lexers/rnc.py,sha256=g7ZD334PMGUqy_Ij64laSN1vJerwHqVkegfMCa3E-y8,1972 +pygments/lexers/roboconf.py,sha256=HbYuK5CqmQdd63SRY2nle01r7-p7mil0SnoauYDmEOY,2074 +pygments/lexers/robotframework.py,sha256=c4U1B9Q9ITBCTohqJTZOvkfyeVbenN4xhzSWIoZh5eU,18448 +pygments/lexers/ruby.py,sha256=uG617E5abBZcECRCqkhIfc-IbZcRb5cGuUZq_xpax90,22753 +pygments/lexers/rust.py,sha256=ZY-9vtsreBP0NfDd0WCouLSp_9MChAL8U8Abe-m9PB8,8260 +pygments/lexers/sas.py,sha256=C1Uz2s9DU6_s2kL-cB_PAGPtpyK5THlmhNmCumC1l48,9456 +pygments/lexers/savi.py,sha256=jrmruK0GnXktgBTWXW3oN3TXtofn3HBbkMlHnR84cko,4878 +pygments/lexers/scdoc.py,sha256=DXRmFDmYuc7h3gPAAVhfcL1OEbNBK5RdPpJqQzF3ZTk,2524 +pygments/lexers/scripting.py,sha256=eaYlkDK-_cAwTcCBHP6QXBCz8n6OzbhzdkRe0uV0xWY,81814 +pygments/lexers/sgf.py,sha256=w6C513ENaO2YCnqrduK7k03NaMDf-pgygvfzq2NaSRk,1985 +pygments/lexers/shell.py,sha256=dCS1zwkf5KwTog4__MnMC7h3Xmwv4_d3fnEV29tSwXI,36381 +pygments/lexers/sieve.py,sha256=eob-L84yf2jmhdNyYZUlbUJozdcd6GXcHW68lmAe8WE,2514 +pygments/lexers/slash.py,sha256=I-cRepmaxhL1SgYvD1hHX3gNBFI8NPszdU7hn1o5JlA,8484 +pygments/lexers/smalltalk.py,sha256=ue2PmqDK2sw0j75WdseiiENJBdZ1OwysH2Op1QN1r24,7204 +pygments/lexers/smithy.py,sha256=VREWoeuz7ANap_Uiopn7rs0Tnsfc-xBisDJKRGQY_y8,2659 +pygments/lexers/smv.py,sha256=He_VBSMbWONMWZmkrB5RYR0cfHVnMyKIXz68IFYl-a8,2805 +pygments/lexers/snobol.py,sha256=qDzb41xQQWMNmjB2MtZs23pFoFgZ2gbRZhK_Ir03r7I,2778 +pygments/lexers/solidity.py,sha256=Tixfnwku4Yezj6nNm8xVaw7EdV1qgAgdwahdTFP0St8,3163 +pygments/lexers/soong.py,sha256=Vm18vV4g6T8UPgjjY2yTRlSXGDpZowmuqQUBFfm4A9A,2339 +pygments/lexers/sophia.py,sha256=2YtYIT8iwAoW0B7TZuuoG_ZILhJV-2A7oBGat-98naE,3376 +pygments/lexers/special.py,sha256=8JuR2Vex8X-RWnC36S0HXTHWp2qmZclc90-TrLUWyaY,3585 +pygments/lexers/spice.py,sha256=m4nK0q4Sq_OFQez7kGWfki0No4ZV24YrONfHVj1Piqs,2790 +pygments/lexers/sql.py,sha256=WSG6vOsR87EEEwSQefP_Z7TauUG_BjqMHUFmPaSOVj4,41476 +pygments/lexers/srcinfo.py,sha256=B8vDs-sJogG3mWa5Hp_7JfHHUMyYRwGvKv6cKbFQXLM,1746 +pygments/lexers/stata.py,sha256=Zr9BC52D5O_3BbdW0N-tzoUmy0NTguL2sC-saXRVM-c,6415 +pygments/lexers/supercollider.py,sha256=_H5wDrn0DiGnlhB_cz6Rt_lo2TvqjSm0o6NPTd9R4Ko,3697 +pygments/lexers/tablegen.py,sha256=1JjedXYY18BNiY9JtNGLOtGfiwduNDZpQLBGTeQ6jAw,3987 +pygments/lexers/tact.py,sha256=X_lsxjFUMaC1TmYysXJq9tmAGifRnil83Bt1zA86Xdo,10809 +pygments/lexers/tal.py,sha256=xS9PlaWQOPj8MVr56fUNq31vUQKRWoLTlyWj9ZHm8AM,2904 +pygments/lexers/tcl.py,sha256=lK97ju4nikkt-oGOzIeyFEM98yq4dZSI8uEmYsq0R6c,5512 +pygments/lexers/teal.py,sha256=t3dqy_Arwv8_yExbX_xiFxv1TqJLPv4vh1MVKjKwS4Y,3522 +pygments/lexers/templates.py,sha256=BVdjYeoacIUuFyHTG39j4PxeNCe5E1oUURjH1rITrI4,75731 +pygments/lexers/teraterm.py,sha256=ciwztagW5Drg2gr17Qykrh6GwMsKy7e4xdQshX95GyQ,9718 +pygments/lexers/testing.py,sha256=YZgDgUEaLEYKSKEqpDsUi3Bn-Db_D42IlyiSsr1oX8U,10810 +pygments/lexers/text.py,sha256=nOCQPssIlKdVWU3PKxZiBPkf_KFM2V48IOssSyqhFY8,1068 +pygments/lexers/textedit.py,sha256=ttT4Ph-hIdgFLG6maRy_GskkziTFK0Wcg28yU0s6lek,7760 +pygments/lexers/textfmts.py,sha256=mi9KLEq4mrzDJbEc8G3VM-mSki_Tylkzodu47yH6z84,15524 +pygments/lexers/theorem.py,sha256=51ppBAEdhJmwU_lC916zMyjEoKLXqf89VAE_Lr0PNCc,17855 +pygments/lexers/thingsdb.py,sha256=x_fHNkLA-hIJyeIs6rg_X8n5OLYvFqaSu1FhI3apI5Y,6017 +pygments/lexers/tlb.py,sha256=ue2gqm45BI512lM13O8skAky9zAb7pLMrxZ8pbt5zRU,1450 +pygments/lexers/tls.py,sha256=_uQUVuMRDOhN-XUyGR5DIlVCk1CUZ1fIOSN4_WQYPKk,1540 +pygments/lexers/tnt.py,sha256=pK4LgoKON7u1xF66JYFncAPSbD8DZaeI_WTZ9HqEFlY,10456 +pygments/lexers/trafficscript.py,sha256=X3B8kgxS54ecuok9ic6Hkp-UMn5DvOmCK0p70Tz27Cw,1506 +pygments/lexers/typoscript.py,sha256=mBuePiVZUoAORPKsHwrx6fBWiy3fAIqG-2O67QmMiFI,8332 +pygments/lexers/typst.py,sha256=zIJBEhUXtWp5OiyAmvFA5m8d1EQG-ocwrJ677dvTUAk,7167 +pygments/lexers/ul4.py,sha256=rCaw0J9j3cdql9lX_HTilg65k9-9S118zOA6TAYfxaM,10499 +pygments/lexers/unicon.py,sha256=RAqoCnAAJBYOAGdR8ng0g6FtB39bGemLRlIqv5mcg9E,18625 +pygments/lexers/urbi.py,sha256=ajNP70NJg32jNnFDZsLvr_-4TToSGqRGkFyAPIJLfCU,6082 +pygments/lexers/usd.py,sha256=2eEGouolodYS402P_gtBrn4lLzpg1z8uHwPCKqjUb_k,3304 +pygments/lexers/varnish.py,sha256=dSh0Ku9SrjmlB29Fi_mWdWavN7M0cMKeepR4a34sOyI,7473 +pygments/lexers/verification.py,sha256=Qu433Q_h3EK3uS4bJoLRFZK0kIVwzX5AFKsa4Z-qnxA,3934 +pygments/lexers/verifpal.py,sha256=buyOOzCo_dGnoC40h0tthylHVVpgDt8qXu4olLvYy_4,2661 +pygments/lexers/vip.py,sha256=2lEV4cLV9p4E37wctBL7zkZ4ZU4p3HVsiLJFzB1bie0,5711 +pygments/lexers/vyper.py,sha256=Zq6sQIUBk6mBdpgOVgu3A6swGoBne0kDlRyjZznm2BY,5615 +pygments/lexers/web.py,sha256=4W9a7vcskrGJnxt4KmoE3SZydWB1qLq7lP2XS85J_m8,913 +pygments/lexers/webassembly.py,sha256=zgcMouzLawcbeFr6w_SOvGoUR68ZtqnnsbOcWEVleLk,5698 +pygments/lexers/webidl.py,sha256=ODtVmw4gVzI8HQWxuEckP6KMwm8WP2G2lSZEjagDXts,10516 +pygments/lexers/webmisc.py,sha256=-_-INDVdk47e2jlj-9bFcuLtntqVorBqIjlnwPfZFdI,40564 +pygments/lexers/wgsl.py,sha256=9igd9dzixGIgNewruv9mPnFms-c9BahkZcCCrZygv84,11880 +pygments/lexers/whiley.py,sha256=lMr750lA4MZsB4xqzVsIRtVMJIC3_dArhFYTHvOPwvA,4017 +pygments/lexers/wowtoc.py,sha256=8xxvf0xGeYtf4PE7KtkHZ_ly9xY_XXHrpCitdKE42Ro,4076 +pygments/lexers/wren.py,sha256=goGXnAMKKa13LLL40ybT3aMGPrk3gCRwZQFYAkKB_w0,3229 +pygments/lexers/x10.py,sha256=Q-AmgdF2E-N7mtOPpZ07CsxrTVnikyqC4uRRv6H75sk,1943 +pygments/lexers/xorg.py,sha256=9ttrBd3_Y2nXANsqtMposSgblYmMYqWXQ-Iz5RH9RsU,925 +pygments/lexers/yang.py,sha256=13CWbSaNr9giOHz4o0SXSklh0bfWt0ah14jJGpTvcn0,4499 +pygments/lexers/yara.py,sha256=jUSv78KTDfguCoAoAZKbYzQERkkyxBBWv5dInVrkDxo,2427 +pygments/lexers/zig.py,sha256=f-80MVOSp1KnczAMokQLVM-_wAEOD16EcGFnaCNlsN0,3976 +pygments/styles/__init__.py,sha256=f9KCQXN4uKbe8aI8-L3qTC-_XPfT563FwTg6VTGVfwI,2006 +pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312 +pygments/styles/abap.py,sha256=64Uwr8uPdEdcT-tE-Y2VveTXfH3SkqH9qdMgY49YHQI,749 +pygments/styles/algol.py,sha256=fCuk8ITTehvbJSufiaKlgnFsKbl-xFxxR82xhltc-cQ,2262 +pygments/styles/algol_nu.py,sha256=Gv9WfHJvYegGcUk1zcufQgsdXPNjCUNk8sAHyrSGGh4,2283 +pygments/styles/arduino.py,sha256=NoUB8xk7M1HGPoLfuySOLU0sVwoTuLcZqllXl2EO_iE,4557 +pygments/styles/autumn.py,sha256=fLLfjHXjxCl6crBAxEsBLH372ALMkFacA2bG6KFbJi4,2195 +pygments/styles/borland.py,sha256=_0ySKp4KGCSgtYjPe8uzD6gQhlmAIR4T43i-FoRYNOM,1611 +pygments/styles/bw.py,sha256=vhk8Xoj64fLPdA9IQU6mUVsYMel255jR-FDU7BjIHtI,1406 +pygments/styles/coffee.py,sha256=NqLt-fc7LONma1BGggbceVRY9uDE70WBuZXqK4zwaco,2308 +pygments/styles/colorful.py,sha256=mYcSbehtH7itH_QV9NqJp4Wna1X4lrwl2wkVXS2u-5A,2832 +pygments/styles/default.py,sha256=RTgG2zKWWUxPTDCFxhTnyZI_WZBIVgu5XsUpNvFisCA,2588 +pygments/styles/dracula.py,sha256=vRJmixBoSKV9o8NVQhXGViQqchhIYugfikLmvX0DoBw,2182 +pygments/styles/emacs.py,sha256=TiOG9oc83qToMCRMnJrXtWYqnzAqYycRz_50OoCKtxc,2535 +pygments/styles/friendly.py,sha256=oAi-l9anQTs9STDmUzXGDlOegatEOH4hpD0j6o6dZGM,2604 +pygments/styles/friendly_grayscale.py,sha256=a7Cqkzt6-uTiXvj6GoYBXzRvX5_zviCjjRB04Kf_-Q0,2828 +pygments/styles/fruity.py,sha256=GfSUTG0stlJr5Ow_saCaxbI2IB4-34Dp2TuRTpfUJBs,1324 +pygments/styles/gh_dark.py,sha256=ruNX3d4rf22rx-8HnwvGbNbXRQpXCNcHU1HNq6N4uNg,3590 +pygments/styles/gruvbox.py,sha256=KrFoHEoVnZW6XM9udyXncPomeGyZgIDsNWOH3kCrxFQ,3387 +pygments/styles/igor.py,sha256=fYYPhM0dRCvcDTMVrMVO5oFKnYm-8YVlsuVBoczFLtY,737 +pygments/styles/inkpot.py,sha256=jggSeX9NV15eOL2oJaVmZ6vmV7LWRzXJQRUqcWEqGRs,2404 +pygments/styles/lightbulb.py,sha256=Y8u1qdvlHfBqI2jJex55SkvVatVo_FjEUzE6h-X7m-0,3172 +pygments/styles/lilypond.py,sha256=Y6fp_sEL-zESmxAaMxzjtrKk90cuDC_DalNdC8wj0nw,2066 +pygments/styles/lovelace.py,sha256=cA9uhmbnzY04MccsiYSgMY7fvb4WMRbegWBUrGvXh1M,3178 +pygments/styles/manni.py,sha256=g9FyO7plTwfMm2cU4iiKgdlkMlvQLG6l2Lwkgz5ITS4,2443 +pygments/styles/material.py,sha256=LDmgomAbgtJDZhbv446_zIwgYh50UAqEEtgYNUns1rQ,4201 +pygments/styles/monokai.py,sha256=lrxTJpkBarV9gTLkBQryZ6oNSjekAVheJueKJP5iEYA,5184 +pygments/styles/murphy.py,sha256=-AKZiLkpiWej-otjHMsYCE-I-_IzCOLJY-_GBdKRZRw,2805 +pygments/styles/native.py,sha256=l6tezGSQTB8p_SyOXJ0PWI7KzCeEdtsPmVc4Yn4_CwU,2043 +pygments/styles/nord.py,sha256=GDt3WAaqaWsiCeqpIBPxd8TEUX708fGfwaA7S0w0oy0,5391 +pygments/styles/onedark.py,sha256=k80cZEppCEF-HLoxy_FEA0QmQDZze68nHVMNGyUVa28,1719 +pygments/styles/paraiso_dark.py,sha256=Jkrg4nUKIVNF8U4fPNV_Smq_g9NFbb9eiUrjYpVgQZg,5662 +pygments/styles/paraiso_light.py,sha256=MxN964ZEpze3wF0ss-igaa2I7E684MHe-Zq0rWPH3wo,5668 +pygments/styles/pastie.py,sha256=ZvAs9UpBNYFC-5PFrCRGYnm3FoPKb-eKR-ozbWZP-4g,2525 +pygments/styles/perldoc.py,sha256=HSxB93e4UpQkZspReQ34FeJbZ-59ksGvdaH-hToehi8,2230 +pygments/styles/rainbow_dash.py,sha256=4ugL18Or7aNtaLfPfCLFRiFy0Gu2RA4a9G2LQUE9SrM,2390 +pygments/styles/rrt.py,sha256=fgzfpC0PC_SCcLOMCNEIQTjPUMOncRe7SR10GfSRbXY,1006 +pygments/styles/sas.py,sha256=yzoXmbfQ2ND1WWq93b4vVGYkQSZHPqb4ymes9YYRT3w,1440 +pygments/styles/solarized.py,sha256=qupILFZn02WspnAF5SPYb-W8guo9xnUtjb1HeLw3XgE,4247 +pygments/styles/staroffice.py,sha256=CLbBeMoxay21Xyu3Af2p4xUXyG1_6ydCbvs5RJKYe5w,831 +pygments/styles/stata_dark.py,sha256=vX8SwHV__sG92F4CKribG08MJfSVq98dgs7gEA_n9yc,1257 +pygments/styles/stata_light.py,sha256=uV3GE-ylvffQ0yN3py1YAVqBB5wflIKZbceyK1Lqvrc,1289 +pygments/styles/tango.py,sha256=O2wcM4hHuU1Yt071M9CK7JPtiiSCqyxtT9tbiQICV28,7137 +pygments/styles/trac.py,sha256=9kMv1ZZyMKACWlx2fQVjRP0I2pgcRYCNrd7iGGZg9qk,1981 +pygments/styles/vim.py,sha256=J7_TqvrGkTX_XuTHW0In5wqPLAUPRWyr1122XueZWmM,2019 +pygments/styles/vs.py,sha256=s7YnzbIPuFU3LIke27mc4lAQSn2R3vbbHc1baMGSU_U,1130 +pygments/styles/xcode.py,sha256=PbQdzgGaA4a9LAU1i58alY9kM4IFlQX5jHQwOYmf_Rk,1504 +pygments/styles/zenburn.py,sha256=suZEKzBTCYdhf2cxNwcY7UATJK1tq5eYhGdBcXdf6MU,2203 +pygments-2.19.2.dist-info/METADATA,sha256=euEA1n1nAGxkeYA92DX89HqbWfrHlEQeqOZqp_WYTYI,2512 +pygments-2.19.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +pygments-2.19.2.dist-info/entry_points.txt,sha256=uUXw-XhMKBEX4pWcCtpuTTnPhL3h7OEE2jWi51VQsa8,53 +pygments-2.19.2.dist-info/licenses/AUTHORS,sha256=BmDjGKbyFYAq3Icxq4XQxl_yfPzKP10oWX8wZHYZW9k,10824 +pygments-2.19.2.dist-info/licenses/LICENSE,sha256=qdZvHVJt8C4p3Oc0NtNOVuhjL0bCdbvf_HBWnogvnxc,1331 +pygments-2.19.2.dist-info/RECORD,, diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/WHEEL b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/WHEEL new file mode 100644 index 000000000..12228d414 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/entry_points.txt b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/entry_points.txt new file mode 100644 index 000000000..15498e35f --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +pygmentize = pygments.cmdline:main diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/licenses/AUTHORS b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/licenses/AUTHORS new file mode 100644 index 000000000..811c66ae1 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/licenses/AUTHORS @@ -0,0 +1,291 @@ +Pygments is written and maintained by Georg Brandl . + +Major developers are Tim Hatch and Armin Ronacher +. + +Other contributors, listed alphabetically, are: + +* Sam Aaron -- Ioke lexer +* Jean Abou Samra -- LilyPond lexer +* João Abecasis -- JSLT lexer +* Ali Afshar -- image formatter +* Thomas Aglassinger -- Easytrieve, JCL, Rexx, Transact-SQL and VBScript + lexers +* Maxence Ahlouche -- PostgreSQL Explain lexer +* Muthiah Annamalai -- Ezhil lexer +* Nikolay Antipov -- OpenSCAD lexer +* Kumar Appaiah -- Debian control lexer +* Andreas Amann -- AppleScript lexer +* Timothy Armstrong -- Dart lexer fixes +* Jeffrey Arnold -- R/S, Rd, BUGS, Jags, and Stan lexers +* Eiríkr Åsheim -- Uxntal lexer +* Jeremy Ashkenas -- CoffeeScript lexer +* José Joaquín Atria -- Praat lexer +* Stefan Matthias Aust -- Smalltalk lexer +* Lucas Bajolet -- Nit lexer +* Ben Bangert -- Mako lexers +* Max Battcher -- Darcs patch lexer +* Thomas Baruchel -- APL lexer +* Tim Baumann -- (Literate) Agda lexer +* Paul Baumgart, 280 North, Inc. -- Objective-J lexer +* Michael Bayer -- Myghty lexers +* Thomas Beale -- Archetype lexers +* John Benediktsson -- Factor lexer +* David Benjamin, Google LLC -- TLS lexer +* Trevor Bergeron -- mIRC formatter +* Vincent Bernat -- LessCSS lexer +* Christopher Bertels -- Fancy lexer +* Sébastien Bigaret -- QVT Operational lexer +* Jarrett Billingsley -- MiniD lexer +* Adam Blinkinsop -- Haskell, Redcode lexers +* Stéphane Blondon -- Procfile, SGF and Sieve lexers +* Frits van Bommel -- assembler lexers +* Pierre Bourdon -- bugfixes +* Martijn Braam -- Kernel log lexer, BARE lexer +* JD Browne, Google LLC -- GoogleSQL lexer +* Matthias Bussonnier -- ANSI style handling for terminal-256 formatter +* chebee7i -- Python traceback lexer improvements +* Hiram Chirino -- Scaml and Jade lexers +* Mauricio Caceres -- SAS and Stata lexers. +* Michael Camilleri, John Gabriele, sogaiu -- Janet lexer +* Daren Chandisingh -- Gleam lexer +* Ian Cooper -- VGL lexer +* David Corbett -- Inform, Jasmin, JSGF, Snowball, and TADS 3 lexers +* Leaf Corcoran -- MoonScript lexer +* Fraser Cormack -- TableGen lexer +* Gabriel Corona -- ASN.1 lexer +* Christopher Creutzig -- MuPAD lexer +* Daniël W. Crompton -- Pike lexer +* Pete Curry -- bugfixes +* Bryan Davis -- EBNF lexer +* Bruno Deferrari -- Shen lexer +* Walter Dörwald -- UL4 lexer +* Luke Drummond -- Meson lexer +* Giedrius Dubinskas -- HTML formatter improvements +* Owen Durni -- Haxe lexer +* Alexander Dutton, Oxford University Computing Services -- SPARQL lexer +* James Edwards -- Terraform lexer +* Nick Efford -- Python 3 lexer +* Sven Efftinge -- Xtend lexer +* Artem Egorkine -- terminal256 formatter +* Matthew Fernandez -- CAmkES lexer +* Paweł Fertyk -- GDScript lexer, HTML formatter improvements +* Michael Ficarra -- CPSA lexer +* James H. Fisher -- PostScript lexer +* Amanda Fitch, Google LLC -- GoogleSQL lexer +* William S. Fulton -- SWIG lexer +* Carlos Galdino -- Elixir and Elixir Console lexers +* Michael Galloy -- IDL lexer +* Naveen Garg -- Autohotkey lexer +* Simon Garnotel -- FreeFem++ lexer +* Laurent Gautier -- R/S lexer +* Alex Gaynor -- PyPy log lexer +* Richard Gerkin -- Igor Pro lexer +* Alain Gilbert -- TypeScript lexer +* Alex Gilding -- BlitzBasic lexer +* GitHub, Inc -- DASM16, Augeas, TOML, and Slash lexers +* Bertrand Goetzmann -- Groovy lexer +* Krzysiek Goj -- Scala lexer +* Rostyslav Golda -- FloScript lexer +* Andrey Golovizin -- BibTeX lexers +* Matt Good -- Genshi, Cheetah lexers +* Michał Górny -- vim modeline support +* Alex Gosse -- TrafficScript lexer +* Patrick Gotthardt -- PHP namespaces support +* Hubert Gruniaux -- C and C++ lexer improvements +* Olivier Guibe -- Asymptote lexer +* Phil Hagelberg -- Fennel lexer +* Florian Hahn -- Boogie lexer +* Martin Harriman -- SNOBOL lexer +* Matthew Harrison -- SVG formatter +* Steven Hazel -- Tcl lexer +* Dan Michael Heggø -- Turtle lexer +* Aslak Hellesøy -- Gherkin lexer +* Greg Hendershott -- Racket lexer +* Justin Hendrick -- ParaSail lexer +* Jordi Gutiérrez Hermoso -- Octave lexer +* David Hess, Fish Software, Inc. -- Objective-J lexer +* Ken Hilton -- Typographic Number Theory and Arrow lexers +* Varun Hiremath -- Debian control lexer +* Rob Hoelz -- Perl 6 lexer +* Doug Hogan -- Mscgen lexer +* Ben Hollis -- Mason lexer +* Max Horn -- GAP lexer +* Fred Hornsey -- OMG IDL Lexer +* Alastair Houghton -- Lexer inheritance facility +* Tim Howard -- BlitzMax lexer +* Dustin Howett -- Logos lexer +* Ivan Inozemtsev -- Fantom lexer +* Hiroaki Itoh -- Shell console rewrite, Lexers for PowerShell session, + MSDOS session, BC, WDiff +* Brian R. Jackson -- Tea lexer +* Christian Jann -- ShellSession lexer +* Jonas Camillus Jeppesen -- Line numbers and line highlighting for + RTF-formatter +* Dennis Kaarsemaker -- sources.list lexer +* Dmitri Kabak -- Inferno Limbo lexer +* Igor Kalnitsky -- vhdl lexer +* Colin Kennedy - USD lexer +* Alexander Kit -- MaskJS lexer +* Pekka Klärck -- Robot Framework lexer +* Gerwin Klein -- Isabelle lexer +* Eric Knibbe -- Lasso lexer +* Stepan Koltsov -- Clay lexer +* Oliver Kopp - Friendly grayscale style +* Adam Koprowski -- Opa lexer +* Benjamin Kowarsch -- Modula-2 lexer +* Domen Kožar -- Nix lexer +* Oleh Krekel -- Emacs Lisp lexer +* Alexander Kriegisch -- Kconfig and AspectJ lexers +* Marek Kubica -- Scheme lexer +* Jochen Kupperschmidt -- Markdown processor +* Gerd Kurzbach -- Modelica lexer +* Jon Larimer, Google Inc. -- Smali lexer +* Olov Lassus -- Dart lexer +* Matt Layman -- TAP lexer +* Dan Lazin, Google LLC -- GoogleSQL lexer +* Kristian Lyngstøl -- Varnish lexers +* Sylvestre Ledru -- Scilab lexer +* Chee Sing Lee -- Flatline lexer +* Mark Lee -- Vala lexer +* Thomas Linder Puls -- Visual Prolog lexer +* Pete Lomax -- Phix lexer +* Valentin Lorentz -- C++ lexer improvements +* Ben Mabey -- Gherkin lexer +* Angus MacArthur -- QML lexer +* Louis Mandel -- X10 lexer +* Louis Marchand -- Eiffel lexer +* Simone Margaritelli -- Hybris lexer +* Tim Martin - World of Warcraft TOC lexer +* Kirk McDonald -- D lexer +* Gordon McGregor -- SystemVerilog lexer +* Stephen McKamey -- Duel/JBST lexer +* Brian McKenna -- F# lexer +* Charles McLaughlin -- Puppet lexer +* Kurt McKee -- Tera Term macro lexer, PostgreSQL updates, MySQL overhaul, JSON lexer +* Joe Eli McIlvain -- Savi lexer +* Lukas Meuser -- BBCode formatter, Lua lexer +* Cat Miller -- Pig lexer +* Paul Miller -- LiveScript lexer +* Hong Minhee -- HTTP lexer +* Michael Mior -- Awk lexer +* Bruce Mitchener -- Dylan lexer rewrite +* Reuben Morais -- SourcePawn lexer +* Jon Morton -- Rust lexer +* Paulo Moura -- Logtalk lexer +* Mher Movsisyan -- DTD lexer +* Dejan Muhamedagic -- Crmsh lexer +* Adrien Nayrat -- PostgreSQL Explain lexer +* Ana Nelson -- Ragel, ANTLR, R console lexers +* David Neto, Google LLC -- WebGPU Shading Language lexer +* Kurt Neufeld -- Markdown lexer +* Nam T. Nguyen -- Monokai style +* Jesper Noehr -- HTML formatter "anchorlinenos" +* Mike Nolta -- Julia lexer +* Avery Nortonsmith -- Pointless lexer +* Jonas Obrist -- BBCode lexer +* Edward O'Callaghan -- Cryptol lexer +* David Oliva -- Rebol lexer +* Pat Pannuto -- nesC lexer +* Jon Parise -- Protocol buffers and Thrift lexers +* Benjamin Peterson -- Test suite refactoring +* Ronny Pfannschmidt -- BBCode lexer +* Dominik Picheta -- Nimrod lexer +* Andrew Pinkham -- RTF Formatter Refactoring +* Clément Prévost -- UrbiScript lexer +* Tanner Prynn -- cmdline -x option and loading lexers from files +* Oleh Prypin -- Crystal lexer (based on Ruby lexer) +* Nick Psaris -- K and Q lexers +* Xidorn Quan -- Web IDL lexer +* Elias Rabel -- Fortran fixed form lexer +* raichoo -- Idris lexer +* Daniel Ramirez -- GDScript lexer +* Kashif Rasul -- CUDA lexer +* Nathan Reed -- HLSL lexer +* Justin Reidy -- MXML lexer +* Jonathon Reinhart, Google LLC -- Soong lexer +* Norman Richards -- JSON lexer +* Corey Richardson -- Rust lexer updates +* Fabrizio Riguzzi -- cplint leder +* Lubomir Rintel -- GoodData MAQL and CL lexers +* Andre Roberge -- Tango style +* Georg Rollinger -- HSAIL lexer +* Michiel Roos -- TypoScript lexer +* Konrad Rudolph -- LaTeX formatter enhancements +* Mario Ruggier -- Evoque lexers +* Miikka Salminen -- Lovelace style, Hexdump lexer, lexer enhancements +* Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers +* Matteo Sasso -- Common Lisp lexer +* Joe Schafer -- Ada lexer +* Max Schillinger -- TiddlyWiki5 lexer +* Andrew Schmidt -- X++ lexer +* Ken Schutte -- Matlab lexers +* René Schwaiger -- Rainbow Dash style +* Sebastian Schweizer -- Whiley lexer +* Tassilo Schweyer -- Io, MOOCode lexers +* Pablo Seminario -- PromQL lexer +* Ted Shaw -- AutoIt lexer +* Joerg Sieker -- ABAP lexer +* Robert Simmons -- Standard ML lexer +* Kirill Simonov -- YAML lexer +* Corbin Simpson -- Monte lexer +* Ville Skyttä -- ASCII armored lexer +* Alexander Smishlajev -- Visual FoxPro lexer +* Steve Spigarelli -- XQuery lexer +* Jerome St-Louis -- eC lexer +* Camil Staps -- Clean and NuSMV lexers; Solarized style +* James Strachan -- Kotlin lexer +* Tom Stuart -- Treetop lexer +* Colin Sullivan -- SuperCollider lexer +* Ben Swift -- Extempore lexer +* tatt61880 -- Kuin lexer +* Edoardo Tenani -- Arduino lexer +* Tiberius Teng -- default style overhaul +* Jeremy Thurgood -- Erlang, Squid config lexers +* Brian Tiffin -- OpenCOBOL lexer +* Bob Tolbert -- Hy lexer +* Doug Torrance -- Macaulay2 lexer +* Matthias Trute -- Forth lexer +* Tuoa Spi T4 -- Bdd lexer +* Erick Tryzelaar -- Felix lexer +* Alexander Udalov -- Kotlin lexer improvements +* Thomas Van Doren -- Chapel lexer +* Dave Van Ee -- Uxntal lexer updates +* Daniele Varrazzo -- PostgreSQL lexers +* Abe Voelker -- OpenEdge ABL lexer +* Pepijn de Vos -- HTML formatter CTags support +* Matthias Vallentin -- Bro lexer +* Benoît Vinot -- AMPL lexer +* Linh Vu Hong -- RSL lexer +* Taavi Väänänen -- Debian control lexer +* Immanuel Washington -- Smithy lexer +* Nathan Weizenbaum -- Haml and Sass lexers +* Nathan Whetsell -- Csound lexers +* Dietmar Winkler -- Modelica lexer +* Nils Winter -- Smalltalk lexer +* Davy Wybiral -- Clojure lexer +* Whitney Young -- ObjectiveC lexer +* Diego Zamboni -- CFengine3 lexer +* Enrique Zamudio -- Ceylon lexer +* Alex Zimin -- Nemerle lexer +* Rob Zimmerman -- Kal lexer +* Evgenii Zheltonozhskii -- Maple lexer +* Vincent Zurczak -- Roboconf lexer +* Hubert Gruniaux -- C and C++ lexer improvements +* Thomas Symalla -- AMDGPU Lexer +* 15b3 -- Image Formatter improvements +* Fabian Neumann -- CDDL lexer +* Thomas Duboucher -- CDDL lexer +* Philipp Imhof -- Pango Markup formatter +* Thomas Voss -- Sed lexer +* Martin Fischer -- WCAG contrast testing +* Marc Auberer -- Spice lexer +* Amr Hesham -- Carbon lexer +* diskdance -- Wikitext lexer +* vanillajonathan -- PRQL lexer +* Nikolay Antipov -- OpenSCAD lexer +* Markus Meyer, Nextron Systems -- YARA lexer +* Hannes Römer -- Mojo lexer +* Jan Frederik Schaefer -- PDDL lexer + +Many thanks for all contributions! diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/licenses/LICENSE b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/licenses/LICENSE new file mode 100644 index 000000000..446a1a805 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments-2.19.2.dist-info/licenses/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2006-2022 by the respective authors (see AUTHORS file). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__init__.py new file mode 100644 index 000000000..2a391c3e4 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__init__.py @@ -0,0 +1,82 @@ +""" + Pygments + ~~~~~~~~ + + Pygments is a syntax highlighting package written in Python. + + It is a generic syntax highlighter for general use in all kinds of software + such as forum systems, wikis or other applications that need to prettify + source code. Highlights are: + + * a wide range of common languages and markup formats is supported + * special attention is paid to details, increasing quality by a fair amount + * support for new languages and formats are added easily + * a number of output formats, presently HTML, LaTeX, RTF, SVG, all image + formats that PIL supports, and ANSI sequences + * it is usable as a command-line tool and as a library + * ... and it highlights even Brainfuck! + + The `Pygments master branch`_ is installable with ``easy_install Pygments==dev``. + + .. _Pygments master branch: + https://github.com/pygments/pygments/archive/master.zip#egg=Pygments-dev + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" +from io import StringIO, BytesIO + +__version__ = '2.19.2' +__docformat__ = 'restructuredtext' + +__all__ = ['lex', 'format', 'highlight'] + + +def lex(code, lexer): + """ + Lex `code` with the `lexer` (must be a `Lexer` instance) + and return an iterable of tokens. Currently, this only calls + `lexer.get_tokens()`. + """ + try: + return lexer.get_tokens(code) + except TypeError: + # Heuristic to catch a common mistake. + from pygments.lexer import RegexLexer + if isinstance(lexer, type) and issubclass(lexer, RegexLexer): + raise TypeError('lex() argument must be a lexer instance, ' + 'not a class') + raise + + +def format(tokens, formatter, outfile=None): # pylint: disable=redefined-builtin + """ + Format ``tokens`` (an iterable of tokens) with the formatter ``formatter`` + (a `Formatter` instance). + + If ``outfile`` is given and a valid file object (an object with a + ``write`` method), the result will be written to it, otherwise it + is returned as a string. + """ + try: + if not outfile: + realoutfile = getattr(formatter, 'encoding', None) and BytesIO() or StringIO() + formatter.format(tokens, realoutfile) + return realoutfile.getvalue() + else: + formatter.format(tokens, outfile) + except TypeError: + # Heuristic to catch a common mistake. + from pygments.formatter import Formatter + if isinstance(formatter, type) and issubclass(formatter, Formatter): + raise TypeError('format() argument must be a formatter instance, ' + 'not a class') + raise + + +def highlight(code, lexer, formatter, outfile=None): + """ + This is the most high-level highlighting function. It combines `lex` and + `format` in one function. + """ + return format(lex(code, lexer), formatter, outfile) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__main__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__main__.py new file mode 100644 index 000000000..4890a6c76 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__main__.py @@ -0,0 +1,17 @@ +""" + pygments.__main__ + ~~~~~~~~~~~~~~~~~ + + Main entry point for ``python -m pygments``. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import sys +import pygments.cmdline + +try: + sys.exit(pygments.cmdline.main(sys.argv)) +except KeyboardInterrupt: + sys.exit(1) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3a3b6ddd7a6922c77970384e4ffb3e227154248 GIT binary patch literal 3484 zcmaJ@O>7&-72YK&i6ZsmO16q9u06Kv*t8|mR^8fBYXkm`g~+mCscFg{$kpzMTx+?@ z%*&1>#*j@NwwCJHXHww_gr+#miOS-Ar zfi#?*pEvKl`Mz)FkAs6b1Ld<%t@=;%hVfVWNJ^^R*gl8GJ;O1|hGRM@&upa1sYbe- zHVr3T&N!KJPt9<8er1+>o!)nia-WlPvhSMZEPng(+u!Od&%k0C~Ux*RJ=<#1)W9>Q>aTX0KKV&4fZ&s8n9)Pf7kmW!YoLFlW*UTj|{&*!UO@h5Qv zfiTN)5IR});;1PmKWr=^PlzW7RWnqH>l2h92@ky%ySjL7c7n}Xi~Q{gc4P6%1Y3CP zjR}1=ZUdofPgt@tPV@ZCY!W)cq12q8TbN;zzY}ub<}t>OF;}A^l-8052MJr0R!pDt zT%Y5d0%Qt{^^oT-2}>lt7mGzb1QQ(~O2%&idl!V|`pcocav(mu#X4uz1l>3zU_~(4 z^6h%HLiu-nsQ@+Y#j307tXf5$T9tNxhZ$$jI{a3(+J-b7sO)TYx}6eMSE?zeOQjl& zhD${RS8BFd)@@kAuDiE*DR!*5?luqcTJ3CNdJ=oaaZKAmvn7ae)9hl>WK$pF2&=sGZ!z+8K!#gnfWr=nc|i4vi$Lctxy*Hj@Lr9HkD^~T7H z`a5T1C#pqOd+?ve|Mmx{?iu~YhI!LO^DAY;c+l=$Fb)~2W8s^IC_&>$^PqRPQ>LN% zlcgJ`(#lES585ll*VSNmd?VHA&nxmm7bl(Ub=SOWtQu?S9~!G>A+!EVowQlL#;PO` zRp@Wa;w4{Nx<`C#Omh37u@;Ke9`!3h3*qN~H+S^kQ#a9YRCiKy}A>K9KDh zdNREG@$mjf!~5@NHir*C%pU&N)BNr)jNYE1zhx(%=J&kEKUmz#AN+9r8lb0gE~&nvue;^Oq| z$iiN0FOsDJe?{M|Q0SNlRnTuoP8GU5jkSnGzgq3It5t38C^#FN#Q00RO`a{wSc9u^ z+4VTK0yArnYN9bNC3Xu}v%_eN1xo~D?Mu6%RIBtXA_EN$*g6GbIo=XnhMt0- zc;!GnlBW}1C$5@^UofjKJ%r-R9-GG^f@@q~h>%|Ba;yVU7WZo4;Cn8Sg#J!k>)(yT z-dPknDfu75kdOKx40x~zfv2J&2$+Jf5@pek9E4m9(C0`;C^{y^7)>6cYM82Bs0uw% zZ+v)Be`jLU*Uoa3$IHiSf9U0s5D(>m*o~46+FDnq(2zev1u~Be_6+@bcCc zjUL$?Ej%13JbP*Q2Y(uvd`SyVkQTTf?%vA3_M7RC-QT{lb^Oi$rv(K5yXUj#_Zh#- zk5Iku%!RSEP5Da-X%eM!`vj_cMpq5G%m;(bge4m(u(_=X3sC&^riRuc-4^&GJT(Gb zLv-OzdUywU-FFeaBbP(pruSx%;VF)X$Pyk{QeR`O4VLelH%(gRF?Xwx<+H;sO}hF=8S=nUmSYRdH?d}$ie$FAFXcYPe06@ z-o_}Rnk(d@zDmUj>`Em{xj_szG8^S9m0Mg$gn*$zJtuY-pICysvQmkKUIT>o{k0+X z<442hMfQ7*zzIEmPP~Rb(q1`<>Ur8U&3~j`F*E->Wtaz^4UOH&KiPHg&fs5iNAL7~ V(K}=gZ66#nhrXQZG0$jo{{}q?$AL8+jHp?WDayD_Cwf(S8H^j6VJw zsbP4HXCR(U1LP6QW#~SksM+)a)*&v+IOA^3rZTF?8^jB!)$Xu7D#jG$ve`?STsF6a zS^;7mjA}h7wH7bj$XY z)PA&~>VCAU`Kd6WX(ll=EfoF057XnP8jfjOE)J7%B$RO9Vqqe_kfK$Dl1|$X!|7EV zw1`g4ipwyiJ&(NugJ{elRXfDNs&3=Hx)#(Z>0*QVYN=k!REdd4tg>=VTPH2TRMumJ zTDq+&V`f_|b+o)i ly~LRx0REnP^Vw?DFMa4w^VTny3If;?W(w!Tt+SAyzW|UV)7bz3 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/cmdline.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/cmdline.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8a5b86d56453634ac0fdc9143f5d2b973de1f01 GIT binary patch literal 26568 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 z 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/formatter.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/formatter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9c2686764a190b29669ed73a81873b4ef0ef87a GIT binary patch literal 4716 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/lexer.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/__pycache__/lexer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aff02e4bd20d829b528fbd49556f62641dc9d7b4 GIT binary patch literal 38780 zcmch=3wTu5ohNv2y-QV6>HU@{3B3x0gajCn0VBlw=@^{EirrG7Dv1KAO1@PBR4LiS zad#w#tfe>!#b7T*+w)nhow3|Wuj%cc4R+Fr)BR0P6~e8enx0X5GGBMT-I)cXOcK(Y z?C*chy|*3|e)N3X7j)|0bI<$nf1m&T>)hNN0oPyrx${Khlpy>UdQdKde6#dLjUZeQ zTtctl5?z{Mu~%fjnqCe2)%I%fs~y&j=zH}ehF*h6>2$-!5mT>;-RpC{YjIV*DD*nmn`*qNQQxdWiL2BSSG#JFu9c-*fpm5?-5M5G zhq!uov07Ifi(QG>2KNdzww=W`BDTqGcekVeI^N{owd_qZ-n6JCcd$4I;#RrWs%3P# zR-+~B*t=G|TjOq5->qk{ZHR4muXV3aDSyMb#<4c|{Tw^4(ea@Xw>RK#8+M;{ODyWS zv@3_j?Qr_tc9z6GFzodE-TpTIqHDl6IxcyJP6WE_J<6@UbM4wk)^x7z++aUGZV#Mr z+aH&!u?O7Fkyg9k?Y4J6d2H{ICyutU^1FsT18%S1-DTf#bSHm*a9_`^!$)`72Yr&= zIEYG(?9TnnbR1baZ&UZ_qOwa7+G#VK=*Rh>5}>cR-HrJ3ij$b&j|l`hAL-?wI>*AfZ2kCP|5$FP!iM-2PGLfIE@Xcg%On?L9U=>UJ0sRx0DT&o|uX8x15Z z^yKjd*aLet?D6v_+lcd&yU*!$4v+ht0aRevJr)>~+$dqp?f3V&+yg$B8?7=+?jiSC zD#4MP&>y6+PUJj6as0k;*V%yE>vFqN;%qzJ!|owxz~dd_iLC6W$L9@DFN_}V!0?#M zO*iO{Cy+25A0Lu@W263re$0fX$Dc5|+=I@sVf6cqPjcaT*yDBgN$#MoZPjBr z4!uL;rycqK{P_>=>&F6vYc?T*mg4V!CkR0U#jNX;qXgl1zYm&t)NwZ=Y0LfocRW?c zBXWe2rsI+0?g1G%ARWJ`swFD^f-o*RG>89Dju);97$@fg<3$zEuF!~*#FvW3Ja=u1`6KkXu>y?I_QtmJkX96eyR{ zrKM8DToBv>AhSSF84y{6{iqw)I&=v$o2^4wxxp9M8b5}~u#e!G?I61oO&)O$c?O)r z!{hb=pZBy|3i$2){d_sO`)HQ?`zgl>pUZE@3iPpZ`~j?q0X6>23D3X@yL0%AbKGy2 z+*p2I`{1z88L*#r4r3Ma4K^SH7uE+tF>D^5W*u;eA?;~FDhMbY6GA{O6?pfS97E4r z@EnjqtRS4!<1yn32_Z40327BTc2vOpCakIbacHGHd3`n>KleSH`$?Z|*X zp`+cJ&>sh|@h3zVTZIIqqz2@X)*uKLsH55@XI_nH|2hQcgt(<5{JEH=_O`u!PMm9t zt?iz-@0jeK^v0|;w{1l)ho(Z|o=9N|KsdY!hA zl+j%3$D7QB)TNZ@MpoF)uqE?%XR4y=D7?AZ7w6ie3uDf zfy?4DzbN(=x^nPT1dwl)3Q>)--Y5uc9kG#Q;MHmOkGcmugIHC=PVdkdwulVgj{;CT zhy6Z#7rNfn&vuK;ecCS-)eW-PXPL_8Ky}4(3r>Nwg-InGk`~cK&&2?Nx>Jq zQW=NXPdHDb{6IkR93KNHwvYMUF4m%f6Fwh-ForxveExtP@LuwbVvh&h$x`jKR9tqS z7i(Se_{RM90aOfN=#<;v*2eakT18ivoo17jfQ8lN^{rvMq>II5N$ni=&}#hj8Gw=8 zRK;h=!s;NLm69<_Q${=h1=u#9p=68~z+zyW<7zhc1V|X(aN#D2m;EPvW5X^!A%QbK zyVK>u4EliCQs$?Nmy@M!W76=aA0hxcKZ@={9d1{aY%J>I8av_~mzU0GYh|DNtaD^^ zINS8II-l~5*$13n`zR8I696bt~gKOl__0ME49k0Am}5Bo()B>~e9c|Ae7 zLm+zq);Y!Gw>!NqJ67)iNCK=@nIxj6Ywu^>?B_(4-6^@{A@1)-Wu8&*aDTrtK=z{) zgCd+z0`1?(*{>hH22lg8W*jtbG=yFs0PHY2|z$&vg`EoTU6`pn9^ zK#6jPc3NCkrJXy4XNm-2LWAm88J&B$fad3rq{Zqn0PHI)*sZ+zJ92_5diVP+ulrXeW0A0&uit zANKi9`Ry!a08l{26_f}-%0=2K zyF=4=Crk>)OBiMB!9WScb9kT7GvJxXNkXWEQ5Iw{w&JkEnlQ>^BGF!#Hc_ydf-VY( zy^tP7kkDd2B;w4Z$0*39xE$aySpwqFCUi8D(sp_wSJKDWeM}bPT!{7IGZoBBpSc<2 z@n1o3PPo$~l&_f7owwdDTN&9i`_whveA!m^T;34*!tBXwjq~N(@tk{Ger}jAe~dks z)kikY?wfmdzHBq4kC(5wY`JKO?4L8vmv5pJO3cCe@{SwjJLZnP_sqM`uoq<<Zae zGhg=TJwY@#PVR|Y^ItwPbtJs!BWuH5Eut8E^#H6Un7Z^T0>EnFBz`k5sTrKFa8iZO z$@eE!SeuNyB)AA-B_q_kOB$EfAA?iiKS>IERg`-0!=)waL`v>asjn|Nk^K1`O1KXJamcopx4g6^UeXi^ zy!qUf=N6i`#hSN8n;yG%`nu~U!|xAAcRd+>^7GN6FGQ_hSbQ+mv(cjNsI{99c56M7y$_GEg3n9 zOpp}Zq{4%47vMb+kOVa#Z?yBx#VL7EJHt%oqb4W*KgR=L4FUoHTcWv_sC{ftB@Ey^ zL6~A5XuzeN6l_P3wu_`4hzaKN4V2t}e@f}v5u6j2O+tQUxcQAoZrWDeE^V1Di*<^j$I%QojRmDtISkal0cYo9{v4m+tzZ*t-rs6 zZb9IIVg?T6WsrP}C1C)X&xAS=jFu%*l)yh^p92B38?c`cERz8MFCS-M+UHfNSGioZ z5V>AZh5_s$8J8%9c}7OuE)pROkE3CXj=%^p+WGi+vIs7`Wuw)fGD^pYWMorJQavV_ zOOxe6Du=Nihw#HWO07oG3a$ZmR*PqB3AN5ADcIbZF?lUs9|npbHwF{(@BaRQVSfsr zFzS>bVgTpi;Cvt&CeIO*W)Mlw#fwUlWOe}KnZhIVGch5i2s1=u{6G<)e2$ac6>q_( zp-_^EyFst_GafI=ntB4we46}d7EKw5>C6(r+2Mse{YfNxn4vs~es#3mQs9|Hg1um& zyrr0koy$c3J>sP%3P^f4kO_qt*#9epp9qEiZ$KN`P8pX=Jk^52Z2<_%_?3h;PouU8 zaYEz$Zx6|IP3oa1&!@3EC6Z!xlY<7Y4eMAsgDTWDScCtHUcuR(Ce(`*HNDLGx zxsz{Px=P_Bi0I5KWONx6C_AAS1+S9ia>>1s2x-;S#;jH#4;f(0W3x2+v^nKvWK;bY!8p$&JW2E`; zgSFw5HG?@!(9;TFHsU)?iFO=0#DJvNCyhYT8l*TyUe+dUMPm|1S-ijq^~1qa$9xd5 zFhnE2NXlCj4+JZK1XqueIuhjDZrJS zxqS+!(Kq58P2_+sfMSWnY6&ew%n1Y6O42V$VWe&<<_QXj!${~EE5lh1#$)7gsTMIa zjQt=^#>L8Wm^n>!gz|}fye%U1I=lu~LVMgd!rGe9qD_7x<76gL;Xcaxl2h8pFfOAgl~TST($%y=iNRL&-BSH4!o1ur=SV1dTgi**asK*3CHM z1tk}1W@;ji8wIQHX!Hfg#J?-9zhf1uR!kdjH+J3=v<0;@ho*bN*!@!I;!r!JnFUHMM))#kZX^Q*SrShe?hS$x&HC9Sw(!}OlTvf3Hl zA}ajy%$FnU-`sj->wHj5N&Kn(++!f9p$I zse-PVu2;59?TqIZy!`Y_Ps=f3*L=~+$(@W%nA#GqyJ4wP8ngb*EmyY87p>)QQAnit z&6+DUvw@p+>%oyt@0>a~Nv)f-{CatxD3q_HF+C>Uu57#`Xqpd-OM<5Akhu87(K~ug z$uaS_ceM2SzMn)uKhW(l2|qEJ_ta~DQefRvqy0&Z9`^&Z36zT{a(Z4mi{NX**Tf6L zlyFjpd`cqvol-f2m&8e7QXGV4_C?c#Rs*%B3T1U6jlV2K*rr2S*npYWl%NQ$CUhYk zDKwpK0Qekb6*Cf&YiNl+BASQm1)!~UOM}?gcHf}gDYG2*eT<5dDe@GGlk)YG9&MN` zDOw!;D&Yv?EWm}qicpHuK0uj!)fSQZi_^%1AhucpWY$1hqgJjCc7UK9bwbL;fm1(I zGN;hEhZ&R{hGcad$`F^&+Z+J2WOSq5Cks!}P4t!bn(IPjHAAuyBn2jM8#odu=j5i# z@-Ic&lT?|IN`%BdZ2u?4GA;cK6hU{;Doe(YsGk9IXe51JNO_pFog{MO9``Vm2UH5{ zauACw>1X@5%lepHtYJ=y(RAoP@AAUpT@44U{ouq=La?45if`kt>!_r zDtuRaM!YH>2Kil@eS{o(iGU09=d0kC?`2l(ka9y47_I6Xw0sHdvcPER9N?9 z%>RpwexeS31Myci;Oc^HbTyT3s%wz(r=yKOP8x=T$eq zS_*&wTh>^iSztk63_BI98IzXws~bRuWsG#da#jl)g;t(zX+Sjwh^R=mgVNMp1XWTu zj|{@V*UK=(g))viEdX+O-|rGSe?0&Qy~Ye zBn3Z_vmihU1zUa8RLADpA?^mDMiM%SwyU(Bf(;aq7${+s?FkZQY<;foPuMc_{|U3I z=}(vx4Sqrk6?-CA)>QT}RV75XvSvWqMK$cFUSZwEd5Lr@j z?hu~xi_h)7r>oXC-rJ(n?-1`<4Y>8+9KAvFb53W}p%- zNEtvg)JtZhge5zo(ye3MxLIdf;Lo&v zRCSQO+b;PabCO?qxj_OjwrmKapzhsFGX%gb!KRELJYfJB3jkz8fJ70rACz2d!>}TO zqXw}n&p@lm(NljvGd~0z;`oRGe@dEK4mBxRhP;)IQ3WKsOwsd0MeW9_hDZwq@;=B$ zZnEwa&19Aa>>b|`X|`Yl$SwF=lGrGNNP_+n0$CjiWTDMNEWhvugjC8Kf@JIpX^~Eu zEg>m3IjQOwm6QA-}e zuFUHsVTz0^DU1So2Q|RZyMBViNrvn~sWFJlLOQ7yLLgP7l`J%%3fGgG*N|>7MGMQ? zrwJJuE3Y~KXh@f>oRA*%8wa&-$?F0n#^Vq^>7?p^X}wAD0Ijf-st_&N_N?Qhwp+*r`1XIpzexwP+IZR390MptrU=|pekk(E~mdF|Q z4)yUj3DF~Ys5qKNKP`Na8SG*N600=Wl)2cF7b?ef1(J`Mnxr)rg%x&WDXC? zsus#t#mZJKly%3-y016Pm+iSH7|m;@_Q1^X+3C8t4UE`@12YF=wiUOEYU0JU3&oAG z;zn?>n_i!oI~i^2zFE8@Ubk|3e>}fD+&z;!V_M9wT*$AB<<~_zBF@=@h~uOD);l&7 zdN*INmd3563)UJKP`>JqY`Qctdoo(P`KGn&wyiqc8?ULm+;_2Wp{6HR({p|Ae9a;7 zwfRTHJJ8b|5!w1bj8X5Tamm1jG(sF}WkXH`${9SbqoF9r6Co!fkW-;64Un_jz5A+mrPnlX5$mC>{z3ZV)FM%h@GZ zgvwyo2^9s%C7zB$)WcVGS$kPe{U9M3Uj$Sut9mbWi`FxBOM`A11ihIjq%_&P^0C&& zCM;iO1s?2qpjVK{XLgDuIrzs$-4atT${0c!KQxA21c#P%2xO~miROfp6#HMEg3|81s^(koqg!4 z@g{v0a6@fIJ?M#gNSHu(9w!DY$Za8#%R(7EB>^9{5m?lFKu+?JRjjO2$Bl-I;O$Zy zt365SXN6j%(3ElLQ9&9)7Mya>GxD4n9OFp~B~U^K(#4-ftgb=YV7}5i#Vq;{Xq-rv ze@?h72EI43Nc ztnx$~vQ9L$oCAT3*`B5s6g)+Rk^V#8DECYvcD_NQ=bRNwlQ!k@5DH6VD3Nu_%`lrL z!qE)FX|dNpS_}Ldnd!8NnNFKwzn=r+@5lY_F_-UoS)M|e1W|_4Y%OaxqXDFgh?ibNklJz*T)Tq#X)Q;LMD4CXTD9G;9)&!# z@=E2UzL>2wYHEG36Vw6L3E~OS2~n~n%_Ll^(DH?cSdlO)CYXEJ$JHL}qz`~X4gi(= zEMsRM(gQt9nlbt;Zj5?CvkMy6l6SkXI@~v3xF%{{Lvs-QYkq zJK;JAeGdm>B5zd&mPi=*Nu^*>+Q`b0)GQK@U~uz`FXYVROin~i)qF&=HiZc53xY?P zRtC4E%qq>SbRhdcu=K%NDSm<~CXh|DS}-YNWCn|KvH~#LX%ek%DMG>P6#QEX-lQM{ zs9m5q3I?f~M%<`CO{1?~0%WTqWVU9>pw(C2%MtZ8^jOHc&GHQ(i+a%%P*azR5qu53 zcWEY3GDO{Gu5NQ^g9jNY&;z09aU6W&^o=YiRneD|+rqI^7j7qj8XG0WdYQqwEMP1L zl`?VU|Bk+VTjb)%F%DPBUOCLS~Punr7hr?!Pfm=^_YUKqzhn&y^T5hKy;^2JPRJE4Wtk1as9%8_2rgb4{fTOA-v0%xTuN@(DV zDWP*Y1I~mF(#R2skqs&QkRmW9B?zs`V5M?uF)1ik-u)qMl>dy9xuE!VMSW!br4{!C zo4I*v9~hp~Bx8LJjLhwVlIg)$s^6%L6|9bzRWo&3N95Tn8|KR#)4D`aS-f(^<<%Eg zgTJY};)YUic5u!Wt?ZgF?pk~xITT*8qLsJGD&zIdZ?3+wde%8tchx;#zdo#e)p*O^ z6dAkSyl!sSdk5YR{X^9X=npULziY(f zoeDJiu3fO&fN(E(W<0N)n(X<;o;zB^{DyHjU)|DEA-*rHrLd#hfS(UG)gfeHl)(~E zVlDaSdC&JWO0HX!LxTG3E(l_IA$<%2OU50gYd6fTSOSay;P zK49z4M2nau52A-5M~ML}W+)fJ>|E~vQ3(u|qQ$tPmu z)UtIpW13|ah@%%0f|BJW7ez7yJVxkYp>S;-M5e43=mOZ;76y38$XhYyXlW*i9+{SV zykyZ$cbuGVc91QcQ$A$EO5rb(#*R?0p+Hg{kP#skYQQ&28dz!;70bCbS)K}w01lk* zCKUoZhlFE`Fv)|iv5ztMFz};8II=+^S-tIg;E=Ywni(w~z|mFob>LJ&M^z2Tu$!$3 zTBrN~U4Hf7GXKtWW=i;gcT9=;`ST2TOI$x7mqe0IvrOlh@VuohT)Suv@C z7bbKlNt;zpE1sl{m2oNgNQOIQqI!Utz)qydAoU>~;b<-kl<`!dilbCqm@HT+6F5r6 z`3jDbLP!UMV;CC+N^wiu@hI)3fDv6xbo4qsMksh2fg?xyF5QFZ5TthyBs9Zk6QZ9X zsHB80VIB(fox;8tg6{zS%d|P*q1YwsH5sT4mNCfnAbR>g2uRJK4vwCn4$LoI%rCu= zJChrBUmm$Qax=d*UeYlAm6;mZvRO(lF#xqK;; zD=#z^sw(fvjyoIirsQJ_jV)g8k9SwOe{3D9q9|rDE&DS^HuiH1!l=uVA5Yu zo_|jP5kVff0fOh76x~ER_p&^=u z4TP$M-_C^<#C}Q?yg@y67g6e+Qs^o*}6y-J;m^3%>7pJSDyPHnp|_!olZst{i?)_`{GZc zh(1ovDpjL_!5G6m4@wAuNf>^#b2`}G;%*yiv#-P`IS3;$mnEG1A*7?6>XMCTTAC># za2)V2ooIz6H|e{Puca9{@EB>@feLvd)&Rm^9Ch(pWnDgmYPfjlmD{|_DmG;T=q_W9qqdHGqz??o$OtOd};#azgR+&RB>uSOP z6U;%+S(wQ{$>llg&~e2V4TJO{1wTdLr_iV@Rd|kK4Ps(}JWcG)*= z5N>*#vB24|Q}7Q|A#Fht6X~(Qty+kLAQw8sRcoyM*_Zhiqk}l-2XFZqtN>2v(AjVfnP}Z97u~b<@&azs)=QRCW>Wqq z&?Mp~m@2?pPT~Ddl1L=u!nzWJJ04dp(pf*S$;XDB1l+NyaLfwbgN9@j2bKWKvDKXb z=wvd*to@iNRT~z_K@=?!-_BM>Tnl2%Nqz z6L~P0X7=$=yTQ9uuqHW2Gn%6W6u?A^4M9B_Ka6`sG^I`m?u??=}>Bs_B^{F5`DPVC}#U!&Ji`iDj>Os4r z%D|u$l-~i*@d@ComLRVT2~$R#y?gkGv)8|)5${BHjJU06de_&#{OZY=t>x{#b5Fi~ zg!Jb7#CYDeYh%|uQR`lalkgn1J-TQsp5&^uG}|2$%3-7abCjAs>dDbomaw#eEPL4T zByn6rrl1gzfIlQrJ>F>98^p6Gol9Q{kp+vhrOuU0Pls%j8M8p*jyc0Yrt~>WN`i6F zMg`7lO9ovg0Bvf0#uY?bvV}P-W_#;0lLg9vrcVV4uuQ=r6R-y0tw}l>5>IW!_|iJc z2^rGc6w+toXwi-=JSlmx!eJ{KTU<(SVbQVyoU9)2bOd2xC4uVm%KzV41;DYrF zwGRdjtbH`*;(1fZ;Igp0TsC?J;+T^w9(ABxys>7Et0OnKHDe#hq#scq+%i+9J+s4_ z`#Pc@fAM=<_w_4B$NVP_|AN@IARc_9UBSXJ?H?keKckCX6VY{3Rs}uo;DB zEoDEk3K&xXBNDd#%xD%VK_P0fq?mCh%!<6sl`vCdc@m?C@79C?lp7%@k}nVmgNsoy zi9!_|ss#t@9tJVhBoLYi{?B2{aj5Beqv)okaS=4Z?i;rHcv(ffpfY?aR^W)2*G-3_ z`77yp=teYVVxe zJhvuVyL~=?`}ElD+_JFwjZHUmTNlggB0X;&ymByBzIJk7+-iII;7bR?-LTL3#=&@L zISvz7(!q<|-Qu(%URD#SxIsl8jJ9=OZ@OL?Z9O=Thq6`i{IUyqGkIbE!itXAijKL} z@yk8hO4L5Tgi@dH*R8?LZ zS$(5?4Su8b>u!{h{KT5rNM@+;a%iK%DkL5GNxLZN|ojS3VMs1H>u7K^J-;4FiXI+W3_A zDEywD6#EziXq!olTBoE+ z{sKI+6+@t2?FXT(=42Y>4ry~~#VGBa$O$--@03_q9z&&CmvO@AEq&Nny7H)`PcwQU zQz$2W45r2NJAgQFMhWLE>y;KX2$Frm9B5RYU1p_ka9WW=tIuT#2?(tr^CjUm^+a#T zj8mA#3G;L2lv9|tU}FmMamwl-S>%yI&;|?6NIn=uGoZ`7R@vFf%KPHVV3EfQ!G;H_ z1%k-@Ww7EwoB~@*a-PFDsKY@UFOZDzm>-*95q!8X`j{PcVx+D;m_u4?UT#oF#CA~A zWoKCH7le%+B`Fw4&nakHgc4~Or9}$9K>24lD z!n}*=Qb6n{az0N^H@P{+0ws6~fy2Vkm-G)5@n0yQk`o4wo}?S}pbKCGrJvEQR&t+( z-H9Yge~ZU7p`n7gSaTmvYO+Cqi(|q6&)7ypYF30Bfu?MYQPa+-qwCs+YmR91&Url8 z8soO&>Ca7_4X=CY`Kal!X#Ivc_uNxa`(yK_$0nbTTk@y(#Vj@PqU!LIP>V*bE8`7K zQB%{TVY(u`0dmK9LGgu(nTkn6ym&=KA1iKJ671%6lRIyt&W1OPIHrgLj^VLyPDJw$ zL|eMAH(sxZHXWGHKQKKJmxbj63$<%wwQJ|9u6b^Ete-pfy$WEW6%Tr8?tbaH zc(r}TyqIj=HSyhz@pap-o6)bD1LCw92A{b_Op?1UqK}M6D?9$y+Igp2#K_&*AwrKZ znfvSI3ZO~S07&BPQhRhI&PQGAe)r7Wsq2*=?)q?Z^w<}pPdy#|Vqdh+89nZfItQb5 zL-VC4qTXkt`Oo5bC1t$NRLehdlVLdZkNd-E$^oL&8LA~E zGpSL50LktePnlPUd4mmUaPZ&8{DRT`%D6(zgDe!RL|?KiXU@+`0Dwe& ztKQK-b(aCKL4^u-drcYuBAXp-I_B~VQnU=l+TRAhvX(w@aIz>u`tPVi`XL322q1JM zqLLrXF|*v*g8t+N%{VZS$X8fvC2ep;2CbNx;0fA-M^OoEAzO)ao-|MQTsSgwB(gJB z>;OS^qqrkdL}p{NJ7aYnljhqc6=BCKedOq9%j7PQcMH~92(!cEvyQnZKe9fGSv79~ zsTnnK6WTOs8Vx0zz(2vJrwN>ZnvS_y!;8!dQ}Ay=uRu4QP1Tr9mqXefg<>F6o@`U6 zFfk}SAe;T*XhL>5Oh~U_N6-kyb9KbNh4e&i0WTY}(LqW70cuVYFrkL$I^Px2WOI5K zA~$;S0)>YQ6AXHepe`eF!lf>;UR9r^Ml$(c6bUX{86?$wIIQ^NT_ zQv4WXefw?YtwZN5LNjw1e}dqUTN)x?XAl?3mgh+`Z3xkd6}1R8M{Y4f@77Ba(7 z@v^c?)dG{-MV2#DP2CVdbDXJ2vPt31usI~zbTC&vrKkGSkxk8$&Rf&H&9vF!tCaXH zF6>?fCv2-yOH7{nVoJodS~8($nz_dCQOXS>>D8CXYO>=#?{M()hk{vnSH~6Q_ZCo*es7}k}5)* zpp{XJQl0QJ2dD@}ec*{{Qb`)hCWOmBX^t4+I?N~;D8u20dPMTUJvBVH(Uii%z8lLi zp(lGQ_ukb83^20NLz=Q&;ihxd<17S6gVhY>Twa?wBuXpWL}N=FlCDwxllJwEE3cS5AGudA_MDYyk#dwPE@I zqgdj_)r+-`%f5@gS@+zr`P!~&OT4HSWB^_u-Nr4`rf^l{OLGNRo{8qKyQ47{^oWRG z*+S-FZx7AaKQes)G{LG3b6<`*c2J==ikt3krsmx-QcsdN-62#r0lJse-72>On3vT3 zcDYt4uSZlt#jWCUL={xr_cve~-d|C&<5ArQoG>8=Dn0rc%KP(Xu zrh$LLvm`@a`X>ai2PHdV++|*;Md=_;@dyYr&Yg?-#f!Cd z3$>lG+RnMoIsd}Oy|ImZ=Qr-3uRSoW{gwrCXMP+cYFiswf5WzRc6}`A4WCr(PHtb}g;PPr9PZt;?pX>BW-484pZ! zvIgH}0C@*F@*#zmtQlb7cW`VNST$3dv*tL`!qq4{hRY%JQ97Is=lQbo3$F+b%cLM2 zzi})`?lhPq4WD)>zgovwBG@?8;KJa>Pi>yUs!)*;nFksSB~(n#c7} zq8+G}~K%njmWlzpJuQO*f!0jM zrPK;Gr3EE%l}QQGmSiNvqcYBKVKdN$JUbqe(vp(qm`?D1A+0}TqQWj^jHHzTnml%e z)Gsn+>(8mDu_Fy=iPok2L(Nvfy9!b+oQY!h4Y>P^J@Arb%?RmHy3#IVO~Di0MjcVv zvb@w~Vk2JZG7pKg0$pal_Cne~rP2?V32Q<_zDi)quVsgiwUBZ>jx;2qVV6=~)|9S| zkjkE~0M)HZ0u`EkT&GaoTzZi?jzoY&`eOw6 zN=OggAEDqH1#eTZjDUF(169vVTrCV%apajWL14v9TBJEj{4+`{j&Sufu|ptX)r*^t z5L!#sw2)uvEdF`^0>H+98@q)$in(JIZ26PgcyalKgEI#?v)uT~mvA<^bVVd*w)09} zth608WS%YF-nAsG&8>{(uLkMX6mi@tt_~lIteY=xo`x%sVrWL9WscibDVhtPSPF^p3*ZWb!u0=J*{ZYe~yEc@yoG;Y2%$mQy?q8G;r)(nxc^}7jynAOWubkyRrt$J4c)IV!u^kpTHOEGYTjM0 z{c#D!|F}$~`*Mmud=&{vsFaO-`W!{;s&0z3P>R&fRdLgl=$=6t_MU+ndY>V5W5fv8LQ>_VqPt(zcJg_$_E{CC+IbKwXAMk&r zH;Puix-#s#1Rr>KE~&gx(iA=&KB1Z%rg2WH;Oz4#?BSdf)Fc?HY~nKcjSkr}F1*pc zW(1!CKi|2jy=Vz)TJ85m2UvuRQP_tf9ym~+IRgApy&luyCv_7>prAG!xIBJwJUlYn zIqQ1o#MKkCPhTs%w(|%3|7`!YZ66jyZ3m*J15CpTrz?j)&Ma*|O3d5@v>w@_yicQE zh$s2<;*v?HZ(g#B`h&7r8l@b-pL(eapA>!R)H*0~w(zm!^-?ij2Y1O!KFJhu`WZ47 zP{#CK6XyI**$Oxf3m;JQl?D1n060Kp`D0|%OC^)PgH6H7WXz-bI(Y-qQR6R6A(LS- zqmWn-dCH393BA`I($F)6pjqbJ#Z<_QpaE%<%{XyF1SzCvME2jvL^k}lOqf9Wk`Ppv zjnhUfA@__+RZp5jW)P{4knt*?^;B8`TgAg(&<@q4z^%>;6$zS-X#?mw`eq}>ICBj3d04*7IDYGQK6f%LZe-VT| z7!;Y9U7u7oqvu&>>@Arfcj?GcF2=Dgd%A3nft7xPnBRgLjf}8$JS0CE$7fvGQ}Q*W zv>H@#!Mxi)iLW1tWX*iN-}U|YTU<;8Dl8&v$qc0ThADa zz1iPG0MFlV!rlK*BgYsNi25@aluxmD!LNHp2Kk9m_)ILA!dXBO05|y@J#aRRea@*>mg(bE1t*pi3_`ZX_~2EFl%4Pt zqg=8wVp0x(1Y^A%MV#wmD3K8^NemvLGFmA}a$*PR@nKAuWT9e-0!d-QEJ^Z+41pQS zV>}o;(k77uO$py|7Lxpy1U)P_E68pyz!)yag9jKN!g%EoVQ~fn!Wpj|IQZi{*DYJ= z?Ltr*k%af%(tO*X#c*H`ca0Vp%M+$Fgv5Thh3< zb?bc`;;}f-215gkom|GO=jzE=!{#Jwx8m}? zi~AO;TVvI&vq#@~>grQ-($!}^s(v&(i>H0h{I2<0{kyrbrfrn^$?^ z%*>g{N*dQ2Ww2JPVVvLPJs0=POw8(Tl(jB4u8!=*sdsZ4|95%l;?Ns`*<;aKe6Xhj zJm6*HzcEHSE?QrMPi*1?FE?Loeq+OI!>pg!>8op^l^bsqZv;PhVb3@BgrA)``0YJ+ zL4SiMEEH%V6V{1bwS{U9==3ojay$P7 z?bJ(~881vt@l|Tim1e6bnAeqH4BlbI5 zl7Md%NCy6tFs^Uy+dJ}=#&p#<<^oq}_)y*;+y%frs*`^i4=Q<{PZpArZ(+r8B1g|jy+_hT zv23yJKnmuioMY!*DiPq4?K4Vdy|_`umkSSYDhDXI~AJ`)~{?cz5ZLCNZPjWn5Z;O4=hkk90vDNuSFZ z8)b#lM>iqLkrW>F7?b+$hLsYzO2OCZy$~%Ya*x7i!9MCB**0vK{m>WS{lo6TK;{8t9b`lvm>G_Y!j2(f!k7P;Z2-Gt{bYB{#vvh&GRGkb zH6{OYY3(0Ul@xrAK;PeBi7>KYxmqYJojy5VPiRcwQmA2*c#N@}5wlZ=5ntijy6a&P7Y%-Rgu45(-_5^3{mI$`e)CSF0u7MYDYyP)ZPCH*|`uf&*Au@-Z5nV(dJ`pW! zx?ydKTZ_Ks4|lwBI-;AIh*=w^_S{*G4&PlXSPDTMeX}+Exk+QZtQPGw*QyRXc{$T- zZdg~S1;Cmgne|9^$DlJ8-ma;OteUS`Gj(`!*Yw6^8_N6j@-BF3u7IV#-nLj&v0$o* znJR9X^6*6pz3sQl>xJSv8je!<2ADS9$}gcVm;QFyF66_aP-8A6uWx&9SqrF=!hiO^ zjJbWmx+_n7Id5m7@LKmO+km4+YH>FK_S#kYub@6b}pR?E&V{f{=X_{}2Scd_`bmR%O@Uz#ZXFLOk? zw@~~5nxtM>aqL3!#11w>qpM4lJudm+RvX&ar0|HHUEG#_Y%xnRoL}_8bIkzY z7<9hwvvxYT3oWk4JLqdmJ97mI5;wB@C)~j0jP`5#uNl$~CS*H`xF%JcnoWWT6FDLk zGA_hs;n$K!TVFE3%ZK=qA?YbMo0r@vIIdB6{g?DfNl>=0xen4NGxU>&N$nsh%gtoy z2kE8uu=Lkx+W_{zdeKObEN1C<2)+%+J5$D!>dWMfi`ju@^LaUyGiAodIUpe&QrkD7 zO^#GnNsV0agl@`|%>WUK!YJBV!@!&_-^orAy?{38TS2<`63fUyOhP&k1x1n=5?Hof(tEI9z2PaR|!m zB8aY|g_qC-){-%}A2%J$kc4?DrBk6U=?+ywX5^{--Z@ZGdcK3YYy2+l@m-t>x!PoapKRb2s>-0HK_8^6K%$$L-D`FtV z-_In~_`(q5p4p*jc4+%U>i176_>UAs5#W?l~j-QI8CzMbQ^dBg^rKHW%ti$dDcU?Yk@xYw^ zJ?pzxr~>JWIm=qHsAGzJd-%MSjV1^n;!iN`yTe`hVx_pHEtq(jvq0Ui-F z@RCXn_TeQJE^-ZtqAa5m+`SXuN?8NDMQ9}GJ67x?4e5u&LHvLybNL{^r_I1WSr2lN zWcCc&;`0x`Afh)7ypTv_CH|K7qn%%qc_)0O2T_?mK!d z79H&m>5}P{UgJxI1hCnql!}p1<6MS^^h*`9E4gu;J1HJc>IdOqk&f^x^`(`qsv^>2 z@j>#3=1@6L@IdGdIhw-xx@2oD;9=8hI}b-wDeqHi92YhU=l`DZIM%}h@*-fJp=GuX ze@ky5P;^7j>;;31WyjcWc8 z;8f)|qzz)}4C-YcTKn<29xdyDA*dN^4r-o$`o8$|;a_y4*`9yGo~Lg;lU7iA8Zpun z2;iYd)3%oR-${s4Li94UU!`{ph5DHXUY*hXiIA0VI}A|Om63pM+n5a4m5Ud9}N z%q-h3{;X>C#ogqw>dNlO=Vo!JRH&$Yb$vvN9rzaiX6l7nlH|YSDpqOEnjz+70TUPz0jT4oiC=%B>^;A9!vEI zzKsurh43-3Yyg9>yy~Dfkqfzi5<(og>Fx z&TW56gH(uOfKVgd5!XV~qcQw%*m4fg8_~ze&o>&bt~x_bX;W1Me_^FC4Xf@BW=UtXT9Sc;|HOoZp8jiPXBwdPw>xPe1JRn`N2vD3Hcj((86J2LXXc3;Y5BXrF#kiXs8~# zXM`zfIItX@XNZWE-lZoqGQnIc;2f4Z@T^c%Bs55|?^>l!b&?-@2srsJEuP<_DA~;! zzKD%)sVtc4Vy3zUQ%lU$GFy1l)Ox$9W}#?(tO#cWudTmcGGDZ3!L%o8+7mA+%~Wb<5Ci zlw+AjTsO;B&lj(rH2>U`d)|mIxz|-8AjTBa6nTC+R%bhRN>R)`DnZ`&?bDaNS2%oP|du z%lnb3{LV_jycfsyXsW*2E$mz=zONN`*6H5Y_0;0wu#}J4#I&#}B7Bu1t!5M5L$iH? zUJ&qOu!K*=MtVWPn>5B`l}d!+Fsi0D3l8-L|zpHENZsnJZ>#PwT*ZzU5209#y3mdI5Tjs-l! z5>ZT&l>(xUBr@LR&T&8h2#EqUF{2&fV~crnqGK`4=AIwZB`YoI3zXhUW+9$|5qIE( z&jna7b6|b)m(IDej%;Z7$AxHsq$epL0*9XnE~mS1QZP-y1quk(GFP?C;T`i}$4?G3 zR^>m?Tej_(l91^R{*dArna-vpeVXo@wv6~(IN!WYdJ?0J|APM@LM#$dysI&Zx}{=4 z%=tS3|1JM0bo{;0{-1?i9|^mDr4hwdzY-AqSE2cyPGebh&IoCnrDU@HfJKtY~hDf&99TQ=l~xszkd0)Bo~SuPgd6%gEeq)aUS z)q0(1x{G`!RBg)r>X~!8dxmzzyF{~Cbr)4vEtltths4R<%L4r_+g%#8>ZxV;Ge@%y z>;FI$E2m2$ZNC)g?pHgsR`H;CSDyCcUi#Ca%-hn R5ndHtyXSuhxMQ2*{{!Q_ is one of "lexer", "formatter" or "filter".') + special_modes.add_argument( + '-V', action='store_true', + help='Print the package version.') + special_modes.add_argument( + '-h', '--help', action='store_true', + help='Print this help.') + special_modes_group.add_argument( + '-a', metavar='ARG', + help='Formatter-specific additional argument for the -S (print ' + 'style sheet) mode.') + + argns = parser.parse_args(args[1:]) + + try: + return main_inner(parser, argns) + except BrokenPipeError: + # someone closed our stdout, e.g. by quitting a pager. + return 0 + except Exception: + if argns.v: + print(file=sys.stderr) + print('*' * 65, file=sys.stderr) + print('An unhandled exception occurred while highlighting.', + file=sys.stderr) + print('Please report the whole traceback to the issue tracker at', + file=sys.stderr) + print('.', + file=sys.stderr) + print('*' * 65, file=sys.stderr) + print(file=sys.stderr) + raise + import traceback + info = traceback.format_exception(*sys.exc_info()) + msg = info[-1].strip() + if len(info) >= 3: + # extract relevant file and position info + msg += '\n (f{})'.format(info[-2].split('\n')[0].strip()[1:]) + print(file=sys.stderr) + print('*** Error while highlighting:', file=sys.stderr) + print(msg, file=sys.stderr) + print('*** If this is a bug you want to report, please rerun with -v.', + file=sys.stderr) + return 1 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/console.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/console.py new file mode 100644 index 000000000..ee1ac27a2 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/console.py @@ -0,0 +1,70 @@ +""" + pygments.console + ~~~~~~~~~~~~~~~~ + + Format colored console output. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +esc = "\x1b[" + +codes = {} +codes[""] = "" +codes["reset"] = esc + "39;49;00m" + +codes["bold"] = esc + "01m" +codes["faint"] = esc + "02m" +codes["standout"] = esc + "03m" +codes["underline"] = esc + "04m" +codes["blink"] = esc + "05m" +codes["overline"] = esc + "06m" + +dark_colors = ["black", "red", "green", "yellow", "blue", + "magenta", "cyan", "gray"] +light_colors = ["brightblack", "brightred", "brightgreen", "brightyellow", "brightblue", + "brightmagenta", "brightcyan", "white"] + +x = 30 +for dark, light in zip(dark_colors, light_colors): + codes[dark] = esc + "%im" % x + codes[light] = esc + "%im" % (60 + x) + x += 1 + +del dark, light, x + +codes["white"] = codes["bold"] + + +def reset_color(): + return codes["reset"] + + +def colorize(color_key, text): + return codes[color_key] + text + codes["reset"] + + +def ansiformat(attr, text): + """ + Format ``text`` with a color and/or some attributes:: + + color normal color + *color* bold color + _color_ underlined color + +color+ blinking color + """ + result = [] + if attr[:1] == attr[-1:] == '+': + result.append(codes['blink']) + attr = attr[1:-1] + if attr[:1] == attr[-1:] == '*': + result.append(codes['bold']) + attr = attr[1:-1] + if attr[:1] == attr[-1:] == '_': + result.append(codes['underline']) + attr = attr[1:-1] + result.append(codes[attr]) + result.append(text) + result.append(codes['reset']) + return ''.join(result) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/filter.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/filter.py new file mode 100644 index 000000000..5efff438d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/filter.py @@ -0,0 +1,70 @@ +""" + pygments.filter + ~~~~~~~~~~~~~~~ + + Module that implements the default filter. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + + +def apply_filters(stream, filters, lexer=None): + """ + Use this method to apply an iterable of filters to + a stream. If lexer is given it's forwarded to the + filter, otherwise the filter receives `None`. + """ + def _apply(filter_, stream): + yield from filter_.filter(lexer, stream) + for filter_ in filters: + stream = _apply(filter_, stream) + return stream + + +def simplefilter(f): + """ + Decorator that converts a function into a filter:: + + @simplefilter + def lowercase(self, lexer, stream, options): + for ttype, value in stream: + yield ttype, value.lower() + """ + return type(f.__name__, (FunctionFilter,), { + '__module__': getattr(f, '__module__'), + '__doc__': f.__doc__, + 'function': f, + }) + + +class Filter: + """ + Default filter. Subclass this class or use the `simplefilter` + decorator to create own filters. + """ + + def __init__(self, **options): + self.options = options + + def filter(self, lexer, stream): + raise NotImplementedError() + + +class FunctionFilter(Filter): + """ + Abstract class used by `simplefilter` to create simple + function filters on the fly. The `simplefilter` decorator + automatically creates subclasses of this class for + functions passed to it. + """ + function = None + + def __init__(self, **options): + if not hasattr(self, 'function'): + raise TypeError(f'{self.__class__.__name__!r} used without bound function') + Filter.__init__(self, **options) + + def filter(self, lexer, stream): + # pylint: disable=not-callable + yield from self.function(lexer, stream, self.options) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/filters/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/filters/__init__.py new file mode 100644 index 000000000..2fed761a0 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/filters/__init__.py @@ -0,0 +1,940 @@ +""" + pygments.filters + ~~~~~~~~~~~~~~~~ + + Module containing filter lookup functions and default + filters. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re + +from pygments.token import String, Comment, Keyword, Name, Error, Whitespace, \ + string_to_tokentype +from pygments.filter import Filter +from pygments.util import get_list_opt, get_int_opt, get_bool_opt, \ + get_choice_opt, ClassNotFound, OptionError +from pygments.plugin import find_plugin_filters + + +def find_filter_class(filtername): + """Lookup a filter by name. Return None if not found.""" + if filtername in FILTERS: + return FILTERS[filtername] + for name, cls in find_plugin_filters(): + if name == filtername: + return cls + return None + + +def get_filter_by_name(filtername, **options): + """Return an instantiated filter. + + Options are passed to the filter initializer if wanted. + Raise a ClassNotFound if not found. + """ + cls = find_filter_class(filtername) + if cls: + return cls(**options) + else: + raise ClassNotFound(f'filter {filtername!r} not found') + + +def get_all_filters(): + """Return a generator of all filter names.""" + yield from FILTERS + for name, _ in find_plugin_filters(): + yield name + + +def _replace_special(ttype, value, regex, specialttype, + replacefunc=lambda x: x): + last = 0 + for match in regex.finditer(value): + start, end = match.start(), match.end() + if start != last: + yield ttype, value[last:start] + yield specialttype, replacefunc(value[start:end]) + last = end + if last != len(value): + yield ttype, value[last:] + + +class CodeTagFilter(Filter): + """Highlight special code tags in comments and docstrings. + + Options accepted: + + `codetags` : list of strings + A list of strings that are flagged as code tags. The default is to + highlight ``XXX``, ``TODO``, ``FIXME``, ``BUG`` and ``NOTE``. + + .. versionchanged:: 2.13 + Now recognizes ``FIXME`` by default. + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + tags = get_list_opt(options, 'codetags', + ['XXX', 'TODO', 'FIXME', 'BUG', 'NOTE']) + self.tag_re = re.compile(r'\b({})\b'.format('|'.join([ + re.escape(tag) for tag in tags if tag + ]))) + + def filter(self, lexer, stream): + regex = self.tag_re + for ttype, value in stream: + if ttype in String.Doc or \ + ttype in Comment and \ + ttype not in Comment.Preproc: + yield from _replace_special(ttype, value, regex, Comment.Special) + else: + yield ttype, value + + +class SymbolFilter(Filter): + """Convert mathematical symbols such as \\ in Isabelle + or \\longrightarrow in LaTeX into Unicode characters. + + This is mostly useful for HTML or console output when you want to + approximate the source rendering you'd see in an IDE. + + Options accepted: + + `lang` : string + The symbol language. Must be one of ``'isabelle'`` or + ``'latex'``. The default is ``'isabelle'``. + """ + + latex_symbols = { + '\\alpha' : '\U000003b1', + '\\beta' : '\U000003b2', + '\\gamma' : '\U000003b3', + '\\delta' : '\U000003b4', + '\\varepsilon' : '\U000003b5', + '\\zeta' : '\U000003b6', + '\\eta' : '\U000003b7', + '\\vartheta' : '\U000003b8', + '\\iota' : '\U000003b9', + '\\kappa' : '\U000003ba', + '\\lambda' : '\U000003bb', + '\\mu' : '\U000003bc', + '\\nu' : '\U000003bd', + '\\xi' : '\U000003be', + '\\pi' : '\U000003c0', + '\\varrho' : '\U000003c1', + '\\sigma' : '\U000003c3', + '\\tau' : '\U000003c4', + '\\upsilon' : '\U000003c5', + '\\varphi' : '\U000003c6', + '\\chi' : '\U000003c7', + '\\psi' : '\U000003c8', + '\\omega' : '\U000003c9', + '\\Gamma' : '\U00000393', + '\\Delta' : '\U00000394', + '\\Theta' : '\U00000398', + '\\Lambda' : '\U0000039b', + '\\Xi' : '\U0000039e', + '\\Pi' : '\U000003a0', + '\\Sigma' : '\U000003a3', + '\\Upsilon' : '\U000003a5', + '\\Phi' : '\U000003a6', + '\\Psi' : '\U000003a8', + '\\Omega' : '\U000003a9', + '\\leftarrow' : '\U00002190', + '\\longleftarrow' : '\U000027f5', + '\\rightarrow' : '\U00002192', + '\\longrightarrow' : '\U000027f6', + '\\Leftarrow' : '\U000021d0', + '\\Longleftarrow' : '\U000027f8', + '\\Rightarrow' : '\U000021d2', + '\\Longrightarrow' : '\U000027f9', + '\\leftrightarrow' : '\U00002194', + '\\longleftrightarrow' : '\U000027f7', + '\\Leftrightarrow' : '\U000021d4', + '\\Longleftrightarrow' : '\U000027fa', + '\\mapsto' : '\U000021a6', + '\\longmapsto' : '\U000027fc', + '\\relbar' : '\U00002500', + '\\Relbar' : '\U00002550', + '\\hookleftarrow' : '\U000021a9', + '\\hookrightarrow' : '\U000021aa', + '\\leftharpoondown' : '\U000021bd', + '\\rightharpoondown' : '\U000021c1', + '\\leftharpoonup' : '\U000021bc', + '\\rightharpoonup' : '\U000021c0', + '\\rightleftharpoons' : '\U000021cc', + '\\leadsto' : '\U0000219d', + '\\downharpoonleft' : '\U000021c3', + '\\downharpoonright' : '\U000021c2', + '\\upharpoonleft' : '\U000021bf', + '\\upharpoonright' : '\U000021be', + '\\restriction' : '\U000021be', + '\\uparrow' : '\U00002191', + '\\Uparrow' : '\U000021d1', + '\\downarrow' : '\U00002193', + '\\Downarrow' : '\U000021d3', + '\\updownarrow' : '\U00002195', + '\\Updownarrow' : '\U000021d5', + '\\langle' : '\U000027e8', + '\\rangle' : '\U000027e9', + '\\lceil' : '\U00002308', + '\\rceil' : '\U00002309', + '\\lfloor' : '\U0000230a', + '\\rfloor' : '\U0000230b', + '\\flqq' : '\U000000ab', + '\\frqq' : '\U000000bb', + '\\bot' : '\U000022a5', + '\\top' : '\U000022a4', + '\\wedge' : '\U00002227', + '\\bigwedge' : '\U000022c0', + '\\vee' : '\U00002228', + '\\bigvee' : '\U000022c1', + '\\forall' : '\U00002200', + '\\exists' : '\U00002203', + '\\nexists' : '\U00002204', + '\\neg' : '\U000000ac', + '\\Box' : '\U000025a1', + '\\Diamond' : '\U000025c7', + '\\vdash' : '\U000022a2', + '\\models' : '\U000022a8', + '\\dashv' : '\U000022a3', + '\\surd' : '\U0000221a', + '\\le' : '\U00002264', + '\\ge' : '\U00002265', + '\\ll' : '\U0000226a', + '\\gg' : '\U0000226b', + '\\lesssim' : '\U00002272', + '\\gtrsim' : '\U00002273', + '\\lessapprox' : '\U00002a85', + '\\gtrapprox' : '\U00002a86', + '\\in' : '\U00002208', + '\\notin' : '\U00002209', + '\\subset' : '\U00002282', + '\\supset' : '\U00002283', + '\\subseteq' : '\U00002286', + '\\supseteq' : '\U00002287', + '\\sqsubset' : '\U0000228f', + '\\sqsupset' : '\U00002290', + '\\sqsubseteq' : '\U00002291', + '\\sqsupseteq' : '\U00002292', + '\\cap' : '\U00002229', + '\\bigcap' : '\U000022c2', + '\\cup' : '\U0000222a', + '\\bigcup' : '\U000022c3', + '\\sqcup' : '\U00002294', + '\\bigsqcup' : '\U00002a06', + '\\sqcap' : '\U00002293', + '\\Bigsqcap' : '\U00002a05', + '\\setminus' : '\U00002216', + '\\propto' : '\U0000221d', + '\\uplus' : '\U0000228e', + '\\bigplus' : '\U00002a04', + '\\sim' : '\U0000223c', + '\\doteq' : '\U00002250', + '\\simeq' : '\U00002243', + '\\approx' : '\U00002248', + '\\asymp' : '\U0000224d', + '\\cong' : '\U00002245', + '\\equiv' : '\U00002261', + '\\Join' : '\U000022c8', + '\\bowtie' : '\U00002a1d', + '\\prec' : '\U0000227a', + '\\succ' : '\U0000227b', + '\\preceq' : '\U0000227c', + '\\succeq' : '\U0000227d', + '\\parallel' : '\U00002225', + '\\mid' : '\U000000a6', + '\\pm' : '\U000000b1', + '\\mp' : '\U00002213', + '\\times' : '\U000000d7', + '\\div' : '\U000000f7', + '\\cdot' : '\U000022c5', + '\\star' : '\U000022c6', + '\\circ' : '\U00002218', + '\\dagger' : '\U00002020', + '\\ddagger' : '\U00002021', + '\\lhd' : '\U000022b2', + '\\rhd' : '\U000022b3', + '\\unlhd' : '\U000022b4', + '\\unrhd' : '\U000022b5', + '\\triangleleft' : '\U000025c3', + '\\triangleright' : '\U000025b9', + '\\triangle' : '\U000025b3', + '\\triangleq' : '\U0000225c', + '\\oplus' : '\U00002295', + '\\bigoplus' : '\U00002a01', + '\\otimes' : '\U00002297', + '\\bigotimes' : '\U00002a02', + '\\odot' : '\U00002299', + '\\bigodot' : '\U00002a00', + '\\ominus' : '\U00002296', + '\\oslash' : '\U00002298', + '\\dots' : '\U00002026', + '\\cdots' : '\U000022ef', + '\\sum' : '\U00002211', + '\\prod' : '\U0000220f', + '\\coprod' : '\U00002210', + '\\infty' : '\U0000221e', + '\\int' : '\U0000222b', + '\\oint' : '\U0000222e', + '\\clubsuit' : '\U00002663', + '\\diamondsuit' : '\U00002662', + '\\heartsuit' : '\U00002661', + '\\spadesuit' : '\U00002660', + '\\aleph' : '\U00002135', + '\\emptyset' : '\U00002205', + '\\nabla' : '\U00002207', + '\\partial' : '\U00002202', + '\\flat' : '\U0000266d', + '\\natural' : '\U0000266e', + '\\sharp' : '\U0000266f', + '\\angle' : '\U00002220', + '\\copyright' : '\U000000a9', + '\\textregistered' : '\U000000ae', + '\\textonequarter' : '\U000000bc', + '\\textonehalf' : '\U000000bd', + '\\textthreequarters' : '\U000000be', + '\\textordfeminine' : '\U000000aa', + '\\textordmasculine' : '\U000000ba', + '\\euro' : '\U000020ac', + '\\pounds' : '\U000000a3', + '\\yen' : '\U000000a5', + '\\textcent' : '\U000000a2', + '\\textcurrency' : '\U000000a4', + '\\textdegree' : '\U000000b0', + } + + isabelle_symbols = { + '\\' : '\U0001d7ec', + '\\' : '\U0001d7ed', + '\\' : '\U0001d7ee', + '\\' : '\U0001d7ef', + '\\' : '\U0001d7f0', + '\\' : '\U0001d7f1', + '\\' : '\U0001d7f2', + '\\' : '\U0001d7f3', + '\\' : '\U0001d7f4', + '\\' : '\U0001d7f5', + '\\' : '\U0001d49c', + '\\' : '\U0000212c', + '\\' : '\U0001d49e', + '\\' : '\U0001d49f', + '\\' : '\U00002130', + '\\' : '\U00002131', + '\\' : '\U0001d4a2', + '\\' : '\U0000210b', + '\\' : '\U00002110', + '\\' : '\U0001d4a5', + '\\' : '\U0001d4a6', + '\\' : '\U00002112', + '\\' : '\U00002133', + '\\' : '\U0001d4a9', + '\\' : '\U0001d4aa', + '\\

' : '\U0001d5c9', + '\\' : '\U0001d5ca', + '\\' : '\U0001d5cb', + '\\' : '\U0001d5cc', + '\\' : '\U0001d5cd', + '\\' : '\U0001d5ce', + '\\' : '\U0001d5cf', + '\\' : '\U0001d5d0', + '\\' : '\U0001d5d1', + '\\' : '\U0001d5d2', + '\\' : '\U0001d5d3', + '\\' : '\U0001d504', + '\\' : '\U0001d505', + '\\' : '\U0000212d', + '\\

' : '\U0001d507', + '\\' : '\U0001d508', + '\\' : '\U0001d509', + '\\' : '\U0001d50a', + '\\' : '\U0000210c', + '\\' : '\U00002111', + '\\' : '\U0001d50d', + '\\' : '\U0001d50e', + '\\' : '\U0001d50f', + '\\' : '\U0001d510', + '\\' : '\U0001d511', + '\\' : '\U0001d512', + '\\' : '\U0001d513', + '\\' : '\U0001d514', + '\\' : '\U0000211c', + '\\' : '\U0001d516', + '\\' : '\U0001d517', + '\\' : '\U0001d518', + '\\' : '\U0001d519', + '\\' : '\U0001d51a', + '\\' : '\U0001d51b', + '\\' : '\U0001d51c', + '\\' : '\U00002128', + '\\' : '\U0001d51e', + '\\' : '\U0001d51f', + '\\' : '\U0001d520', + '\\
' : '\U0001d521', + '\\' : '\U0001d522', + '\\' : '\U0001d523', + '\\' : '\U0001d524', + '\\' : '\U0001d525', + '\\' : '\U0001d526', + '\\' : '\U0001d527', + '\\' : '\U0001d528', + '\\' : '\U0001d529', + '\\' : '\U0001d52a', + '\\' : '\U0001d52b', + '\\' : '\U0001d52c', + '\\' : '\U0001d52d', + '\\' : '\U0001d52e', + '\\' : '\U0001d52f', + '\\' : '\U0001d530', + '\\' : '\U0001d531', + '\\' : '\U0001d532', + '\\' : '\U0001d533', + '\\' : '\U0001d534', + '\\' : '\U0001d535', + '\\' : '\U0001d536', + '\\' : '\U0001d537', + '\\' : '\U000003b1', + '\\' : '\U000003b2', + '\\' : '\U000003b3', + '\\' : '\U000003b4', + '\\' : '\U000003b5', + '\\' : '\U000003b6', + '\\' : '\U000003b7', + '\\' : '\U000003b8', + '\\' : '\U000003b9', + '\\' : '\U000003ba', + '\\' : '\U000003bb', + '\\' : '\U000003bc', + '\\' : '\U000003bd', + '\\' : '\U000003be', + '\\' : '\U000003c0', + '\\' : '\U000003c1', + '\\' : '\U000003c3', + '\\' : '\U000003c4', + '\\' : '\U000003c5', + '\\' : '\U000003c6', + '\\' : '\U000003c7', + '\\' : '\U000003c8', + '\\' : '\U000003c9', + '\\' : '\U00000393', + '\\' : '\U00000394', + '\\' : '\U00000398', + '\\' : '\U0000039b', + '\\' : '\U0000039e', + '\\' : '\U000003a0', + '\\' : '\U000003a3', + '\\' : '\U000003a5', + '\\' : '\U000003a6', + '\\' : '\U000003a8', + '\\' : '\U000003a9', + '\\' : '\U0001d539', + '\\' : '\U00002102', + '\\' : '\U00002115', + '\\' : '\U0000211a', + '\\' : '\U0000211d', + '\\' : '\U00002124', + '\\' : '\U00002190', + '\\' : '\U000027f5', + '\\' : '\U00002192', + '\\' : '\U000027f6', + '\\' : '\U000021d0', + '\\' : '\U000027f8', + '\\' : '\U000021d2', + '\\' : '\U000027f9', + '\\' : '\U00002194', + '\\' : '\U000027f7', + '\\' : '\U000021d4', + '\\' : '\U000027fa', + '\\' : '\U000021a6', + '\\' : '\U000027fc', + '\\' : '\U00002500', + '\\' : '\U00002550', + '\\' : '\U000021a9', + '\\' : '\U000021aa', + '\\' : '\U000021bd', + '\\' : '\U000021c1', + '\\' : '\U000021bc', + '\\' : '\U000021c0', + '\\' : '\U000021cc', + '\\' : '\U0000219d', + '\\' : '\U000021c3', + '\\' : '\U000021c2', + '\\' : '\U000021bf', + '\\' : '\U000021be', + '\\' : '\U000021be', + '\\' : '\U00002237', + '\\' : '\U00002191', + '\\' : '\U000021d1', + '\\' : '\U00002193', + '\\' : '\U000021d3', + '\\' : '\U00002195', + '\\' : '\U000021d5', + '\\' : '\U000027e8', + '\\' : '\U000027e9', + '\\' : '\U00002308', + '\\' : '\U00002309', + '\\' : '\U0000230a', + '\\' : '\U0000230b', + '\\' : '\U00002987', + '\\' : '\U00002988', + '\\' : '\U000027e6', + '\\' : '\U000027e7', + '\\' : '\U00002983', + '\\' : '\U00002984', + '\\' : '\U000000ab', + '\\' : '\U000000bb', + '\\' : '\U000022a5', + '\\' : '\U000022a4', + '\\' : '\U00002227', + '\\' : '\U000022c0', + '\\' : '\U00002228', + '\\' : '\U000022c1', + '\\' : '\U00002200', + '\\' : '\U00002203', + '\\' : '\U00002204', + '\\' : '\U000000ac', + '\\' : '\U000025a1', + '\\' : '\U000025c7', + '\\' : '\U000022a2', + '\\' : '\U000022a8', + '\\' : '\U000022a9', + '\\' : '\U000022ab', + '\\' : '\U000022a3', + '\\' : '\U0000221a', + '\\' : '\U00002264', + '\\' : '\U00002265', + '\\' : '\U0000226a', + '\\' : '\U0000226b', + '\\' : '\U00002272', + '\\' : '\U00002273', + '\\' : '\U00002a85', + '\\' : '\U00002a86', + '\\' : '\U00002208', + '\\' : '\U00002209', + '\\' : '\U00002282', + '\\' : '\U00002283', + '\\' : '\U00002286', + '\\' : '\U00002287', + '\\' : '\U0000228f', + '\\' : '\U00002290', + '\\' : '\U00002291', + '\\' : '\U00002292', + '\\' : '\U00002229', + '\\' : '\U000022c2', + '\\' : '\U0000222a', + '\\' : '\U000022c3', + '\\' : '\U00002294', + '\\' : '\U00002a06', + '\\' : '\U00002293', + '\\' : '\U00002a05', + '\\' : '\U00002216', + '\\' : '\U0000221d', + '\\' : '\U0000228e', + '\\' : '\U00002a04', + '\\' : '\U00002260', + '\\' : '\U0000223c', + '\\' : '\U00002250', + '\\' : '\U00002243', + '\\' : '\U00002248', + '\\' : '\U0000224d', + '\\' : '\U00002245', + '\\' : '\U00002323', + '\\' : '\U00002261', + '\\' : '\U00002322', + '\\' : '\U000022c8', + '\\' : '\U00002a1d', + '\\' : '\U0000227a', + '\\' : '\U0000227b', + '\\' : '\U0000227c', + '\\' : '\U0000227d', + '\\' : '\U00002225', + '\\' : '\U000000a6', + '\\' : '\U000000b1', + '\\' : '\U00002213', + '\\' : '\U000000d7', + '\\
' : '\U000000f7', + '\\' : '\U000022c5', + '\\' : '\U000022c6', + '\\' : '\U00002219', + '\\' : '\U00002218', + '\\' : '\U00002020', + '\\' : '\U00002021', + '\\' : '\U000022b2', + '\\' : '\U000022b3', + '\\' : '\U000022b4', + '\\' : '\U000022b5', + '\\' : '\U000025c3', + '\\' : '\U000025b9', + '\\' : '\U000025b3', + '\\' : '\U0000225c', + '\\' : '\U00002295', + '\\' : '\U00002a01', + '\\' : '\U00002297', + '\\' : '\U00002a02', + '\\' : '\U00002299', + '\\' : '\U00002a00', + '\\' : '\U00002296', + '\\' : '\U00002298', + '\\' : '\U00002026', + '\\' : '\U000022ef', + '\\' : '\U00002211', + '\\' : '\U0000220f', + '\\' : '\U00002210', + '\\' : '\U0000221e', + '\\' : '\U0000222b', + '\\' : '\U0000222e', + '\\' : '\U00002663', + '\\' : '\U00002662', + '\\' : '\U00002661', + '\\' : '\U00002660', + '\\' : '\U00002135', + '\\' : '\U00002205', + '\\' : '\U00002207', + '\\' : '\U00002202', + '\\' : '\U0000266d', + '\\' : '\U0000266e', + '\\' : '\U0000266f', + '\\' : '\U00002220', + '\\' : '\U000000a9', + '\\' : '\U000000ae', + '\\' : '\U000000ad', + '\\' : '\U000000af', + '\\' : '\U000000bc', + '\\' : '\U000000bd', + '\\' : '\U000000be', + '\\' : '\U000000aa', + '\\' : '\U000000ba', + '\\
' : '\U000000a7', + '\\' : '\U000000b6', + '\\' : '\U000000a1', + '\\' : '\U000000bf', + '\\' : '\U000020ac', + '\\' : '\U000000a3', + '\\' : '\U000000a5', + '\\' : '\U000000a2', + '\\' : '\U000000a4', + '\\' : '\U000000b0', + '\\' : '\U00002a3f', + '\\' : '\U00002127', + '\\' : '\U000025ca', + '\\' : '\U00002118', + '\\' : '\U00002240', + '\\' : '\U000022c4', + '\\' : '\U000000b4', + '\\' : '\U00000131', + '\\' : '\U000000a8', + '\\' : '\U000000b8', + '\\' : '\U000002dd', + '\\' : '\U000003f5', + '\\' : '\U000023ce', + '\\' : '\U00002039', + '\\' : '\U0000203a', + '\\' : '\U00002302', + '\\<^sub>' : '\U000021e9', + '\\<^sup>' : '\U000021e7', + '\\<^bold>' : '\U00002759', + '\\<^bsub>' : '\U000021d8', + '\\<^esub>' : '\U000021d9', + '\\<^bsup>' : '\U000021d7', + '\\<^esup>' : '\U000021d6', + } + + lang_map = {'isabelle' : isabelle_symbols, 'latex' : latex_symbols} + + def __init__(self, **options): + Filter.__init__(self, **options) + lang = get_choice_opt(options, 'lang', + ['isabelle', 'latex'], 'isabelle') + self.symbols = self.lang_map[lang] + + def filter(self, lexer, stream): + for ttype, value in stream: + if value in self.symbols: + yield ttype, self.symbols[value] + else: + yield ttype, value + + +class KeywordCaseFilter(Filter): + """Convert keywords to lowercase or uppercase or capitalize them, which + means first letter uppercase, rest lowercase. + + This can be useful e.g. if you highlight Pascal code and want to adapt the + code to your styleguide. + + Options accepted: + + `case` : string + The casing to convert keywords to. Must be one of ``'lower'``, + ``'upper'`` or ``'capitalize'``. The default is ``'lower'``. + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + case = get_choice_opt(options, 'case', + ['lower', 'upper', 'capitalize'], 'lower') + self.convert = getattr(str, case) + + def filter(self, lexer, stream): + for ttype, value in stream: + if ttype in Keyword: + yield ttype, self.convert(value) + else: + yield ttype, value + + +class NameHighlightFilter(Filter): + """Highlight a normal Name (and Name.*) token with a different token type. + + Example:: + + filter = NameHighlightFilter( + names=['foo', 'bar', 'baz'], + tokentype=Name.Function, + ) + + This would highlight the names "foo", "bar" and "baz" + as functions. `Name.Function` is the default token type. + + Options accepted: + + `names` : list of strings + A list of names that should be given the different token type. + There is no default. + `tokentype` : TokenType or string + A token type or a string containing a token type name that is + used for highlighting the strings in `names`. The default is + `Name.Function`. + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + self.names = set(get_list_opt(options, 'names', [])) + tokentype = options.get('tokentype') + if tokentype: + self.tokentype = string_to_tokentype(tokentype) + else: + self.tokentype = Name.Function + + def filter(self, lexer, stream): + for ttype, value in stream: + if ttype in Name and value in self.names: + yield self.tokentype, value + else: + yield ttype, value + + +class ErrorToken(Exception): + pass + + +class RaiseOnErrorTokenFilter(Filter): + """Raise an exception when the lexer generates an error token. + + Options accepted: + + `excclass` : Exception class + The exception class to raise. + The default is `pygments.filters.ErrorToken`. + + .. versionadded:: 0.8 + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + self.exception = options.get('excclass', ErrorToken) + try: + # issubclass() will raise TypeError if first argument is not a class + if not issubclass(self.exception, Exception): + raise TypeError + except TypeError: + raise OptionError('excclass option is not an exception class') + + def filter(self, lexer, stream): + for ttype, value in stream: + if ttype is Error: + raise self.exception(value) + yield ttype, value + + +class VisibleWhitespaceFilter(Filter): + """Convert tabs, newlines and/or spaces to visible characters. + + Options accepted: + + `spaces` : string or bool + If this is a one-character string, spaces will be replaces by this string. + If it is another true value, spaces will be replaced by ``·`` (unicode + MIDDLE DOT). If it is a false value, spaces will not be replaced. The + default is ``False``. + `tabs` : string or bool + The same as for `spaces`, but the default replacement character is ``»`` + (unicode RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK). The default value + is ``False``. Note: this will not work if the `tabsize` option for the + lexer is nonzero, as tabs will already have been expanded then. + `tabsize` : int + If tabs are to be replaced by this filter (see the `tabs` option), this + is the total number of characters that a tab should be expanded to. + The default is ``8``. + `newlines` : string or bool + The same as for `spaces`, but the default replacement character is ``¶`` + (unicode PILCROW SIGN). The default value is ``False``. + `wstokentype` : bool + If true, give whitespace the special `Whitespace` token type. This allows + styling the visible whitespace differently (e.g. greyed out), but it can + disrupt background colors. The default is ``True``. + + .. versionadded:: 0.8 + """ + + def __init__(self, **options): + Filter.__init__(self, **options) + for name, default in [('spaces', '·'), + ('tabs', '»'), + ('newlines', '¶')]: + opt = options.get(name, False) + if isinstance(opt, str) and len(opt) == 1: + setattr(self, name, opt) + else: + setattr(self, name, (opt and default or '')) + tabsize = get_int_opt(options, 'tabsize', 8) + if self.tabs: + self.tabs += ' ' * (tabsize - 1) + if self.newlines: + self.newlines += '\n' + self.wstt = get_bool_opt(options, 'wstokentype', True) + + def filter(self, lexer, stream): + if self.wstt: + spaces = self.spaces or ' ' + tabs = self.tabs or '\t' + newlines = self.newlines or '\n' + regex = re.compile(r'\s') + + def replacefunc(wschar): + if wschar == ' ': + return spaces + elif wschar == '\t': + return tabs + elif wschar == '\n': + return newlines + return wschar + + for ttype, value in stream: + yield from _replace_special(ttype, value, regex, Whitespace, + replacefunc) + else: + spaces, tabs, newlines = self.spaces, self.tabs, self.newlines + # simpler processing + for ttype, value in stream: + if spaces: + value = value.replace(' ', spaces) + if tabs: + value = value.replace('\t', tabs) + if newlines: + value = value.replace('\n', newlines) + yield ttype, value + + +class GobbleFilter(Filter): + """Gobbles source code lines (eats initial characters). + + This filter drops the first ``n`` characters off every line of code. This + may be useful when the source code fed to the lexer is indented by a fixed + amount of space that isn't desired in the output. + + Options accepted: + + `n` : int + The number of characters to gobble. + + .. versionadded:: 1.2 + """ + def __init__(self, **options): + Filter.__init__(self, **options) + self.n = get_int_opt(options, 'n', 0) + + def gobble(self, value, left): + if left < len(value): + return value[left:], 0 + else: + return '', left - len(value) + + def filter(self, lexer, stream): + n = self.n + left = n # How many characters left to gobble. + for ttype, value in stream: + # Remove ``left`` tokens from first line, ``n`` from all others. + parts = value.split('\n') + (parts[0], left) = self.gobble(parts[0], left) + for i in range(1, len(parts)): + (parts[i], left) = self.gobble(parts[i], n) + value = '\n'.join(parts) + + if value != '': + yield ttype, value + + +class TokenMergeFilter(Filter): + """Merges consecutive tokens with the same token type in the output + stream of a lexer. + + .. versionadded:: 1.2 + """ + def __init__(self, **options): + Filter.__init__(self, **options) + + def filter(self, lexer, stream): + current_type = None + current_value = None + for ttype, value in stream: + if ttype is current_type: + current_value += value + else: + if current_type is not None: + yield current_type, current_value + current_type = ttype + current_value = value + if current_type is not None: + yield current_type, current_value + + +FILTERS = { + 'codetagify': CodeTagFilter, + 'keywordcase': KeywordCaseFilter, + 'highlight': NameHighlightFilter, + 'raiseonerror': RaiseOnErrorTokenFilter, + 'whitespace': VisibleWhitespaceFilter, + 'gobble': GobbleFilter, + 'tokenmerge': TokenMergeFilter, + 'symbols': SymbolFilter, +} diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..684b6fcfc69348149d6fd195d10605a14c1926c7 GIT binary patch literal 37951 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, + the `arg` is then given by the ``-a`` option. + """ + return '' + + def format(self, tokensource, outfile): + """ + This method must format the tokens from the `tokensource` iterable and + write the formatted version to the file object `outfile`. + + Formatter options can control how exactly the tokens are converted. + """ + if self.encoding: + # wrap the outfile in a StreamWriter + outfile = codecs.lookup(self.encoding)[3](outfile) + return self.format_unencoded(tokensource, outfile) + + # Allow writing Formatter[str] or Formatter[bytes]. That's equivalent to + # Formatter. This helps when using third-party type stubs from typeshed. + def __class_getitem__(cls, name): + return cls diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__init__.py new file mode 100644 index 000000000..b24931cd1 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__init__.py @@ -0,0 +1,157 @@ +""" + pygments.formatters + ~~~~~~~~~~~~~~~~~~~ + + Pygments formatters. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re +import sys +import types +import fnmatch +from os.path import basename + +from pygments.formatters._mapping import FORMATTERS +from pygments.plugin import find_plugin_formatters +from pygments.util import ClassNotFound + +__all__ = ['get_formatter_by_name', 'get_formatter_for_filename', + 'get_all_formatters', 'load_formatter_from_file'] + list(FORMATTERS) + +_formatter_cache = {} # classes by name +_pattern_cache = {} + + +def _fn_matches(fn, glob): + """Return whether the supplied file name fn matches pattern filename.""" + if glob not in _pattern_cache: + pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob)) + return pattern.match(fn) + return _pattern_cache[glob].match(fn) + + +def _load_formatters(module_name): + """Load a formatter (and all others in the module too).""" + mod = __import__(module_name, None, None, ['__all__']) + for formatter_name in mod.__all__: + cls = getattr(mod, formatter_name) + _formatter_cache[cls.name] = cls + + +def get_all_formatters(): + """Return a generator for all formatter classes.""" + # NB: this returns formatter classes, not info like get_all_lexers(). + for info in FORMATTERS.values(): + if info[1] not in _formatter_cache: + _load_formatters(info[0]) + yield _formatter_cache[info[1]] + for _, formatter in find_plugin_formatters(): + yield formatter + + +def find_formatter_class(alias): + """Lookup a formatter by alias. + + Returns None if not found. + """ + for module_name, name, aliases, _, _ in FORMATTERS.values(): + if alias in aliases: + if name not in _formatter_cache: + _load_formatters(module_name) + return _formatter_cache[name] + for _, cls in find_plugin_formatters(): + if alias in cls.aliases: + return cls + + +def get_formatter_by_name(_alias, **options): + """ + Return an instance of a :class:`.Formatter` subclass that has `alias` in its + aliases list. The formatter is given the `options` at its instantiation. + + Will raise :exc:`pygments.util.ClassNotFound` if no formatter with that + alias is found. + """ + cls = find_formatter_class(_alias) + if cls is None: + raise ClassNotFound(f"no formatter found for name {_alias!r}") + return cls(**options) + + +def load_formatter_from_file(filename, formattername="CustomFormatter", **options): + """ + Return a `Formatter` subclass instance loaded from the provided file, relative + to the current directory. + + The file is expected to contain a Formatter class named ``formattername`` + (by default, CustomFormatter). Users should be very careful with the input, because + this method is equivalent to running ``eval()`` on the input file. The formatter is + given the `options` at its instantiation. + + :exc:`pygments.util.ClassNotFound` is raised if there are any errors loading + the formatter. + + .. versionadded:: 2.2 + """ + try: + # This empty dict will contain the namespace for the exec'd file + custom_namespace = {} + with open(filename, 'rb') as f: + exec(f.read(), custom_namespace) + # Retrieve the class `formattername` from that namespace + if formattername not in custom_namespace: + raise ClassNotFound(f'no valid {formattername} class found in {filename}') + formatter_class = custom_namespace[formattername] + # And finally instantiate it with the options + return formatter_class(**options) + except OSError as err: + raise ClassNotFound(f'cannot read {filename}: {err}') + except ClassNotFound: + raise + except Exception as err: + raise ClassNotFound(f'error when loading custom formatter: {err}') + + +def get_formatter_for_filename(fn, **options): + """ + Return a :class:`.Formatter` subclass instance that has a filename pattern + matching `fn`. The formatter is given the `options` at its instantiation. + + Will raise :exc:`pygments.util.ClassNotFound` if no formatter for that filename + is found. + """ + fn = basename(fn) + for modname, name, _, filenames, _ in FORMATTERS.values(): + for filename in filenames: + if _fn_matches(fn, filename): + if name not in _formatter_cache: + _load_formatters(modname) + return _formatter_cache[name](**options) + for _name, cls in find_plugin_formatters(): + for filename in cls.filenames: + if _fn_matches(fn, filename): + return cls(**options) + raise ClassNotFound(f"no formatter found for file name {fn!r}") + + +class _automodule(types.ModuleType): + """Automatically import formatters.""" + + def __getattr__(self, name): + info = FORMATTERS.get(name) + if info: + _load_formatters(info[0]) + cls = _formatter_cache[info[1]] + setattr(self, name, cls) + return cls + raise AttributeError(name) + + +oldmod = sys.modules[__name__] +newmod = _automodule(__name__) +newmod.__dict__.update(oldmod.__dict__) +sys.modules[__name__] = newmod +del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9322a226906ee7c83d9ebba0319d5ab8cde1b3dc GIT binary patch literal 6937 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�Je;QB%hvO^XYa~BD$05B5@+UMNL*=c zpSQ)Y;XuvO4i+uon2f)?e4U7Q!(Oa%kr19Oa~+>Y?&wr?J0=4=CK)?OLgXV#JBzt{ zf^wN4ArDdX3kF`yG*BW$)%a>#oNFeda0DZ(FiNM@2;#Ys=X(6~i=mE@6BN<3&xVmL z3Z7{b5?j=0eB0Mhfg9;s3q?a7aCI__3wDg}&ngVa>z*7K-tm$VWLA<;Gn?sRfoEpz z0&+#k9Kbzok`jia{RyT-e%cfy={i#Bgo6RP5uf8A*B49hw)4 zZT_~@2a%O0FR1LBn4!)KF*q^w{RV3Z6<8`j$*n9g+BEN5ej0qC_y+3Ts(+6opbCFM4iqE zGgrdVAVLj5V?b}>K}5HY&Y>rbELW62>?pf}2yG?shCG~x2^uV-WUVdK0NTQjfAOpU z)y2$w0*Vvfbg>{%wu!kHi~Sg zg^DMZX>tmKKz;}=U_Uq^7g=Xw)6^4!>ymQwjLo%ZBrMk~5@&QR_5rK=Sc&a(kATa~ zIFssx;8qIp7>&=M^ zZ8a3;j49IfntDdfe+tZ$r5GJgpAFJUbkN+vU_JlmkM|t5{2zu#qFtU8f4-RFPf=iZ zP;U?gc5Wf~>17D0=Et#;u?mpvCMh@tD_W(MY8*nx!p;{*2cNau&yS9cmhW*1rHkJ- z`*I+fJQU~6gHcP#*NEGs`TV%`Hdm@`5Pj%mSBRc3)rfn&SIMpty-=#Hfxh*- zYPLx9QmJ<1Uu!yBCSoOLZadjEqOa%5zH+ivqTk8)btSt&^jfa$xRTu@`c|oS2g>iA zSF&}YH*)!YCA&@ZCJw{?&2}}rL-gI8*46AD(eLK+FKXF+qFFBgc{O`L^n0b+1IR!8 YvX(t0`u%+WW#vDQK>vP0y#QSQ1!^g{2mk;8 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/bbcode.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/bbcode.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fd78f51d1a9adc547060498a07fcc83b9892fcc GIT binary patch literal 4228 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/groff.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/groff.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e73d6d46e61e5e972481da820f65a39f59ac0979 GIT binary patch literal 7328 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..729b242c936ddbf4fe992a270a89929b3ba1f7f9 GIT binary patch literal 41397 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%0AU%ELx8+pvrDAGSokEn?pmw(pUh$(DOp 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/img.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/img.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d571b7b82fd20494d0dd300820b82c82683aacc1 GIT binary patch literal 28709 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 Fe*wCaYx~U+|Z6T13w5j+~N4Pk`m+~9B^0F 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�ilx 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/other.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/other.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4893b4e6f947f27cf4899dd52e48dfda79d4fb79 GIT binary patch literal 6871 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..899962a377963ade14c4c4266b8604d53e203539 GIT binary patch literal 2976 zcmcImO>7&-6`uVgmlS2m5-sb`@mOx;(6UKau9a9)h$NQmScz02YLkNfAy(WGMQg=n zcZaq~FI@rkK{A9|I*Gp2DiEL!e28-k&|Z7$#gtuy-R7X8=%F{sYA!zY%`8a^g4$aL z*xA|l-n{qbz3;u*KQ}iA5sW|nL7V@riqJpUM|~)@#ojMqv4M1yK)RrdhOj6mL;>ki zT1ZGDBC;+&5j4AH&mxxa!Z%@Ks2u7NU{|sUn zxk7r8WT_pUGp$99QexTBoR&?Si<-5N&vBW%|9b?v(AD~W44UvXQ-M7l*v!*ho<=>n z;gp#xSef)Z9mZGcOFVet!qEA_3xk*NYys1Gf~RYKVM?^cbJ!*XzyISOefYyqW}@8O zu#riTtWAdT2QyI~Q{;&D5r|@QYAs&t^-}}0J{&YBWRN3# zF8oFi5UfzLAqB8vx(WG0)T$)xMEX#pzCRruTWdDxHmT-heZ zoa;Ap6hHxd4l|3LlgVlpbtM3k&2j|26NbgoZm~Kjo|tAm??79L)@_~v5&KUtEunAK zqu;3A6}7wkgNiz^`SzANu-(zQEUz|g_u@wr4<}xtmOymn?JP9l+*@hxJKatV2?OLI8LJ9yz>~lFv~9HjRR)t4HXjVD&i4VSoZ4|Mxw@ zD(rIPg|{G0EsjL}b&XEr&g9^gRC7`!5~tK72Sg0MP)<@$0OG*8NV zeI#J@Fj|w>dd<9*B2X!LI+rnEVQ4nJsTr=y7POEfP(0oXsCnWBd8y5kbSCSne9a1p zH7#C8jaqVBy<$w}vn0#fxn6wp(84+>_AaQh{|3_%V)f#$wjWKnZ5rXm5>%Cg!bfmRkwCKpXTZ?JVJnfzs5Gin@v zGO3#>Aj^#4`k_~9HZ;8eOBf^Byl+_p5VJ23SM7B(*0cGQ+si`A8rMCvE6R$x6GEZx zrLk&DN4fdgk^ZG?)z-G9>o4W765Tu3p`5I_r&=-Chfl0n?5o2*R$Y3i5YhBt&+6DAe~X z*tg{0Rgt1DOTYebIsI4J&lht$igZ+5YKC+4U))2YaO&T|w}q4C%ike*aa;cZHB$Je literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/rtf.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/rtf.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee90616e02014b36474f26723418c9e9c1502e82 GIT binary patch literal 13808 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/svg.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/svg.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41486b44421df7fa14e2201a12ceb4044d0a2138 GIT binary patch literal 9135 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/terminal.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/__pycache__/terminal.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76ffe2aaeabc10788f10f285344ebc9149ecdd2f GIT binary patch literal 5801 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 b3$Z;ParF129$O3F#m{ft`Ad!xY;FGmXJME5 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/_mapping.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/_mapping.py new file mode 100644 index 000000000..72ca84040 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/_mapping.py @@ -0,0 +1,23 @@ +# Automatically generated by scripts/gen_mapfiles.py. +# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead. + +FORMATTERS = { + 'BBCodeFormatter': ('pygments.formatters.bbcode', 'BBCode', ('bbcode', 'bb'), (), 'Format tokens with BBcodes. These formatting codes are used by many bulletin boards, so you can highlight your sourcecode with pygments before posting it there.'), + 'BmpImageFormatter': ('pygments.formatters.img', 'img_bmp', ('bmp', 'bitmap'), ('*.bmp',), 'Create a bitmap image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), + 'GifImageFormatter': ('pygments.formatters.img', 'img_gif', ('gif',), ('*.gif',), 'Create a GIF image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), + 'GroffFormatter': ('pygments.formatters.groff', 'groff', ('groff', 'troff', 'roff'), (), 'Format tokens with groff escapes to change their color and font style.'), + 'HtmlFormatter': ('pygments.formatters.html', 'HTML', ('html',), ('*.html', '*.htm'), "Format tokens as HTML 4 ```` tags. By default, the content is enclosed in a ``
`` tag, itself wrapped in a ``
`` tag (but see the `nowrap` option). The ``
``'s CSS class can be set by the `cssclass` option."), + 'IRCFormatter': ('pygments.formatters.irc', 'IRC', ('irc', 'IRC'), (), 'Format tokens with IRC color sequences'), + 'ImageFormatter': ('pygments.formatters.img', 'img', ('img', 'IMG', 'png'), ('*.png',), 'Create a PNG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), + 'JpgImageFormatter': ('pygments.formatters.img', 'img_jpg', ('jpg', 'jpeg'), ('*.jpg',), 'Create a JPEG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), + 'LatexFormatter': ('pygments.formatters.latex', 'LaTeX', ('latex', 'tex'), ('*.tex',), 'Format tokens as LaTeX code. This needs the `fancyvrb` and `color` standard packages.'), + 'NullFormatter': ('pygments.formatters.other', 'Text only', ('text', 'null'), ('*.txt',), 'Output the text unchanged without any formatting.'), + 'PangoMarkupFormatter': ('pygments.formatters.pangomarkup', 'Pango Markup', ('pango', 'pangomarkup'), (), 'Format tokens as Pango Markup code. It can then be rendered to an SVG.'), + 'RawTokenFormatter': ('pygments.formatters.other', 'Raw tokens', ('raw', 'tokens'), ('*.raw',), 'Format tokens as a raw representation for storing token streams.'), + 'RtfFormatter': ('pygments.formatters.rtf', 'RTF', ('rtf',), ('*.rtf',), 'Format tokens as RTF markup. This formatter automatically outputs full RTF documents with color information and other useful stuff. Perfect for Copy and Paste into Microsoft(R) Word(R) documents.'), + 'SvgFormatter': ('pygments.formatters.svg', 'SVG', ('svg',), ('*.svg',), 'Format tokens as an SVG graphics file. This formatter is still experimental. Each line of code is a ```` element with explicit ``x`` and ``y`` coordinates containing ```` elements with the individual token styles.'), + 'Terminal256Formatter': ('pygments.formatters.terminal256', 'Terminal256', ('terminal256', 'console256', '256'), (), 'Format tokens with ANSI color sequences, for output in a 256-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), + 'TerminalFormatter': ('pygments.formatters.terminal', 'Terminal', ('terminal', 'console'), (), 'Format tokens with ANSI color sequences, for output in a text console. Color sequences are terminated at newlines, so that paging the output works correctly.'), + 'TerminalTrueColorFormatter': ('pygments.formatters.terminal256', 'TerminalTrueColor', ('terminal16m', 'console16m', '16m'), (), 'Format tokens with ANSI color sequences, for output in a true-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), + 'TestcaseFormatter': ('pygments.formatters.other', 'Testcase', ('testcase',), (), 'Format tokens as appropriate for a new testcase.'), +} diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/bbcode.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/bbcode.py new file mode 100644 index 000000000..339edf9dc --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/bbcode.py @@ -0,0 +1,108 @@ +""" + pygments.formatters.bbcode + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + BBcode formatter. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + + +from pygments.formatter import Formatter +from pygments.util import get_bool_opt + +__all__ = ['BBCodeFormatter'] + + +class BBCodeFormatter(Formatter): + """ + Format tokens with BBcodes. These formatting codes are used by many + bulletin boards, so you can highlight your sourcecode with pygments before + posting it there. + + This formatter has no support for background colors and borders, as there + are no common BBcode tags for that. + + Some board systems (e.g. phpBB) don't support colors in their [code] tag, + so you can't use the highlighting together with that tag. + Text in a [code] tag usually is shown with a monospace font (which this + formatter can do with the ``monofont`` option) and no spaces (which you + need for indentation) are removed. + + Additional options accepted: + + `style` + The style to use, can be a string or a Style subclass (default: + ``'default'``). + + `codetag` + If set to true, put the output into ``[code]`` tags (default: + ``false``) + + `monofont` + If set to true, add a tag to show the code with a monospace font + (default: ``false``). + """ + name = 'BBCode' + aliases = ['bbcode', 'bb'] + filenames = [] + + def __init__(self, **options): + Formatter.__init__(self, **options) + self._code = get_bool_opt(options, 'codetag', False) + self._mono = get_bool_opt(options, 'monofont', False) + + self.styles = {} + self._make_styles() + + def _make_styles(self): + for ttype, ndef in self.style: + start = end = '' + if ndef['color']: + start += '[color=#{}]'.format(ndef['color']) + end = '[/color]' + end + if ndef['bold']: + start += '[b]' + end = '[/b]' + end + if ndef['italic']: + start += '[i]' + end = '[/i]' + end + if ndef['underline']: + start += '[u]' + end = '[/u]' + end + # there are no common BBcodes for background-color and border + + self.styles[ttype] = start, end + + def format_unencoded(self, tokensource, outfile): + if self._code: + outfile.write('[code]') + if self._mono: + outfile.write('[font=monospace]') + + lastval = '' + lasttype = None + + for ttype, value in tokensource: + while ttype not in self.styles: + ttype = ttype.parent + if ttype == lasttype: + lastval += value + else: + if lastval: + start, end = self.styles[lasttype] + outfile.write(''.join((start, lastval, end))) + lastval = value + lasttype = ttype + + if lastval: + start, end = self.styles[lasttype] + outfile.write(''.join((start, lastval, end))) + + if self._mono: + outfile.write('[/font]') + if self._code: + outfile.write('[/code]') + if self._code or self._mono: + outfile.write('\n') diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/groff.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/groff.py new file mode 100644 index 000000000..028fec4ea --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/groff.py @@ -0,0 +1,170 @@ +""" + pygments.formatters.groff + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + Formatter for groff output. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import math +from pygments.formatter import Formatter +from pygments.util import get_bool_opt, get_int_opt + +__all__ = ['GroffFormatter'] + + +class GroffFormatter(Formatter): + """ + Format tokens with groff escapes to change their color and font style. + + .. versionadded:: 2.11 + + Additional options accepted: + + `style` + The style to use, can be a string or a Style subclass (default: + ``'default'``). + + `monospaced` + If set to true, monospace font will be used (default: ``true``). + + `linenos` + If set to true, print the line numbers (default: ``false``). + + `wrap` + Wrap lines to the specified number of characters. Disabled if set to 0 + (default: ``0``). + """ + + name = 'groff' + aliases = ['groff','troff','roff'] + filenames = [] + + def __init__(self, **options): + Formatter.__init__(self, **options) + + self.monospaced = get_bool_opt(options, 'monospaced', True) + self.linenos = get_bool_opt(options, 'linenos', False) + self._lineno = 0 + self.wrap = get_int_opt(options, 'wrap', 0) + self._linelen = 0 + + self.styles = {} + self._make_styles() + + + def _make_styles(self): + regular = '\\f[CR]' if self.monospaced else '\\f[R]' + bold = '\\f[CB]' if self.monospaced else '\\f[B]' + italic = '\\f[CI]' if self.monospaced else '\\f[I]' + + for ttype, ndef in self.style: + start = end = '' + if ndef['color']: + start += '\\m[{}]'.format(ndef['color']) + end = '\\m[]' + end + if ndef['bold']: + start += bold + end = regular + end + if ndef['italic']: + start += italic + end = regular + end + if ndef['bgcolor']: + start += '\\M[{}]'.format(ndef['bgcolor']) + end = '\\M[]' + end + + self.styles[ttype] = start, end + + + def _define_colors(self, outfile): + colors = set() + for _, ndef in self.style: + if ndef['color'] is not None: + colors.add(ndef['color']) + + for color in sorted(colors): + outfile.write('.defcolor ' + color + ' rgb #' + color + '\n') + + + def _write_lineno(self, outfile): + self._lineno += 1 + outfile.write("%s% 4d " % (self._lineno != 1 and '\n' or '', self._lineno)) + + + def _wrap_line(self, line): + length = len(line.rstrip('\n')) + space = ' ' if self.linenos else '' + newline = '' + + if length > self.wrap: + for i in range(0, math.floor(length / self.wrap)): + chunk = line[i*self.wrap:i*self.wrap+self.wrap] + newline += (chunk + '\n' + space) + remainder = length % self.wrap + if remainder > 0: + newline += line[-remainder-1:] + self._linelen = remainder + elif self._linelen + length > self.wrap: + newline = ('\n' + space) + line + self._linelen = length + else: + newline = line + self._linelen += length + + return newline + + + def _escape_chars(self, text): + text = text.replace('\\', '\\[u005C]'). \ + replace('.', '\\[char46]'). \ + replace('\'', '\\[u0027]'). \ + replace('`', '\\[u0060]'). \ + replace('~', '\\[u007E]') + copy = text + + for char in copy: + if len(char) != len(char.encode()): + uni = char.encode('unicode_escape') \ + .decode()[1:] \ + .replace('x', 'u00') \ + .upper() + text = text.replace(char, '\\[u' + uni[1:] + ']') + + return text + + + def format_unencoded(self, tokensource, outfile): + self._define_colors(outfile) + + outfile.write('.nf\n\\f[CR]\n') + + if self.linenos: + self._write_lineno(outfile) + + for ttype, value in tokensource: + while ttype not in self.styles: + ttype = ttype.parent + start, end = self.styles[ttype] + + for line in value.splitlines(True): + if self.wrap > 0: + line = self._wrap_line(line) + + if start and end: + text = self._escape_chars(line.rstrip('\n')) + if text != '': + outfile.write(''.join((start, text, end))) + else: + outfile.write(self._escape_chars(line.rstrip('\n'))) + + if line.endswith('\n'): + if self.linenos: + self._write_lineno(outfile) + self._linelen = 0 + else: + outfile.write('\n') + self._linelen = 0 + + outfile.write('\n.fi') diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/html.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/html.py new file mode 100644 index 000000000..4ef183681 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/formatters/html.py @@ -0,0 +1,995 @@ +""" + pygments.formatters.html + ~~~~~~~~~~~~~~~~~~~~~~~~ + + Formatter for HTML output. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import functools +import os +import sys +import os.path +from io import StringIO + +from pygments.formatter import Formatter +from pygments.token import Token, Text, STANDARD_TYPES +from pygments.util import get_bool_opt, get_int_opt, get_list_opt + +try: + import ctags +except ImportError: + ctags = None + +__all__ = ['HtmlFormatter'] + + +_escape_html_table = { + ord('&'): '&', + ord('<'): '<', + ord('>'): '>', + ord('"'): '"', + ord("'"): ''', +} + + +def escape_html(text, table=_escape_html_table): + """Escape &, <, > as well as single and double quotes for HTML.""" + return text.translate(table) + + +def webify(color): + if color.startswith('calc') or color.startswith('var'): + return color + else: + # Check if the color can be shortened from 6 to 3 characters + color = color.upper() + if (len(color) == 6 and + ( color[0] == color[1] + and color[2] == color[3] + and color[4] == color[5])): + return f'#{color[0]}{color[2]}{color[4]}' + else: + return f'#{color}' + + +def _get_ttype_class(ttype): + fname = STANDARD_TYPES.get(ttype) + if fname: + return fname + aname = '' + while fname is None: + aname = '-' + ttype[-1] + aname + ttype = ttype.parent + fname = STANDARD_TYPES.get(ttype) + return fname + aname + + +CSSFILE_TEMPLATE = '''\ +/* +generated by Pygments +Copyright 2006-2025 by the Pygments team. +Licensed under the BSD license, see LICENSE for details. +*/ +%(styledefs)s +''' + +DOC_HEADER = '''\ + + + + + %(title)s + + + + +

%(title)s

+ +''' + +DOC_HEADER_EXTERNALCSS = '''\ + + + + + %(title)s + + + + +

%(title)s

+ +''' + +DOC_FOOTER = '''\ + + +''' + + +class HtmlFormatter(Formatter): + r""" + Format tokens as HTML 4 ```` tags. By default, the content is enclosed + in a ``
`` tag, itself wrapped in a ``
`` tag (but see the `nowrap` option). + The ``
``'s CSS class can be set by the `cssclass` option. + + If the `linenos` option is set to ``"table"``, the ``
`` is
+    additionally wrapped inside a ```` which has one row and two
+    cells: one containing the line numbers and one containing the code.
+    Example:
+
+    .. sourcecode:: html
+
+        
+
+ + +
+
1
+            2
+
+
def foo(bar):
+              pass
+            
+
+ + (whitespace added to improve clarity). + + A list of lines can be specified using the `hl_lines` option to make these + lines highlighted (as of Pygments 0.11). + + With the `full` option, a complete HTML 4 document is output, including + the style definitions inside a ``$)', _handle_cssblock), + + include('keywords'), + include('inline'), + ], + 'keywords': [ + (words(( + '\\define', '\\end', 'caption', 'created', 'modified', 'tags', + 'title', 'type'), prefix=r'^', suffix=r'\b'), + Keyword), + ], + 'inline': [ + # escape + (r'\\.', Text), + # created or modified date + (r'\d{17}', Number.Integer), + # italics + (r'(\s)(//[^/]+//)((?=\W|\n))', + bygroups(Text, Generic.Emph, Text)), + # superscript + (r'(\s)(\^\^[^\^]+\^\^)', bygroups(Text, Generic.Emph)), + # subscript + (r'(\s)(,,[^,]+,,)', bygroups(Text, Generic.Emph)), + # underscore + (r'(\s)(__[^_]+__)', bygroups(Text, Generic.Strong)), + # bold + (r"(\s)(''[^']+'')((?=\W|\n))", + bygroups(Text, Generic.Strong, Text)), + # strikethrough + (r'(\s)(~~[^~]+~~)((?=\W|\n))', + bygroups(Text, Generic.Deleted, Text)), + # TiddlyWiki variables + (r'<<[^>]+>>', Name.Tag), + (r'\$\$[^$]+\$\$', Name.Tag), + (r'\$\([^)]+\)\$', Name.Tag), + # TiddlyWiki style or class + (r'^@@.*$', Name.Tag), + # HTML tags + (r']+>', Name.Tag), + # inline code + (r'`[^`]+`', String.Backtick), + # HTML escaped symbols + (r'&\S*?;', String.Regex), + # Wiki links + (r'(\[{2})([^]\|]+)(\]{2})', bygroups(Text, Name.Tag, Text)), + # External links + (r'(\[{2})([^]\|]+)(\|)([^]\|]+)(\]{2})', + bygroups(Text, Name.Tag, Text, Name.Attribute, Text)), + # Transclusion + (r'(\{{2})([^}]+)(\}{2})', bygroups(Text, Name.Tag, Text)), + # URLs + (r'(\b.?.?tps?://[^\s"]+)', bygroups(Name.Attribute)), + + # general text, must come last! + (r'[\w]+', Text), + (r'.', Text) + ], + } + + def __init__(self, **options): + self.handlecodeblocks = get_bool_opt(options, 'handlecodeblocks', True) + RegexLexer.__init__(self, **options) + + +class WikitextLexer(RegexLexer): + """ + For MediaWiki Wikitext. + + Parsing Wikitext is tricky, and results vary between different MediaWiki + installations, so we only highlight common syntaxes (built-in or from + popular extensions), and also assume templates produce no unbalanced + syntaxes. + """ + name = 'Wikitext' + url = 'https://www.mediawiki.org/wiki/Wikitext' + aliases = ['wikitext', 'mediawiki'] + filenames = [] + mimetypes = ['text/x-wiki'] + version_added = '2.15' + flags = re.MULTILINE + + def nowiki_tag_rules(tag_name): + return [ + (rf'(?i)()', bygroups(Punctuation, + Name.Tag, Whitespace, Punctuation), '#pop'), + include('entity'), + include('text'), + ] + + def plaintext_tag_rules(tag_name): + return [ + (rf'(?si)(.*?)()', bygroups(Text, + Punctuation, Name.Tag, Whitespace, Punctuation), '#pop'), + ] + + def delegate_tag_rules(tag_name, lexer, **lexer_kwargs): + return [ + (rf'(?i)()', bygroups(Punctuation, + Name.Tag, Whitespace, Punctuation), '#pop'), + (rf'(?si).+?(?=)', using(lexer, **lexer_kwargs)), + ] + + def text_rules(token): + return [ + (r'\w+', token), + (r'[^\S\n]+', token), + (r'(?s).', token), + ] + + def handle_syntaxhighlight(self, match, ctx): + from pygments.lexers import get_lexer_by_name + + attr_content = match.group() + start = 0 + index = 0 + while True: + index = attr_content.find('>', start) + # Exclude comment end (-->) + if attr_content[index-2:index] != '--': + break + start = index + 1 + + if index == -1: + # No tag end + yield from self.get_tokens_unprocessed(attr_content, stack=['root', 'attr']) + return + attr = attr_content[:index] + yield from self.get_tokens_unprocessed(attr, stack=['root', 'attr']) + yield match.start(3) + index, Punctuation, '>' + + lexer = None + content = attr_content[index+1:] + lang_match = re.findall(r'\blang=("|\'|)(\w+)(\1)', attr) + + if len(lang_match) >= 1: + # Pick the last match in case of multiple matches + lang = lang_match[-1][1] + try: + lexer = get_lexer_by_name(lang) + except ClassNotFound: + pass + + if lexer is None: + yield match.start() + index + 1, Text, content + else: + yield from lexer.get_tokens_unprocessed(content) + + def handle_score(self, match, ctx): + attr_content = match.group() + start = 0 + index = 0 + while True: + index = attr_content.find('>', start) + # Exclude comment end (-->) + if attr_content[index-2:index] != '--': + break + start = index + 1 + + if index == -1: + # No tag end + yield from self.get_tokens_unprocessed(attr_content, stack=['root', 'attr']) + return + attr = attr_content[:index] + content = attr_content[index+1:] + yield from self.get_tokens_unprocessed(attr, stack=['root', 'attr']) + yield match.start(3) + index, Punctuation, '>' + + lang_match = re.findall(r'\blang=("|\'|)(\w+)(\1)', attr) + # Pick the last match in case of multiple matches + lang = lang_match[-1][1] if len(lang_match) >= 1 else 'lilypond' + + if lang == 'lilypond': # Case sensitive + yield from LilyPondLexer().get_tokens_unprocessed(content) + else: # ABC + # FIXME: Use ABC lexer in the future + yield match.start() + index + 1, Text, content + + # a-z removed to prevent linter from complaining, REMEMBER to use (?i) + title_char = r' %!"$&\'()*,\-./0-9:;=?@A-Z\\\^_`~+\u0080-\uFFFF' + nbsp_char = r'(?:\t| |&\#0*160;|&\#[Xx]0*[Aa]0;|[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000])' + link_address = r'(?:[0-9.]+|\[[0-9a-f:.]+\]|[^\x00-\x20"<>\[\]\x7F\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFFFD])' + link_char_class = r'[^\x00-\x20"<>\[\]\x7F\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFFFD]' + double_slashes_i = { + '__FORCETOC__', '__NOCONTENTCONVERT__', '__NOCC__', '__NOEDITSECTION__', '__NOGALLERY__', + '__NOTITLECONVERT__', '__NOTC__', '__NOTOC__', '__TOC__', + } + double_slashes = { + '__EXPECTUNUSEDCATEGORY__', '__HIDDENCAT__', '__INDEX__', '__NEWSECTIONLINK__', + '__NOINDEX__', '__NONEWSECTIONLINK__', '__STATICREDIRECT__', '__NOGLOBAL__', + '__DISAMBIG__', '__EXPECTED_UNCONNECTED_PAGE__', + } + protocols = { + 'bitcoin:', 'ftp://', 'ftps://', 'geo:', 'git://', 'gopher://', 'http://', 'https://', + 'irc://', 'ircs://', 'magnet:', 'mailto:', 'mms://', 'news:', 'nntp://', 'redis://', + 'sftp://', 'sip:', 'sips:', 'sms:', 'ssh://', 'svn://', 'tel:', 'telnet://', 'urn:', + 'worldwind://', 'xmpp:', '//', + } + non_relative_protocols = protocols - {'//'} + html_tags = { + 'abbr', 'b', 'bdi', 'bdo', 'big', 'blockquote', 'br', 'caption', 'center', 'cite', 'code', + 'data', 'dd', 'del', 'dfn', 'div', 'dl', 'dt', 'em', 'font', 'h1', 'h2', 'h3', 'h4', 'h5', + 'h6', 'hr', 'i', 'ins', 'kbd', 'li', 'link', 'mark', 'meta', 'ol', 'p', 'q', 'rb', 'rp', + 'rt', 'rtc', 'ruby', 's', 'samp', 'small', 'span', 'strike', 'strong', 'sub', 'sup', + 'table', 'td', 'th', 'time', 'tr', 'tt', 'u', 'ul', 'var', 'wbr', + } + parser_tags = { + 'graph', 'charinsert', 'rss', 'chem', 'categorytree', 'nowiki', 'inputbox', 'math', + 'hiero', 'score', 'pre', 'ref', 'translate', 'imagemap', 'templatestyles', 'languages', + 'noinclude', 'mapframe', 'section', 'poem', 'syntaxhighlight', 'includeonly', 'tvar', + 'onlyinclude', 'templatedata', 'langconvert', 'timeline', 'dynamicpagelist', 'gallery', + 'maplink', 'ce', 'references', + } + variant_langs = { + # ZhConverter.php + 'zh', 'zh-hans', 'zh-hant', 'zh-cn', 'zh-hk', 'zh-mo', 'zh-my', 'zh-sg', 'zh-tw', + # WuuConverter.php + 'wuu', 'wuu-hans', 'wuu-hant', + # UzConverter.php + 'uz', 'uz-latn', 'uz-cyrl', + # TlyConverter.php + 'tly', 'tly-cyrl', + # TgConverter.php + 'tg', 'tg-latn', + # SrConverter.php + 'sr', 'sr-ec', 'sr-el', + # ShiConverter.php + 'shi', 'shi-tfng', 'shi-latn', + # ShConverter.php + 'sh-latn', 'sh-cyrl', + # KuConverter.php + 'ku', 'ku-arab', 'ku-latn', + # IuConverter.php + 'iu', 'ike-cans', 'ike-latn', + # GanConverter.php + 'gan', 'gan-hans', 'gan-hant', + # EnConverter.php + 'en', 'en-x-piglatin', + # CrhConverter.php + 'crh', 'crh-cyrl', 'crh-latn', + # BanConverter.php + 'ban', 'ban-bali', 'ban-x-dharma', 'ban-x-palmleaf', 'ban-x-pku', + } + magic_vars_i = { + 'ARTICLEPATH', 'INT', 'PAGEID', 'SCRIPTPATH', 'SERVER', 'SERVERNAME', 'STYLEPATH', + } + magic_vars = { + '!', '=', 'BASEPAGENAME', 'BASEPAGENAMEE', 'CASCADINGSOURCES', 'CONTENTLANGUAGE', + 'CONTENTLANG', 'CURRENTDAY', 'CURRENTDAY2', 'CURRENTDAYNAME', 'CURRENTDOW', 'CURRENTHOUR', + 'CURRENTMONTH', 'CURRENTMONTH2', 'CURRENTMONTH1', 'CURRENTMONTHABBREV', 'CURRENTMONTHNAME', + 'CURRENTMONTHNAMEGEN', 'CURRENTTIME', 'CURRENTTIMESTAMP', 'CURRENTVERSION', 'CURRENTWEEK', + 'CURRENTYEAR', 'DIRECTIONMARK', 'DIRMARK', 'FULLPAGENAME', 'FULLPAGENAMEE', 'LOCALDAY', + 'LOCALDAY2', 'LOCALDAYNAME', 'LOCALDOW', 'LOCALHOUR', 'LOCALMONTH', 'LOCALMONTH2', + 'LOCALMONTH1', 'LOCALMONTHABBREV', 'LOCALMONTHNAME', 'LOCALMONTHNAMEGEN', 'LOCALTIME', + 'LOCALTIMESTAMP', 'LOCALWEEK', 'LOCALYEAR', 'NAMESPACE', 'NAMESPACEE', 'NAMESPACENUMBER', + 'NUMBEROFACTIVEUSERS', 'NUMBEROFADMINS', 'NUMBEROFARTICLES', 'NUMBEROFEDITS', + 'NUMBEROFFILES', 'NUMBEROFPAGES', 'NUMBEROFUSERS', 'PAGELANGUAGE', 'PAGENAME', 'PAGENAMEE', + 'REVISIONDAY', 'REVISIONDAY2', 'REVISIONID', 'REVISIONMONTH', 'REVISIONMONTH1', + 'REVISIONSIZE', 'REVISIONTIMESTAMP', 'REVISIONUSER', 'REVISIONYEAR', 'ROOTPAGENAME', + 'ROOTPAGENAMEE', 'SITENAME', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME', 'SUBJECTPAGENAMEE', + 'ARTICLEPAGENAMEE', 'SUBJECTSPACE', 'ARTICLESPACE', 'SUBJECTSPACEE', 'ARTICLESPACEE', + 'SUBPAGENAME', 'SUBPAGENAMEE', 'TALKPAGENAME', 'TALKPAGENAMEE', 'TALKSPACE', 'TALKSPACEE', + } + parser_functions_i = { + 'ANCHORENCODE', 'BIDI', 'CANONICALURL', 'CANONICALURLE', 'FILEPATH', 'FORMATNUM', + 'FULLURL', 'FULLURLE', 'GENDER', 'GRAMMAR', 'INT', r'\#LANGUAGE', 'LC', 'LCFIRST', 'LOCALURL', + 'LOCALURLE', 'NS', 'NSE', 'PADLEFT', 'PADRIGHT', 'PAGEID', 'PLURAL', 'UC', 'UCFIRST', + 'URLENCODE', + } + parser_functions = { + 'BASEPAGENAME', 'BASEPAGENAMEE', 'CASCADINGSOURCES', 'DEFAULTSORT', 'DEFAULTSORTKEY', + 'DEFAULTCATEGORYSORT', 'FULLPAGENAME', 'FULLPAGENAMEE', 'NAMESPACE', 'NAMESPACEE', + 'NAMESPACENUMBER', 'NUMBERINGROUP', 'NUMINGROUP', 'NUMBEROFACTIVEUSERS', 'NUMBEROFADMINS', + 'NUMBEROFARTICLES', 'NUMBEROFEDITS', 'NUMBEROFFILES', 'NUMBEROFPAGES', 'NUMBEROFUSERS', + 'PAGENAME', 'PAGENAMEE', 'PAGESINCATEGORY', 'PAGESINCAT', 'PAGESIZE', 'PROTECTIONEXPIRY', + 'PROTECTIONLEVEL', 'REVISIONDAY', 'REVISIONDAY2', 'REVISIONID', 'REVISIONMONTH', + 'REVISIONMONTH1', 'REVISIONTIMESTAMP', 'REVISIONUSER', 'REVISIONYEAR', 'ROOTPAGENAME', + 'ROOTPAGENAMEE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME', 'SUBJECTPAGENAMEE', + 'ARTICLEPAGENAMEE', 'SUBJECTSPACE', 'ARTICLESPACE', 'SUBJECTSPACEE', 'ARTICLESPACEE', + 'SUBPAGENAME', 'SUBPAGENAMEE', 'TALKPAGENAME', 'TALKPAGENAMEE', 'TALKSPACE', 'TALKSPACEE', + 'INT', 'DISPLAYTITLE', 'PAGESINNAMESPACE', 'PAGESINNS', + } + + tokens = { + 'root': [ + # Redirects + (r"""(?xi) + (\A\s*?)(\#REDIRECT:?) # may contain a colon + (\s+)(\[\[) (?=[^\]\n]* \]\]$) + """, + bygroups(Whitespace, Keyword, Whitespace, Punctuation), 'redirect-inner'), + # Subheadings + (r'^(={2,6})(.+?)(\1)(\s*$\n)', + bygroups(Generic.Subheading, Generic.Subheading, Generic.Subheading, Whitespace)), + # Headings + (r'^(=.+?=)(\s*$\n)', + bygroups(Generic.Heading, Whitespace)), + # Double-slashed magic words + (words(double_slashes_i, prefix=r'(?i)'), Name.Function.Magic), + (words(double_slashes), Name.Function.Magic), + # Raw URLs + (r'(?i)\b(?:{}){}{}*'.format('|'.join(protocols), + link_address, link_char_class), Name.Label), + # Magic links + (rf'\b(?:RFC|PMID){nbsp_char}+[0-9]+\b', + Name.Function.Magic), + (r"""(?x) + \bISBN {nbsp_char} + (?: 97[89] {nbsp_dash}? )? + (?: [0-9] {nbsp_dash}? ){{9}} # escape format() + [0-9Xx]\b + """.format(nbsp_char=nbsp_char, nbsp_dash=f'(?:-|{nbsp_char})'), Name.Function.Magic), + include('list'), + include('inline'), + include('text'), + ], + 'redirect-inner': [ + (r'(\]\])(\s*?\n)', bygroups(Punctuation, Whitespace), '#pop'), + (r'(\#)([^#]*?)', bygroups(Punctuation, Name.Label)), + (rf'(?i)[{title_char}]+', Name.Tag), + ], + 'list': [ + # Description lists + (r'^;', Keyword, 'dt'), + # Ordered lists, unordered lists and indents + (r'^[#:*]+', Keyword), + # Horizontal rules + (r'^-{4,}', Keyword), + ], + 'inline': [ + # Signatures + (r'~{3,5}', Keyword), + # Entities + include('entity'), + # Bold & italic + (r"('')(''')(?!')", bygroups(Generic.Emph, + Generic.EmphStrong), 'inline-italic-bold'), + (r"'''(?!')", Generic.Strong, 'inline-bold'), + (r"''(?!')", Generic.Emph, 'inline-italic'), + # Comments & parameters & templates + include('replaceable'), + # Media links + ( + r"""(?xi) + (\[\[) + (File|Image) (:) + ((?: [{}] | \{{{{2,3}}[^{{}}]*?\}}{{2,3}} | )*) + (?: (\#) ([{}]*?) )? + """.format(title_char, f'{title_char}#'), + bygroups(Punctuation, Name.Namespace, Punctuation, + using(this, state=['wikilink-name']), Punctuation, Name.Label), + 'medialink-inner' + ), + # Wikilinks + ( + r"""(?xi) + (\[\[)(?!{}) # Should not contain URLs + (?: ([{}]*) (:))? + ((?: [{}] | \{{{{2,3}}[^{{}}]*?\}}{{2,3}} | )*?) + (?: (\#) ([{}]*?) )? + (\]\]) + """.format('|'.join(protocols), title_char.replace('/', ''), + title_char, f'{title_char}#'), + bygroups(Punctuation, Name.Namespace, Punctuation, + using(this, state=['wikilink-name']), Punctuation, Name.Label, Punctuation) + ), + ( + r"""(?xi) + (\[\[)(?!{}) + (?: ([{}]*) (:))? + ((?: [{}] | \{{{{2,3}}[^{{}}]*?\}}{{2,3}} | )*?) + (?: (\#) ([{}]*?) )? + (\|) + """.format('|'.join(protocols), title_char.replace('/', ''), + title_char, f'{title_char}#'), + bygroups(Punctuation, Name.Namespace, Punctuation, + using(this, state=['wikilink-name']), Punctuation, Name.Label, Punctuation), + 'wikilink-inner' + ), + # External links + ( + r"""(?xi) + (\[) + ((?:{}) {} {}*) + (\s*) + """.format('|'.join(protocols), link_address, link_char_class), + bygroups(Punctuation, Name.Label, Whitespace), + 'extlink-inner' + ), + # Tables + (r'^(:*)(\s*?)(\{\|)([^\n]*)$', bygroups(Keyword, + Whitespace, Punctuation, using(this, state=['root', 'attr'])), 'table'), + # HTML tags + (r'(?i)(<)({})\b'.format('|'.join(html_tags)), + bygroups(Punctuation, Name.Tag), 'tag-inner-ordinary'), + (r'(?i)()'.format('|'.join(html_tags)), + bygroups(Punctuation, Name.Tag, Whitespace, Punctuation)), + # + (r'(?i)(<)(nowiki)\b', bygroups(Punctuation, + Name.Tag), ('tag-nowiki', 'tag-inner')), + #
+            (r'(?i)(<)(pre)\b', bygroups(Punctuation,
+             Name.Tag), ('tag-pre', 'tag-inner')),
+            # 
+            (r'(?i)(<)(categorytree)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-categorytree', 'tag-inner')),
+            # 
+            (r'(?i)(<)(hiero)\b', bygroups(Punctuation,
+             Name.Tag), ('tag-hiero', 'tag-inner')),
+            # 
+            (r'(?i)(<)(math)\b', bygroups(Punctuation,
+             Name.Tag), ('tag-math', 'tag-inner')),
+            # 
+            (r'(?i)(<)(chem)\b', bygroups(Punctuation,
+             Name.Tag), ('tag-chem', 'tag-inner')),
+            # 
+            (r'(?i)(<)(ce)\b', bygroups(Punctuation,
+             Name.Tag), ('tag-ce', 'tag-inner')),
+            # 
+            (r'(?i)(<)(charinsert)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-charinsert', 'tag-inner')),
+            # 
+            (r'(?i)(<)(templatedata)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-templatedata', 'tag-inner')),
+            # 
+            (r'(?i)(<)(gallery)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-gallery', 'tag-inner')),
+            # 
+            (r'(?i)(<)(gallery)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-graph', 'tag-inner')),
+            # 
+            (r'(?i)(<)(dynamicpagelist)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-dynamicpagelist', 'tag-inner')),
+            # 
+            (r'(?i)(<)(inputbox)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-inputbox', 'tag-inner')),
+            # 
+            (r'(?i)(<)(rss)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-rss', 'tag-inner')),
+            # 
+            (r'(?i)(<)(imagemap)\b', bygroups(
+                Punctuation, Name.Tag), ('tag-imagemap', 'tag-inner')),
+            # 
+            (r'(?i)()',
+             bygroups(Punctuation, Name.Tag, Whitespace, Punctuation)),
+            (r'(?si)(<)(syntaxhighlight)\b([^>]*?(?.*?)(?=)',
+             bygroups(Punctuation, Name.Tag, handle_syntaxhighlight)),
+            # : Fallback case for self-closing tags
+            (r'(?i)(<)(syntaxhighlight)\b(\s*?)((?:[^>]|-->)*?)(/\s*?(?)*?)(/\s*?(?)*?)(/\s*?(?|\Z)', Comment.Multiline),
+            # Parameters
+            (
+                r"""(?x)
+                (\{{3})
+                    ([^|]*?)
+                    (?=\}{3}|\|)
+                """,
+                bygroups(Punctuation, Name.Variable),
+                'parameter-inner',
+            ),
+            # Magic variables
+            (r'(?i)(\{{\{{)(\s*)({})(\s*)(\}}\}})'.format('|'.join(magic_vars_i)),
+             bygroups(Punctuation, Whitespace, Name.Function, Whitespace, Punctuation)),
+            (r'(\{{\{{)(\s*)({})(\s*)(\}}\}})'.format('|'.join(magic_vars)),
+                bygroups(Punctuation, Whitespace, Name.Function, Whitespace, Punctuation)),
+            # Parser functions & templates
+            (r'\{\{', Punctuation, 'template-begin-space'),
+            #  legacy syntax
+            (r'(?i)(<)(tvar)\b(\|)([^>]*?)(>)', bygroups(Punctuation,
+             Name.Tag, Punctuation, String, Punctuation)),
+            (r'', Punctuation, '#pop'),
+            # 
+            (r'(?i)(<)(tvar)\b', bygroups(Punctuation, Name.Tag), 'tag-inner-ordinary'),
+            (r'(?i)()',
+             bygroups(Punctuation, Name.Tag, Whitespace, Punctuation)),
+        ],
+        'parameter-inner': [
+            (r'\}{3}', Punctuation, '#pop'),
+            (r'\|', Punctuation),
+            include('inline'),
+            include('text'),
+        ],
+        'template-begin-space': [
+            # Templates allow line breaks at the beginning, and due to how MediaWiki handles
+            # comments, an extra state is required to handle things like {{\n\n name}}
+            (r'|\Z)', Comment.Multiline),
+            (r'\s+', Whitespace),
+            # Parser functions
+            (
+                r'(?i)(\#[{}]*?|{})(:)'.format(title_char,
+                                           '|'.join(parser_functions_i)),
+                bygroups(Name.Function, Punctuation), ('#pop', 'template-inner')
+            ),
+            (
+                r'({})(:)'.format('|'.join(parser_functions)),
+                bygroups(Name.Function, Punctuation), ('#pop', 'template-inner')
+            ),
+            # Templates
+            (
+                rf'(?i)([{title_char}]*?)(:)',
+                bygroups(Name.Namespace, Punctuation), ('#pop', 'template-name')
+            ),
+            default(('#pop', 'template-name'),),
+        ],
+        'template-name': [
+            (r'(\s*?)(\|)', bygroups(Text, Punctuation), ('#pop', 'template-inner')),
+            (r'\}\}', Punctuation, '#pop'),
+            (r'\n', Text, '#pop'),
+            include('replaceable'),
+            *text_rules(Name.Tag),
+        ],
+        'template-inner': [
+            (r'\}\}', Punctuation, '#pop'),
+            (r'\|', Punctuation),
+            (
+                r"""(?x)
+                    (?<=\|)
+                    ( (?: (?! \{\{ | \}\} )[^=\|<])*? ) # Exclude templates and tags
+                    (=)
+                """,
+                bygroups(Name.Label, Operator)
+            ),
+            include('inline'),
+            include('text'),
+        ],
+        'table': [
+            # Use [ \t\n\r\0\x0B] instead of \s to follow PHP trim() behavior
+            # Endings
+            (r'^([ \t\n\r\0\x0B]*?)(\|\})',
+             bygroups(Whitespace, Punctuation), '#pop'),
+            # Table rows
+            (r'^([ \t\n\r\0\x0B]*?)(\|-+)(.*)$', bygroups(Whitespace, Punctuation,
+             using(this, state=['root', 'attr']))),
+            # Captions
+            (
+                r"""(?x)
+                ^([ \t\n\r\0\x0B]*?)(\|\+)
+                # Exclude links, template and tags
+                (?: ( (?: (?! \[\[ | \{\{ )[^|\n<] )*? )(\|) )?
+                (.*?)$
+                """,
+                bygroups(Whitespace, Punctuation, using(this, state=[
+                         'root', 'attr']), Punctuation, Generic.Heading),
+            ),
+            # Table data
+            (
+                r"""(?x)
+                ( ^(?:[ \t\n\r\0\x0B]*?)\| | \|\| )
+                (?: ( (?: (?! \[\[ | \{\{ )[^|\n<] )*? )(\|)(?!\|) )?
+                """,
+                bygroups(Punctuation, using(this, state=[
+                         'root', 'attr']), Punctuation),
+            ),
+            # Table headers
+            (
+                r"""(?x)
+                ( ^(?:[ \t\n\r\0\x0B]*?)!  )
+                (?: ( (?: (?! \[\[ | \{\{ )[^|\n<] )*? )(\|)(?!\|) )?
+                """,
+                bygroups(Punctuation, using(this, state=[
+                         'root', 'attr']), Punctuation),
+                'table-header',
+            ),
+            include('list'),
+            include('inline'),
+            include('text'),
+        ],
+        'table-header': [
+            # Requires another state for || handling inside headers
+            (r'\n', Text, '#pop'),
+            (
+                r"""(?x)
+                (!!|\|\|)
+                (?:
+                    ( (?: (?! \[\[ | \{\{ )[^|\n<] )*? )
+                    (\|)(?!\|)
+                )?
+                """,
+                bygroups(Punctuation, using(this, state=[
+                         'root', 'attr']), Punctuation)
+            ),
+            *text_rules(Generic.Subheading),
+        ],
+        'entity': [
+            (r'&\S*?;', Name.Entity),
+        ],
+        'dt': [
+            (r'\n', Text, '#pop'),
+            include('inline'),
+            (r':', Keyword, '#pop'),
+            include('text'),
+        ],
+        'extlink-inner': [
+            (r'\]', Punctuation, '#pop'),
+            include('inline'),
+            include('text'),
+        ],
+        'nowiki-ish': [
+            include('entity'),
+            include('text'),
+        ],
+        'attr': [
+            include('replaceable'),
+            (r'\s+', Whitespace),
+            (r'(=)(\s*)(")', bygroups(Operator, Whitespace, String.Double), 'attr-val-2'),
+            (r"(=)(\s*)(')", bygroups(Operator, Whitespace, String.Single), 'attr-val-1'),
+            (r'(=)(\s*)', bygroups(Operator, Whitespace), 'attr-val-0'),
+            (r'[\w:-]+', Name.Attribute),
+
+        ],
+        'attr-val-0': [
+            (r'\s', Whitespace, '#pop'),
+            include('replaceable'),
+            *text_rules(String),
+        ],
+        'attr-val-1': [
+            (r"'", String.Single, '#pop'),
+            include('replaceable'),
+            *text_rules(String.Single),
+        ],
+        'attr-val-2': [
+            (r'"', String.Double, '#pop'),
+            include('replaceable'),
+            *text_rules(String.Double),
+        ],
+        'tag-inner-ordinary': [
+            (r'/?\s*>', Punctuation, '#pop'),
+            include('tag-attr'),
+        ],
+        'tag-inner': [
+            # Return to root state for self-closing tags
+            (r'/\s*>', Punctuation, '#pop:2'),
+            (r'\s*>', Punctuation, '#pop'),
+            include('tag-attr'),
+        ],
+        # There states below are just like their non-tag variants, the key difference is
+        # they forcibly quit when encountering tag closing markup
+        'tag-attr': [
+            include('replaceable'),
+            (r'\s+', Whitespace),
+            (r'(=)(\s*)(")', bygroups(Operator,
+             Whitespace, String.Double), 'tag-attr-val-2'),
+            (r"(=)(\s*)(')", bygroups(Operator,
+             Whitespace, String.Single), 'tag-attr-val-1'),
+            (r'(=)(\s*)', bygroups(Operator, Whitespace), 'tag-attr-val-0'),
+            (r'[\w:-]+', Name.Attribute),
+
+        ],
+        'tag-attr-val-0': [
+            (r'\s', Whitespace, '#pop'),
+            (r'/?>', Punctuation, '#pop:2'),
+            include('replaceable'),
+            *text_rules(String),
+        ],
+        'tag-attr-val-1': [
+            (r"'", String.Single, '#pop'),
+            (r'/?>', Punctuation, '#pop:2'),
+            include('replaceable'),
+            *text_rules(String.Single),
+        ],
+        'tag-attr-val-2': [
+            (r'"', String.Double, '#pop'),
+            (r'/?>', Punctuation, '#pop:2'),
+            include('replaceable'),
+            *text_rules(String.Double),
+        ],
+        'tag-nowiki': nowiki_tag_rules('nowiki'),
+        'tag-pre': nowiki_tag_rules('pre'),
+        'tag-categorytree': plaintext_tag_rules('categorytree'),
+        'tag-dynamicpagelist': plaintext_tag_rules('dynamicpagelist'),
+        'tag-hiero': plaintext_tag_rules('hiero'),
+        'tag-inputbox': plaintext_tag_rules('inputbox'),
+        'tag-imagemap': plaintext_tag_rules('imagemap'),
+        'tag-charinsert': plaintext_tag_rules('charinsert'),
+        'tag-timeline': plaintext_tag_rules('timeline'),
+        'tag-gallery': plaintext_tag_rules('gallery'),
+        'tag-graph': plaintext_tag_rules('graph'),
+        'tag-rss': plaintext_tag_rules('rss'),
+        'tag-math': delegate_tag_rules('math', TexLexer, state='math'),
+        'tag-chem': delegate_tag_rules('chem', TexLexer, state='math'),
+        'tag-ce': delegate_tag_rules('ce', TexLexer, state='math'),
+        'tag-templatedata': delegate_tag_rules('templatedata', JsonLexer),
+        'text-italic': text_rules(Generic.Emph),
+        'text-bold': text_rules(Generic.Strong),
+        'text-bold-italic': text_rules(Generic.EmphStrong),
+        'text': text_rules(Text),
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/math.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/math.py
new file mode 100644
index 000000000..b225ffcf9
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/math.py
@@ -0,0 +1,21 @@
+"""
+    pygments.lexers.math
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexers that were contained in this module.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# ruff: noqa: F401
+from pygments.lexers.python import NumPyLexer
+from pygments.lexers.matlab import MatlabLexer, MatlabSessionLexer, \
+    OctaveLexer, ScilabLexer
+from pygments.lexers.julia import JuliaLexer, JuliaConsoleLexer
+from pygments.lexers.r import RConsoleLexer, SLexer, RdLexer
+from pygments.lexers.modeling import BugsLexer, JagsLexer, StanLexer
+from pygments.lexers.idl import IDLLexer
+from pygments.lexers.algebra import MuPADLexer
+
+__all__ = []
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/matlab.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/matlab.py
new file mode 100644
index 000000000..8eeffc9d2
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/matlab.py
@@ -0,0 +1,3307 @@
+"""
+    pygments.lexers.matlab
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Matlab and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, bygroups, default, words, \
+    do_insertions, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+
+from pygments.lexers import _scilab_builtins
+
+__all__ = ['MatlabLexer', 'MatlabSessionLexer', 'OctaveLexer', 'ScilabLexer']
+
+
+class MatlabLexer(RegexLexer):
+    """
+    For Matlab source code.
+    """
+    name = 'Matlab'
+    aliases = ['matlab']
+    filenames = ['*.m']
+    mimetypes = ['text/matlab']
+    url = 'https://www.mathworks.com/products/matlab.html'
+    version_added = '0.10'
+
+    _operators = r'-|==|~=|<=|>=|<|>|&&|&|~|\|\|?|\.\*|\*|\+|\.\^|\^|\.\\|\./|/|\\'
+
+    tokens = {
+        'expressions': [
+            # operators:
+            (_operators, Operator),
+
+            # numbers (must come before punctuation to handle `.5`; cannot use
+            # `\b` due to e.g. `5. + .5`).  The negative lookahead on operators
+            # avoids including the dot in `1./x` (the dot is part of `./`).
+            (rf'(? and then
+            # (equal | open-parenthesis |  | ).
+            (rf'(?:^|(?<=;))(\s*)(\w+)(\s+)(?!=|\(|{_operators}\s|\s)',
+             bygroups(Whitespace, Name, Whitespace), 'commandargs'),
+
+            include('expressions')
+        ],
+        'blockcomment': [
+            (r'^\s*%\}', Comment.Multiline, '#pop'),
+            (r'^.*\n', Comment.Multiline),
+            (r'.', Comment.Multiline),
+        ],
+        'deffunc': [
+            (r'(\s*)(?:(\S+)(\s*)(=)(\s*))?(.+)(\()(.*)(\))(\s*)',
+             bygroups(Whitespace, Text, Whitespace, Punctuation,
+                      Whitespace, Name.Function, Punctuation, Text,
+                      Punctuation, Whitespace), '#pop'),
+            # function with no args
+            (r'(\s*)([a-zA-Z_]\w*)',
+             bygroups(Whitespace, Name.Function), '#pop'),
+        ],
+        'propattrs': [
+            (r'(\w+)(\s*)(=)(\s*)(\d+)',
+             bygroups(Name.Builtin, Whitespace, Punctuation, Whitespace,
+                      Number)),
+            (r'(\w+)(\s*)(=)(\s*)([a-zA-Z]\w*)',
+             bygroups(Name.Builtin, Whitespace, Punctuation, Whitespace,
+                      Keyword)),
+            (r',', Punctuation),
+            (r'\)', Punctuation, '#pop'),
+            (r'\s+', Whitespace),
+            (r'.', Text),
+        ],
+        'defprops': [
+            (r'%\{\s*\n', Comment.Multiline, 'blockcomment'),
+            (r'%.*$', Comment),
+            (r'(?.
+    """
+    name = 'Matlab session'
+    aliases = ['matlabsession']
+    url = 'https://www.mathworks.com/products/matlab.html'
+    version_added = '0.10'
+    _example = "matlabsession/matlabsession_sample.txt"
+
+    def get_tokens_unprocessed(self, text):
+        mlexer = MatlabLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        continuation = False
+
+        for match in line_re.finditer(text):
+            line = match.group()
+
+            if line.startswith('>> '):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:3])]))
+                curcode += line[3:]
+
+            elif line.startswith('>>'):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:2])]))
+                curcode += line[2:]
+
+            elif line.startswith('???'):
+
+                idx = len(curcode)
+
+                # without is showing error on same line as before...?
+                # line = "\n" + line
+                token = (0, Generic.Traceback, line)
+                insertions.append((idx, [token]))
+            elif continuation and insertions:
+                # line_start is the length of the most recent prompt symbol
+                line_start = len(insertions[-1][-1][-1])
+                # Set leading spaces with the length of the prompt to be a generic prompt
+                # This keeps code aligned when prompts are removed, say with some Javascript
+                if line.startswith(' '*line_start):
+                    insertions.append(
+                        (len(curcode), [(0, Generic.Prompt, line[:line_start])]))
+                    curcode += line[line_start:]
+                else:
+                    curcode += line
+            else:
+                if curcode:
+                    yield from do_insertions(
+                        insertions, mlexer.get_tokens_unprocessed(curcode))
+                    curcode = ''
+                    insertions = []
+
+                yield match.start(), Generic.Output, line
+
+            # Does not allow continuation if a comment is included after the ellipses.
+            # Continues any line that ends with ..., even comments (lines that start with %)
+            if line.strip().endswith('...'):
+                continuation = True
+            else:
+                continuation = False
+
+        if curcode:  # or item:
+            yield from do_insertions(
+                insertions, mlexer.get_tokens_unprocessed(curcode))
+
+
+class OctaveLexer(RegexLexer):
+    """
+    For GNU Octave source code.
+    """
+    name = 'Octave'
+    url = 'https://www.gnu.org/software/octave/index'
+    aliases = ['octave']
+    filenames = ['*.m']
+    mimetypes = ['text/octave']
+    version_added = '1.5'
+
+    # These lists are generated automatically.
+    # Run the following in bash shell:
+    #
+    # First dump all of the Octave manual into a plain text file:
+    #
+    #   $ info octave --subnodes -o octave-manual
+    #
+    # Now grep through it:
+
+    # for i in \
+    #     "Built-in Function" "Command" "Function File" \
+    #     "Loadable Function" "Mapping Function";
+    # do
+    #     perl -e '@name = qw('"$i"');
+    #              print lc($name[0]),"_kw = [\n"';
+    #
+    #     perl -n -e 'print "\"$1\",\n" if /-- '"$i"': .* (\w*) \(/;' \
+    #         octave-manual | sort | uniq ;
+    #     echo "]" ;
+    #     echo;
+    # done
+
+    # taken from Octave Mercurial changeset 8cc154f45e37 (30-jan-2011)
+
+    builtin_kw = (
+        "addlistener", "addpath", "addproperty", "all",
+        "and", "any", "argnames", "argv", "assignin",
+        "atexit", "autoload",
+        "available_graphics_toolkits", "beep_on_error",
+        "bitand", "bitmax", "bitor", "bitshift", "bitxor",
+        "cat", "cell", "cellstr", "char", "class", "clc",
+        "columns", "command_line_path",
+        "completion_append_char", "completion_matches",
+        "complex", "confirm_recursive_rmdir", "cputime",
+        "crash_dumps_octave_core", "ctranspose", "cumprod",
+        "cumsum", "debug_on_error", "debug_on_interrupt",
+        "debug_on_warning", "default_save_options",
+        "dellistener", "diag", "diff", "disp",
+        "doc_cache_file", "do_string_escapes", "double",
+        "drawnow", "e", "echo_executing_commands", "eps",
+        "eq", "errno", "errno_list", "error", "eval",
+        "evalin", "exec", "exist", "exit", "eye", "false",
+        "fclear", "fclose", "fcntl", "fdisp", "feof",
+        "ferror", "feval", "fflush", "fgetl", "fgets",
+        "fieldnames", "file_in_loadpath", "file_in_path",
+        "filemarker", "filesep", "find_dir_in_path",
+        "fixed_point_format", "fnmatch", "fopen", "fork",
+        "formula", "fprintf", "fputs", "fread", "freport",
+        "frewind", "fscanf", "fseek", "fskipl", "ftell",
+        "functions", "fwrite", "ge", "genpath", "get",
+        "getegid", "getenv", "geteuid", "getgid",
+        "getpgrp", "getpid", "getppid", "getuid", "glob",
+        "gt", "gui_mode", "history_control",
+        "history_file", "history_size",
+        "history_timestamp_format_string", "home",
+        "horzcat", "hypot", "ifelse",
+        "ignore_function_time_stamp", "inferiorto",
+        "info_file", "info_program", "inline", "input",
+        "intmax", "intmin", "ipermute",
+        "is_absolute_filename", "isargout", "isbool",
+        "iscell", "iscellstr", "ischar", "iscomplex",
+        "isempty", "isfield", "isfloat", "isglobal",
+        "ishandle", "isieee", "isindex", "isinteger",
+        "islogical", "ismatrix", "ismethod", "isnull",
+        "isnumeric", "isobject", "isreal",
+        "is_rooted_relative_filename", "issorted",
+        "isstruct", "isvarname", "kbhit", "keyboard",
+        "kill", "lasterr", "lasterror", "lastwarn",
+        "ldivide", "le", "length", "link", "linspace",
+        "logical", "lstat", "lt", "make_absolute_filename",
+        "makeinfo_program", "max_recursion_depth", "merge",
+        "methods", "mfilename", "minus", "mislocked",
+        "mkdir", "mkfifo", "mkstemp", "mldivide", "mlock",
+        "mouse_wheel_zoom", "mpower", "mrdivide", "mtimes",
+        "munlock", "nargin", "nargout",
+        "native_float_format", "ndims", "ne", "nfields",
+        "nnz", "norm", "not", "numel", "nzmax",
+        "octave_config_info", "octave_core_file_limit",
+        "octave_core_file_name",
+        "octave_core_file_options", "ones", "or",
+        "output_max_field_width", "output_precision",
+        "page_output_immediately", "page_screen_output",
+        "path", "pathsep", "pause", "pclose", "permute",
+        "pi", "pipe", "plus", "popen", "power",
+        "print_empty_dimensions", "printf",
+        "print_struct_array_contents", "prod",
+        "program_invocation_name", "program_name",
+        "putenv", "puts", "pwd", "quit", "rats", "rdivide",
+        "readdir", "readlink", "read_readline_init_file",
+        "realmax", "realmin", "rehash", "rename",
+        "repelems", "re_read_readline_init_file", "reset",
+        "reshape", "resize", "restoredefaultpath",
+        "rethrow", "rmdir", "rmfield", "rmpath", "rows",
+        "save_header_format_string", "save_precision",
+        "saving_history", "scanf", "set", "setenv",
+        "shell_cmd", "sighup_dumps_octave_core",
+        "sigterm_dumps_octave_core", "silent_functions",
+        "single", "size", "size_equal", "sizemax",
+        "sizeof", "sleep", "source", "sparse_auto_mutate",
+        "split_long_rows", "sprintf", "squeeze", "sscanf",
+        "stat", "stderr", "stdin", "stdout", "strcmp",
+        "strcmpi", "string_fill_char", "strncmp",
+        "strncmpi", "struct", "struct_levels_to_print",
+        "strvcat", "subsasgn", "subsref", "sum", "sumsq",
+        "superiorto", "suppress_verbose_help_message",
+        "symlink", "system", "tic", "tilde_expand",
+        "times", "tmpfile", "tmpnam", "toc", "toupper",
+        "transpose", "true", "typeinfo", "umask", "uminus",
+        "uname", "undo_string_escapes", "unlink", "uplus",
+        "upper", "usage", "usleep", "vec", "vectorize",
+        "vertcat", "waitpid", "warning", "warranty",
+        "whos_line_format", "yes_or_no", "zeros",
+        "inf", "Inf", "nan", "NaN")
+
+    command_kw = ("close", "load", "who", "whos")
+
+    function_kw = (
+        "accumarray", "accumdim", "acosd", "acotd",
+        "acscd", "addtodate", "allchild", "ancestor",
+        "anova", "arch_fit", "arch_rnd", "arch_test",
+        "area", "arma_rnd", "arrayfun", "ascii", "asctime",
+        "asecd", "asind", "assert", "atand",
+        "autoreg_matrix", "autumn", "axes", "axis", "bar",
+        "barh", "bartlett", "bartlett_test", "beep",
+        "betacdf", "betainv", "betapdf", "betarnd",
+        "bicgstab", "bicubic", "binary", "binocdf",
+        "binoinv", "binopdf", "binornd", "bitcmp",
+        "bitget", "bitset", "blackman", "blanks",
+        "blkdiag", "bone", "box", "brighten", "calendar",
+        "cast", "cauchy_cdf", "cauchy_inv", "cauchy_pdf",
+        "cauchy_rnd", "caxis", "celldisp", "center", "cgs",
+        "chisquare_test_homogeneity",
+        "chisquare_test_independence", "circshift", "cla",
+        "clabel", "clf", "clock", "cloglog", "closereq",
+        "colon", "colorbar", "colormap", "colperm",
+        "comet", "common_size", "commutation_matrix",
+        "compan", "compare_versions", "compass",
+        "computer", "cond", "condest", "contour",
+        "contourc", "contourf", "contrast", "conv",
+        "convhull", "cool", "copper", "copyfile", "cor",
+        "corrcoef", "cor_test", "cosd", "cotd", "cov",
+        "cplxpair", "cross", "cscd", "cstrcat", "csvread",
+        "csvwrite", "ctime", "cumtrapz", "curl", "cut",
+        "cylinder", "date", "datenum", "datestr",
+        "datetick", "datevec", "dblquad", "deal",
+        "deblank", "deconv", "delaunay", "delaunayn",
+        "delete", "demo", "detrend", "diffpara", "diffuse",
+        "dir", "discrete_cdf", "discrete_inv",
+        "discrete_pdf", "discrete_rnd", "display",
+        "divergence", "dlmwrite", "dos", "dsearch",
+        "dsearchn", "duplication_matrix", "durbinlevinson",
+        "ellipsoid", "empirical_cdf", "empirical_inv",
+        "empirical_pdf", "empirical_rnd", "eomday",
+        "errorbar", "etime", "etreeplot", "example",
+        "expcdf", "expinv", "expm", "exppdf", "exprnd",
+        "ezcontour", "ezcontourf", "ezmesh", "ezmeshc",
+        "ezplot", "ezpolar", "ezsurf", "ezsurfc", "factor",
+        "factorial", "fail", "fcdf", "feather", "fftconv",
+        "fftfilt", "fftshift", "figure", "fileattrib",
+        "fileparts", "fill", "findall", "findobj",
+        "findstr", "finv", "flag", "flipdim", "fliplr",
+        "flipud", "fpdf", "fplot", "fractdiff", "freqz",
+        "freqz_plot", "frnd", "fsolve",
+        "f_test_regression", "ftp", "fullfile", "fzero",
+        "gamcdf", "gaminv", "gampdf", "gamrnd", "gca",
+        "gcbf", "gcbo", "gcf", "genvarname", "geocdf",
+        "geoinv", "geopdf", "geornd", "getfield", "ginput",
+        "glpk", "gls", "gplot", "gradient",
+        "graphics_toolkit", "gray", "grid", "griddata",
+        "griddatan", "gtext", "gunzip", "gzip", "hadamard",
+        "hamming", "hankel", "hanning", "hggroup",
+        "hidden", "hilb", "hist", "histc", "hold", "hot",
+        "hotelling_test", "housh", "hsv", "hurst",
+        "hygecdf", "hygeinv", "hygepdf", "hygernd",
+        "idivide", "ifftshift", "image", "imagesc",
+        "imfinfo", "imread", "imshow", "imwrite", "index",
+        "info", "inpolygon", "inputname", "interpft",
+        "interpn", "intersect", "invhilb", "iqr", "isa",
+        "isdefinite", "isdir", "is_duplicate_entry",
+        "isequal", "isequalwithequalnans", "isfigure",
+        "ishermitian", "ishghandle", "is_leap_year",
+        "isletter", "ismac", "ismember", "ispc", "isprime",
+        "isprop", "isscalar", "issquare", "isstrprop",
+        "issymmetric", "isunix", "is_valid_file_id",
+        "isvector", "jet", "kendall",
+        "kolmogorov_smirnov_cdf",
+        "kolmogorov_smirnov_test", "kruskal_wallis_test",
+        "krylov", "kurtosis", "laplace_cdf", "laplace_inv",
+        "laplace_pdf", "laplace_rnd", "legend", "legendre",
+        "license", "line", "linkprop", "list_primes",
+        "loadaudio", "loadobj", "logistic_cdf",
+        "logistic_inv", "logistic_pdf", "logistic_rnd",
+        "logit", "loglog", "loglogerr", "logm", "logncdf",
+        "logninv", "lognpdf", "lognrnd", "logspace",
+        "lookfor", "ls_command", "lsqnonneg", "magic",
+        "mahalanobis", "manova", "matlabroot",
+        "mcnemar_test", "mean", "meansq", "median", "menu",
+        "mesh", "meshc", "meshgrid", "meshz", "mexext",
+        "mget", "mkpp", "mode", "moment", "movefile",
+        "mpoles", "mput", "namelengthmax", "nargchk",
+        "nargoutchk", "nbincdf", "nbininv", "nbinpdf",
+        "nbinrnd", "nchoosek", "ndgrid", "newplot", "news",
+        "nonzeros", "normcdf", "normest", "norminv",
+        "normpdf", "normrnd", "now", "nthroot", "null",
+        "ocean", "ols", "onenormest", "optimget",
+        "optimset", "orderfields", "orient", "orth",
+        "pack", "pareto", "parseparams", "pascal", "patch",
+        "pathdef", "pcg", "pchip", "pcolor", "pcr",
+        "peaks", "periodogram", "perl", "perms", "pie",
+        "pink", "planerot", "playaudio", "plot",
+        "plotmatrix", "plotyy", "poisscdf", "poissinv",
+        "poisspdf", "poissrnd", "polar", "poly",
+        "polyaffine", "polyarea", "polyderiv", "polyfit",
+        "polygcd", "polyint", "polyout", "polyreduce",
+        "polyval", "polyvalm", "postpad", "powerset",
+        "ppder", "ppint", "ppjumps", "ppplot", "ppval",
+        "pqpnonneg", "prepad", "primes", "print",
+        "print_usage", "prism", "probit", "qp", "qqplot",
+        "quadcc", "quadgk", "quadl", "quadv", "quiver",
+        "qzhess", "rainbow", "randi", "range", "rank",
+        "ranks", "rat", "reallog", "realpow", "realsqrt",
+        "record", "rectangle_lw", "rectangle_sw",
+        "rectint", "refresh", "refreshdata",
+        "regexptranslate", "repmat", "residue", "ribbon",
+        "rindex", "roots", "rose", "rosser", "rotdim",
+        "rref", "run", "run_count", "rundemos", "run_test",
+        "runtests", "saveas", "saveaudio", "saveobj",
+        "savepath", "scatter", "secd", "semilogx",
+        "semilogxerr", "semilogy", "semilogyerr",
+        "setaudio", "setdiff", "setfield", "setxor",
+        "shading", "shift", "shiftdim", "sign_test",
+        "sinc", "sind", "sinetone", "sinewave", "skewness",
+        "slice", "sombrero", "sortrows", "spaugment",
+        "spconvert", "spdiags", "spearman", "spectral_adf",
+        "spectral_xdf", "specular", "speed", "spencer",
+        "speye", "spfun", "sphere", "spinmap", "spline",
+        "spones", "sprand", "sprandn", "sprandsym",
+        "spring", "spstats", "spy", "sqp", "stairs",
+        "statistics", "std", "stdnormal_cdf",
+        "stdnormal_inv", "stdnormal_pdf", "stdnormal_rnd",
+        "stem", "stft", "strcat", "strchr", "strjust",
+        "strmatch", "strread", "strsplit", "strtok",
+        "strtrim", "strtrunc", "structfun", "studentize",
+        "subplot", "subsindex", "subspace", "substr",
+        "substruct", "summer", "surf", "surface", "surfc",
+        "surfl", "surfnorm", "svds", "swapbytes",
+        "sylvester_matrix", "symvar", "synthesis", "table",
+        "tand", "tar", "tcdf", "tempdir", "tempname",
+        "test", "text", "textread", "textscan", "tinv",
+        "title", "toeplitz", "tpdf", "trace", "trapz",
+        "treelayout", "treeplot", "triangle_lw",
+        "triangle_sw", "tril", "trimesh", "triplequad",
+        "triplot", "trisurf", "triu", "trnd", "tsearchn",
+        "t_test", "t_test_regression", "type", "unidcdf",
+        "unidinv", "unidpdf", "unidrnd", "unifcdf",
+        "unifinv", "unifpdf", "unifrnd", "union", "unique",
+        "unix", "unmkpp", "unpack", "untabify", "untar",
+        "unwrap", "unzip", "u_test", "validatestring",
+        "vander", "var", "var_test", "vech", "ver",
+        "version", "view", "voronoi", "voronoin",
+        "waitforbuttonpress", "wavread", "wavwrite",
+        "wblcdf", "wblinv", "wblpdf", "wblrnd", "weekday",
+        "welch_test", "what", "white", "whitebg",
+        "wienrnd", "wilcoxon_test", "wilkinson", "winter",
+        "xlabel", "xlim", "ylabel", "yulewalker", "zip",
+        "zlabel", "z_test")
+
+    loadable_kw = (
+        "airy", "amd", "balance", "besselh", "besseli",
+        "besselj", "besselk", "bessely", "bitpack",
+        "bsxfun", "builtin", "ccolamd", "cellfun",
+        "cellslices", "chol", "choldelete", "cholinsert",
+        "cholinv", "cholshift", "cholupdate", "colamd",
+        "colloc", "convhulln", "convn", "csymamd",
+        "cummax", "cummin", "daspk", "daspk_options",
+        "dasrt", "dasrt_options", "dassl", "dassl_options",
+        "dbclear", "dbdown", "dbstack", "dbstatus",
+        "dbstop", "dbtype", "dbup", "dbwhere", "det",
+        "dlmread", "dmperm", "dot", "eig", "eigs",
+        "endgrent", "endpwent", "etree", "fft", "fftn",
+        "fftw", "filter", "find", "full", "gcd",
+        "getgrent", "getgrgid", "getgrnam", "getpwent",
+        "getpwnam", "getpwuid", "getrusage", "givens",
+        "gmtime", "gnuplot_binary", "hess", "ifft",
+        "ifftn", "inv", "isdebugmode", "issparse", "kron",
+        "localtime", "lookup", "lsode", "lsode_options",
+        "lu", "luinc", "luupdate", "matrix_type", "max",
+        "min", "mktime", "pinv", "qr", "qrdelete",
+        "qrinsert", "qrshift", "qrupdate", "quad",
+        "quad_options", "qz", "rand", "rande", "randg",
+        "randn", "randp", "randperm", "rcond", "regexp",
+        "regexpi", "regexprep", "schur", "setgrent",
+        "setpwent", "sort", "spalloc", "sparse", "spparms",
+        "sprank", "sqrtm", "strfind", "strftime",
+        "strptime", "strrep", "svd", "svd_driver", "syl",
+        "symamd", "symbfact", "symrcm", "time", "tsearch",
+        "typecast", "urlread", "urlwrite")
+
+    mapping_kw = (
+        "abs", "acos", "acosh", "acot", "acoth", "acsc",
+        "acsch", "angle", "arg", "asec", "asech", "asin",
+        "asinh", "atan", "atanh", "beta", "betainc",
+        "betaln", "bincoeff", "cbrt", "ceil", "conj", "cos",
+        "cosh", "cot", "coth", "csc", "csch", "erf", "erfc",
+        "erfcx", "erfinv", "exp", "finite", "fix", "floor",
+        "fmod", "gamma", "gammainc", "gammaln", "imag",
+        "isalnum", "isalpha", "isascii", "iscntrl",
+        "isdigit", "isfinite", "isgraph", "isinf",
+        "islower", "isna", "isnan", "isprint", "ispunct",
+        "isspace", "isupper", "isxdigit", "lcm", "lgamma",
+        "log", "lower", "mod", "real", "rem", "round",
+        "roundb", "sec", "sech", "sign", "sin", "sinh",
+        "sqrt", "tan", "tanh", "toascii", "tolower", "xor")
+
+    builtin_consts = (
+        "EDITOR", "EXEC_PATH", "I", "IMAGE_PATH", "NA",
+        "OCTAVE_HOME", "OCTAVE_VERSION", "PAGER",
+        "PAGER_FLAGS", "SEEK_CUR", "SEEK_END", "SEEK_SET",
+        "SIG", "S_ISBLK", "S_ISCHR", "S_ISDIR", "S_ISFIFO",
+        "S_ISLNK", "S_ISREG", "S_ISSOCK", "WCONTINUE",
+        "WCOREDUMP", "WEXITSTATUS", "WIFCONTINUED",
+        "WIFEXITED", "WIFSIGNALED", "WIFSTOPPED", "WNOHANG",
+        "WSTOPSIG", "WTERMSIG", "WUNTRACED")
+
+    tokens = {
+        'root': [
+            (r'%\{\s*\n', Comment.Multiline, 'percentblockcomment'),
+            (r'#\{\s*\n', Comment.Multiline, 'hashblockcomment'),
+            (r'[%#].*$', Comment),
+            (r'^\s*function\b', Keyword, 'deffunc'),
+
+            # from 'iskeyword' on hg changeset 8cc154f45e37
+            (words((
+                '__FILE__', '__LINE__', 'break', 'case', 'catch', 'classdef',
+                'continue', 'do', 'else', 'elseif', 'end', 'end_try_catch',
+                'end_unwind_protect', 'endclassdef', 'endevents', 'endfor',
+                'endfunction', 'endif', 'endmethods', 'endproperties', 'endswitch',
+                'endwhile', 'events', 'for', 'function', 'get', 'global', 'if',
+                'methods', 'otherwise', 'persistent', 'properties', 'return',
+                'set', 'static', 'switch', 'try', 'until', 'unwind_protect',
+                'unwind_protect_cleanup', 'while'), suffix=r'\b'),
+             Keyword),
+
+            (words(builtin_kw + command_kw + function_kw + loadable_kw + mapping_kw,
+                   suffix=r'\b'),  Name.Builtin),
+
+            (words(builtin_consts, suffix=r'\b'), Name.Constant),
+
+            # operators in Octave but not Matlab:
+            (r'-=|!=|!|/=|--', Operator),
+            # operators:
+            (r'-|==|~=|<|>|<=|>=|&&|&|~|\|\|?', Operator),
+            # operators in Octave but not Matlab requiring escape for re:
+            (r'\*=|\+=|\^=|\/=|\\=|\*\*|\+\+|\.\*\*', Operator),
+            # operators requiring escape for re:
+            (r'\.\*|\*|\+|\.\^|\^|\.\\|\.\/|\/|\\', Operator),
+
+
+            # punctuation:
+            (r'[\[\](){}:@.,]', Punctuation),
+            (r'=|:|;', Punctuation),
+
+            (r'"[^"]*"', String),
+
+            (r'(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eEf][+-]?[0-9]+', Number.Float),
+            (r'\d+', Number.Integer),
+
+            # quote can be transpose, instead of string:
+            # (not great, but handles common cases...)
+            (r'(?<=[\w)\].])\'+', Operator),
+            (r'(?|<=|>=|&&|&|~|\|\|?', Operator),
+            # operators requiring escape for re:
+            (r'\.\*|\*|\+|\.\^|\^|\.\\|\.\/|\/|\\', Operator),
+
+            # punctuation:
+            (r'[\[\](){}@.,=:;]+', Punctuation),
+
+            (r'"[^"]*"', String),
+
+            # quote can be transpose, instead of string:
+            # (not great, but handles common cases...)
+            (r'(?<=[\w)\].])\'+', Operator),
+            (r'(?', r'<', r'|', r'!', r"'")
+
+    operator_words = ('and', 'or', 'not')
+
+    tokens = {
+        'root': [
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'"(?:[^"\\]|\\.)*"', String),
+            (r'\(|\)|\[|\]|\{|\}', Punctuation),
+            (r'[,;$]', Punctuation),
+            (words (constants), Name.Constant),
+            (words (keywords), Keyword),
+            (words (operators), Operator),
+            (words (operator_words), Operator.Word),
+            (r'''(?x)
+              ((?:[a-zA-Z_#][\w#]*|`[^`]*`)
+              (?:::[a-zA-Z_#][\w#]*|`[^`]*`)*)(\s*)([(])''',
+             bygroups(Name.Function, Text.Whitespace, Punctuation)),
+            (r'''(?x)
+              (?:[a-zA-Z_#%][\w#%]*|`[^`]*`)
+              (?:::[a-zA-Z_#%][\w#%]*|`[^`]*`)*''', Name.Variable),
+            (r'[-+]?(\d*\.\d+([bdefls][-+]?\d+)?|\d+(\.\d*)?[bdefls][-+]?\d+)', Number.Float),
+            (r'[-+]?\d+', Number.Integer),
+            (r'\s+', Text.Whitespace),
+            (r'.', Text)
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ]
+    }
+
+    def analyse_text (text):
+        strength = 0.0
+        # Input expression terminator.
+        if re.search (r'\$\s*$', text, re.MULTILINE):
+            strength += 0.05
+        # Function definition operator.
+        if ':=' in text:
+            strength += 0.02
+        return strength
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/meson.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/meson.py
new file mode 100644
index 000000000..6f2c6da37
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/meson.py
@@ -0,0 +1,139 @@
+"""
+    pygments.lexers.meson
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Pygments lexer for the Meson build system
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include
+from pygments.token import Comment, Name, Number, Punctuation, Operator, \
+    Keyword, String, Whitespace
+
+__all__ = ['MesonLexer']
+
+
+class MesonLexer(RegexLexer):
+    """Meson language lexer.
+
+    The grammar definition use to transcribe the syntax was retrieved from
+    https://mesonbuild.com/Syntax.html#grammar for version 0.58.
+    Some of those definitions are improperly transcribed, so the Meson++
+    implementation was also checked: https://github.com/dcbaker/meson-plus-plus.
+    """
+
+    # TODO String interpolation @VARNAME@ inner matches
+    # TODO keyword_arg: value inner matches
+
+    name = 'Meson'
+    url = 'https://mesonbuild.com/'
+    aliases = ['meson', 'meson.build']
+    filenames = ['meson.build', 'meson_options.txt']
+    mimetypes = ['text/x-meson']
+    version_added = '2.10'
+
+    tokens = {
+        'root': [
+            (r'#.*?$', Comment),
+            (r"'''.*'''", String.Single),
+            (r'[1-9][0-9]*', Number.Integer),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[a-fA-F0-9]+', Number.Hex),
+            include('string'),
+            include('keywords'),
+            include('expr'),
+            (r'[a-zA-Z_][a-zA-Z_0-9]*', Name),
+            (r'\s+', Whitespace),
+        ],
+        'string': [
+            (r"[']{3}([']{0,2}([^\\']|\\(.|\n)))*[']{3}", String),
+            (r"'.*?(?`_.
+    """
+
+    name = "MCFunction"
+    url = "https://minecraft.wiki/w/Commands"
+    aliases = ["mcfunction", "mcf"]
+    filenames = ["*.mcfunction"]
+    mimetypes = ["text/mcfunction"]
+    version_added = '2.12'
+
+    # Used to denotate the start of a block comment, borrowed from Github's mcfunction
+    _block_comment_prefix = "[>!]"
+
+    tokens = {
+        "root": [
+            include("names"),
+            include("comments"),
+            include("literals"),
+            include("whitespace"),
+            include("property"),
+            include("operators"),
+            include("selectors"),
+        ],
+
+        "names": [
+            # The start of a command (either beginning of line OR after the run keyword)
+            #  We don't encode a list of keywords since mods, plugins, or even pre-processors
+            #  may add new commands, so we have a 'close-enough' regex which catches them.
+            (r"^(\s*)([a-z_]+)", bygroups(Whitespace, Name.Builtin)),
+            (r"(?<=run)\s+[a-z_]+", Name.Builtin),
+
+            # UUID
+            (r"\b[0-9a-fA-F]+(?:-[0-9a-fA-F]+){4}\b", Name.Variable),
+            include("resource-name"),
+            # normal command names and scoreboards
+            #  there's no way to know the differences unfortuntely
+            (r"[A-Za-z_][\w.#%$]+", Keyword.Constant),
+            (r"[#%$][\w.#%$]+", Name.Variable.Magic),
+        ],
+
+        "resource-name": [
+            # resource names have to be lowercase
+            (r"#?[a-z_][a-z_.-]*:[a-z0-9_./-]+", Name.Function),
+            # similar to above except optional `:``
+            #  a `/` must be present "somewhere"
+            (r"#?[a-z0-9_\.\-]+\/[a-z0-9_\.\-\/]+", Name.Function),
+        ],
+
+        "whitespace": [
+            (r"\s+", Whitespace),
+        ],
+
+        "comments": [
+            (rf"^\s*(#{_block_comment_prefix})", Comment.Multiline,
+             ("comments.block", "comments.block.emphasized")),
+            (r"#.*$", Comment.Single),
+        ],
+        "comments.block": [
+            (rf"^\s*#{_block_comment_prefix}", Comment.Multiline,
+             "comments.block.emphasized"),
+            (r"^\s*#", Comment.Multiline, "comments.block.normal"),
+            default("#pop"),
+        ],
+        "comments.block.normal": [
+            include("comments.block.special"),
+            (r"\S+", Comment.Multiline),
+            (r"\n", Text, "#pop"),
+            include("whitespace"),
+        ],
+        "comments.block.emphasized": [
+            include("comments.block.special"),
+            (r"\S+", String.Doc),
+            (r"\n", Text, "#pop"),
+            include("whitespace"),
+        ],
+        "comments.block.special": [
+            # Params
+            (r"@\S+", Name.Decorator),
+
+            include("resource-name"),
+
+            # Scoreboard player names
+            (r"[#%$][\w.#%$]+", Name.Variable.Magic),
+        ],
+
+        "operators": [
+            (r"[\-~%^?!+*<>\\/|&=.]", Operator),
+        ],
+
+        "literals": [
+            (r"\.\.", Literal),
+            (r"(true|false)", Keyword.Pseudo),
+
+            # these are like unquoted strings and appear in many places
+            (r"[A-Za-z_]+", Name.Variable.Class),
+
+            (r"[0-7]b", Number.Byte),
+            (r"[+-]?\d*\.?\d+([eE]?[+-]?\d+)?[df]?\b", Number.Float),
+            (r"[+-]?\d+\b", Number.Integer),
+            (r'"', String.Double, "literals.string-double"),
+            (r"'", String.Single, "literals.string-single"),
+        ],
+        "literals.string-double": [
+            (r"\\.", String.Escape),
+            (r'[^\\"\n]+', String.Double),
+            (r'"', String.Double, "#pop"),
+        ],
+        "literals.string-single": [
+            (r"\\.", String.Escape),
+            (r"[^\\'\n]+", String.Single),
+            (r"'", String.Single, "#pop"),
+        ],
+
+        "selectors": [
+            (r"@[a-z]", Name.Variable),
+        ],
+
+
+        ## Generic Property Container
+        # There are several, differing instances where the language accepts
+        #  specific contained keys or contained key, value pairings.
+        #
+        # Property Maps:
+        # - Starts with either `[` or `{`
+        # - Key separated by `:` or `=`
+        # - Deliminated by `,`
+        #
+        # Property Lists:
+        # - Starts with `[`
+        # - Deliminated by `,`
+        #
+        # For simplicity, these patterns match a generic, nestable structure
+        #  which follow a key, value pattern. For normal lists, there's only keys.
+        # This allow some "illegal" structures, but we'll accept those for
+        #  sake of simplicity
+        #
+        # Examples:
+        # - `[facing=up, powered=true]` (blockstate)
+        # - `[name="hello world", nbt={key: 1b}]` (selector + nbt)
+        # - `[{"text": "value"}, "literal"]` (json)
+        ##
+        "property": [
+            # This state gets included in root and also several substates
+            # We do this to shortcut the starting of new properties
+            #  within other properties. Lists can have sublists and compounds
+            #  and values can start a new property (see the `difficult_1.txt`
+            #  snippet).
+            (r"\{", Punctuation, ("property.curly", "property.key")),
+            (r"\[", Punctuation, ("property.square", "property.key")),
+        ],
+        "property.curly": [
+            include("whitespace"),
+            include("property"),
+            (r"\}", Punctuation, "#pop"),
+        ],
+        "property.square": [
+            include("whitespace"),
+            include("property"),
+            (r"\]", Punctuation, "#pop"),
+
+            # lists can have sequences of items
+            (r",", Punctuation),
+        ],
+        "property.key": [
+            include("whitespace"),
+
+            # resource names (for advancements)
+            #  can omit `:` to default `minecraft:`
+            # must check if there is a future equals sign if `:` is in the name
+            (r"#?[a-z_][a-z_\.\-]*\:[a-z0-9_\.\-/]+(?=\s*\=)", Name.Attribute, "property.delimiter"),
+            (r"#?[a-z_][a-z0-9_\.\-/]+", Name.Attribute, "property.delimiter"),
+
+            # unquoted NBT key
+            (r"[A-Za-z_\-\+]+", Name.Attribute, "property.delimiter"),
+
+            # quoted JSON or NBT key
+            (r'"', Name.Attribute, "property.delimiter", "literals.string-double"),
+            (r"'", Name.Attribute, "property.delimiter", "literals.string-single"),
+
+            # index for a list
+            (r"-?\d+", Number.Integer, "property.delimiter"),
+
+            default("#pop"),
+        ],
+        "property.key.string-double": [
+            (r"\\.", String.Escape),
+            (r'[^\\"\n]+', Name.Attribute),
+            (r'"', Name.Attribute, "#pop"),
+        ],
+        "property.key.string-single": [
+            (r"\\.", String.Escape),
+            (r"[^\\'\n]+", Name.Attribute),
+            (r"'", Name.Attribute, "#pop"),
+        ],
+        "property.delimiter": [
+            include("whitespace"),
+
+            (r"[:=]!?", Punctuation, "property.value"),
+            (r",", Punctuation),
+
+            default("#pop"),
+        ],
+        "property.value": [
+            include("whitespace"),
+
+            # unquoted resource names are valid literals here
+            (r"#?[a-z_][a-z_\.\-]*\:[a-z0-9_\.\-/]+", Name.Tag),
+            (r"#?[a-z_][a-z0-9_\.\-/]+", Name.Tag),
+
+            include("literals"),
+            include("property"),
+
+            default("#pop"),
+        ],
+    }
+
+
+class MCSchemaLexer(RegexLexer):
+    """Lexer for Minecraft Add-ons data Schemas, an interface structure standard used in Minecraft
+    """
+
+    name = 'MCSchema'
+    url = 'https://learn.microsoft.com/en-us/minecraft/creator/reference/content/schemasreference/'
+    aliases = ['mcschema']
+    filenames = ['*.mcschema']
+    mimetypes = ['text/mcschema']
+    version_added = '2.14'
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Whitespace),
+            (r'//.*?$', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gimuysd]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Whitespace, '#pop')
+        ],
+        'singlestring': [
+            (r'\\.', String.Escape),
+            (r"'", String.Single, '#pop'),
+            (r"[^\\']+", String.Single),
+        ],
+        'doublestring': [
+            (r'\\.', String.Escape),
+            (r'"', String.Double, '#pop'),
+            (r'[^\\"]+', String.Double),
+        ],
+        'root': [
+            (r'^(?=\s|/|', Comment, '#pop'),
+            (r'[^\-]+|-', Comment),
+        ],
+    }
+
+
+class ReasonLexer(RegexLexer):
+    """
+    For the ReasonML language.
+    """
+
+    name = 'ReasonML'
+    url = 'https://reasonml.github.io/'
+    aliases = ['reasonml', 'reason']
+    filenames = ['*.re', '*.rei']
+    mimetypes = ['text/x-reasonml']
+    version_added = '2.6'
+
+    keywords = (
+        'as', 'assert', 'begin', 'class', 'constraint', 'do', 'done', 'downto',
+        'else', 'end', 'exception', 'external', 'false', 'for', 'fun', 'esfun',
+        'function', 'functor', 'if', 'in', 'include', 'inherit', 'initializer', 'lazy',
+        'let', 'switch', 'module', 'pub', 'mutable', 'new', 'nonrec', 'object', 'of',
+        'open', 'pri', 'rec', 'sig', 'struct', 'then', 'to', 'true', 'try',
+        'type', 'val', 'virtual', 'when', 'while', 'with',
+    )
+    keyopts = (
+        '!=', '#', '&', '&&', r'\(', r'\)', r'\*', r'\+', ',', '-',
+        r'-\.', '=>', r'\.', r'\.\.', r'\.\.\.', ':', '::', ':=', ':>', ';', ';;', '<',
+        '<-', '=', '>', '>]', r'>\}', r'\?', r'\?\?', r'\[', r'\[<', r'\[>',
+        r'\[\|', ']', '_', '`', r'\{', r'\{<', r'\|', r'\|\|', r'\|]', r'\}', '~'
+    )
+
+    operators = r'[!$%&*+\./:<=>?@^|~-]'
+    word_operators = ('and', 'asr', 'land', 'lor', 'lsl', 'lsr', 'lxor', 'mod', 'or')
+    prefix_syms = r'[!?~]'
+    infix_syms = r'[=<>@^|&+\*/$%-]'
+    primitives = ('unit', 'int', 'float', 'bool', 'string', 'char', 'list', 'array')
+
+    tokens = {
+        'escape-sequence': [
+            (r'\\[\\"\'ntbr]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        ],
+        'root': [
+            (r'\s+', Text),
+            (r'false|true|\(\)|\[\]', Name.Builtin.Pseudo),
+            (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Namespace, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name.Class),
+            (r'//.*?\n', Comment.Single),
+            (r'\/\*(?!/)', Comment.Multiline, 'comment'),
+            (r'\b({})\b'.format('|'.join(keywords)), Keyword),
+            (r'({})'.format('|'.join(keyopts[::-1])), Operator.Word),
+            (rf'({infix_syms}|{prefix_syms})?{operators}', Operator),
+            (r'\b({})\b'.format('|'.join(word_operators)), Operator.Word),
+            (r'\b({})\b'.format('|'.join(primitives)), Keyword.Type),
+
+            (r"[^\W\d][\w']*", Name),
+
+            (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'0[oO][0-7][0-7_]*', Number.Oct),
+            (r'0[bB][01][01_]*', Number.Bin),
+            (r'\d[\d_]*', Number.Integer),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
+             String.Char),
+            (r"'.'", String.Char),
+            (r"'", Keyword),
+
+            (r'"', String.Double, 'string'),
+
+            (r'[~?][a-z][\w\']*:', Name.Variable),
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'\/\*', Comment.Multiline, '#push'),
+            (r'\*\/', Comment.Multiline, '#pop'),
+            (r'\*', Comment.Multiline),
+        ],
+        'string': [
+            (r'[^\\"]+', String.Double),
+            include('escape-sequence'),
+            (r'\\\n', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'dotted': [
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
+            (r'[A-Z][\w\']*', Name.Class, '#pop'),
+            (r'[a-z_][\w\']*', Name, '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class FStarLexer(RegexLexer):
+    """
+    For the F* language.
+    """
+
+    name = 'FStar'
+    url = 'https://www.fstar-lang.org/'
+    aliases = ['fstar']
+    filenames = ['*.fst', '*.fsti']
+    mimetypes = ['text/x-fstar']
+    version_added = '2.7'
+
+    keywords = (
+        'abstract', 'attributes', 'noeq', 'unopteq', 'and'
+        'begin', 'by', 'default', 'effect', 'else', 'end', 'ensures',
+        'exception', 'exists', 'false', 'forall', 'fun', 'function', 'if',
+        'in', 'include', 'inline', 'inline_for_extraction', 'irreducible',
+        'logic', 'match', 'module', 'mutable', 'new', 'new_effect', 'noextract',
+        'of', 'open', 'opaque', 'private', 'range_of', 'reifiable',
+        'reify', 'reflectable', 'requires', 'set_range_of', 'sub_effect',
+        'synth', 'then', 'total', 'true', 'try', 'type', 'unfold', 'unfoldable',
+        'val', 'when', 'with', 'not'
+    )
+    decl_keywords = ('let', 'rec')
+    assume_keywords = ('assume', 'admit', 'assert', 'calc')
+    keyopts = (
+        r'~', r'-', r'/\\', r'\\/', r'<:', r'<@', r'\(\|', r'\|\)', r'#', r'u#',
+        r'&', r'\(', r'\)', r'\(\)', r',', r'~>', r'->', r'<-', r'<--', r'<==>',
+        r'==>', r'\.', r'\?', r'\?\.', r'\.\[', r'\.\(', r'\.\(\|', r'\.\[\|',
+        r'\{:pattern', r':', r'::', r':=', r';', r';;', r'=', r'%\[', r'!\{',
+        r'\[', r'\[@', r'\[\|', r'\|>', r'\]', r'\|\]', r'\{', r'\|', r'\}', r'\$'
+    )
+
+    operators = r'[!$%&*+\./:<=>?@^|~-]'
+    prefix_syms = r'[!?~]'
+    infix_syms = r'[=<>@^|&+\*/$%-]'
+    primitives = ('unit', 'int', 'float', 'bool', 'string', 'char', 'list', 'array')
+
+    tokens = {
+        'escape-sequence': [
+            (r'\\[\\"\'ntbr]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        ],
+        'root': [
+            (r'\s+', Text),
+            (r'false|true|False|True|\(\)|\[\]', Name.Builtin.Pseudo),
+            (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Namespace, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name.Class),
+            (r'\(\*(?![)])', Comment, 'comment'),
+            (r'\/\/.+$', Comment),
+            (r'\b({})\b'.format('|'.join(keywords)), Keyword),
+            (r'\b({})\b'.format('|'.join(assume_keywords)), Name.Exception),
+            (r'\b({})\b'.format('|'.join(decl_keywords)), Keyword.Declaration),
+            (r'({})'.format('|'.join(keyopts[::-1])), Operator),
+            (rf'({infix_syms}|{prefix_syms})?{operators}', Operator),
+            (r'\b({})\b'.format('|'.join(primitives)), Keyword.Type),
+
+            (r"[^\W\d][\w']*", Name),
+
+            (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float),
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'0[oO][0-7][0-7_]*', Number.Oct),
+            (r'0[bB][01][01_]*', Number.Bin),
+            (r'\d[\d_]*', Number.Integer),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
+             String.Char),
+            (r"'.'", String.Char),
+            (r"'", Keyword),  # a stray quote is another syntax element
+            (r"\`([\w\'.]+)\`", Operator.Word),  # for infix applications
+            (r"\`", Keyword),  # for quoting
+            (r'"', String.Double, 'string'),
+
+            (r'[~?][a-z][\w\']*:', Name.Variable),
+        ],
+        'comment': [
+            (r'[^(*)]+', Comment),
+            (r'\(\*', Comment, '#push'),
+            (r'\*\)', Comment, '#pop'),
+            (r'[(*)]', Comment),
+        ],
+        'string': [
+            (r'[^\\"]+', String.Double),
+            include('escape-sequence'),
+            (r'\\\n', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'dotted': [
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Namespace),
+            (r'[A-Z][\w\']*', Name.Class, '#pop'),
+            (r'[a-z_][\w\']*', Name, '#pop'),
+            default('#pop'),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/modeling.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/modeling.py
new file mode 100644
index 000000000..d681e7f3b
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/modeling.py
@@ -0,0 +1,366 @@
+"""
+    pygments.lexers.modeling
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for modeling languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+from pygments.lexers.html import HtmlLexer
+from pygments.lexers import _stan_builtins
+
+__all__ = ['ModelicaLexer', 'BugsLexer', 'JagsLexer', 'StanLexer']
+
+
+class ModelicaLexer(RegexLexer):
+    """
+    For Modelica source code.
+    """
+    name = 'Modelica'
+    url = 'http://www.modelica.org/'
+    aliases = ['modelica']
+    filenames = ['*.mo']
+    mimetypes = ['text/x-modelica']
+    version_added = '1.1'
+
+    flags = re.DOTALL | re.MULTILINE
+
+    _name = r"(?:'(?:[^\\']|\\.)+'|[a-zA-Z_]\w*)"
+
+    tokens = {
+        'whitespace': [
+            (r'[\s\ufeff]+', Text),
+            (r'//[^\n]*\n?', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'root': [
+            include('whitespace'),
+            (r'"', String.Double, 'string'),
+            (r'[()\[\]{},;]+', Punctuation),
+            (r'\.?[*^/+-]|\.|<>|[<>:=]=?', Operator),
+            (r'\d+(\.?\d*[eE][-+]?\d+|\.\d*)', Number.Float),
+            (r'\d+', Number.Integer),
+            (r'(abs|acos|actualStream|array|asin|assert|AssertionLevel|atan|'
+             r'atan2|backSample|Boolean|cardinality|cat|ceil|change|Clock|'
+             r'Connections|cos|cosh|cross|delay|diagonal|div|edge|exp|'
+             r'ExternalObject|fill|floor|getInstanceName|hold|homotopy|'
+             r'identity|inStream|integer|Integer|interval|inverse|isPresent|'
+             r'linspace|log|log10|matrix|max|min|mod|ndims|noClock|noEvent|'
+             r'ones|outerProduct|pre|previous|product|Real|reinit|rem|rooted|'
+             r'sample|scalar|semiLinear|shiftSample|sign|sin|sinh|size|skew|'
+             r'smooth|spatialDistribution|sqrt|StateSelect|String|subSample|'
+             r'sum|superSample|symmetric|tan|tanh|terminal|terminate|time|'
+             r'transpose|vector|zeros)\b', Name.Builtin),
+            (r'(algorithm|annotation|break|connect|constant|constrainedby|der|'
+             r'discrete|each|else|elseif|elsewhen|encapsulated|enumeration|'
+             r'equation|exit|expandable|extends|external|firstTick|final|flow|for|if|'
+             r'import|impure|in|initial|inner|input|interval|loop|nondiscrete|outer|'
+             r'output|parameter|partial|protected|public|pure|redeclare|'
+             r'replaceable|return|stream|then|when|while)\b',
+             Keyword.Reserved),
+            (r'(and|not|or)\b', Operator.Word),
+            (r'(block|class|connector|end|function|model|operator|package|'
+             r'record|type)\b', Keyword.Reserved, 'class'),
+            (r'(false|true)\b', Keyword.Constant),
+            (r'within\b', Keyword.Reserved, 'package-prefix'),
+            (_name, Name)
+        ],
+        'class': [
+            include('whitespace'),
+            (r'(function|record)\b', Keyword.Reserved),
+            (r'(if|for|when|while)\b', Keyword.Reserved, '#pop'),
+            (_name, Name.Class, '#pop'),
+            default('#pop')
+        ],
+        'package-prefix': [
+            include('whitespace'),
+            (_name, Name.Namespace, '#pop'),
+            default('#pop')
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'\\[\'"?\\abfnrtv]', String.Escape),
+            (r'(?i)<\s*html\s*>([^\\"]|\\.)+?(<\s*/\s*html\s*>|(?="))',
+             using(HtmlLexer)),
+            (r'<|\\?[^"\\<]+', String.Double)
+        ]
+    }
+
+
+class BugsLexer(RegexLexer):
+    """
+    Pygments Lexer for OpenBugs and WinBugs
+    models.
+    """
+
+    name = 'BUGS'
+    aliases = ['bugs', 'winbugs', 'openbugs']
+    filenames = ['*.bug']
+    url = 'https://www.mrc-bsu.cam.ac.uk/software/bugs/openbugs'
+    version_added = '1.6'
+
+    _FUNCTIONS = (
+        # Scalar functions
+        'abs', 'arccos', 'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctanh',
+        'cloglog', 'cos', 'cosh', 'cumulative', 'cut', 'density', 'deviance',
+        'equals', 'expr', 'gammap', 'ilogit', 'icloglog', 'integral', 'log',
+        'logfact', 'loggam', 'logit', 'max', 'min', 'phi', 'post.p.value',
+        'pow', 'prior.p.value', 'probit', 'replicate.post', 'replicate.prior',
+        'round', 'sin', 'sinh', 'solution', 'sqrt', 'step', 'tan', 'tanh',
+        'trunc',
+        # Vector functions
+        'inprod', 'interp.lin', 'inverse', 'logdet', 'mean', 'eigen.vals',
+        'ode', 'prod', 'p.valueM', 'rank', 'ranked', 'replicate.postM',
+        'sd', 'sort', 'sum',
+        # Special
+        'D', 'I', 'F', 'T', 'C')
+    """ OpenBUGS built-in functions
+
+    From http://www.openbugs.info/Manuals/ModelSpecification.html#ContentsAII
+
+    This also includes
+
+    - T, C, I : Truncation and censoring.
+      ``T`` and ``C`` are in OpenBUGS. ``I`` in WinBUGS.
+    - D : ODE
+    - F : Functional http://www.openbugs.info/Examples/Functionals.html
+
+    """
+
+    _DISTRIBUTIONS = ('dbern', 'dbin', 'dcat', 'dnegbin', 'dpois',
+                      'dhyper', 'dbeta', 'dchisqr', 'ddexp', 'dexp',
+                      'dflat', 'dgamma', 'dgev', 'df', 'dggamma', 'dgpar',
+                      'dloglik', 'dlnorm', 'dlogis', 'dnorm', 'dpar',
+                      'dt', 'dunif', 'dweib', 'dmulti', 'ddirch', 'dmnorm',
+                      'dmt', 'dwish')
+    """ OpenBUGS built-in distributions
+
+    Functions from
+    http://www.openbugs.info/Manuals/ModelSpecification.html#ContentsAI
+    """
+
+    tokens = {
+        'whitespace': [
+            (r"\s+", Text),
+        ],
+        'comments': [
+            # Comments
+            (r'#.*$', Comment.Single),
+        ],
+        'root': [
+            # Comments
+            include('comments'),
+            include('whitespace'),
+            # Block start
+            (r'(model)(\s+)(\{)',
+             bygroups(Keyword.Namespace, Text, Punctuation)),
+            # Reserved Words
+            (r'(for|in)(?![\w.])', Keyword.Reserved),
+            # Built-in Functions
+            (r'({})(?=\s*\()'.format(r'|'.join(_FUNCTIONS + _DISTRIBUTIONS)),
+             Name.Builtin),
+            # Regular variable names
+            (r'[A-Za-z][\w.]*', Name),
+            # Number Literals
+            (r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', Number),
+            # Punctuation
+            (r'\[|\]|\(|\)|:|,|;', Punctuation),
+            # Assignment operators
+            # SLexer makes these tokens Operators.
+            (r'<-|~', Operator),
+            # Infix and prefix operators
+            (r'\+|-|\*|/', Operator),
+            # Block
+            (r'[{}]', Punctuation),
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r"^\s*model\s*{", text, re.M):
+            return 0.7
+        else:
+            return 0.0
+
+
+class JagsLexer(RegexLexer):
+    """
+    Pygments Lexer for JAGS.
+    """
+
+    name = 'JAGS'
+    aliases = ['jags']
+    filenames = ['*.jag', '*.bug']
+    url = 'https://mcmc-jags.sourceforge.io'
+    version_added = '1.6'
+
+    # JAGS
+    _FUNCTIONS = (
+        'abs', 'arccos', 'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctanh',
+        'cos', 'cosh', 'cloglog',
+        'equals', 'exp', 'icloglog', 'ifelse', 'ilogit', 'log', 'logfact',
+        'loggam', 'logit', 'phi', 'pow', 'probit', 'round', 'sin', 'sinh',
+        'sqrt', 'step', 'tan', 'tanh', 'trunc', 'inprod', 'interp.lin',
+        'logdet', 'max', 'mean', 'min', 'prod', 'sum', 'sd', 'inverse',
+        'rank', 'sort', 't', 'acos', 'acosh', 'asin', 'asinh', 'atan',
+        # Truncation/Censoring (should I include)
+        'T', 'I')
+    # Distributions with density, probability and quartile functions
+    _DISTRIBUTIONS = tuple(f'[dpq]{x}' for x in
+                           ('bern', 'beta', 'dchiqsqr', 'ddexp', 'dexp',
+                            'df', 'gamma', 'gen.gamma', 'logis', 'lnorm',
+                            'negbin', 'nchisqr', 'norm', 'par', 'pois', 'weib'))
+    # Other distributions without density and probability
+    _OTHER_DISTRIBUTIONS = (
+        'dt', 'dunif', 'dbetabin', 'dbern', 'dbin', 'dcat', 'dhyper',
+        'ddirch', 'dmnorm', 'dwish', 'dmt', 'dmulti', 'dbinom', 'dchisq',
+        'dnbinom', 'dweibull', 'ddirich')
+
+    tokens = {
+        'whitespace': [
+            (r"\s+", Text),
+        ],
+        'names': [
+            # Regular variable names
+            (r'[a-zA-Z][\w.]*\b', Name),
+        ],
+        'comments': [
+            # do not use stateful comments
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+            # Comments
+            (r'#.*$', Comment.Single),
+        ],
+        'root': [
+            # Comments
+            include('comments'),
+            include('whitespace'),
+            # Block start
+            (r'(model|data)(\s+)(\{)',
+             bygroups(Keyword.Namespace, Text, Punctuation)),
+            (r'var(?![\w.])', Keyword.Declaration),
+            # Reserved Words
+            (r'(for|in)(?![\w.])', Keyword.Reserved),
+            # Builtins
+            # Need to use lookahead because . is a valid char
+            (r'({})(?=\s*\()'.format(r'|'.join(_FUNCTIONS
+                                          + _DISTRIBUTIONS
+                                          + _OTHER_DISTRIBUTIONS)),
+             Name.Builtin),
+            # Names
+            include('names'),
+            # Number Literals
+            (r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', Number),
+            (r'\[|\]|\(|\)|:|,|;', Punctuation),
+            # Assignment operators
+            (r'<-|~', Operator),
+            # # JAGS includes many more than OpenBUGS
+            (r'\+|-|\*|\/|\|\|[&]{2}|[<>=]=?|\^|%.*?%', Operator),
+            (r'[{}]', Punctuation),
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r'^\s*model\s*\{', text, re.M):
+            if re.search(r'^\s*data\s*\{', text, re.M):
+                return 0.9
+            elif re.search(r'^\s*var', text, re.M):
+                return 0.9
+            else:
+                return 0.3
+        else:
+            return 0
+
+
+class StanLexer(RegexLexer):
+    """Pygments Lexer for Stan models.
+
+    The Stan modeling language is specified in the *Stan Modeling Language
+    User's Guide and Reference Manual, v2.17.0*,
+    `pdf `__.
+    """
+
+    name = 'Stan'
+    aliases = ['stan']
+    filenames = ['*.stan']
+    url = 'https://mc-stan.org'
+    version_added = '1.6'
+
+    tokens = {
+        'whitespace': [
+            (r"\s+", Text),
+        ],
+        'comments': [
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+            # Comments
+            (r'(//|#).*$', Comment.Single),
+        ],
+        'root': [
+            (r'"[^"]*"', String),
+            # Comments
+            include('comments'),
+            # block start
+            include('whitespace'),
+            # Block start
+            (r'({})(\s*)(\{{)'.format(r'|'.join(('functions', 'data', r'transformed\s+?data',
+                        'parameters', r'transformed\s+parameters',
+                        'model', r'generated\s+quantities'))),
+             bygroups(Keyword.Namespace, Text, Punctuation)),
+            # target keyword
+            (r'target\s*\+=', Keyword),
+            # Reserved Words
+            (r'({})\b'.format(r'|'.join(_stan_builtins.KEYWORDS)), Keyword),
+            # Truncation
+            (r'T(?=\s*\[)', Keyword),
+            # Data types
+            (r'({})\b'.format(r'|'.join(_stan_builtins.TYPES)), Keyword.Type),
+             # < should be punctuation, but elsewhere I can't tell if it is in
+             # a range constraint
+            (r'(<)(\s*)(upper|lower|offset|multiplier)(\s*)(=)',
+             bygroups(Operator, Whitespace, Keyword, Whitespace, Punctuation)),
+            (r'(,)(\s*)(upper)(\s*)(=)',
+             bygroups(Punctuation, Whitespace, Keyword, Whitespace, Punctuation)),
+            # Punctuation
+            (r"[;,\[\]()]", Punctuation),
+            # Builtin
+            (r'({})(?=\s*\()'.format('|'.join(_stan_builtins.FUNCTIONS)), Name.Builtin),
+            (r'(~)(\s*)({})(?=\s*\()'.format('|'.join(_stan_builtins.DISTRIBUTIONS)),
+                bygroups(Operator, Whitespace, Name.Builtin)),
+            # Special names ending in __, like lp__
+            (r'[A-Za-z]\w*__\b', Name.Builtin.Pseudo),
+            (r'({})\b'.format(r'|'.join(_stan_builtins.RESERVED)), Keyword.Reserved),
+            # user-defined functions
+            (r'[A-Za-z]\w*(?=\s*\()]', Name.Function),
+            # Imaginary Literals
+            (r'[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?i', Number.Float),
+            (r'\.[0-9]+([eE][+-]?[0-9]+)?i', Number.Float),
+            (r'[0-9]+i', Number.Float),
+            # Real Literals
+            (r'[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\.[0-9]+([eE][+-]?[0-9]+)?', Number.Float),
+            # Integer Literals
+            (r'[0-9]+', Number.Integer),
+            # Regular variable names
+            (r'[A-Za-z]\w*\b', Name),
+            # Assignment operators
+            (r'<-|(?:\+|-|\.?/|\.?\*|=)?=|~', Operator),
+            # Infix, prefix and postfix operators (and = )
+            (r"\+|-|\.?\*|\.?/|\\|'|\.?\^|!=?|<=?|>=?|\|\||&&|%|\?|:|%/%|!", Operator),
+            # Block delimiters
+            (r'[{}]', Punctuation),
+            # Distribution |
+            (r'\|', Punctuation)
+        ]
+    }
+
+    def analyse_text(text):
+        if re.search(r'^\s*parameters\s*\{', text, re.M):
+            return 1.0
+        else:
+            return 0.0
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/modula2.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/modula2.py
new file mode 100644
index 000000000..713f4722f
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/modula2.py
@@ -0,0 +1,1579 @@
+"""
+    pygments.lexers.modula2
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Multi-Dialect Lexer for Modula-2.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include
+from pygments.util import get_bool_opt, get_list_opt
+from pygments.token import Text, Comment, Operator, Keyword, Name, \
+    String, Number, Punctuation, Error
+
+__all__ = ['Modula2Lexer']
+
+
+# Multi-Dialect Modula-2 Lexer
+class Modula2Lexer(RegexLexer):
+    """
+    For Modula-2 source code.
+
+    The Modula-2 lexer supports several dialects.  By default, it operates in
+    fallback mode, recognising the *combined* literals, punctuation symbols
+    and operators of all supported dialects, and the *combined* reserved words
+    and builtins of PIM Modula-2, ISO Modula-2 and Modula-2 R10, while not
+    differentiating between library defined identifiers.
+
+    To select a specific dialect, a dialect option may be passed
+    or a dialect tag may be embedded into a source file.
+
+    Dialect Options:
+
+    `m2pim`
+        Select PIM Modula-2 dialect.
+    `m2iso`
+        Select ISO Modula-2 dialect.
+    `m2r10`
+        Select Modula-2 R10 dialect.
+    `objm2`
+        Select Objective Modula-2 dialect.
+
+    The PIM and ISO dialect options may be qualified with a language extension.
+
+    Language Extensions:
+
+    `+aglet`
+        Select Aglet Modula-2 extensions, available with m2iso.
+    `+gm2`
+        Select GNU Modula-2 extensions, available with m2pim.
+    `+p1`
+        Select p1 Modula-2 extensions, available with m2iso.
+    `+xds`
+        Select XDS Modula-2 extensions, available with m2iso.
+
+
+    Passing a Dialect Option via Unix Commandline Interface
+
+    Dialect options may be passed to the lexer using the `dialect` key.
+    Only one such option should be passed. If multiple dialect options are
+    passed, the first valid option is used, any subsequent options are ignored.
+
+    Examples:
+
+    `$ pygmentize -O full,dialect=m2iso -f html -o /path/to/output /path/to/input`
+        Use ISO dialect to render input to HTML output
+    `$ pygmentize -O full,dialect=m2iso+p1 -f rtf -o /path/to/output /path/to/input`
+        Use ISO dialect with p1 extensions to render input to RTF output
+
+
+    Embedding a Dialect Option within a source file
+
+    A dialect option may be embedded in a source file in form of a dialect
+    tag, a specially formatted comment that specifies a dialect option.
+
+    Dialect Tag EBNF::
+
+       dialectTag :
+           OpeningCommentDelim Prefix dialectOption ClosingCommentDelim ;
+
+       dialectOption :
+           'm2pim' | 'm2iso' | 'm2r10' | 'objm2' |
+           'm2iso+aglet' | 'm2pim+gm2' | 'm2iso+p1' | 'm2iso+xds' ;
+
+       Prefix : '!' ;
+
+       OpeningCommentDelim : '(*' ;
+
+       ClosingCommentDelim : '*)' ;
+
+    No whitespace is permitted between the tokens of a dialect tag.
+
+    In the event that a source file contains multiple dialect tags, the first
+    tag that contains a valid dialect option will be used and any subsequent
+    dialect tags will be ignored.  Ideally, a dialect tag should be placed
+    at the beginning of a source file.
+
+    An embedded dialect tag overrides a dialect option set via command line.
+
+    Examples:
+
+    ``(*!m2r10*) DEFINITION MODULE Foobar; ...``
+        Use Modula2 R10 dialect to render this source file.
+    ``(*!m2pim+gm2*) DEFINITION MODULE Bazbam; ...``
+        Use PIM dialect with GNU extensions to render this source file.
+
+
+    Algol Publication Mode:
+
+    In Algol publication mode, source text is rendered for publication of
+    algorithms in scientific papers and academic texts, following the format
+    of the Revised Algol-60 Language Report.  It is activated by passing
+    one of two corresponding styles as an option:
+
+    `algol`
+        render reserved words lowercase underline boldface
+        and builtins lowercase boldface italic
+    `algol_nu`
+        render reserved words lowercase boldface (no underlining)
+        and builtins lowercase boldface italic
+
+    The lexer automatically performs the required lowercase conversion when
+    this mode is activated.
+
+    Example:
+
+    ``$ pygmentize -O full,style=algol -f latex -o /path/to/output /path/to/input``
+        Render input file in Algol publication mode to LaTeX output.
+
+
+    Rendering Mode of First Class ADT Identifiers:
+
+    The rendering of standard library first class ADT identifiers is controlled
+    by option flag "treat_stdlib_adts_as_builtins".
+
+    When this option is turned on, standard library ADT identifiers are rendered
+    as builtins.  When it is turned off, they are rendered as ordinary library
+    identifiers.
+
+    `treat_stdlib_adts_as_builtins` (default: On)
+
+    The option is useful for dialects that support ADTs as first class objects
+    and provide ADTs in the standard library that would otherwise be built-in.
+
+    At present, only Modula-2 R10 supports library ADTs as first class objects
+    and therefore, no ADT identifiers are defined for any other dialects.
+
+    Example:
+
+    ``$ pygmentize -O full,dialect=m2r10,treat_stdlib_adts_as_builtins=Off ...``
+        Render standard library ADTs as ordinary library types.
+
+    .. versionchanged:: 2.1
+       Added multi-dialect support.
+    """
+    name = 'Modula-2'
+    url = 'http://www.modula2.org/'
+    aliases = ['modula2', 'm2']
+    filenames = ['*.def', '*.mod']
+    mimetypes = ['text/x-modula2']
+    version_added = '1.3'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'whitespace': [
+            (r'\n+', Text),  # blank lines
+            (r'\s+', Text),  # whitespace
+        ],
+        'dialecttags': [
+            # PIM Dialect Tag
+            (r'\(\*!m2pim\*\)', Comment.Special),
+            # ISO Dialect Tag
+            (r'\(\*!m2iso\*\)', Comment.Special),
+            # M2R10 Dialect Tag
+            (r'\(\*!m2r10\*\)', Comment.Special),
+            # ObjM2 Dialect Tag
+            (r'\(\*!objm2\*\)', Comment.Special),
+            # Aglet Extensions Dialect Tag
+            (r'\(\*!m2iso\+aglet\*\)', Comment.Special),
+            # GNU Extensions Dialect Tag
+            (r'\(\*!m2pim\+gm2\*\)', Comment.Special),
+            # p1 Extensions Dialect Tag
+            (r'\(\*!m2iso\+p1\*\)', Comment.Special),
+            # XDS Extensions Dialect Tag
+            (r'\(\*!m2iso\+xds\*\)', Comment.Special),
+        ],
+        'identifiers': [
+            (r'([a-zA-Z_$][\w$]*)', Name),
+        ],
+        'prefixed_number_literals': [
+            #
+            # Base-2, whole number
+            (r'0b[01]+(\'[01]+)*', Number.Bin),
+            #
+            # Base-16, whole number
+            (r'0[ux][0-9A-F]+(\'[0-9A-F]+)*', Number.Hex),
+        ],
+        'plain_number_literals': [
+            #
+            # Base-10, real number with exponent
+            (r'[0-9]+(\'[0-9]+)*'  # integral part
+             r'\.[0-9]+(\'[0-9]+)*'  # fractional part
+             r'[eE][+-]?[0-9]+(\'[0-9]+)*',  # exponent
+             Number.Float),
+            #
+            # Base-10, real number without exponent
+            (r'[0-9]+(\'[0-9]+)*'  # integral part
+             r'\.[0-9]+(\'[0-9]+)*',  # fractional part
+             Number.Float),
+            #
+            # Base-10, whole number
+            (r'[0-9]+(\'[0-9]+)*', Number.Integer),
+        ],
+        'suffixed_number_literals': [
+            #
+            # Base-8, whole number
+            (r'[0-7]+B', Number.Oct),
+            #
+            # Base-8, character code
+            (r'[0-7]+C', Number.Oct),
+            #
+            # Base-16, number
+            (r'[0-9A-F]+H', Number.Hex),
+        ],
+        'string_literals': [
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ],
+        'digraph_operators': [
+            # Dot Product Operator
+            (r'\*\.', Operator),
+            # Array Concatenation Operator
+            (r'\+>', Operator),  # M2R10 + ObjM2
+            # Inequality Operator
+            (r'<>', Operator),  # ISO + PIM
+            # Less-Or-Equal, Subset
+            (r'<=', Operator),
+            # Greater-Or-Equal, Superset
+            (r'>=', Operator),
+            # Identity Operator
+            (r'==', Operator),  # M2R10 + ObjM2
+            # Type Conversion Operator
+            (r'::', Operator),  # M2R10 + ObjM2
+            # Assignment Symbol
+            (r':=', Operator),
+            # Postfix Increment Mutator
+            (r'\+\+', Operator),  # M2R10 + ObjM2
+            # Postfix Decrement Mutator
+            (r'--', Operator),  # M2R10 + ObjM2
+        ],
+        'unigraph_operators': [
+            # Arithmetic Operators
+            (r'[+-]', Operator),
+            (r'[*/]', Operator),
+            # ISO 80000-2 compliant Set Difference Operator
+            (r'\\', Operator),  # M2R10 + ObjM2
+            # Relational Operators
+            (r'[=#<>]', Operator),
+            # Dereferencing Operator
+            (r'\^', Operator),
+            # Dereferencing Operator Synonym
+            (r'@', Operator),  # ISO
+            # Logical AND Operator Synonym
+            (r'&', Operator),  # PIM + ISO
+            # Logical NOT Operator Synonym
+            (r'~', Operator),  # PIM + ISO
+            # Smalltalk Message Prefix
+            (r'`', Operator),  # ObjM2
+        ],
+        'digraph_punctuation': [
+            # Range Constructor
+            (r'\.\.', Punctuation),
+            # Opening Chevron Bracket
+            (r'<<', Punctuation),  # M2R10 + ISO
+            # Closing Chevron Bracket
+            (r'>>', Punctuation),  # M2R10 + ISO
+            # Blueprint Punctuation
+            (r'->', Punctuation),  # M2R10 + ISO
+            # Distinguish |# and # in M2 R10
+            (r'\|#', Punctuation),
+            # Distinguish ## and # in M2 R10
+            (r'##', Punctuation),
+            # Distinguish |* and * in M2 R10
+            (r'\|\*', Punctuation),
+        ],
+        'unigraph_punctuation': [
+            # Common Punctuation
+            (r'[()\[\]{},.:;|]', Punctuation),
+            # Case Label Separator Synonym
+            (r'!', Punctuation),  # ISO
+            # Blueprint Punctuation
+            (r'\?', Punctuation),  # M2R10 + ObjM2
+        ],
+        'comments': [
+            # Single Line Comment
+            (r'^//.*?\n', Comment.Single),  # M2R10 + ObjM2
+            # Block Comment
+            (r'\(\*([^$].*?)\*\)', Comment.Multiline),
+            # Template Block Comment
+            (r'/\*(.*?)\*/', Comment.Multiline),  # M2R10 + ObjM2
+        ],
+        'pragmas': [
+            # ISO Style Pragmas
+            (r'<\*.*?\*>', Comment.Preproc),  # ISO, M2R10 + ObjM2
+            # Pascal Style Pragmas
+            (r'\(\*\$.*?\*\)', Comment.Preproc),  # PIM
+        ],
+        'root': [
+            include('whitespace'),
+            include('dialecttags'),
+            include('pragmas'),
+            include('comments'),
+            include('identifiers'),
+            include('suffixed_number_literals'),  # PIM + ISO
+            include('prefixed_number_literals'),  # M2R10 + ObjM2
+            include('plain_number_literals'),
+            include('string_literals'),
+            include('digraph_punctuation'),
+            include('digraph_operators'),
+            include('unigraph_punctuation'),
+            include('unigraph_operators'),
+        ]
+    }
+
+#  C o m m o n   D a t a s e t s
+
+    # Common Reserved Words Dataset
+    common_reserved_words = (
+        # 37 common reserved words
+        'AND', 'ARRAY', 'BEGIN', 'BY', 'CASE', 'CONST', 'DEFINITION', 'DIV',
+        'DO', 'ELSE', 'ELSIF', 'END', 'EXIT', 'FOR', 'FROM', 'IF',
+        'IMPLEMENTATION', 'IMPORT', 'IN', 'LOOP', 'MOD', 'MODULE', 'NOT',
+        'OF', 'OR', 'POINTER', 'PROCEDURE', 'RECORD', 'REPEAT', 'RETURN',
+        'SET', 'THEN', 'TO', 'TYPE', 'UNTIL', 'VAR', 'WHILE',
+    )
+
+    # Common Builtins Dataset
+    common_builtins = (
+        # 16 common builtins
+        'ABS', 'BOOLEAN', 'CARDINAL', 'CHAR', 'CHR', 'FALSE', 'INTEGER',
+        'LONGINT', 'LONGREAL', 'MAX', 'MIN', 'NIL', 'ODD', 'ORD', 'REAL',
+        'TRUE',
+    )
+
+    # Common Pseudo-Module Builtins Dataset
+    common_pseudo_builtins = (
+        # 4 common pseudo builtins
+        'ADDRESS', 'BYTE', 'WORD', 'ADR'
+    )
+
+#  P I M   M o d u l a - 2   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for PIM Modula-2
+    pim_lexemes_to_reject = (
+        '!', '`', '@', '$', '%', '?', '\\', '==', '++', '--', '::', '*.',
+        '+>', '->', '<<', '>>', '|#', '##',
+    )
+
+    # PIM Modula-2 Additional Reserved Words Dataset
+    pim_additional_reserved_words = (
+        # 3 additional reserved words
+        'EXPORT', 'QUALIFIED', 'WITH',
+    )
+
+    # PIM Modula-2 Additional Builtins Dataset
+    pim_additional_builtins = (
+        # 16 additional builtins
+        'BITSET', 'CAP', 'DEC', 'DISPOSE', 'EXCL', 'FLOAT', 'HALT', 'HIGH',
+        'INC', 'INCL', 'NEW', 'NIL', 'PROC', 'SIZE', 'TRUNC', 'VAL',
+    )
+
+    # PIM Modula-2 Additional Pseudo-Module Builtins Dataset
+    pim_additional_pseudo_builtins = (
+        # 5 additional pseudo builtins
+        'SYSTEM', 'PROCESS', 'TSIZE', 'NEWPROCESS', 'TRANSFER',
+    )
+
+#  I S O   M o d u l a - 2   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for ISO Modula-2
+    iso_lexemes_to_reject = (
+        '`', '$', '%', '?', '\\', '==', '++', '--', '::', '*.', '+>', '->',
+        '<<', '>>', '|#', '##',
+    )
+
+    # ISO Modula-2 Additional Reserved Words Dataset
+    iso_additional_reserved_words = (
+        # 9 additional reserved words (ISO 10514-1)
+        'EXCEPT', 'EXPORT', 'FINALLY', 'FORWARD', 'PACKEDSET', 'QUALIFIED',
+        'REM', 'RETRY', 'WITH',
+        # 10 additional reserved words (ISO 10514-2 & ISO 10514-3)
+        'ABSTRACT', 'AS', 'CLASS', 'GUARD', 'INHERIT', 'OVERRIDE', 'READONLY',
+        'REVEAL', 'TRACED', 'UNSAFEGUARDED',
+    )
+
+    # ISO Modula-2 Additional Builtins Dataset
+    iso_additional_builtins = (
+        # 26 additional builtins (ISO 10514-1)
+        'BITSET', 'CAP', 'CMPLX', 'COMPLEX', 'DEC', 'DISPOSE', 'EXCL', 'FLOAT',
+        'HALT', 'HIGH', 'IM', 'INC', 'INCL', 'INT', 'INTERRUPTIBLE',  'LENGTH',
+        'LFLOAT', 'LONGCOMPLEX', 'NEW', 'PROC', 'PROTECTION', 'RE', 'SIZE',
+        'TRUNC', 'UNINTERRUBTIBLE', 'VAL',
+        # 5 additional builtins (ISO 10514-2 & ISO 10514-3)
+        'CREATE', 'DESTROY', 'EMPTY', 'ISMEMBER', 'SELF',
+    )
+
+    # ISO Modula-2 Additional Pseudo-Module Builtins Dataset
+    iso_additional_pseudo_builtins = (
+        # 14 additional builtins (SYSTEM)
+        'SYSTEM', 'BITSPERLOC', 'LOCSPERBYTE', 'LOCSPERWORD', 'LOC',
+        'ADDADR', 'SUBADR', 'DIFADR', 'MAKEADR', 'ADR',
+        'ROTATE', 'SHIFT', 'CAST', 'TSIZE',
+        # 13 additional builtins (COROUTINES)
+        'COROUTINES', 'ATTACH', 'COROUTINE', 'CURRENT', 'DETACH', 'HANDLER',
+        'INTERRUPTSOURCE', 'IOTRANSFER', 'IsATTACHED', 'LISTEN',
+        'NEWCOROUTINE', 'PROT', 'TRANSFER',
+        # 9 additional builtins (EXCEPTIONS)
+        'EXCEPTIONS', 'AllocateSource', 'CurrentNumber', 'ExceptionNumber',
+        'ExceptionSource', 'GetMessage', 'IsCurrentSource',
+        'IsExceptionalExecution', 'RAISE',
+        # 3 additional builtins (TERMINATION)
+        'TERMINATION', 'IsTerminating', 'HasHalted',
+        # 4 additional builtins (M2EXCEPTION)
+        'M2EXCEPTION', 'M2Exceptions', 'M2Exception', 'IsM2Exception',
+        'indexException', 'rangeException', 'caseSelectException',
+        'invalidLocation', 'functionException', 'wholeValueException',
+        'wholeDivException', 'realValueException', 'realDivException',
+        'complexValueException', 'complexDivException', 'protException',
+        'sysException', 'coException', 'exException',
+    )
+
+#  M o d u l a - 2   R 1 0   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for Modula-2 R10
+    m2r10_lexemes_to_reject = (
+        '!', '`', '@', '$', '%', '&', '<>',
+    )
+
+    # Modula-2 R10 reserved words in addition to the common set
+    m2r10_additional_reserved_words = (
+        # 12 additional reserved words
+        'ALIAS', 'ARGLIST', 'BLUEPRINT', 'COPY', 'GENLIB', 'INDETERMINATE',
+        'NEW', 'NONE', 'OPAQUE', 'REFERENTIAL', 'RELEASE', 'RETAIN',
+        # 2 additional reserved words with symbolic assembly option
+        'ASM', 'REG',
+    )
+
+    # Modula-2 R10 builtins in addition to the common set
+    m2r10_additional_builtins = (
+        # 26 additional builtins
+        'CARDINAL', 'COUNT', 'EMPTY', 'EXISTS', 'INSERT', 'LENGTH', 'LONGCARD',
+        'OCTET', 'PTR', 'PRED', 'READ', 'READNEW', 'REMOVE', 'RETRIEVE', 'SORT',
+        'STORE', 'SUBSET', 'SUCC', 'TLIMIT', 'TMAX', 'TMIN', 'TRUE', 'TSIZE',
+        'UNICHAR', 'WRITE', 'WRITEF',
+    )
+
+    # Modula-2 R10 Additional Pseudo-Module Builtins Dataset
+    m2r10_additional_pseudo_builtins = (
+        # 13 additional builtins (TPROPERTIES)
+        'TPROPERTIES', 'PROPERTY', 'LITERAL', 'TPROPERTY', 'TLITERAL',
+        'TBUILTIN', 'TDYN', 'TREFC', 'TNIL', 'TBASE', 'TPRECISION',
+        'TMAXEXP', 'TMINEXP',
+        # 4 additional builtins (CONVERSION)
+        'CONVERSION', 'TSXFSIZE', 'SXF', 'VAL',
+        # 35 additional builtins (UNSAFE)
+        'UNSAFE', 'CAST', 'INTRINSIC', 'AVAIL', 'ADD', 'SUB', 'ADDC', 'SUBC',
+        'FETCHADD', 'FETCHSUB', 'SHL', 'SHR', 'ASHR', 'ROTL', 'ROTR', 'ROTLC',
+        'ROTRC', 'BWNOT', 'BWAND', 'BWOR', 'BWXOR', 'BWNAND', 'BWNOR',
+        'SETBIT', 'TESTBIT', 'LSBIT', 'MSBIT', 'CSBITS', 'BAIL', 'HALT',
+        'TODO', 'FFI', 'ADDR', 'VARGLIST', 'VARGC',
+        # 11 additional builtins (ATOMIC)
+        'ATOMIC', 'INTRINSIC', 'AVAIL', 'SWAP', 'CAS', 'INC', 'DEC', 'BWAND',
+        'BWNAND', 'BWOR', 'BWXOR',
+        # 7 additional builtins (COMPILER)
+        'COMPILER', 'DEBUG', 'MODNAME', 'PROCNAME', 'LINENUM', 'DEFAULT',
+        'HASH',
+        # 5 additional builtins (ASSEMBLER)
+        'ASSEMBLER', 'REGISTER', 'SETREG', 'GETREG', 'CODE',
+    )
+
+#  O b j e c t i v e   M o d u l a - 2   D a t a s e t s
+
+    # Lexemes to Mark as Error Tokens for Objective Modula-2
+    objm2_lexemes_to_reject = (
+        '!', '$', '%', '&', '<>',
+    )
+
+    # Objective Modula-2 Extensions
+    # reserved words in addition to Modula-2 R10
+    objm2_additional_reserved_words = (
+        # 16 additional reserved words
+        'BYCOPY', 'BYREF', 'CLASS', 'CONTINUE', 'CRITICAL', 'INOUT', 'METHOD',
+        'ON', 'OPTIONAL', 'OUT', 'PRIVATE', 'PROTECTED', 'PROTOCOL', 'PUBLIC',
+        'SUPER', 'TRY',
+    )
+
+    # Objective Modula-2 Extensions
+    # builtins in addition to Modula-2 R10
+    objm2_additional_builtins = (
+        # 3 additional builtins
+        'OBJECT', 'NO', 'YES',
+    )
+
+    # Objective Modula-2 Extensions
+    # pseudo-module builtins in addition to Modula-2 R10
+    objm2_additional_pseudo_builtins = (
+        # None
+    )
+
+#  A g l e t   M o d u l a - 2   D a t a s e t s
+
+    # Aglet Extensions
+    # reserved words in addition to ISO Modula-2
+    aglet_additional_reserved_words = (
+        # None
+    )
+
+    # Aglet Extensions
+    # builtins in addition to ISO Modula-2
+    aglet_additional_builtins = (
+        # 9 additional builtins
+        'BITSET8', 'BITSET16', 'BITSET32', 'CARDINAL8', 'CARDINAL16',
+        'CARDINAL32', 'INTEGER8', 'INTEGER16', 'INTEGER32',
+    )
+
+    # Aglet Modula-2 Extensions
+    # pseudo-module builtins in addition to ISO Modula-2
+    aglet_additional_pseudo_builtins = (
+        # None
+    )
+
+#  G N U   M o d u l a - 2   D a t a s e t s
+
+    # GNU Extensions
+    # reserved words in addition to PIM Modula-2
+    gm2_additional_reserved_words = (
+        # 10 additional reserved words
+        'ASM', '__ATTRIBUTE__', '__BUILTIN__', '__COLUMN__', '__DATE__',
+        '__FILE__', '__FUNCTION__', '__LINE__', '__MODULE__', 'VOLATILE',
+    )
+
+    # GNU Extensions
+    # builtins in addition to PIM Modula-2
+    gm2_additional_builtins = (
+        # 21 additional builtins
+        'BITSET8', 'BITSET16', 'BITSET32', 'CARDINAL8', 'CARDINAL16',
+        'CARDINAL32', 'CARDINAL64', 'COMPLEX32', 'COMPLEX64', 'COMPLEX96',
+        'COMPLEX128', 'INTEGER8', 'INTEGER16', 'INTEGER32', 'INTEGER64',
+        'REAL8', 'REAL16', 'REAL32', 'REAL96', 'REAL128', 'THROW',
+    )
+
+    # GNU Extensions
+    # pseudo-module builtins in addition to PIM Modula-2
+    gm2_additional_pseudo_builtins = (
+        # None
+    )
+
+#  p 1   M o d u l a - 2   D a t a s e t s
+
+    # p1 Extensions
+    # reserved words in addition to ISO Modula-2
+    p1_additional_reserved_words = (
+        # None
+    )
+
+    # p1 Extensions
+    # builtins in addition to ISO Modula-2
+    p1_additional_builtins = (
+        # None
+    )
+
+    # p1 Modula-2 Extensions
+    # pseudo-module builtins in addition to ISO Modula-2
+    p1_additional_pseudo_builtins = (
+        # 1 additional builtin
+        'BCD',
+    )
+
+#  X D S   M o d u l a - 2   D a t a s e t s
+
+    # XDS Extensions
+    # reserved words in addition to ISO Modula-2
+    xds_additional_reserved_words = (
+        # 1 additional reserved word
+        'SEQ',
+    )
+
+    # XDS Extensions
+    # builtins in addition to ISO Modula-2
+    xds_additional_builtins = (
+        # 9 additional builtins
+        'ASH', 'ASSERT', 'DIFFADR_TYPE', 'ENTIER', 'INDEX', 'LEN',
+        'LONGCARD', 'SHORTCARD', 'SHORTINT',
+    )
+
+    # XDS Modula-2 Extensions
+    # pseudo-module builtins in addition to ISO Modula-2
+    xds_additional_pseudo_builtins = (
+        # 22 additional builtins (SYSTEM)
+        'PROCESS', 'NEWPROCESS', 'BOOL8', 'BOOL16', 'BOOL32', 'CARD8',
+        'CARD16', 'CARD32', 'INT8', 'INT16', 'INT32', 'REF', 'MOVE',
+        'FILL', 'GET', 'PUT', 'CC', 'int', 'unsigned', 'size_t', 'void'
+        # 3 additional builtins (COMPILER)
+        'COMPILER', 'OPTION', 'EQUATION'
+    )
+
+#  P I M   S t a n d a r d   L i b r a r y   D a t a s e t s
+
+    # PIM Modula-2 Standard Library Modules Dataset
+    pim_stdlib_module_identifiers = (
+        'Terminal', 'FileSystem', 'InOut', 'RealInOut', 'MathLib0', 'Storage',
+    )
+
+    # PIM Modula-2 Standard Library Types Dataset
+    pim_stdlib_type_identifiers = (
+        'Flag', 'FlagSet', 'Response', 'Command', 'Lock', 'Permission',
+        'MediumType', 'File', 'FileProc', 'DirectoryProc', 'FileCommand',
+        'DirectoryCommand',
+    )
+
+    # PIM Modula-2 Standard Library Procedures Dataset
+    pim_stdlib_proc_identifiers = (
+        'Read', 'BusyRead', 'ReadAgain', 'Write', 'WriteString', 'WriteLn',
+        'Create', 'Lookup', 'Close', 'Delete', 'Rename', 'SetRead', 'SetWrite',
+        'SetModify', 'SetOpen', 'Doio', 'SetPos', 'GetPos', 'Length', 'Reset',
+        'Again', 'ReadWord', 'WriteWord', 'ReadChar', 'WriteChar',
+        'CreateMedium', 'DeleteMedium', 'AssignName', 'DeassignName',
+        'ReadMedium', 'LookupMedium', 'OpenInput', 'OpenOutput', 'CloseInput',
+        'CloseOutput', 'ReadString', 'ReadInt', 'ReadCard', 'ReadWrd',
+        'WriteInt', 'WriteCard', 'WriteOct', 'WriteHex', 'WriteWrd',
+        'ReadReal', 'WriteReal', 'WriteFixPt', 'WriteRealOct', 'sqrt', 'exp',
+        'ln', 'sin', 'cos', 'arctan', 'entier', 'ALLOCATE', 'DEALLOCATE',
+    )
+
+    # PIM Modula-2 Standard Library Variables Dataset
+    pim_stdlib_var_identifiers = (
+        'Done', 'termCH', 'in', 'out'
+    )
+
+    # PIM Modula-2 Standard Library Constants Dataset
+    pim_stdlib_const_identifiers = (
+        'EOL',
+    )
+
+#  I S O   S t a n d a r d   L i b r a r y   D a t a s e t s
+
+    # ISO Modula-2 Standard Library Modules Dataset
+    iso_stdlib_module_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Types Dataset
+    iso_stdlib_type_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Procedures Dataset
+    iso_stdlib_proc_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Variables Dataset
+    iso_stdlib_var_identifiers = (
+        # TO DO
+    )
+
+    # ISO Modula-2 Standard Library Constants Dataset
+    iso_stdlib_const_identifiers = (
+        # TO DO
+    )
+
+#  M 2   R 1 0   S t a n d a r d   L i b r a r y   D a t a s e t s
+
+    # Modula-2 R10 Standard Library ADTs Dataset
+    m2r10_stdlib_adt_identifiers = (
+        'BCD', 'LONGBCD', 'BITSET', 'SHORTBITSET', 'LONGBITSET',
+        'LONGLONGBITSET', 'COMPLEX', 'LONGCOMPLEX', 'SHORTCARD', 'LONGLONGCARD',
+        'SHORTINT', 'LONGLONGINT', 'POSINT', 'SHORTPOSINT', 'LONGPOSINT',
+        'LONGLONGPOSINT', 'BITSET8', 'BITSET16', 'BITSET32', 'BITSET64',
+        'BITSET128', 'BS8', 'BS16', 'BS32', 'BS64', 'BS128', 'CARDINAL8',
+        'CARDINAL16', 'CARDINAL32', 'CARDINAL64', 'CARDINAL128', 'CARD8',
+        'CARD16', 'CARD32', 'CARD64', 'CARD128', 'INTEGER8', 'INTEGER16',
+        'INTEGER32', 'INTEGER64', 'INTEGER128', 'INT8', 'INT16', 'INT32',
+        'INT64', 'INT128', 'STRING', 'UNISTRING',
+    )
+
+    # Modula-2 R10 Standard Library Blueprints Dataset
+    m2r10_stdlib_blueprint_identifiers = (
+        'ProtoRoot', 'ProtoComputational', 'ProtoNumeric', 'ProtoScalar',
+        'ProtoNonScalar', 'ProtoCardinal', 'ProtoInteger', 'ProtoReal',
+        'ProtoComplex', 'ProtoVector', 'ProtoTuple', 'ProtoCompArray',
+        'ProtoCollection', 'ProtoStaticArray', 'ProtoStaticSet',
+        'ProtoStaticString', 'ProtoArray', 'ProtoString', 'ProtoSet',
+        'ProtoMultiSet', 'ProtoDictionary', 'ProtoMultiDict', 'ProtoExtension',
+        'ProtoIO', 'ProtoCardMath', 'ProtoIntMath', 'ProtoRealMath',
+    )
+
+    # Modula-2 R10 Standard Library Modules Dataset
+    m2r10_stdlib_module_identifiers = (
+        'ASCII', 'BooleanIO', 'CharIO', 'UnicharIO', 'OctetIO',
+        'CardinalIO', 'LongCardIO', 'IntegerIO', 'LongIntIO', 'RealIO',
+        'LongRealIO', 'BCDIO', 'LongBCDIO', 'CardMath', 'LongCardMath',
+        'IntMath', 'LongIntMath', 'RealMath', 'LongRealMath', 'BCDMath',
+        'LongBCDMath', 'FileIO', 'FileSystem', 'Storage', 'IOSupport',
+    )
+
+    # Modula-2 R10 Standard Library Types Dataset
+    m2r10_stdlib_type_identifiers = (
+        'File', 'Status',
+        # TO BE COMPLETED
+    )
+
+    # Modula-2 R10 Standard Library Procedures Dataset
+    m2r10_stdlib_proc_identifiers = (
+        'ALLOCATE', 'DEALLOCATE', 'SIZE',
+        # TO BE COMPLETED
+    )
+
+    # Modula-2 R10 Standard Library Variables Dataset
+    m2r10_stdlib_var_identifiers = (
+        'stdIn', 'stdOut', 'stdErr',
+    )
+
+    # Modula-2 R10 Standard Library Constants Dataset
+    m2r10_stdlib_const_identifiers = (
+        'pi', 'tau',
+    )
+
+#  D i a l e c t s
+
+    # Dialect modes
+    dialects = (
+        'unknown',
+        'm2pim', 'm2iso', 'm2r10', 'objm2',
+        'm2iso+aglet', 'm2pim+gm2', 'm2iso+p1', 'm2iso+xds',
+    )
+
+#   D a t a b a s e s
+
+    # Lexemes to Mark as Errors Database
+    lexemes_to_reject_db = {
+        # Lexemes to reject for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Lexemes to reject for PIM Modula-2
+        'm2pim': (
+            pim_lexemes_to_reject,
+        ),
+        # Lexemes to reject for ISO Modula-2
+        'm2iso': (
+            iso_lexemes_to_reject,
+        ),
+        # Lexemes to reject for Modula-2 R10
+        'm2r10': (
+            m2r10_lexemes_to_reject,
+        ),
+        # Lexemes to reject for Objective Modula-2
+        'objm2': (
+            objm2_lexemes_to_reject,
+        ),
+        # Lexemes to reject for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_lexemes_to_reject,
+        ),
+        # Lexemes to reject for GNU Modula-2
+        'm2pim+gm2': (
+            pim_lexemes_to_reject,
+        ),
+        # Lexemes to reject for p1 Modula-2
+        'm2iso+p1': (
+            iso_lexemes_to_reject,
+        ),
+        # Lexemes to reject for XDS Modula-2
+        'm2iso+xds': (
+            iso_lexemes_to_reject,
+        ),
+    }
+
+    # Reserved Words Database
+    reserved_words_db = {
+        # Reserved words for unknown dialect
+        'unknown': (
+            common_reserved_words,
+            pim_additional_reserved_words,
+            iso_additional_reserved_words,
+            m2r10_additional_reserved_words,
+        ),
+
+        # Reserved words for PIM Modula-2
+        'm2pim': (
+            common_reserved_words,
+            pim_additional_reserved_words,
+        ),
+
+        # Reserved words for Modula-2 R10
+        'm2iso': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+        ),
+
+        # Reserved words for ISO Modula-2
+        'm2r10': (
+            common_reserved_words,
+            m2r10_additional_reserved_words,
+        ),
+
+        # Reserved words for Objective Modula-2
+        'objm2': (
+            common_reserved_words,
+            m2r10_additional_reserved_words,
+            objm2_additional_reserved_words,
+        ),
+
+        # Reserved words for Aglet Modula-2 Extensions
+        'm2iso+aglet': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+            aglet_additional_reserved_words,
+        ),
+
+        # Reserved words for GNU Modula-2 Extensions
+        'm2pim+gm2': (
+            common_reserved_words,
+            pim_additional_reserved_words,
+            gm2_additional_reserved_words,
+        ),
+
+        # Reserved words for p1 Modula-2 Extensions
+        'm2iso+p1': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+            p1_additional_reserved_words,
+        ),
+
+        # Reserved words for XDS Modula-2 Extensions
+        'm2iso+xds': (
+            common_reserved_words,
+            iso_additional_reserved_words,
+            xds_additional_reserved_words,
+        ),
+    }
+
+    # Builtins Database
+    builtins_db = {
+        # Builtins for unknown dialect
+        'unknown': (
+            common_builtins,
+            pim_additional_builtins,
+            iso_additional_builtins,
+            m2r10_additional_builtins,
+        ),
+
+        # Builtins for PIM Modula-2
+        'm2pim': (
+            common_builtins,
+            pim_additional_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2iso': (
+            common_builtins,
+            iso_additional_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2r10': (
+            common_builtins,
+            m2r10_additional_builtins,
+        ),
+
+        # Builtins for Objective Modula-2
+        'objm2': (
+            common_builtins,
+            m2r10_additional_builtins,
+            objm2_additional_builtins,
+        ),
+
+        # Builtins for Aglet Modula-2 Extensions
+        'm2iso+aglet': (
+            common_builtins,
+            iso_additional_builtins,
+            aglet_additional_builtins,
+        ),
+
+        # Builtins for GNU Modula-2 Extensions
+        'm2pim+gm2': (
+            common_builtins,
+            pim_additional_builtins,
+            gm2_additional_builtins,
+        ),
+
+        # Builtins for p1 Modula-2 Extensions
+        'm2iso+p1': (
+            common_builtins,
+            iso_additional_builtins,
+            p1_additional_builtins,
+        ),
+
+        # Builtins for XDS Modula-2 Extensions
+        'm2iso+xds': (
+            common_builtins,
+            iso_additional_builtins,
+            xds_additional_builtins,
+        ),
+    }
+
+    # Pseudo-Module Builtins Database
+    pseudo_builtins_db = {
+        # Builtins for unknown dialect
+        'unknown': (
+            common_pseudo_builtins,
+            pim_additional_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            m2r10_additional_pseudo_builtins,
+        ),
+
+        # Builtins for PIM Modula-2
+        'm2pim': (
+            common_pseudo_builtins,
+            pim_additional_pseudo_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2iso': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+        ),
+
+        # Builtins for ISO Modula-2
+        'm2r10': (
+            common_pseudo_builtins,
+            m2r10_additional_pseudo_builtins,
+        ),
+
+        # Builtins for Objective Modula-2
+        'objm2': (
+            common_pseudo_builtins,
+            m2r10_additional_pseudo_builtins,
+            objm2_additional_pseudo_builtins,
+        ),
+
+        # Builtins for Aglet Modula-2 Extensions
+        'm2iso+aglet': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            aglet_additional_pseudo_builtins,
+        ),
+
+        # Builtins for GNU Modula-2 Extensions
+        'm2pim+gm2': (
+            common_pseudo_builtins,
+            pim_additional_pseudo_builtins,
+            gm2_additional_pseudo_builtins,
+        ),
+
+        # Builtins for p1 Modula-2 Extensions
+        'm2iso+p1': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            p1_additional_pseudo_builtins,
+        ),
+
+        # Builtins for XDS Modula-2 Extensions
+        'm2iso+xds': (
+            common_pseudo_builtins,
+            iso_additional_pseudo_builtins,
+            xds_additional_pseudo_builtins,
+        ),
+    }
+
+    # Standard Library ADTs Database
+    stdlib_adts_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library ADTs for PIM Modula-2
+        'm2pim': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for ISO Modula-2
+        'm2iso': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_adt_identifiers,
+        ),
+
+        # Standard Library ADTs for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_adt_identifiers,
+        ),
+
+        # Standard Library ADTs for Aglet Modula-2
+        'm2iso+aglet': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for GNU Modula-2
+        'm2pim+gm2': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for p1 Modula-2
+        'm2iso+p1': (
+            # No first class library types
+        ),
+
+        # Standard Library ADTs for XDS Modula-2
+        'm2iso+xds': (
+            # No first class library types
+        ),
+    }
+
+    # Standard Library Modules Database
+    stdlib_modules_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Modules for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_blueprint_identifiers,
+            m2r10_stdlib_module_identifiers,
+            m2r10_stdlib_adt_identifiers,
+        ),
+
+        # Standard Library Modules for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_blueprint_identifiers,
+            m2r10_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_module_identifiers,
+        ),
+
+        # Standard Library Modules for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_module_identifiers,
+        ),
+    }
+
+    # Standard Library Types Database
+    stdlib_types_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Types for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_type_identifiers,
+        ),
+
+        # Standard Library Types for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_type_identifiers,
+        ),
+    }
+
+    # Standard Library Procedures Database
+    stdlib_procedures_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Procedures for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_proc_identifiers,
+        ),
+
+        # Standard Library Procedures for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_proc_identifiers,
+        ),
+    }
+
+    # Standard Library Variables Database
+    stdlib_variables_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Variables for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_var_identifiers,
+        ),
+
+        # Standard Library Variables for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_var_identifiers,
+        ),
+    }
+
+    # Standard Library Constants Database
+    stdlib_constants_db = {
+        # Empty entry for unknown dialect
+        'unknown': (
+            # LEAVE THIS EMPTY
+        ),
+        # Standard Library Constants for PIM Modula-2
+        'm2pim': (
+            pim_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for ISO Modula-2
+        'm2iso': (
+            iso_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for Modula-2 R10
+        'm2r10': (
+            m2r10_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for Objective Modula-2
+        'objm2': (
+            m2r10_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for Aglet Modula-2
+        'm2iso+aglet': (
+            iso_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for GNU Modula-2
+        'm2pim+gm2': (
+            pim_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for p1 Modula-2
+        'm2iso+p1': (
+            iso_stdlib_const_identifiers,
+        ),
+
+        # Standard Library Constants for XDS Modula-2
+        'm2iso+xds': (
+            iso_stdlib_const_identifiers,
+        ),
+    }
+
+#   M e t h o d s
+
+    # initialise a lexer instance
+    def __init__(self, **options):
+        #
+        # check dialect options
+        #
+        dialects = get_list_opt(options, 'dialect', [])
+        #
+        for dialect_option in dialects:
+            if dialect_option in self.dialects[1:-1]:
+                # valid dialect option found
+                self.set_dialect(dialect_option)
+                break
+        #
+        # Fallback Mode (DEFAULT)
+        else:
+            # no valid dialect option
+            self.set_dialect('unknown')
+        #
+        self.dialect_set_by_tag = False
+        #
+        # check style options
+        #
+        styles = get_list_opt(options, 'style', [])
+        #
+        # use lowercase mode for Algol style
+        if 'algol' in styles or 'algol_nu' in styles:
+            self.algol_publication_mode = True
+        else:
+            self.algol_publication_mode = False
+        #
+        # Check option flags
+        #
+        self.treat_stdlib_adts_as_builtins = get_bool_opt(
+            options, 'treat_stdlib_adts_as_builtins', True)
+        #
+        # call superclass initialiser
+        RegexLexer.__init__(self, **options)
+
+    # Set lexer to a specified dialect
+    def set_dialect(self, dialect_id):
+        #
+        # if __debug__:
+        #    print 'entered set_dialect with arg: ', dialect_id
+        #
+        # check dialect name against known dialects
+        if dialect_id not in self.dialects:
+            dialect = 'unknown'  # default
+        else:
+            dialect = dialect_id
+        #
+        # compose lexemes to reject set
+        lexemes_to_reject_set = set()
+        # add each list of reject lexemes for this dialect
+        for list in self.lexemes_to_reject_db[dialect]:
+            lexemes_to_reject_set.update(set(list))
+        #
+        # compose reserved words set
+        reswords_set = set()
+        # add each list of reserved words for this dialect
+        for list in self.reserved_words_db[dialect]:
+            reswords_set.update(set(list))
+        #
+        # compose builtins set
+        builtins_set = set()
+        # add each list of builtins for this dialect excluding reserved words
+        for list in self.builtins_db[dialect]:
+            builtins_set.update(set(list).difference(reswords_set))
+        #
+        # compose pseudo-builtins set
+        pseudo_builtins_set = set()
+        # add each list of builtins for this dialect excluding reserved words
+        for list in self.pseudo_builtins_db[dialect]:
+            pseudo_builtins_set.update(set(list).difference(reswords_set))
+        #
+        # compose ADTs set
+        adts_set = set()
+        # add each list of ADTs for this dialect excluding reserved words
+        for list in self.stdlib_adts_db[dialect]:
+            adts_set.update(set(list).difference(reswords_set))
+        #
+        # compose modules set
+        modules_set = set()
+        # add each list of builtins for this dialect excluding builtins
+        for list in self.stdlib_modules_db[dialect]:
+            modules_set.update(set(list).difference(builtins_set))
+        #
+        # compose types set
+        types_set = set()
+        # add each list of types for this dialect excluding builtins
+        for list in self.stdlib_types_db[dialect]:
+            types_set.update(set(list).difference(builtins_set))
+        #
+        # compose procedures set
+        procedures_set = set()
+        # add each list of procedures for this dialect excluding builtins
+        for list in self.stdlib_procedures_db[dialect]:
+            procedures_set.update(set(list).difference(builtins_set))
+        #
+        # compose variables set
+        variables_set = set()
+        # add each list of variables for this dialect excluding builtins
+        for list in self.stdlib_variables_db[dialect]:
+            variables_set.update(set(list).difference(builtins_set))
+        #
+        # compose constants set
+        constants_set = set()
+        # add each list of constants for this dialect excluding builtins
+        for list in self.stdlib_constants_db[dialect]:
+            constants_set.update(set(list).difference(builtins_set))
+        #
+        # update lexer state
+        self.dialect = dialect
+        self.lexemes_to_reject = lexemes_to_reject_set
+        self.reserved_words = reswords_set
+        self.builtins = builtins_set
+        self.pseudo_builtins = pseudo_builtins_set
+        self.adts = adts_set
+        self.modules = modules_set
+        self.types = types_set
+        self.procedures = procedures_set
+        self.variables = variables_set
+        self.constants = constants_set
+        #
+        # if __debug__:
+        #    print 'exiting set_dialect'
+        #    print ' self.dialect: ', self.dialect
+        #    print ' self.lexemes_to_reject: ', self.lexemes_to_reject
+        #    print ' self.reserved_words: ', self.reserved_words
+        #    print ' self.builtins: ', self.builtins
+        #    print ' self.pseudo_builtins: ', self.pseudo_builtins
+        #    print ' self.adts: ', self.adts
+        #    print ' self.modules: ', self.modules
+        #    print ' self.types: ', self.types
+        #    print ' self.procedures: ', self.procedures
+        #    print ' self.variables: ', self.variables
+        #    print ' self.types: ', self.types
+        #    print ' self.constants: ', self.constants
+
+    # Extracts a dialect name from a dialect tag comment string  and checks
+    # the extracted name against known dialects.  If a match is found,  the
+    # matching name is returned, otherwise dialect id 'unknown' is returned
+    def get_dialect_from_dialect_tag(self, dialect_tag):
+        #
+        # if __debug__:
+        #    print 'entered get_dialect_from_dialect_tag with arg: ', dialect_tag
+        #
+        # constants
+        left_tag_delim = '(*!'
+        right_tag_delim = '*)'
+        left_tag_delim_len = len(left_tag_delim)
+        right_tag_delim_len = len(right_tag_delim)
+        indicator_start = left_tag_delim_len
+        indicator_end = -(right_tag_delim_len)
+        #
+        # check comment string for dialect indicator
+        if len(dialect_tag) > (left_tag_delim_len + right_tag_delim_len) \
+           and dialect_tag.startswith(left_tag_delim) \
+           and dialect_tag.endswith(right_tag_delim):
+            #
+            # if __debug__:
+            #    print 'dialect tag found'
+            #
+            # extract dialect indicator
+            indicator = dialect_tag[indicator_start:indicator_end]
+            #
+            # if __debug__:
+            #    print 'extracted: ', indicator
+            #
+            # check against known dialects
+            for index in range(1, len(self.dialects)):
+                #
+                # if __debug__:
+                #    print 'dialects[', index, ']: ', self.dialects[index]
+                #
+                if indicator == self.dialects[index]:
+                    #
+                    # if __debug__:
+                    #    print 'matching dialect found'
+                    #
+                    # indicator matches known dialect
+                    return indicator
+            else:
+                # indicator does not match any dialect
+                return 'unknown'  # default
+        else:
+            # invalid indicator string
+            return 'unknown'  # default
+
+    # intercept the token stream, modify token attributes and return them
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in RegexLexer.get_tokens_unprocessed(self, text):
+            #
+            # check for dialect tag if dialect has not been set by tag
+            if not self.dialect_set_by_tag and token == Comment.Special:
+                indicated_dialect = self.get_dialect_from_dialect_tag(value)
+                if indicated_dialect != 'unknown':
+                    # token is a dialect indicator
+                    # reset reserved words and builtins
+                    self.set_dialect(indicated_dialect)
+                    self.dialect_set_by_tag = True
+            #
+            # check for reserved words, predefined and stdlib identifiers
+            if token is Name:
+                if value in self.reserved_words:
+                    token = Keyword.Reserved
+                    if self.algol_publication_mode:
+                        value = value.lower()
+                #
+                elif value in self.builtins:
+                    token = Name.Builtin
+                    if self.algol_publication_mode:
+                        value = value.lower()
+                #
+                elif value in self.pseudo_builtins:
+                    token = Name.Builtin.Pseudo
+                    if self.algol_publication_mode:
+                        value = value.lower()
+                #
+                elif value in self.adts:
+                    if not self.treat_stdlib_adts_as_builtins:
+                        token = Name.Namespace
+                    else:
+                        token = Name.Builtin.Pseudo
+                        if self.algol_publication_mode:
+                            value = value.lower()
+                #
+                elif value in self.modules:
+                    token = Name.Namespace
+                #
+                elif value in self.types:
+                    token = Name.Class
+                #
+                elif value in self.procedures:
+                    token = Name.Function
+                #
+                elif value in self.variables:
+                    token = Name.Variable
+                #
+                elif value in self.constants:
+                    token = Name.Constant
+            #
+            elif token in Number:
+                #
+                # mark prefix number literals as error for PIM and ISO dialects
+                if self.dialect not in ('unknown', 'm2r10', 'objm2'):
+                    if "'" in value or value[0:2] in ('0b', '0x', '0u'):
+                        token = Error
+                #
+                elif self.dialect in ('m2r10', 'objm2'):
+                    # mark base-8 number literals as errors for M2 R10 and ObjM2
+                    if token is Number.Oct:
+                        token = Error
+                    # mark suffix base-16 literals as errors for M2 R10 and ObjM2
+                    elif token is Number.Hex and 'H' in value:
+                        token = Error
+                    # mark real numbers with E as errors for M2 R10 and ObjM2
+                    elif token is Number.Float and 'E' in value:
+                        token = Error
+            #
+            elif token in Comment:
+                #
+                # mark single line comment as error for PIM and ISO dialects
+                if token is Comment.Single:
+                    if self.dialect not in ('unknown', 'm2r10', 'objm2'):
+                        token = Error
+                #
+                if token is Comment.Preproc:
+                    # mark ISO pragma as error for PIM dialects
+                    if value.startswith('<*') and \
+                       self.dialect.startswith('m2pim'):
+                        token = Error
+                    # mark PIM pragma as comment for other dialects
+                    elif value.startswith('(*$') and \
+                            self.dialect != 'unknown' and \
+                            not self.dialect.startswith('m2pim'):
+                        token = Comment.Multiline
+            #
+            else:  # token is neither Name nor Comment
+                #
+                # mark lexemes matching the dialect's error token set as errors
+                if value in self.lexemes_to_reject:
+                    token = Error
+                #
+                # substitute lexemes when in Algol mode
+                if self.algol_publication_mode:
+                    if value == '#':
+                        value = '≠'
+                    elif value == '<=':
+                        value = '≤'
+                    elif value == '>=':
+                        value = '≥'
+                    elif value == '==':
+                        value = '≡'
+                    elif value == '*.':
+                        value = '•'
+
+            # return result
+            yield index, token, value
+
+    def analyse_text(text):
+        """It's Pascal-like, but does not use FUNCTION -- uses PROCEDURE
+        instead."""
+
+        # Check if this looks like Pascal, if not, bail out early
+        if not ('(*' in text and '*)' in text and ':=' in text):
+            return
+
+        result = 0
+        # Procedure is in Modula2
+        if re.search(r'\bPROCEDURE\b', text):
+            result += 0.6
+
+        # FUNCTION is only valid in Pascal, but not in Modula2
+        if re.search(r'\bFUNCTION\b', text):
+            result = 0.0
+
+        return result
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/mojo.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/mojo.py
new file mode 100644
index 000000000..4df18c4f9
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/mojo.py
@@ -0,0 +1,707 @@
+"""
+    pygments.lexers.mojo
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Mojo and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import keyword
+
+from pygments import unistring as uni
+from pygments.lexer import (
+    RegexLexer,
+    bygroups,
+    combined,
+    default,
+    include,
+    this,
+    using,
+    words,
+)
+from pygments.token import (
+    Comment,
+    # Error,
+    Keyword,
+    Name,
+    Number,
+    Operator,
+    Punctuation,
+    String,
+    Text,
+    Whitespace,
+)
+from pygments.util import shebang_matches
+
+__all__ = ["MojoLexer"]
+
+
+class MojoLexer(RegexLexer):
+    """
+    For Mojo source code (version 24.2.1).
+    """
+
+    name = "Mojo"
+    url = "https://docs.modular.com/mojo/"
+    aliases = ["mojo", "🔥"]
+    filenames = [
+        "*.mojo",
+        "*.🔥",
+    ]
+    mimetypes = [
+        "text/x-mojo",
+        "application/x-mojo",
+    ]
+    version_added = "2.18"
+
+    uni_name = f"[{uni.xid_start}][{uni.xid_continue}]*"
+
+    def innerstring_rules(ttype):
+        return [
+            # the old style '%s' % (...) string formatting (still valid in Py3)
+            (
+                r"%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?"
+                "[hlL]?[E-GXc-giorsaux%]",
+                String.Interpol,
+            ),
+            # the new style '{}'.format(...) string formatting
+            (
+                r"\{"
+                r"((\w+)((\.\w+)|(\[[^\]]+\]))*)?"  # field name
+                r"(\![sra])?"  # conversion
+                r"(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?"
+                r"\}",
+                String.Interpol,
+            ),
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"%{\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # unhandled string formatting sign
+            (r"%|(\{{1,2})", ttype),
+            # newlines are an error (use "nl" state)
+        ]
+
+    def fstring_rules(ttype):
+        return [
+            # Assuming that a '}' is the closing brace after format specifier.
+            # Sadly, this means that we won't detect syntax error. But it's
+            # more important to parse correct syntax correctly, than to
+            # highlight invalid syntax.
+            (r"\}", String.Interpol),
+            (r"\{", String.Interpol, "expr-inside-fstring"),
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"{}\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # newlines are an error (use "nl" state)
+        ]
+
+    tokens = {
+        "root": [
+            (r"\s+", Whitespace),
+            (
+                r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")',
+                bygroups(Whitespace, String.Affix, String.Doc),
+            ),
+            (
+                r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')",
+                bygroups(Whitespace, String.Affix, String.Doc),
+            ),
+            (r"\A#!.+$", Comment.Hashbang),
+            (r"#.*$", Comment.Single),
+            (r"\\\n", Whitespace),
+            (r"\\", Whitespace),
+            include("keywords"),
+            include("soft-keywords"),
+            # In the original PR, all the below here used ((?:\s|\\\s)+) to
+            # designate whitespace, but I can't find any example of this being
+            # needed in the example file, so we're replacing it with `\s+`.
+            (
+                r"(alias)(\s+)",
+                bygroups(Keyword, Whitespace),
+                "varname",  # TODO varname the right fit?
+            ),
+            (r"(var)(\s+)", bygroups(Keyword, Whitespace), "varname"),
+            (r"(def)(\s+)", bygroups(Keyword, Whitespace), "funcname"),
+            (r"(fn)(\s+)", bygroups(Keyword, Whitespace), "funcname"),
+            (
+                r"(class)(\s+)",
+                bygroups(Keyword, Whitespace),
+                "classname",
+            ),  # not implemented yet
+            (r"(struct)(\s+)", bygroups(Keyword, Whitespace), "structname"),
+            (r"(trait)(\s+)", bygroups(Keyword, Whitespace), "structname"),
+            (r"(from)(\s+)", bygroups(Keyword.Namespace, Whitespace), "fromimport"),
+            (r"(import)(\s+)", bygroups(Keyword.Namespace, Whitespace), "import"),
+            include("expr"),
+        ],
+        "expr": [
+            # raw f-strings
+            (
+                '(?i)(rf|fr)(""")',
+                bygroups(String.Affix, String.Double),
+                combined("rfstringescape", "tdqf"),
+            ),
+            (
+                "(?i)(rf|fr)(''')",
+                bygroups(String.Affix, String.Single),
+                combined("rfstringescape", "tsqf"),
+            ),
+            (
+                '(?i)(rf|fr)(")',
+                bygroups(String.Affix, String.Double),
+                combined("rfstringescape", "dqf"),
+            ),
+            (
+                "(?i)(rf|fr)(')",
+                bygroups(String.Affix, String.Single),
+                combined("rfstringescape", "sqf"),
+            ),
+            # non-raw f-strings
+            (
+                '([fF])(""")',
+                bygroups(String.Affix, String.Double),
+                combined("fstringescape", "tdqf"),
+            ),
+            (
+                "([fF])(''')",
+                bygroups(String.Affix, String.Single),
+                combined("fstringescape", "tsqf"),
+            ),
+            (
+                '([fF])(")',
+                bygroups(String.Affix, String.Double),
+                combined("fstringescape", "dqf"),
+            ),
+            (
+                "([fF])(')",
+                bygroups(String.Affix, String.Single),
+                combined("fstringescape", "sqf"),
+            ),
+            # raw bytes and strings
+            ('(?i)(rb|br|r)(""")', bygroups(String.Affix, String.Double), "tdqs"),
+            ("(?i)(rb|br|r)(''')", bygroups(String.Affix, String.Single), "tsqs"),
+            ('(?i)(rb|br|r)(")', bygroups(String.Affix, String.Double), "dqs"),
+            ("(?i)(rb|br|r)(')", bygroups(String.Affix, String.Single), "sqs"),
+            # non-raw strings
+            (
+                '([uU]?)(""")',
+                bygroups(String.Affix, String.Double),
+                combined("stringescape", "tdqs"),
+            ),
+            (
+                "([uU]?)(''')",
+                bygroups(String.Affix, String.Single),
+                combined("stringescape", "tsqs"),
+            ),
+            (
+                '([uU]?)(")',
+                bygroups(String.Affix, String.Double),
+                combined("stringescape", "dqs"),
+            ),
+            (
+                "([uU]?)(')",
+                bygroups(String.Affix, String.Single),
+                combined("stringescape", "sqs"),
+            ),
+            # non-raw bytes
+            (
+                '([bB])(""")',
+                bygroups(String.Affix, String.Double),
+                combined("bytesescape", "tdqs"),
+            ),
+            (
+                "([bB])(''')",
+                bygroups(String.Affix, String.Single),
+                combined("bytesescape", "tsqs"),
+            ),
+            (
+                '([bB])(")',
+                bygroups(String.Affix, String.Double),
+                combined("bytesescape", "dqs"),
+            ),
+            (
+                "([bB])(')",
+                bygroups(String.Affix, String.Single),
+                combined("bytesescape", "sqs"),
+            ),
+            (r"[^\S\n]+", Text),
+            include("numbers"),
+            (r"!=|==|<<|>>|:=|[-~+/*%=<>&^|.]", Operator),
+            (r"([]{}:\(\),;[])+", Punctuation),
+            (r"(in|is|and|or|not)\b", Operator.Word),
+            include("expr-keywords"),
+            include("builtins"),
+            include("magicfuncs"),
+            include("magicvars"),
+            include("name"),
+        ],
+        "expr-inside-fstring": [
+            (r"[{([]", Punctuation, "expr-inside-fstring-inner"),
+            # without format specifier
+            (
+                r"(=\s*)?"  # debug (https://bugs.python.org/issue36817)
+                r"(\![sraf])?"  # conversion
+                r"\}",
+                String.Interpol,
+                "#pop",
+            ),
+            # with format specifier
+            # we'll catch the remaining '}' in the outer scope
+            (
+                r"(=\s*)?"  # debug (https://bugs.python.org/issue36817)
+                r"(\![sraf])?"  # conversion
+                r":",
+                String.Interpol,
+                "#pop",
+            ),
+            (r"\s+", Whitespace),  # allow new lines
+            include("expr"),
+        ],
+        "expr-inside-fstring-inner": [
+            (r"[{([]", Punctuation, "expr-inside-fstring-inner"),
+            (r"[])}]", Punctuation, "#pop"),
+            (r"\s+", Whitespace),  # allow new lines
+            include("expr"),
+        ],
+        "expr-keywords": [
+            # Based on https://docs.python.org/3/reference/expressions.html
+            (
+                words(
+                    (
+                        "async for",  # TODO https://docs.modular.com/mojo/roadmap#no-async-for-or-async-with
+                        "async with",  # TODO https://docs.modular.com/mojo/roadmap#no-async-for-or-async-with
+                        "await",
+                        "else",
+                        "for",
+                        "if",
+                        "lambda",
+                        "yield",
+                        "yield from",
+                    ),
+                    suffix=r"\b",
+                ),
+                Keyword,
+            ),
+            (words(("True", "False", "None"), suffix=r"\b"), Keyword.Constant),
+        ],
+        "keywords": [
+            (
+                words(
+                    (
+                        "assert",
+                        "async",
+                        "await",
+                        "borrowed",
+                        "break",
+                        "continue",
+                        "del",
+                        "elif",
+                        "else",
+                        "except",
+                        "finally",
+                        "for",
+                        "global",
+                        "if",
+                        "lambda",
+                        "pass",
+                        "raise",
+                        "nonlocal",
+                        "return",
+                        "try",
+                        "while",
+                        "yield",
+                        "yield from",
+                        "as",
+                        "with",
+                    ),
+                    suffix=r"\b",
+                ),
+                Keyword,
+            ),
+            (words(("True", "False", "None"), suffix=r"\b"), Keyword.Constant),
+        ],
+        "soft-keywords": [
+            # `match`, `case` and `_` soft keywords
+            (
+                r"(^[ \t]*)"  # at beginning of line + possible indentation
+                r"(match|case)\b"  # a possible keyword
+                r"(?![ \t]*(?:"  # not followed by...
+                r"[:,;=^&|@~)\]}]|(?:" +  # characters and keywords that mean this isn't
+                # pattern matching (but None/True/False is ok)
+                r"|".join(k for k in keyword.kwlist if k[0].islower())
+                + r")\b))",
+                bygroups(Whitespace, Keyword),
+                "soft-keywords-inner",
+            ),
+        ],
+        "soft-keywords-inner": [
+            # optional `_` keyword
+            (r"(\s+)([^\n_]*)(_\b)", bygroups(Whitespace, using(this), Keyword)),
+            default("#pop"),
+        ],
+        "builtins": [
+            (
+                words(
+                    (
+                        "__import__",
+                        "abs",
+                        "aiter",
+                        "all",
+                        "any",
+                        "bin",
+                        "bool",
+                        "bytearray",
+                        "breakpoint",
+                        "bytes",
+                        "callable",
+                        "chr",
+                        "classmethod",
+                        "compile",
+                        "complex",
+                        "delattr",
+                        "dict",
+                        "dir",
+                        "divmod",
+                        "enumerate",
+                        "eval",
+                        "filter",
+                        "float",
+                        "format",
+                        "frozenset",
+                        "getattr",
+                        "globals",
+                        "hasattr",
+                        "hash",
+                        "hex",
+                        "id",
+                        "input",
+                        "int",
+                        "isinstance",
+                        "issubclass",
+                        "iter",
+                        "len",
+                        "list",
+                        "locals",
+                        "map",
+                        "max",
+                        "memoryview",
+                        "min",
+                        "next",
+                        "object",
+                        "oct",
+                        "open",
+                        "ord",
+                        "pow",
+                        "print",
+                        "property",
+                        "range",
+                        "repr",
+                        "reversed",
+                        "round",
+                        "set",
+                        "setattr",
+                        "slice",
+                        "sorted",
+                        "staticmethod",
+                        "str",
+                        "sum",
+                        "super",
+                        "tuple",
+                        "type",
+                        "vars",
+                        "zip",
+                        # Mojo builtin types: https://docs.modular.com/mojo/stdlib/builtin/
+                        "AnyType",
+                        "Coroutine",
+                        "DType",
+                        "Error",
+                        "Int",
+                        "List",
+                        "ListLiteral",
+                        "Scalar",
+                        "Int8",
+                        "UInt8",
+                        "Int16",
+                        "UInt16",
+                        "Int32",
+                        "UInt32",
+                        "Int64",
+                        "UInt64",
+                        "BFloat16",
+                        "Float16",
+                        "Float32",
+                        "Float64",
+                        "SIMD",
+                        "String",
+                        "Tensor",
+                        "Tuple",
+                        "Movable",
+                        "Copyable",
+                        "CollectionElement",
+                    ),
+                    prefix=r"(?>',
+    # Binary augmented
+    '+=', '-=', '*=', '/=', '%=', '**=', '&=', '|=', '^=', '<<=', '>>=',
+    # Comparison
+    '==', '!=', '<', '<=', '>', '>=', '<=>',
+    # Patterns and assignment
+    ':=', '?', '=~', '!~', '=>',
+    # Calls and sends
+    '.', '<-', '->',
+]
+_escape_pattern = (
+    r'(?:\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|'
+    r'\\["\'\\bftnr])')
+# _char = _escape_chars + [('.', String.Char)]
+_identifier = r'[_a-zA-Z]\w*'
+
+_constants = [
+    # Void constants
+    'null',
+    # Bool constants
+    'false', 'true',
+    # Double constants
+    'Infinity', 'NaN',
+    # Special objects
+    'M', 'Ref', 'throw', 'traceln',
+]
+
+_guards = [
+    'Any', 'Binding', 'Bool', 'Bytes', 'Char', 'DeepFrozen', 'Double',
+    'Empty', 'Int', 'List', 'Map', 'Near', 'NullOk', 'Same', 'Selfless',
+    'Set', 'Str', 'SubrangeGuard', 'Transparent', 'Void',
+]
+
+_safeScope = [
+    '_accumulateList', '_accumulateMap', '_auditedBy', '_bind',
+    '_booleanFlow', '_comparer', '_equalizer', '_iterForever', '_loop',
+    '_makeBytes', '_makeDouble', '_makeFinalSlot', '_makeInt', '_makeList',
+    '_makeMap', '_makeMessageDesc', '_makeOrderedSpace', '_makeParamDesc',
+    '_makeProtocolDesc', '_makeSourceSpan', '_makeString', '_makeVarSlot',
+    '_makeVerbFacet', '_mapExtract', '_matchSame', '_quasiMatcher',
+    '_slotToBinding', '_splitList', '_suchThat', '_switchFailed',
+    '_validateFor', 'b__quasiParser', 'eval', 'import', 'm__quasiParser',
+    'makeBrandPair', 'makeLazySlot', 'safeScope', 'simple__quasiParser',
+]
+
+
+class MonteLexer(RegexLexer):
+    """
+    Lexer for the Monte programming language.
+    """
+    name = 'Monte'
+    url = 'https://monte.readthedocs.io/'
+    aliases = ['monte']
+    filenames = ['*.mt']
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'#[^\n]*\n', Comment),
+
+            # Docstrings
+            # Apologies for the non-greedy matcher here.
+            (r'/\*\*.*?\*/', String.Doc),
+
+            # `var` declarations
+            (r'\bvar\b', Keyword.Declaration, 'var'),
+
+            # `interface` declarations
+            (r'\binterface\b', Keyword.Declaration, 'interface'),
+
+            # method declarations
+            (words(_methods, prefix='\\b', suffix='\\b'),
+             Keyword, 'method'),
+
+            # All other declarations
+            (words(_declarations, prefix='\\b', suffix='\\b'),
+             Keyword.Declaration),
+
+            # Keywords
+            (words(_keywords, prefix='\\b', suffix='\\b'), Keyword),
+
+            # Literals
+            ('[+-]?0x[_0-9a-fA-F]+', Number.Hex),
+            (r'[+-]?[_0-9]+\.[_0-9]*([eE][+-]?[_0-9]+)?', Number.Float),
+            ('[+-]?[_0-9]+', Number.Integer),
+            ("'", String.Double, 'char'),
+            ('"', String.Double, 'string'),
+
+            # Quasiliterals
+            ('`', String.Backtick, 'ql'),
+
+            # Operators
+            (words(_operators), Operator),
+
+            # Verb operators
+            (_identifier + '=', Operator.Word),
+
+            # Safe scope constants
+            (words(_constants, prefix='\\b', suffix='\\b'),
+             Keyword.Pseudo),
+
+            # Safe scope guards
+            (words(_guards, prefix='\\b', suffix='\\b'), Keyword.Type),
+
+            # All other safe scope names
+            (words(_safeScope, prefix='\\b', suffix='\\b'),
+             Name.Builtin),
+
+            # Identifiers
+            (_identifier, Name),
+
+            # Punctuation
+            (r'\(|\)|\{|\}|\[|\]|:|,', Punctuation),
+
+            # Whitespace
+            (' +', Whitespace),
+
+            # Definite lexer errors
+            ('=', Error),
+        ],
+        'char': [
+            # It is definitely an error to have a char of width == 0.
+            ("'", Error, 'root'),
+            (_escape_pattern, String.Escape, 'charEnd'),
+            ('.', String.Char, 'charEnd'),
+        ],
+        'charEnd': [
+            ("'", String.Char, '#pop:2'),
+            # It is definitely an error to have a char of width > 1.
+            ('.', Error),
+        ],
+        # The state of things coming into an interface.
+        'interface': [
+            (' +', Whitespace),
+            (_identifier, Name.Class, '#pop'),
+            include('root'),
+        ],
+        # The state of things coming into a method.
+        'method': [
+            (' +', Whitespace),
+            (_identifier, Name.Function, '#pop'),
+            include('root'),
+        ],
+        'string': [
+            ('"', String.Double, 'root'),
+            (_escape_pattern, String.Escape),
+            (r'\n', String.Double),
+            ('.', String.Double),
+        ],
+        'ql': [
+            ('`', String.Backtick, 'root'),
+            (r'\$' + _escape_pattern, String.Escape),
+            (r'\$\$', String.Escape),
+            (r'@@', String.Escape),
+            (r'\$\{', String.Interpol, 'qlNest'),
+            (r'@\{', String.Interpol, 'qlNest'),
+            (r'\$' + _identifier, Name),
+            ('@' + _identifier, Name),
+            ('.', String.Backtick),
+        ],
+        'qlNest': [
+            (r'\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+        # The state of things immediately following `var`.
+        'var': [
+            (' +', Whitespace),
+            (_identifier, Name.Variable, '#pop'),
+            include('root'),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/mosel.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/mosel.py
new file mode 100644
index 000000000..426c9a145
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/mosel.py
@@ -0,0 +1,447 @@
+"""
+    pygments.lexers.mosel
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the mosel language.
+    http://www.fico.com/en/products/fico-xpress-optimization
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['MoselLexer']
+
+FUNCTIONS = (
+    # core functions
+    '_',
+    'abs',
+    'arctan',
+    'asproc',
+    'assert',
+    'bitflip',
+    'bitneg',
+    'bitset',
+    'bitshift',
+    'bittest',
+    'bitval',
+    'ceil',
+    'cos',
+    'create',
+    'currentdate',
+    'currenttime',
+    'cutelt',
+    'cutfirst',
+    'cuthead',
+    'cutlast',
+    'cuttail',
+    'datablock',
+    'delcell',
+    'exists',
+    'exit',
+    'exp',
+    'exportprob',
+    'fclose',
+    'fflush',
+    'finalize',
+    'findfirst',
+    'findlast',
+    'floor',
+    'fopen',
+    'fselect',
+    'fskipline',
+    'fwrite',
+    'fwrite_',
+    'fwriteln',
+    'fwriteln_',
+    'getact',
+    'getcoeff',
+    'getcoeffs',
+    'getdual',
+    'getelt',
+    'getfid',
+    'getfirst',
+    'getfname',
+    'gethead',
+    'getlast',
+    'getobjval',
+    'getparam',
+    'getrcost',
+    'getreadcnt',
+    'getreverse',
+    'getsize',
+    'getslack',
+    'getsol',
+    'gettail',
+    'gettype',
+    'getvars',
+    'isdynamic',
+    'iseof',
+    'isfinite',
+    'ishidden',
+    'isinf',
+    'isnan',
+    'isodd',
+    'ln',
+    'localsetparam',
+    'log',
+    'makesos1',
+    'makesos2',
+    'maxlist',
+    'memoryuse',
+    'minlist',
+    'newmuid',
+    'publish',
+    'random',
+    'read',
+    'readln',
+    'reset',
+    'restoreparam',
+    'reverse',
+    'round',
+    'setcoeff',
+    'sethidden',
+    'setioerr',
+    'setmatherr',
+    'setname',
+    'setparam',
+    'setrandseed',
+    'setrange',
+    'settype',
+    'sin',
+    'splithead',
+    'splittail',
+    'sqrt',
+    'strfmt',
+    'substr',
+    'timestamp',
+    'unpublish',
+    'versionnum',
+    'versionstr',
+    'write',
+    'write_',
+    'writeln',
+    'writeln_',
+
+    # mosel exam mmxprs | sed -n -e "s/ [pf][a-z]* \([a-zA-Z0-9_]*\).*/'\1',/p" | sort -u
+    'addcut',
+    'addcuts',
+    'addmipsol',
+    'basisstability',
+    'calcsolinfo',
+    'clearmipdir',
+    'clearmodcut',
+    'command',
+    'copysoltoinit',
+    'crossoverlpsol',
+    'defdelayedrows',
+    'defsecurevecs',
+    'delcuts',
+    'dropcuts',
+    'estimatemarginals',
+    'fixglobal',
+    'flushmsgq',
+    'getbstat',
+    'getcnlist',
+    'getcplist',
+    'getdualray',
+    'getiis',
+    'getiissense',
+    'getiistype',
+    'getinfcause',
+    'getinfeas',
+    'getlb',
+    'getlct',
+    'getleft',
+    'getloadedlinctrs',
+    'getloadedmpvars',
+    'getname',
+    'getprimalray',
+    'getprobstat',
+    'getrange',
+    'getright',
+    'getsensrng',
+    'getsize',
+    'getsol',
+    'gettype',
+    'getub',
+    'getvars',
+    'gety',
+    'hasfeature',
+    'implies',
+    'indicator',
+    'initglobal',
+    'ishidden',
+    'isiisvalid',
+    'isintegral',
+    'loadbasis',
+    'loadcuts',
+    'loadlpsol',
+    'loadmipsol',
+    'loadprob',
+    'maximise',
+    'maximize',
+    'minimise',
+    'minimize',
+    'postsolve',
+    'readbasis',
+    'readdirs',
+    'readsol',
+    'refinemipsol',
+    'rejectintsol',
+    'repairinfeas',
+    'repairinfeas_deprec',
+    'resetbasis',
+    'resetiis',
+    'resetsol',
+    'savebasis',
+    'savemipsol',
+    'savesol',
+    'savestate',
+    'selectsol',
+    'setarchconsistency',
+    'setbstat',
+    'setcallback',
+    'setcbcutoff',
+    'setgndata',
+    'sethidden',
+    'setlb',
+    'setmipdir',
+    'setmodcut',
+    'setsol',
+    'setub',
+    'setucbdata',
+    'stopoptimise',
+    'stopoptimize',
+    'storecut',
+    'storecuts',
+    'unloadprob',
+    'uselastbarsol',
+    'writebasis',
+    'writedirs',
+    'writeprob',
+    'writesol',
+    'xor',
+    'xprs_addctr',
+    'xprs_addindic',
+
+    # mosel exam mmsystem | sed -n -e "s/ [pf][a-z]* \([a-zA-Z0-9_]*\).*/'\1',/p" | sort -u
+    'addmonths',
+    'copytext',
+    'cuttext',
+    'deltext',
+    'endswith',
+    'erase',
+    'expandpath',
+    'fcopy',
+    'fdelete',
+    'findfiles',
+    'findtext',
+    'fmove',
+    'formattext',
+    'getasnumber',
+    'getchar',
+    'getcwd',
+    'getdate',
+    'getday',
+    'getdaynum',
+    'getdays',
+    'getdirsep',
+    'getdsoparam',
+    'getendparse',
+    'getenv',
+    'getfsize',
+    'getfstat',
+    'getftime',
+    'gethour',
+    'getminute',
+    'getmonth',
+    'getmsec',
+    'getoserrmsg',
+    'getoserror',
+    'getpathsep',
+    'getqtype',
+    'getsecond',
+    'getsepchar',
+    'getsize',
+    'getstart',
+    'getsucc',
+    'getsysinfo',
+    'getsysstat',
+    'gettime',
+    'gettmpdir',
+    'gettrim',
+    'getweekday',
+    'getyear',
+    'inserttext',
+    'isvalid',
+    'jointext',
+    'makedir',
+    'makepath',
+    'newtar',
+    'newzip',
+    'nextfield',
+    'openpipe',
+    'parseextn',
+    'parseint',
+    'parsereal',
+    'parsetext',
+    'pastetext',
+    'pathmatch',
+    'pathsplit',
+    'qsort',
+    'quote',
+    'readtextline',
+    'regmatch',
+    'regreplace',
+    'removedir',
+    'removefiles',
+    'setchar',
+    'setdate',
+    'setday',
+    'setdsoparam',
+    'setendparse',
+    'setenv',
+    'sethour',
+    'setminute',
+    'setmonth',
+    'setmsec',
+    'setoserror',
+    'setqtype',
+    'setsecond',
+    'setsepchar',
+    'setstart',
+    'setsucc',
+    'settime',
+    'settrim',
+    'setyear',
+    'sleep',
+    'splittext',
+    'startswith',
+    'system',
+    'tarlist',
+    'textfmt',
+    'tolower',
+    'toupper',
+    'trim',
+    'untar',
+    'unzip',
+    'ziplist',
+
+    # mosel exam mmjobs | sed -n -e "s/ [pf][a-z]* \([a-zA-Z0-9_]*\).*/'\1',/p" | sort -u
+    'canceltimer',
+    'clearaliases',
+    'compile',
+    'connect',
+    'detach',
+    'disconnect',
+    'dropnextevent',
+    'findxsrvs',
+    'getaliases',
+    'getannidents',
+    'getannotations',
+    'getbanner',
+    'getclass',
+    'getdsoprop',
+    'getdsopropnum',
+    'getexitcode',
+    'getfromgid',
+    'getfromid',
+    'getfromuid',
+    'getgid',
+    'gethostalias',
+    'getid',
+    'getmodprop',
+    'getmodpropnum',
+    'getnextevent',
+    'getnode',
+    'getrmtid',
+    'getstatus',
+    'getsysinfo',
+    'gettimer',
+    'getuid',
+    'getvalue',
+    'isqueueempty',
+    'load',
+    'nullevent',
+    'peeknextevent',
+    'resetmodpar',
+    'run',
+    'send',
+    'setcontrol',
+    'setdefstream',
+    'setgid',
+    'sethostalias',
+    'setmodpar',
+    'settimer',
+    'setuid',
+    'setworkdir',
+    'stop',
+    'unload',
+    'wait',
+    'waitexpired',
+    'waitfor',
+    'waitforend',
+)
+
+
+class MoselLexer(RegexLexer):
+    """
+    For the Mosel optimization language.
+    """
+    name = 'Mosel'
+    aliases = ['mosel']
+    filenames = ['*.mos']
+    url = 'https://www.fico.com/fico-xpress-optimization/docs/latest/mosel/mosel_lang/dhtml/moselreflang.html'
+    version_added = '2.6'
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'\s+', Text.Whitespace),
+            (r'!.*?\n', Comment.Single),
+            (r'\(!(.|\n)*?!\)', Comment.Multiline),
+            (words((
+                'and', 'as', 'break', 'case', 'count', 'declarations', 'do',
+                'dynamic', 'elif', 'else', 'end-', 'end', 'evaluation', 'false',
+                'forall', 'forward', 'from', 'function', 'hashmap', 'if',
+                'imports', 'include', 'initialisations', 'initializations', 'inter',
+                'max', 'min', 'model', 'namespace', 'next', 'not', 'nsgroup',
+                'nssearch', 'of', 'options', 'or', 'package', 'parameters',
+                'procedure', 'public', 'prod', 'record', 'repeat', 'requirements',
+                'return', 'sum', 'then', 'to', 'true', 'union', 'until', 'uses',
+                'version', 'while', 'with'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Builtin),
+            (words((
+                'range', 'array', 'set', 'list', 'mpvar', 'mpproblem', 'linctr',
+                'nlctr', 'integer', 'string', 'real', 'boolean', 'text', 'time',
+                'date', 'datetime', 'returned', 'Model', 'Mosel', 'counter',
+                'xmldoc', 'is_sos1', 'is_sos2', 'is_integer', 'is_binary',
+                'is_continuous', 'is_free', 'is_semcont', 'is_semint',
+                'is_partint'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Type),
+            (r'(\+|\-|\*|/|=|<=|>=|\||\^|<|>|<>|\.\.|\.|:=|::|:|in|mod|div)',
+             Operator),
+            (r'[()\[\]{},;]+', Punctuation),
+            (words(FUNCTIONS,  prefix=r'\b', suffix=r'\b'), Name.Function),
+            (r'(\d+\.(?!\.)\d*|\.(?!.)\d+)([eE][+-]?\d+)?', Number.Float),
+            (r'\d+([eE][+-]?\d+)?', Number.Integer),
+            (r'[+-]?Infinity', Number.Integer),
+            (r'0[xX][0-9a-fA-F]+', Number),
+            (r'"', String.Double, 'double_quote'),
+            (r'\'', String.Single, 'single_quote'),
+            (r'(\w+|(\.(?!\.)))', Text),
+        ],
+        'single_quote': [
+            (r'\'', String.Single, '#pop'),
+            (r'[^\']+', String.Single),
+        ],
+        'double_quote': [
+            (r'(\\"|\\[0-7]{1,3}\D|\\[abfnrtv]|\\\\)', String.Escape),
+            (r'\"', String.Double, '#pop'),
+            (r'[^"\\]+', String.Double),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ncl.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ncl.py
new file mode 100644
index 000000000..d2f476087
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ncl.py
@@ -0,0 +1,894 @@
+"""
+    pygments.lexers.ncl
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for NCAR Command Language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['NCLLexer']
+
+
+class NCLLexer(RegexLexer):
+    """
+    Lexer for NCL code.
+    """
+    name = 'NCL'
+    aliases = ['ncl']
+    filenames = ['*.ncl']
+    mimetypes = ['text/ncl']
+    url = 'https://www.ncl.ucar.edu'
+    version_added = '2.2'
+
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r';.*\n', Comment),
+            include('strings'),
+            include('core'),
+            (r'[a-zA-Z_]\w*', Name),
+            include('nums'),
+            (r'[\s]+', Text),
+        ],
+        'core': [
+            # Statements
+            (words((
+                'begin', 'break', 'continue', 'create', 'defaultapp', 'do',
+                'else', 'end', 'external', 'exit', 'True', 'False', 'file', 'function',
+                'getvalues', 'graphic', 'group', 'if', 'list', 'load', 'local',
+                'new', '_Missing', 'Missing', 'noparent', 'procedure',
+                'quit', 'QUIT', 'Quit', 'record', 'return', 'setvalues', 'stop',
+                'then', 'while'), prefix=r'\b', suffix=r'\s*\b'),
+             Keyword),
+
+            # Data Types
+            (words((
+                'ubyte', 'uint', 'uint64', 'ulong', 'string', 'byte',
+                'character', 'double', 'float', 'integer', 'int64', 'logical',
+                'long', 'short', 'ushort', 'enumeric', 'numeric', 'snumeric'),
+                prefix=r'\b', suffix=r'\s*\b'),
+             Keyword.Type),
+
+            # Operators
+            (r'[\%^*+\-/<>]', Operator),
+
+            # punctuation:
+            (r'[\[\]():@$!&|.,\\{}]', Punctuation),
+            (r'[=:]', Punctuation),
+
+            # Intrinsics
+            (words((
+                'abs', 'acos', 'addfile', 'addfiles', 'all', 'angmom_atm', 'any',
+                'area_conserve_remap', 'area_hi2lores', 'area_poly_sphere',
+                'asciiread', 'asciiwrite', 'asin', 'atan', 'atan2', 'attsetvalues',
+                'avg', 'betainc', 'bin_avg', 'bin_sum', 'bw_bandpass_filter',
+                'cancor', 'cbinread', 'cbinwrite', 'cd_calendar', 'cd_inv_calendar',
+                'cdfbin_p', 'cdfbin_pr', 'cdfbin_s', 'cdfbin_xn', 'cdfchi_p',
+                'cdfchi_x', 'cdfgam_p', 'cdfgam_x', 'cdfnor_p', 'cdfnor_x',
+                'cdft_p', 'cdft_t', 'ceil', 'center_finite_diff',
+                'center_finite_diff_n', 'cfftb', 'cfftf', 'cfftf_frq_reorder',
+                'charactertodouble', 'charactertofloat', 'charactertointeger',
+                'charactertolong', 'charactertoshort', 'charactertostring',
+                'chartodouble', 'chartofloat', 'chartoint', 'chartointeger',
+                'chartolong', 'chartoshort', 'chartostring', 'chiinv', 'clear',
+                'color_index_to_rgba', 'conform', 'conform_dims', 'cos', 'cosh',
+                'count_unique_values', 'covcorm', 'covcorm_xy', 'craybinnumrec',
+                'craybinrecread', 'create_graphic', 'csa1', 'csa1d', 'csa1s',
+                'csa1x', 'csa1xd', 'csa1xs', 'csa2', 'csa2d', 'csa2l', 'csa2ld',
+                'csa2ls', 'csa2lx', 'csa2lxd', 'csa2lxs', 'csa2s', 'csa2x',
+                'csa2xd', 'csa2xs', 'csa3', 'csa3d', 'csa3l', 'csa3ld', 'csa3ls',
+                'csa3lx', 'csa3lxd', 'csa3lxs', 'csa3s', 'csa3x', 'csa3xd',
+                'csa3xs', 'csc2s', 'csgetp', 'css2c', 'cssetp', 'cssgrid', 'csstri',
+                'csvoro', 'cumsum', 'cz2ccm', 'datatondc', 'day_of_week',
+                'day_of_year', 'days_in_month', 'default_fillvalue', 'delete',
+                'depth_to_pres', 'destroy', 'determinant', 'dewtemp_trh',
+                'dgeevx_lapack', 'dim_acumrun_n', 'dim_avg', 'dim_avg_n',
+                'dim_avg_wgt', 'dim_avg_wgt_n', 'dim_cumsum', 'dim_cumsum_n',
+                'dim_gamfit_n', 'dim_gbits', 'dim_max', 'dim_max_n', 'dim_median',
+                'dim_median_n', 'dim_min', 'dim_min_n', 'dim_num', 'dim_num_n',
+                'dim_numrun_n', 'dim_pqsort', 'dim_pqsort_n', 'dim_product',
+                'dim_product_n', 'dim_rmsd', 'dim_rmsd_n', 'dim_rmvmean',
+                'dim_rmvmean_n', 'dim_rmvmed', 'dim_rmvmed_n', 'dim_spi_n',
+                'dim_standardize', 'dim_standardize_n', 'dim_stat4', 'dim_stat4_n',
+                'dim_stddev', 'dim_stddev_n', 'dim_sum', 'dim_sum_n', 'dim_sum_wgt',
+                'dim_sum_wgt_n', 'dim_variance', 'dim_variance_n', 'dimsizes',
+                'doubletobyte', 'doubletochar', 'doubletocharacter',
+                'doubletofloat', 'doubletoint', 'doubletointeger', 'doubletolong',
+                'doubletoshort', 'dpres_hybrid_ccm', 'dpres_plevel', 'draw',
+                'draw_color_palette', 'dsgetp', 'dsgrid2', 'dsgrid2d', 'dsgrid2s',
+                'dsgrid3', 'dsgrid3d', 'dsgrid3s', 'dspnt2', 'dspnt2d', 'dspnt2s',
+                'dspnt3', 'dspnt3d', 'dspnt3s', 'dssetp', 'dtrend', 'dtrend_msg',
+                'dtrend_msg_n', 'dtrend_n', 'dtrend_quadratic',
+                'dtrend_quadratic_msg_n', 'dv2uvf', 'dv2uvg', 'dz_height',
+                'echo_off', 'echo_on', 'eof2data', 'eof_varimax', 'eofcor',
+                'eofcor_pcmsg', 'eofcor_ts', 'eofcov', 'eofcov_pcmsg', 'eofcov_ts',
+                'eofunc', 'eofunc_ts', 'eofunc_varimax', 'equiv_sample_size', 'erf',
+                'erfc', 'esacr', 'esacv', 'esccr', 'esccv', 'escorc', 'escorc_n',
+                'escovc', 'exit', 'exp', 'exp_tapersh', 'exp_tapersh_wgts',
+                'exp_tapershC', 'ezfftb', 'ezfftb_n', 'ezfftf', 'ezfftf_n',
+                'f2fosh', 'f2foshv', 'f2fsh', 'f2fshv', 'f2gsh', 'f2gshv', 'fabs',
+                'fbindirread', 'fbindirwrite', 'fbinnumrec', 'fbinread',
+                'fbinrecread', 'fbinrecwrite', 'fbinwrite', 'fft2db', 'fft2df',
+                'fftshift', 'fileattdef', 'filechunkdimdef', 'filedimdef',
+                'fileexists', 'filegrpdef', 'filevarattdef', 'filevarchunkdef',
+                'filevarcompressleveldef', 'filevardef', 'filevardimsizes',
+                'filwgts_lancos', 'filwgts_lanczos', 'filwgts_normal',
+                'floattobyte', 'floattochar', 'floattocharacter', 'floattoint',
+                'floattointeger', 'floattolong', 'floattoshort', 'floor',
+                'fluxEddy', 'fo2fsh', 'fo2fshv', 'fourier_info', 'frame', 'fspan',
+                'ftcurv', 'ftcurvd', 'ftcurvi', 'ftcurvp', 'ftcurvpi', 'ftcurvps',
+                'ftcurvs', 'ftest', 'ftgetp', 'ftkurv', 'ftkurvd', 'ftkurvp',
+                'ftkurvpd', 'ftsetp', 'ftsurf', 'g2fsh', 'g2fshv', 'g2gsh',
+                'g2gshv', 'gamma', 'gammainc', 'gaus', 'gaus_lobat',
+                'gaus_lobat_wgt', 'gc_aangle', 'gc_clkwise', 'gc_dangle',
+                'gc_inout', 'gc_latlon', 'gc_onarc', 'gc_pnt2gc', 'gc_qarea',
+                'gc_tarea', 'generate_2d_array', 'get_color_index',
+                'get_color_rgba', 'get_cpu_time', 'get_isolines', 'get_ncl_version',
+                'get_script_name', 'get_script_prefix_name', 'get_sphere_radius',
+                'get_unique_values', 'getbitsone', 'getenv', 'getfiledimsizes',
+                'getfilegrpnames', 'getfilepath', 'getfilevaratts',
+                'getfilevarchunkdimsizes', 'getfilevardims', 'getfilevardimsizes',
+                'getfilevarnames', 'getfilevartypes', 'getvaratts', 'getvardims',
+                'gradsf', 'gradsg', 'greg2jul', 'grid2triple', 'hlsrgb', 'hsvrgb',
+                'hydro', 'hyi2hyo', 'idsfft', 'igradsf', 'igradsg', 'ilapsf',
+                'ilapsg', 'ilapvf', 'ilapvg', 'ind', 'ind_resolve', 'int2p',
+                'int2p_n', 'integertobyte', 'integertochar', 'integertocharacter',
+                'integertoshort', 'inttobyte', 'inttochar', 'inttoshort',
+                'inverse_matrix', 'isatt', 'isbigendian', 'isbyte', 'ischar',
+                'iscoord', 'isdefined', 'isdim', 'isdimnamed', 'isdouble',
+                'isenumeric', 'isfile', 'isfilepresent', 'isfilevar',
+                'isfilevaratt', 'isfilevarcoord', 'isfilevardim', 'isfloat',
+                'isfunc', 'isgraphic', 'isint', 'isint64', 'isinteger',
+                'isleapyear', 'islogical', 'islong', 'ismissing', 'isnan_ieee',
+                'isnumeric', 'ispan', 'isproc', 'isshort', 'issnumeric', 'isstring',
+                'isubyte', 'isuint', 'isuint64', 'isulong', 'isunlimited',
+                'isunsigned', 'isushort', 'isvar', 'jul2greg', 'kmeans_as136',
+                'kolsm2_n', 'kron_product', 'lapsf', 'lapsg', 'lapvf', 'lapvg',
+                'latlon2utm', 'lclvl', 'lderuvf', 'lderuvg', 'linint1', 'linint1_n',
+                'linint2', 'linint2_points', 'linmsg', 'linmsg_n', 'linrood_latwgt',
+                'linrood_wgt', 'list_files', 'list_filevars', 'list_hlus',
+                'list_procfuncs', 'list_vars', 'ListAppend', 'ListCount',
+                'ListGetType', 'ListIndex', 'ListIndexFromName', 'ListPop',
+                'ListPush', 'ListSetType', 'loadscript', 'local_max', 'local_min',
+                'log', 'log10', 'longtobyte', 'longtochar', 'longtocharacter',
+                'longtoint', 'longtointeger', 'longtoshort', 'lspoly', 'lspoly_n',
+                'mask', 'max', 'maxind', 'min', 'minind', 'mixed_layer_depth',
+                'mixhum_ptd', 'mixhum_ptrh', 'mjo_cross_coh2pha',
+                'mjo_cross_segment', 'moc_globe_atl', 'monthday', 'natgrid',
+                'natgridd', 'natgrids', 'ncargpath', 'ncargversion', 'ndctodata',
+                'ndtooned', 'new', 'NewList', 'ngezlogo', 'nggcog', 'nggetp',
+                'nglogo', 'ngsetp', 'NhlAddAnnotation', 'NhlAddData',
+                'NhlAddOverlay', 'NhlAddPrimitive', 'NhlAppGetDefaultParentId',
+                'NhlChangeWorkstation', 'NhlClassName', 'NhlClearWorkstation',
+                'NhlDataPolygon', 'NhlDataPolyline', 'NhlDataPolymarker',
+                'NhlDataToNDC', 'NhlDestroy', 'NhlDraw', 'NhlFrame', 'NhlFreeColor',
+                'NhlGetBB', 'NhlGetClassResources', 'NhlGetErrorObjectId',
+                'NhlGetNamedColorIndex', 'NhlGetParentId',
+                'NhlGetParentWorkstation', 'NhlGetWorkspaceObjectId',
+                'NhlIsAllocatedColor', 'NhlIsApp', 'NhlIsDataComm', 'NhlIsDataItem',
+                'NhlIsDataSpec', 'NhlIsTransform', 'NhlIsView', 'NhlIsWorkstation',
+                'NhlName', 'NhlNDCPolygon', 'NhlNDCPolyline', 'NhlNDCPolymarker',
+                'NhlNDCToData', 'NhlNewColor', 'NhlNewDashPattern', 'NhlNewMarker',
+                'NhlPalGetDefined', 'NhlRemoveAnnotation', 'NhlRemoveData',
+                'NhlRemoveOverlay', 'NhlRemovePrimitive', 'NhlSetColor',
+                'NhlSetDashPattern', 'NhlSetMarker', 'NhlUpdateData',
+                'NhlUpdateWorkstation', 'nice_mnmxintvl', 'nngetaspectd',
+                'nngetaspects', 'nngetp', 'nngetsloped', 'nngetslopes', 'nngetwts',
+                'nngetwtsd', 'nnpnt', 'nnpntd', 'nnpntend', 'nnpntendd',
+                'nnpntinit', 'nnpntinitd', 'nnpntinits', 'nnpnts', 'nnsetp', 'num',
+                'obj_anal_ic', 'omega_ccm', 'onedtond', 'overlay', 'paleo_outline',
+                'pdfxy_bin', 'poisson_grid_fill', 'pop_remap', 'potmp_insitu_ocn',
+                'prcwater_dp', 'pres2hybrid', 'pres_hybrid_ccm', 'pres_sigma',
+                'print', 'print_table', 'printFileVarSummary', 'printVarSummary',
+                'product', 'pslec', 'pslhor', 'pslhyp', 'qsort', 'rand',
+                'random_chi', 'random_gamma', 'random_normal', 'random_setallseed',
+                'random_uniform', 'rcm2points', 'rcm2rgrid', 'rdsstoi',
+                'read_colormap_file', 'reg_multlin', 'regcoef', 'regCoef_n',
+                'regline', 'relhum', 'replace_ieeenan', 'reshape', 'reshape_ind',
+                'rgba_to_color_index', 'rgbhls', 'rgbhsv', 'rgbyiq', 'rgrid2rcm',
+                'rhomb_trunc', 'rip_cape_2d', 'rip_cape_3d', 'round', 'rtest',
+                'runave', 'runave_n', 'set_default_fillvalue', 'set_sphere_radius',
+                'setfileoption', 'sfvp2uvf', 'sfvp2uvg', 'shaec', 'shagc',
+                'shgetnp', 'shgetp', 'shgrid', 'shorttobyte', 'shorttochar',
+                'shorttocharacter', 'show_ascii', 'shsec', 'shsetp', 'shsgc',
+                'shsgc_R42', 'sigma2hybrid', 'simpeq', 'simpne', 'sin',
+                'sindex_yrmo', 'sinh', 'sizeof', 'sleep', 'smth9', 'snindex_yrmo',
+                'solve_linsys', 'span_color_indexes', 'span_color_rgba',
+                'sparse_matrix_mult', 'spcorr', 'spcorr_n', 'specx_anal',
+                'specxy_anal', 'spei', 'sprintf', 'sprinti', 'sqrt', 'sqsort',
+                'srand', 'stat2', 'stat4', 'stat_medrng', 'stat_trim',
+                'status_exit', 'stdatmus_p2tdz', 'stdatmus_z2tdp', 'stddev',
+                'str_capital', 'str_concat', 'str_fields_count', 'str_get_cols',
+                'str_get_dq', 'str_get_field', 'str_get_nl', 'str_get_sq',
+                'str_get_tab', 'str_index_of_substr', 'str_insert', 'str_is_blank',
+                'str_join', 'str_left_strip', 'str_lower', 'str_match',
+                'str_match_ic', 'str_match_ic_regex', 'str_match_ind',
+                'str_match_ind_ic', 'str_match_ind_ic_regex', 'str_match_ind_regex',
+                'str_match_regex', 'str_right_strip', 'str_split',
+                'str_split_by_length', 'str_split_csv', 'str_squeeze', 'str_strip',
+                'str_sub_str', 'str_switch', 'str_upper', 'stringtochar',
+                'stringtocharacter', 'stringtodouble', 'stringtofloat',
+                'stringtoint', 'stringtointeger', 'stringtolong', 'stringtoshort',
+                'strlen', 'student_t', 'sum', 'svd_lapack', 'svdcov', 'svdcov_sv',
+                'svdstd', 'svdstd_sv', 'system', 'systemfunc', 'tan', 'tanh',
+                'taper', 'taper_n', 'tdclrs', 'tdctri', 'tdcudp', 'tdcurv',
+                'tddtri', 'tdez2d', 'tdez3d', 'tdgetp', 'tdgrds', 'tdgrid',
+                'tdgtrs', 'tdinit', 'tditri', 'tdlbla', 'tdlblp', 'tdlbls',
+                'tdline', 'tdlndp', 'tdlnpa', 'tdlpdp', 'tdmtri', 'tdotri',
+                'tdpara', 'tdplch', 'tdprpa', 'tdprpi', 'tdprpt', 'tdsetp',
+                'tdsort', 'tdstri', 'tdstrs', 'tdttri', 'thornthwaite', 'tobyte',
+                'tochar', 'todouble', 'tofloat', 'toint', 'toint64', 'tointeger',
+                'tolong', 'toshort', 'tosigned', 'tostring', 'tostring_with_format',
+                'totype', 'toubyte', 'touint', 'touint64', 'toulong', 'tounsigned',
+                'toushort', 'trend_manken', 'tri_trunc', 'triple2grid',
+                'triple2grid2d', 'trop_wmo', 'ttest', 'typeof', 'undef',
+                'unique_string', 'update', 'ushorttoint', 'ut_calendar',
+                'ut_inv_calendar', 'utm2latlon', 'uv2dv_cfd', 'uv2dvf', 'uv2dvg',
+                'uv2sfvpf', 'uv2sfvpg', 'uv2vr_cfd', 'uv2vrdvf', 'uv2vrdvg',
+                'uv2vrf', 'uv2vrg', 'v5d_close', 'v5d_create', 'v5d_setLowLev',
+                'v5d_setUnits', 'v5d_write', 'v5d_write_var', 'variance', 'vhaec',
+                'vhagc', 'vhsec', 'vhsgc', 'vibeta', 'vinth2p', 'vinth2p_ecmwf',
+                'vinth2p_ecmwf_nodes', 'vinth2p_nodes', 'vintp2p_ecmwf', 'vr2uvf',
+                'vr2uvg', 'vrdv2uvf', 'vrdv2uvg', 'wavelet', 'wavelet_default',
+                'weibull', 'wgt_area_smooth', 'wgt_areaave', 'wgt_areaave2',
+                'wgt_arearmse', 'wgt_arearmse2', 'wgt_areasum2', 'wgt_runave',
+                'wgt_runave_n', 'wgt_vert_avg_beta', 'wgt_volave', 'wgt_volave_ccm',
+                'wgt_volrmse', 'wgt_volrmse_ccm', 'where', 'wk_smooth121', 'wmbarb',
+                'wmbarbmap', 'wmdrft', 'wmgetp', 'wmlabs', 'wmsetp', 'wmstnm',
+                'wmvect', 'wmvectmap', 'wmvlbl', 'wrf_avo', 'wrf_cape_2d',
+                'wrf_cape_3d', 'wrf_dbz', 'wrf_eth', 'wrf_helicity', 'wrf_ij_to_ll',
+                'wrf_interp_1d', 'wrf_interp_2d_xy', 'wrf_interp_3d_z',
+                'wrf_latlon_to_ij', 'wrf_ll_to_ij', 'wrf_omega', 'wrf_pvo',
+                'wrf_rh', 'wrf_slp', 'wrf_smooth_2d', 'wrf_td', 'wrf_tk',
+                'wrf_updraft_helicity', 'wrf_uvmet', 'wrf_virtual_temp',
+                'wrf_wetbulb', 'wrf_wps_close_int', 'wrf_wps_open_int',
+                'wrf_wps_rddata_int', 'wrf_wps_rdhead_int', 'wrf_wps_read_int',
+                'wrf_wps_write_int', 'write_matrix', 'write_table', 'yiqrgb',
+                'z2geouv', 'zonal_mpsi', 'addfiles_GetVar', 'advect_variable',
+                'area_conserve_remap_Wrap', 'area_hi2lores_Wrap',
+                'array_append_record', 'assignFillValue', 'byte2flt',
+                'byte2flt_hdf', 'calcDayAnomTLL', 'calcMonAnomLLLT',
+                'calcMonAnomLLT', 'calcMonAnomTLL', 'calcMonAnomTLLL',
+                'calculate_monthly_values', 'cd_convert', 'changeCase',
+                'changeCaseChar', 'clmDayTLL', 'clmDayTLLL', 'clmMon2clmDay',
+                'clmMonLLLT', 'clmMonLLT', 'clmMonTLL', 'clmMonTLLL', 'closest_val',
+                'copy_VarAtts', 'copy_VarCoords', 'copy_VarCoords_1',
+                'copy_VarCoords_2', 'copy_VarMeta', 'copyatt', 'crossp3',
+                'cshstringtolist', 'cssgrid_Wrap', 'dble2flt', 'decimalPlaces',
+                'delete_VarAtts', 'dim_avg_n_Wrap', 'dim_avg_wgt_n_Wrap',
+                'dim_avg_wgt_Wrap', 'dim_avg_Wrap', 'dim_cumsum_n_Wrap',
+                'dim_cumsum_Wrap', 'dim_max_n_Wrap', 'dim_min_n_Wrap',
+                'dim_rmsd_n_Wrap', 'dim_rmsd_Wrap', 'dim_rmvmean_n_Wrap',
+                'dim_rmvmean_Wrap', 'dim_rmvmed_n_Wrap', 'dim_rmvmed_Wrap',
+                'dim_standardize_n_Wrap', 'dim_standardize_Wrap',
+                'dim_stddev_n_Wrap', 'dim_stddev_Wrap', 'dim_sum_n_Wrap',
+                'dim_sum_wgt_n_Wrap', 'dim_sum_wgt_Wrap', 'dim_sum_Wrap',
+                'dim_variance_n_Wrap', 'dim_variance_Wrap', 'dpres_plevel_Wrap',
+                'dtrend_leftdim', 'dv2uvF_Wrap', 'dv2uvG_Wrap', 'eof_north',
+                'eofcor_Wrap', 'eofcov_Wrap', 'eofunc_north', 'eofunc_ts_Wrap',
+                'eofunc_varimax_reorder', 'eofunc_varimax_Wrap', 'eofunc_Wrap',
+                'epsZero', 'f2fosh_Wrap', 'f2foshv_Wrap', 'f2fsh_Wrap',
+                'f2fshv_Wrap', 'f2gsh_Wrap', 'f2gshv_Wrap', 'fbindirSwap',
+                'fbinseqSwap1', 'fbinseqSwap2', 'flt2dble', 'flt2string',
+                'fo2fsh_Wrap', 'fo2fshv_Wrap', 'g2fsh_Wrap', 'g2fshv_Wrap',
+                'g2gsh_Wrap', 'g2gshv_Wrap', 'generate_resample_indices',
+                'generate_sample_indices', 'generate_unique_indices',
+                'genNormalDist', 'get1Dindex', 'get1Dindex_Collapse',
+                'get1Dindex_Exclude', 'get_file_suffix', 'GetFillColor',
+                'GetFillColorIndex', 'getFillValue', 'getind_latlon2d',
+                'getVarDimNames', 'getVarFillValue', 'grib_stime2itime',
+                'hyi2hyo_Wrap', 'ilapsF_Wrap', 'ilapsG_Wrap', 'ind_nearest_coord',
+                'indStrSubset', 'int2dble', 'int2flt', 'int2p_n_Wrap', 'int2p_Wrap',
+                'isMonotonic', 'isStrSubset', 'latGau', 'latGauWgt', 'latGlobeF',
+                'latGlobeFo', 'latRegWgt', 'linint1_n_Wrap', 'linint1_Wrap',
+                'linint2_points_Wrap', 'linint2_Wrap', 'local_max_1d',
+                'local_min_1d', 'lonFlip', 'lonGlobeF', 'lonGlobeFo', 'lonPivot',
+                'merge_levels_sfc', 'mod', 'month_to_annual',
+                'month_to_annual_weighted', 'month_to_season', 'month_to_season12',
+                'month_to_seasonN', 'monthly_total_to_daily_mean', 'nameDim',
+                'natgrid_Wrap', 'NewCosWeight', 'niceLatLon2D', 'NormCosWgtGlobe',
+                'numAsciiCol', 'numAsciiRow', 'numeric2int',
+                'obj_anal_ic_deprecated', 'obj_anal_ic_Wrap', 'omega_ccm_driver',
+                'omega_to_w', 'oneDtostring', 'pack_values', 'pattern_cor', 'pdfx',
+                'pdfxy', 'pdfxy_conform', 'pot_temp', 'pot_vort_hybrid',
+                'pot_vort_isobaric', 'pres2hybrid_Wrap', 'print_clock',
+                'printMinMax', 'quadroots', 'rcm2points_Wrap', 'rcm2rgrid_Wrap',
+                'readAsciiHead', 'readAsciiTable', 'reg_multlin_stats',
+                'region_ind', 'regline_stats', 'relhum_ttd', 'replaceSingleChar',
+                'RGBtoCmap', 'rgrid2rcm_Wrap', 'rho_mwjf', 'rm_single_dims',
+                'rmAnnCycle1D', 'rmInsufData', 'rmMonAnnCycLLLT', 'rmMonAnnCycLLT',
+                'rmMonAnnCycTLL', 'runave_n_Wrap', 'runave_Wrap', 'short2flt',
+                'short2flt_hdf', 'shsgc_R42_Wrap', 'sign_f90', 'sign_matlab',
+                'smth9_Wrap', 'smthClmDayTLL', 'smthClmDayTLLL', 'SqrtCosWeight',
+                'stat_dispersion', 'static_stability', 'stdMonLLLT', 'stdMonLLT',
+                'stdMonTLL', 'stdMonTLLL', 'symMinMaxPlt', 'table_attach_columns',
+                'table_attach_rows', 'time_to_newtime', 'transpose',
+                'triple2grid_Wrap', 'ut_convert', 'uv2dvF_Wrap', 'uv2dvG_Wrap',
+                'uv2vrF_Wrap', 'uv2vrG_Wrap', 'vr2uvF_Wrap', 'vr2uvG_Wrap',
+                'w_to_omega', 'wallClockElapseTime', 'wave_number_spc',
+                'wgt_areaave_Wrap', 'wgt_runave_leftdim', 'wgt_runave_n_Wrap',
+                'wgt_runave_Wrap', 'wgt_vertical_n', 'wind_component',
+                'wind_direction', 'yyyyddd_to_yyyymmdd', 'yyyymm_time',
+                'yyyymm_to_yyyyfrac', 'yyyymmdd_time', 'yyyymmdd_to_yyyyddd',
+                'yyyymmdd_to_yyyyfrac', 'yyyymmddhh_time', 'yyyymmddhh_to_yyyyfrac',
+                'zonal_mpsi_Wrap', 'zonalAve', 'calendar_decode2', 'cd_string',
+                'kf_filter', 'run_cor', 'time_axis_labels', 'ut_string',
+                'wrf_contour', 'wrf_map', 'wrf_map_overlay', 'wrf_map_overlays',
+                'wrf_map_resources', 'wrf_map_zoom', 'wrf_overlay', 'wrf_overlays',
+                'wrf_user_getvar', 'wrf_user_ij_to_ll', 'wrf_user_intrp2d',
+                'wrf_user_intrp3d', 'wrf_user_latlon_to_ij', 'wrf_user_list_times',
+                'wrf_user_ll_to_ij', 'wrf_user_unstagger', 'wrf_user_vert_interp',
+                'wrf_vector', 'gsn_add_annotation', 'gsn_add_polygon',
+                'gsn_add_polyline', 'gsn_add_polymarker',
+                'gsn_add_shapefile_polygons', 'gsn_add_shapefile_polylines',
+                'gsn_add_shapefile_polymarkers', 'gsn_add_text', 'gsn_attach_plots',
+                'gsn_blank_plot', 'gsn_contour', 'gsn_contour_map',
+                'gsn_contour_shade', 'gsn_coordinates', 'gsn_create_labelbar',
+                'gsn_create_legend', 'gsn_create_text',
+                'gsn_csm_attach_zonal_means', 'gsn_csm_blank_plot',
+                'gsn_csm_contour', 'gsn_csm_contour_map', 'gsn_csm_contour_map_ce',
+                'gsn_csm_contour_map_overlay', 'gsn_csm_contour_map_polar',
+                'gsn_csm_hov', 'gsn_csm_lat_time', 'gsn_csm_map', 'gsn_csm_map_ce',
+                'gsn_csm_map_polar', 'gsn_csm_pres_hgt',
+                'gsn_csm_pres_hgt_streamline', 'gsn_csm_pres_hgt_vector',
+                'gsn_csm_streamline', 'gsn_csm_streamline_contour_map',
+                'gsn_csm_streamline_contour_map_ce',
+                'gsn_csm_streamline_contour_map_polar', 'gsn_csm_streamline_map',
+                'gsn_csm_streamline_map_ce', 'gsn_csm_streamline_map_polar',
+                'gsn_csm_streamline_scalar', 'gsn_csm_streamline_scalar_map',
+                'gsn_csm_streamline_scalar_map_ce',
+                'gsn_csm_streamline_scalar_map_polar', 'gsn_csm_time_lat',
+                'gsn_csm_vector', 'gsn_csm_vector_map', 'gsn_csm_vector_map_ce',
+                'gsn_csm_vector_map_polar', 'gsn_csm_vector_scalar',
+                'gsn_csm_vector_scalar_map', 'gsn_csm_vector_scalar_map_ce',
+                'gsn_csm_vector_scalar_map_polar', 'gsn_csm_x2y', 'gsn_csm_x2y2',
+                'gsn_csm_xy', 'gsn_csm_xy2', 'gsn_csm_xy3', 'gsn_csm_y',
+                'gsn_define_colormap', 'gsn_draw_colormap', 'gsn_draw_named_colors',
+                'gsn_histogram', 'gsn_labelbar_ndc', 'gsn_legend_ndc', 'gsn_map',
+                'gsn_merge_colormaps', 'gsn_open_wks', 'gsn_panel', 'gsn_polygon',
+                'gsn_polygon_ndc', 'gsn_polyline', 'gsn_polyline_ndc',
+                'gsn_polymarker', 'gsn_polymarker_ndc', 'gsn_retrieve_colormap',
+                'gsn_reverse_colormap', 'gsn_streamline', 'gsn_streamline_map',
+                'gsn_streamline_scalar', 'gsn_streamline_scalar_map', 'gsn_table',
+                'gsn_text', 'gsn_text_ndc', 'gsn_vector', 'gsn_vector_map',
+                'gsn_vector_scalar', 'gsn_vector_scalar_map', 'gsn_xy', 'gsn_y',
+                'hsv2rgb', 'maximize_output', 'namedcolor2rgb', 'namedcolor2rgba',
+                'reset_device_coordinates', 'span_named_colors'), prefix=r'\b'),
+             Name.Builtin),
+
+            # Resources
+            (words((
+                'amDataXF', 'amDataYF', 'amJust', 'amOn', 'amOrthogonalPosF',
+                'amParallelPosF', 'amResizeNotify', 'amSide', 'amTrackData',
+                'amViewId', 'amZone', 'appDefaultParent', 'appFileSuffix',
+                'appResources', 'appSysDir', 'appUsrDir', 'caCopyArrays',
+                'caXArray', 'caXCast', 'caXMaxV', 'caXMinV', 'caXMissingV',
+                'caYArray', 'caYCast', 'caYMaxV', 'caYMinV', 'caYMissingV',
+                'cnCellFillEdgeColor', 'cnCellFillMissingValEdgeColor',
+                'cnConpackParams', 'cnConstFEnableFill', 'cnConstFLabelAngleF',
+                'cnConstFLabelBackgroundColor', 'cnConstFLabelConstantSpacingF',
+                'cnConstFLabelFont', 'cnConstFLabelFontAspectF',
+                'cnConstFLabelFontColor', 'cnConstFLabelFontHeightF',
+                'cnConstFLabelFontQuality', 'cnConstFLabelFontThicknessF',
+                'cnConstFLabelFormat', 'cnConstFLabelFuncCode', 'cnConstFLabelJust',
+                'cnConstFLabelOn', 'cnConstFLabelOrthogonalPosF',
+                'cnConstFLabelParallelPosF', 'cnConstFLabelPerimColor',
+                'cnConstFLabelPerimOn', 'cnConstFLabelPerimSpaceF',
+                'cnConstFLabelPerimThicknessF', 'cnConstFLabelSide',
+                'cnConstFLabelString', 'cnConstFLabelTextDirection',
+                'cnConstFLabelZone', 'cnConstFUseInfoLabelRes',
+                'cnExplicitLabelBarLabelsOn', 'cnExplicitLegendLabelsOn',
+                'cnExplicitLineLabelsOn', 'cnFillBackgroundColor', 'cnFillColor',
+                'cnFillColors', 'cnFillDotSizeF', 'cnFillDrawOrder', 'cnFillMode',
+                'cnFillOn', 'cnFillOpacityF', 'cnFillPalette', 'cnFillPattern',
+                'cnFillPatterns', 'cnFillScaleF', 'cnFillScales', 'cnFixFillBleed',
+                'cnGridBoundFillColor', 'cnGridBoundFillPattern',
+                'cnGridBoundFillScaleF', 'cnGridBoundPerimColor',
+                'cnGridBoundPerimDashPattern', 'cnGridBoundPerimOn',
+                'cnGridBoundPerimThicknessF', 'cnHighLabelAngleF',
+                'cnHighLabelBackgroundColor', 'cnHighLabelConstantSpacingF',
+                'cnHighLabelCount', 'cnHighLabelFont', 'cnHighLabelFontAspectF',
+                'cnHighLabelFontColor', 'cnHighLabelFontHeightF',
+                'cnHighLabelFontQuality', 'cnHighLabelFontThicknessF',
+                'cnHighLabelFormat', 'cnHighLabelFuncCode', 'cnHighLabelPerimColor',
+                'cnHighLabelPerimOn', 'cnHighLabelPerimSpaceF',
+                'cnHighLabelPerimThicknessF', 'cnHighLabelString', 'cnHighLabelsOn',
+                'cnHighLowLabelOverlapMode', 'cnHighUseLineLabelRes',
+                'cnInfoLabelAngleF', 'cnInfoLabelBackgroundColor',
+                'cnInfoLabelConstantSpacingF', 'cnInfoLabelFont',
+                'cnInfoLabelFontAspectF', 'cnInfoLabelFontColor',
+                'cnInfoLabelFontHeightF', 'cnInfoLabelFontQuality',
+                'cnInfoLabelFontThicknessF', 'cnInfoLabelFormat',
+                'cnInfoLabelFuncCode', 'cnInfoLabelJust', 'cnInfoLabelOn',
+                'cnInfoLabelOrthogonalPosF', 'cnInfoLabelParallelPosF',
+                'cnInfoLabelPerimColor', 'cnInfoLabelPerimOn',
+                'cnInfoLabelPerimSpaceF', 'cnInfoLabelPerimThicknessF',
+                'cnInfoLabelSide', 'cnInfoLabelString', 'cnInfoLabelTextDirection',
+                'cnInfoLabelZone', 'cnLabelBarEndLabelsOn', 'cnLabelBarEndStyle',
+                'cnLabelDrawOrder', 'cnLabelMasking', 'cnLabelScaleFactorF',
+                'cnLabelScaleValueF', 'cnLabelScalingMode', 'cnLegendLevelFlags',
+                'cnLevelCount', 'cnLevelFlag', 'cnLevelFlags', 'cnLevelSelectionMode',
+                'cnLevelSpacingF', 'cnLevels', 'cnLineColor', 'cnLineColors',
+                'cnLineDashPattern', 'cnLineDashPatterns', 'cnLineDashSegLenF',
+                'cnLineDrawOrder', 'cnLineLabelAngleF', 'cnLineLabelBackgroundColor',
+                'cnLineLabelConstantSpacingF', 'cnLineLabelCount',
+                'cnLineLabelDensityF', 'cnLineLabelFont', 'cnLineLabelFontAspectF',
+                'cnLineLabelFontColor', 'cnLineLabelFontColors',
+                'cnLineLabelFontHeightF', 'cnLineLabelFontQuality',
+                'cnLineLabelFontThicknessF', 'cnLineLabelFormat',
+                'cnLineLabelFuncCode', 'cnLineLabelInterval', 'cnLineLabelPerimColor',
+                'cnLineLabelPerimOn', 'cnLineLabelPerimSpaceF',
+                'cnLineLabelPerimThicknessF', 'cnLineLabelPlacementMode',
+                'cnLineLabelStrings', 'cnLineLabelsOn', 'cnLinePalette',
+                'cnLineThicknessF', 'cnLineThicknesses', 'cnLinesOn',
+                'cnLowLabelAngleF', 'cnLowLabelBackgroundColor',
+                'cnLowLabelConstantSpacingF', 'cnLowLabelCount', 'cnLowLabelFont',
+                'cnLowLabelFontAspectF', 'cnLowLabelFontColor',
+                'cnLowLabelFontHeightF', 'cnLowLabelFontQuality',
+                'cnLowLabelFontThicknessF', 'cnLowLabelFormat', 'cnLowLabelFuncCode',
+                'cnLowLabelPerimColor', 'cnLowLabelPerimOn', 'cnLowLabelPerimSpaceF',
+                'cnLowLabelPerimThicknessF', 'cnLowLabelString', 'cnLowLabelsOn',
+                'cnLowUseHighLabelRes', 'cnMaxDataValueFormat', 'cnMaxLevelCount',
+                'cnMaxLevelValF', 'cnMaxPointDistanceF', 'cnMinLevelValF',
+                'cnMissingValFillColor', 'cnMissingValFillPattern',
+                'cnMissingValFillScaleF', 'cnMissingValPerimColor',
+                'cnMissingValPerimDashPattern', 'cnMissingValPerimGridBoundOn',
+                'cnMissingValPerimOn', 'cnMissingValPerimThicknessF',
+                'cnMonoFillColor', 'cnMonoFillPattern', 'cnMonoFillScale',
+                'cnMonoLevelFlag', 'cnMonoLineColor', 'cnMonoLineDashPattern',
+                'cnMonoLineLabelFontColor', 'cnMonoLineThickness', 'cnNoDataLabelOn',
+                'cnNoDataLabelString', 'cnOutOfRangeFillColor',
+                'cnOutOfRangeFillPattern', 'cnOutOfRangeFillScaleF',
+                'cnOutOfRangePerimColor', 'cnOutOfRangePerimDashPattern',
+                'cnOutOfRangePerimOn', 'cnOutOfRangePerimThicknessF',
+                'cnRasterCellSizeF', 'cnRasterMinCellSizeF', 'cnRasterModeOn',
+                'cnRasterSampleFactorF', 'cnRasterSmoothingOn', 'cnScalarFieldData',
+                'cnSmoothingDistanceF', 'cnSmoothingOn', 'cnSmoothingTensionF',
+                'cnSpanFillPalette', 'cnSpanLinePalette', 'ctCopyTables',
+                'ctXElementSize', 'ctXMaxV', 'ctXMinV', 'ctXMissingV', 'ctXTable',
+                'ctXTableLengths', 'ctXTableType', 'ctYElementSize', 'ctYMaxV',
+                'ctYMinV', 'ctYMissingV', 'ctYTable', 'ctYTableLengths',
+                'ctYTableType', 'dcDelayCompute', 'errBuffer',
+                'errFileName', 'errFilePtr', 'errLevel', 'errPrint', 'errUnitNumber',
+                'gsClipOn', 'gsColors', 'gsEdgeColor', 'gsEdgeDashPattern',
+                'gsEdgeDashSegLenF', 'gsEdgeThicknessF', 'gsEdgesOn',
+                'gsFillBackgroundColor', 'gsFillColor', 'gsFillDotSizeF',
+                'gsFillIndex', 'gsFillLineThicknessF', 'gsFillOpacityF',
+                'gsFillScaleF', 'gsFont', 'gsFontAspectF', 'gsFontColor',
+                'gsFontHeightF', 'gsFontOpacityF', 'gsFontQuality',
+                'gsFontThicknessF', 'gsLineColor', 'gsLineDashPattern',
+                'gsLineDashSegLenF', 'gsLineLabelConstantSpacingF', 'gsLineLabelFont',
+                'gsLineLabelFontAspectF', 'gsLineLabelFontColor',
+                'gsLineLabelFontHeightF', 'gsLineLabelFontQuality',
+                'gsLineLabelFontThicknessF', 'gsLineLabelFuncCode',
+                'gsLineLabelString', 'gsLineOpacityF', 'gsLineThicknessF',
+                'gsMarkerColor', 'gsMarkerIndex', 'gsMarkerOpacityF', 'gsMarkerSizeF',
+                'gsMarkerThicknessF', 'gsSegments', 'gsTextAngleF',
+                'gsTextConstantSpacingF', 'gsTextDirection', 'gsTextFuncCode',
+                'gsTextJustification', 'gsnAboveYRefLineBarColors',
+                'gsnAboveYRefLineBarFillScales', 'gsnAboveYRefLineBarPatterns',
+                'gsnAboveYRefLineColor', 'gsnAddCyclic', 'gsnAttachBorderOn',
+                'gsnAttachPlotsXAxis', 'gsnBelowYRefLineBarColors',
+                'gsnBelowYRefLineBarFillScales', 'gsnBelowYRefLineBarPatterns',
+                'gsnBelowYRefLineColor', 'gsnBoxMargin', 'gsnCenterString',
+                'gsnCenterStringFontColor', 'gsnCenterStringFontHeightF',
+                'gsnCenterStringFuncCode', 'gsnCenterStringOrthogonalPosF',
+                'gsnCenterStringParallelPosF', 'gsnContourLineThicknessesScale',
+                'gsnContourNegLineDashPattern', 'gsnContourPosLineDashPattern',
+                'gsnContourZeroLineThicknessF', 'gsnDebugWriteFileName', 'gsnDraw',
+                'gsnFrame', 'gsnHistogramBarWidthPercent', 'gsnHistogramBinIntervals',
+                'gsnHistogramBinMissing', 'gsnHistogramBinWidth',
+                'gsnHistogramClassIntervals', 'gsnHistogramCompare',
+                'gsnHistogramComputePercentages',
+                'gsnHistogramComputePercentagesNoMissing',
+                'gsnHistogramDiscreteBinValues', 'gsnHistogramDiscreteClassValues',
+                'gsnHistogramHorizontal', 'gsnHistogramMinMaxBinsOn',
+                'gsnHistogramNumberOfBins', 'gsnHistogramPercentSign',
+                'gsnHistogramSelectNiceIntervals', 'gsnLeftString',
+                'gsnLeftStringFontColor', 'gsnLeftStringFontHeightF',
+                'gsnLeftStringFuncCode', 'gsnLeftStringOrthogonalPosF',
+                'gsnLeftStringParallelPosF', 'gsnMajorLatSpacing',
+                'gsnMajorLonSpacing', 'gsnMaskLambertConformal',
+                'gsnMaskLambertConformalOutlineOn', 'gsnMaximize',
+                'gsnMinorLatSpacing', 'gsnMinorLonSpacing', 'gsnPanelBottom',
+                'gsnPanelCenter', 'gsnPanelDebug', 'gsnPanelFigureStrings',
+                'gsnPanelFigureStringsBackgroundFillColor',
+                'gsnPanelFigureStringsFontHeightF', 'gsnPanelFigureStringsJust',
+                'gsnPanelFigureStringsPerimOn', 'gsnPanelLabelBar', 'gsnPanelLeft',
+                'gsnPanelMainFont', 'gsnPanelMainFontColor',
+                'gsnPanelMainFontHeightF', 'gsnPanelMainString', 'gsnPanelRight',
+                'gsnPanelRowSpec', 'gsnPanelScalePlotIndex', 'gsnPanelTop',
+                'gsnPanelXF', 'gsnPanelXWhiteSpacePercent', 'gsnPanelYF',
+                'gsnPanelYWhiteSpacePercent', 'gsnPaperHeight', 'gsnPaperMargin',
+                'gsnPaperOrientation', 'gsnPaperWidth', 'gsnPolar',
+                'gsnPolarLabelDistance', 'gsnPolarLabelFont',
+                'gsnPolarLabelFontHeightF', 'gsnPolarLabelSpacing', 'gsnPolarTime',
+                'gsnPolarUT', 'gsnRightString', 'gsnRightStringFontColor',
+                'gsnRightStringFontHeightF', 'gsnRightStringFuncCode',
+                'gsnRightStringOrthogonalPosF', 'gsnRightStringParallelPosF',
+                'gsnScalarContour', 'gsnScale', 'gsnShape', 'gsnSpreadColorEnd',
+                'gsnSpreadColorStart', 'gsnSpreadColors', 'gsnStringFont',
+                'gsnStringFontColor', 'gsnStringFontHeightF', 'gsnStringFuncCode',
+                'gsnTickMarksOn', 'gsnXAxisIrregular2Linear', 'gsnXAxisIrregular2Log',
+                'gsnXRefLine', 'gsnXRefLineColor', 'gsnXRefLineDashPattern',
+                'gsnXRefLineThicknessF', 'gsnXYAboveFillColors', 'gsnXYBarChart',
+                'gsnXYBarChartBarWidth', 'gsnXYBarChartColors',
+                'gsnXYBarChartColors2', 'gsnXYBarChartFillDotSizeF',
+                'gsnXYBarChartFillLineThicknessF', 'gsnXYBarChartFillOpacityF',
+                'gsnXYBarChartFillScaleF', 'gsnXYBarChartOutlineOnly',
+                'gsnXYBarChartOutlineThicknessF', 'gsnXYBarChartPatterns',
+                'gsnXYBarChartPatterns2', 'gsnXYBelowFillColors', 'gsnXYFillColors',
+                'gsnXYFillOpacities', 'gsnXYLeftFillColors', 'gsnXYRightFillColors',
+                'gsnYAxisIrregular2Linear', 'gsnYAxisIrregular2Log', 'gsnYRefLine',
+                'gsnYRefLineColor', 'gsnYRefLineColors', 'gsnYRefLineDashPattern',
+                'gsnYRefLineDashPatterns', 'gsnYRefLineThicknessF',
+                'gsnYRefLineThicknesses', 'gsnZonalMean', 'gsnZonalMeanXMaxF',
+                'gsnZonalMeanXMinF', 'gsnZonalMeanYRefLine', 'lbAutoManage',
+                'lbBottomMarginF', 'lbBoxCount', 'lbBoxEndCapStyle', 'lbBoxFractions',
+                'lbBoxLineColor', 'lbBoxLineDashPattern', 'lbBoxLineDashSegLenF',
+                'lbBoxLineThicknessF', 'lbBoxLinesOn', 'lbBoxMajorExtentF',
+                'lbBoxMinorExtentF', 'lbBoxSeparatorLinesOn', 'lbBoxSizing',
+                'lbFillBackground', 'lbFillColor', 'lbFillColors', 'lbFillDotSizeF',
+                'lbFillLineThicknessF', 'lbFillPattern', 'lbFillPatterns',
+                'lbFillScaleF', 'lbFillScales', 'lbJustification', 'lbLabelAlignment',
+                'lbLabelAngleF', 'lbLabelAutoStride', 'lbLabelBarOn',
+                'lbLabelConstantSpacingF', 'lbLabelDirection', 'lbLabelFont',
+                'lbLabelFontAspectF', 'lbLabelFontColor', 'lbLabelFontHeightF',
+                'lbLabelFontQuality', 'lbLabelFontThicknessF', 'lbLabelFuncCode',
+                'lbLabelJust', 'lbLabelOffsetF', 'lbLabelPosition', 'lbLabelStride',
+                'lbLabelStrings', 'lbLabelsOn', 'lbLeftMarginF', 'lbMaxLabelLenF',
+                'lbMinLabelSpacingF', 'lbMonoFillColor', 'lbMonoFillPattern',
+                'lbMonoFillScale', 'lbOrientation', 'lbPerimColor',
+                'lbPerimDashPattern', 'lbPerimDashSegLenF', 'lbPerimFill',
+                'lbPerimFillColor', 'lbPerimOn', 'lbPerimThicknessF',
+                'lbRasterFillOn', 'lbRightMarginF', 'lbTitleAngleF',
+                'lbTitleConstantSpacingF', 'lbTitleDirection', 'lbTitleExtentF',
+                'lbTitleFont', 'lbTitleFontAspectF', 'lbTitleFontColor',
+                'lbTitleFontHeightF', 'lbTitleFontQuality', 'lbTitleFontThicknessF',
+                'lbTitleFuncCode', 'lbTitleJust', 'lbTitleOffsetF', 'lbTitleOn',
+                'lbTitlePosition', 'lbTitleString', 'lbTopMarginF', 'lgAutoManage',
+                'lgBottomMarginF', 'lgBoxBackground', 'lgBoxLineColor',
+                'lgBoxLineDashPattern', 'lgBoxLineDashSegLenF', 'lgBoxLineThicknessF',
+                'lgBoxLinesOn', 'lgBoxMajorExtentF', 'lgBoxMinorExtentF',
+                'lgDashIndex', 'lgDashIndexes', 'lgItemCount', 'lgItemOrder',
+                'lgItemPlacement', 'lgItemPositions', 'lgItemType', 'lgItemTypes',
+                'lgJustification', 'lgLabelAlignment', 'lgLabelAngleF',
+                'lgLabelAutoStride', 'lgLabelConstantSpacingF', 'lgLabelDirection',
+                'lgLabelFont', 'lgLabelFontAspectF', 'lgLabelFontColor',
+                'lgLabelFontHeightF', 'lgLabelFontQuality', 'lgLabelFontThicknessF',
+                'lgLabelFuncCode', 'lgLabelJust', 'lgLabelOffsetF', 'lgLabelPosition',
+                'lgLabelStride', 'lgLabelStrings', 'lgLabelsOn', 'lgLeftMarginF',
+                'lgLegendOn', 'lgLineColor', 'lgLineColors', 'lgLineDashSegLenF',
+                'lgLineDashSegLens', 'lgLineLabelConstantSpacingF', 'lgLineLabelFont',
+                'lgLineLabelFontAspectF', 'lgLineLabelFontColor',
+                'lgLineLabelFontColors', 'lgLineLabelFontHeightF',
+                'lgLineLabelFontHeights', 'lgLineLabelFontQuality',
+                'lgLineLabelFontThicknessF', 'lgLineLabelFuncCode',
+                'lgLineLabelStrings', 'lgLineLabelsOn', 'lgLineThicknessF',
+                'lgLineThicknesses', 'lgMarkerColor', 'lgMarkerColors',
+                'lgMarkerIndex', 'lgMarkerIndexes', 'lgMarkerSizeF', 'lgMarkerSizes',
+                'lgMarkerThicknessF', 'lgMarkerThicknesses', 'lgMonoDashIndex',
+                'lgMonoItemType', 'lgMonoLineColor', 'lgMonoLineDashSegLen',
+                'lgMonoLineLabelFontColor', 'lgMonoLineLabelFontHeight',
+                'lgMonoLineThickness', 'lgMonoMarkerColor', 'lgMonoMarkerIndex',
+                'lgMonoMarkerSize', 'lgMonoMarkerThickness', 'lgOrientation',
+                'lgPerimColor', 'lgPerimDashPattern', 'lgPerimDashSegLenF',
+                'lgPerimFill', 'lgPerimFillColor', 'lgPerimOn', 'lgPerimThicknessF',
+                'lgRightMarginF', 'lgTitleAngleF', 'lgTitleConstantSpacingF',
+                'lgTitleDirection', 'lgTitleExtentF', 'lgTitleFont',
+                'lgTitleFontAspectF', 'lgTitleFontColor', 'lgTitleFontHeightF',
+                'lgTitleFontQuality', 'lgTitleFontThicknessF', 'lgTitleFuncCode',
+                'lgTitleJust', 'lgTitleOffsetF', 'lgTitleOn', 'lgTitlePosition',
+                'lgTitleString', 'lgTopMarginF', 'mpAreaGroupCount',
+                'mpAreaMaskingOn', 'mpAreaNames', 'mpAreaTypes', 'mpBottomAngleF',
+                'mpBottomMapPosF', 'mpBottomNDCF', 'mpBottomNPCF',
+                'mpBottomPointLatF', 'mpBottomPointLonF', 'mpBottomWindowF',
+                'mpCenterLatF', 'mpCenterLonF', 'mpCenterRotF', 'mpCountyLineColor',
+                'mpCountyLineDashPattern', 'mpCountyLineDashSegLenF',
+                'mpCountyLineThicknessF', 'mpDataBaseVersion', 'mpDataResolution',
+                'mpDataSetName', 'mpDefaultFillColor', 'mpDefaultFillPattern',
+                'mpDefaultFillScaleF', 'mpDynamicAreaGroups', 'mpEllipticalBoundary',
+                'mpFillAreaSpecifiers', 'mpFillBoundarySets', 'mpFillColor',
+                'mpFillColors', 'mpFillColors-default', 'mpFillDotSizeF',
+                'mpFillDrawOrder', 'mpFillOn', 'mpFillPatternBackground',
+                'mpFillPattern', 'mpFillPatterns', 'mpFillPatterns-default',
+                'mpFillScaleF', 'mpFillScales', 'mpFillScales-default',
+                'mpFixedAreaGroups', 'mpGeophysicalLineColor',
+                'mpGeophysicalLineDashPattern', 'mpGeophysicalLineDashSegLenF',
+                'mpGeophysicalLineThicknessF', 'mpGreatCircleLinesOn',
+                'mpGridAndLimbDrawOrder', 'mpGridAndLimbOn', 'mpGridLatSpacingF',
+                'mpGridLineColor', 'mpGridLineDashPattern', 'mpGridLineDashSegLenF',
+                'mpGridLineThicknessF', 'mpGridLonSpacingF', 'mpGridMaskMode',
+                'mpGridMaxLatF', 'mpGridPolarLonSpacingF', 'mpGridSpacingF',
+                'mpInlandWaterFillColor', 'mpInlandWaterFillPattern',
+                'mpInlandWaterFillScaleF', 'mpLabelDrawOrder', 'mpLabelFontColor',
+                'mpLabelFontHeightF', 'mpLabelsOn', 'mpLambertMeridianF',
+                'mpLambertParallel1F', 'mpLambertParallel2F', 'mpLandFillColor',
+                'mpLandFillPattern', 'mpLandFillScaleF', 'mpLeftAngleF',
+                'mpLeftCornerLatF', 'mpLeftCornerLonF', 'mpLeftMapPosF',
+                'mpLeftNDCF', 'mpLeftNPCF', 'mpLeftPointLatF',
+                'mpLeftPointLonF', 'mpLeftWindowF', 'mpLimbLineColor',
+                'mpLimbLineDashPattern', 'mpLimbLineDashSegLenF',
+                'mpLimbLineThicknessF', 'mpLimitMode', 'mpMaskAreaSpecifiers',
+                'mpMaskOutlineSpecifiers', 'mpMaxLatF', 'mpMaxLonF',
+                'mpMinLatF', 'mpMinLonF', 'mpMonoFillColor', 'mpMonoFillPattern',
+                'mpMonoFillScale', 'mpNationalLineColor', 'mpNationalLineDashPattern',
+                'mpNationalLineThicknessF', 'mpOceanFillColor', 'mpOceanFillPattern',
+                'mpOceanFillScaleF', 'mpOutlineBoundarySets', 'mpOutlineDrawOrder',
+                'mpOutlineMaskingOn', 'mpOutlineOn', 'mpOutlineSpecifiers',
+                'mpPerimDrawOrder', 'mpPerimLineColor', 'mpPerimLineDashPattern',
+                'mpPerimLineDashSegLenF', 'mpPerimLineThicknessF', 'mpPerimOn',
+                'mpPolyMode', 'mpProjection', 'mpProvincialLineColor',
+                'mpProvincialLineDashPattern', 'mpProvincialLineDashSegLenF',
+                'mpProvincialLineThicknessF', 'mpRelativeCenterLat',
+                'mpRelativeCenterLon', 'mpRightAngleF', 'mpRightCornerLatF',
+                'mpRightCornerLonF', 'mpRightMapPosF', 'mpRightNDCF',
+                'mpRightNPCF', 'mpRightPointLatF', 'mpRightPointLonF',
+                'mpRightWindowF', 'mpSatelliteAngle1F', 'mpSatelliteAngle2F',
+                'mpSatelliteDistF', 'mpShapeMode', 'mpSpecifiedFillColors',
+                'mpSpecifiedFillDirectIndexing', 'mpSpecifiedFillPatterns',
+                'mpSpecifiedFillPriority', 'mpSpecifiedFillScales',
+                'mpTopAngleF', 'mpTopMapPosF', 'mpTopNDCF', 'mpTopNPCF',
+                'mpTopPointLatF', 'mpTopPointLonF', 'mpTopWindowF',
+                'mpUSStateLineColor', 'mpUSStateLineDashPattern',
+                'mpUSStateLineDashSegLenF', 'mpUSStateLineThicknessF',
+                'pmAnnoManagers', 'pmAnnoViews', 'pmLabelBarDisplayMode',
+                'pmLabelBarHeightF', 'pmLabelBarKeepAspect', 'pmLabelBarOrthogonalPosF',
+                'pmLabelBarParallelPosF', 'pmLabelBarSide', 'pmLabelBarWidthF',
+                'pmLabelBarZone', 'pmLegendDisplayMode', 'pmLegendHeightF',
+                'pmLegendKeepAspect', 'pmLegendOrthogonalPosF',
+                'pmLegendParallelPosF', 'pmLegendSide', 'pmLegendWidthF',
+                'pmLegendZone', 'pmOverlaySequenceIds', 'pmTickMarkDisplayMode',
+                'pmTickMarkZone', 'pmTitleDisplayMode', 'pmTitleZone',
+                'prGraphicStyle', 'prPolyType', 'prXArray', 'prYArray',
+                'sfCopyData', 'sfDataArray', 'sfDataMaxV', 'sfDataMinV',
+                'sfElementNodes', 'sfExchangeDimensions', 'sfFirstNodeIndex',
+                'sfMissingValueV', 'sfXArray', 'sfXCActualEndF', 'sfXCActualStartF',
+                'sfXCEndIndex', 'sfXCEndSubsetV', 'sfXCEndV', 'sfXCStartIndex',
+                'sfXCStartSubsetV', 'sfXCStartV', 'sfXCStride', 'sfXCellBounds',
+                'sfYArray', 'sfYCActualEndF', 'sfYCActualStartF', 'sfYCEndIndex',
+                'sfYCEndSubsetV', 'sfYCEndV', 'sfYCStartIndex', 'sfYCStartSubsetV',
+                'sfYCStartV', 'sfYCStride', 'sfYCellBounds', 'stArrowLengthF',
+                'stArrowStride', 'stCrossoverCheckCount',
+                'stExplicitLabelBarLabelsOn', 'stLabelBarEndLabelsOn',
+                'stLabelFormat', 'stLengthCheckCount', 'stLevelColors',
+                'stLevelCount', 'stLevelPalette', 'stLevelSelectionMode',
+                'stLevelSpacingF', 'stLevels', 'stLineColor', 'stLineOpacityF',
+                'stLineStartStride', 'stLineThicknessF', 'stMapDirection',
+                'stMaxLevelCount', 'stMaxLevelValF', 'stMinArrowSpacingF',
+                'stMinDistanceF', 'stMinLevelValF', 'stMinLineSpacingF',
+                'stMinStepFactorF', 'stMonoLineColor', 'stNoDataLabelOn',
+                'stNoDataLabelString', 'stScalarFieldData', 'stScalarMissingValColor',
+                'stSpanLevelPalette', 'stStepSizeF', 'stStreamlineDrawOrder',
+                'stUseScalarArray', 'stVectorFieldData', 'stZeroFLabelAngleF',
+                'stZeroFLabelBackgroundColor', 'stZeroFLabelConstantSpacingF',
+                'stZeroFLabelFont', 'stZeroFLabelFontAspectF',
+                'stZeroFLabelFontColor', 'stZeroFLabelFontHeightF',
+                'stZeroFLabelFontQuality', 'stZeroFLabelFontThicknessF',
+                'stZeroFLabelFuncCode', 'stZeroFLabelJust', 'stZeroFLabelOn',
+                'stZeroFLabelOrthogonalPosF', 'stZeroFLabelParallelPosF',
+                'stZeroFLabelPerimColor', 'stZeroFLabelPerimOn',
+                'stZeroFLabelPerimSpaceF', 'stZeroFLabelPerimThicknessF',
+                'stZeroFLabelSide', 'stZeroFLabelString', 'stZeroFLabelTextDirection',
+                'stZeroFLabelZone', 'tfDoNDCOverlay', 'tfPlotManagerOn',
+                'tfPolyDrawList', 'tfPolyDrawOrder', 'tiDeltaF', 'tiMainAngleF',
+                'tiMainConstantSpacingF', 'tiMainDirection', 'tiMainFont',
+                'tiMainFontAspectF', 'tiMainFontColor', 'tiMainFontHeightF',
+                'tiMainFontQuality', 'tiMainFontThicknessF', 'tiMainFuncCode',
+                'tiMainJust', 'tiMainOffsetXF', 'tiMainOffsetYF', 'tiMainOn',
+                'tiMainPosition', 'tiMainSide', 'tiMainString', 'tiUseMainAttributes',
+                'tiXAxisAngleF', 'tiXAxisConstantSpacingF', 'tiXAxisDirection',
+                'tiXAxisFont', 'tiXAxisFontAspectF', 'tiXAxisFontColor',
+                'tiXAxisFontHeightF', 'tiXAxisFontQuality', 'tiXAxisFontThicknessF',
+                'tiXAxisFuncCode', 'tiXAxisJust', 'tiXAxisOffsetXF',
+                'tiXAxisOffsetYF', 'tiXAxisOn', 'tiXAxisPosition', 'tiXAxisSide',
+                'tiXAxisString', 'tiYAxisAngleF', 'tiYAxisConstantSpacingF',
+                'tiYAxisDirection', 'tiYAxisFont', 'tiYAxisFontAspectF',
+                'tiYAxisFontColor', 'tiYAxisFontHeightF', 'tiYAxisFontQuality',
+                'tiYAxisFontThicknessF', 'tiYAxisFuncCode', 'tiYAxisJust',
+                'tiYAxisOffsetXF', 'tiYAxisOffsetYF', 'tiYAxisOn', 'tiYAxisPosition',
+                'tiYAxisSide', 'tiYAxisString', 'tmBorderLineColor',
+                'tmBorderThicknessF', 'tmEqualizeXYSizes', 'tmLabelAutoStride',
+                'tmSciNoteCutoff', 'tmXBAutoPrecision', 'tmXBBorderOn',
+                'tmXBDataLeftF', 'tmXBDataRightF', 'tmXBFormat', 'tmXBIrrTensionF',
+                'tmXBIrregularPoints', 'tmXBLabelAngleF', 'tmXBLabelConstantSpacingF',
+                'tmXBLabelDeltaF', 'tmXBLabelDirection', 'tmXBLabelFont',
+                'tmXBLabelFontAspectF', 'tmXBLabelFontColor', 'tmXBLabelFontHeightF',
+                'tmXBLabelFontQuality', 'tmXBLabelFontThicknessF',
+                'tmXBLabelFuncCode', 'tmXBLabelJust', 'tmXBLabelStride', 'tmXBLabels',
+                'tmXBLabelsOn', 'tmXBMajorLengthF', 'tmXBMajorLineColor',
+                'tmXBMajorOutwardLengthF', 'tmXBMajorThicknessF', 'tmXBMaxLabelLenF',
+                'tmXBMaxTicks', 'tmXBMinLabelSpacingF', 'tmXBMinorLengthF',
+                'tmXBMinorLineColor', 'tmXBMinorOn', 'tmXBMinorOutwardLengthF',
+                'tmXBMinorPerMajor', 'tmXBMinorThicknessF', 'tmXBMinorValues',
+                'tmXBMode', 'tmXBOn', 'tmXBPrecision', 'tmXBStyle', 'tmXBTickEndF',
+                'tmXBTickSpacingF', 'tmXBTickStartF', 'tmXBValues', 'tmXMajorGrid',
+                'tmXMajorGridLineColor', 'tmXMajorGridLineDashPattern',
+                'tmXMajorGridThicknessF', 'tmXMinorGrid', 'tmXMinorGridLineColor',
+                'tmXMinorGridLineDashPattern', 'tmXMinorGridThicknessF',
+                'tmXTAutoPrecision', 'tmXTBorderOn', 'tmXTDataLeftF',
+                'tmXTDataRightF', 'tmXTFormat', 'tmXTIrrTensionF',
+                'tmXTIrregularPoints', 'tmXTLabelAngleF', 'tmXTLabelConstantSpacingF',
+                'tmXTLabelDeltaF', 'tmXTLabelDirection', 'tmXTLabelFont',
+                'tmXTLabelFontAspectF', 'tmXTLabelFontColor', 'tmXTLabelFontHeightF',
+                'tmXTLabelFontQuality', 'tmXTLabelFontThicknessF',
+                'tmXTLabelFuncCode', 'tmXTLabelJust', 'tmXTLabelStride', 'tmXTLabels',
+                'tmXTLabelsOn', 'tmXTMajorLengthF', 'tmXTMajorLineColor',
+                'tmXTMajorOutwardLengthF', 'tmXTMajorThicknessF', 'tmXTMaxLabelLenF',
+                'tmXTMaxTicks', 'tmXTMinLabelSpacingF', 'tmXTMinorLengthF',
+                'tmXTMinorLineColor', 'tmXTMinorOn', 'tmXTMinorOutwardLengthF',
+                'tmXTMinorPerMajor', 'tmXTMinorThicknessF', 'tmXTMinorValues',
+                'tmXTMode', 'tmXTOn', 'tmXTPrecision', 'tmXTStyle', 'tmXTTickEndF',
+                'tmXTTickSpacingF', 'tmXTTickStartF', 'tmXTValues', 'tmXUseBottom',
+                'tmYLAutoPrecision', 'tmYLBorderOn', 'tmYLDataBottomF',
+                'tmYLDataTopF', 'tmYLFormat', 'tmYLIrrTensionF',
+                'tmYLIrregularPoints', 'tmYLLabelAngleF', 'tmYLLabelConstantSpacingF',
+                'tmYLLabelDeltaF', 'tmYLLabelDirection', 'tmYLLabelFont',
+                'tmYLLabelFontAspectF', 'tmYLLabelFontColor', 'tmYLLabelFontHeightF',
+                'tmYLLabelFontQuality', 'tmYLLabelFontThicknessF',
+                'tmYLLabelFuncCode', 'tmYLLabelJust', 'tmYLLabelStride', 'tmYLLabels',
+                'tmYLLabelsOn', 'tmYLMajorLengthF', 'tmYLMajorLineColor',
+                'tmYLMajorOutwardLengthF', 'tmYLMajorThicknessF', 'tmYLMaxLabelLenF',
+                'tmYLMaxTicks', 'tmYLMinLabelSpacingF', 'tmYLMinorLengthF',
+                'tmYLMinorLineColor', 'tmYLMinorOn', 'tmYLMinorOutwardLengthF',
+                'tmYLMinorPerMajor', 'tmYLMinorThicknessF', 'tmYLMinorValues',
+                'tmYLMode', 'tmYLOn', 'tmYLPrecision', 'tmYLStyle', 'tmYLTickEndF',
+                'tmYLTickSpacingF', 'tmYLTickStartF', 'tmYLValues', 'tmYMajorGrid',
+                'tmYMajorGridLineColor', 'tmYMajorGridLineDashPattern',
+                'tmYMajorGridThicknessF', 'tmYMinorGrid', 'tmYMinorGridLineColor',
+                'tmYMinorGridLineDashPattern', 'tmYMinorGridThicknessF',
+                'tmYRAutoPrecision', 'tmYRBorderOn', 'tmYRDataBottomF',
+                'tmYRDataTopF', 'tmYRFormat', 'tmYRIrrTensionF',
+                'tmYRIrregularPoints', 'tmYRLabelAngleF', 'tmYRLabelConstantSpacingF',
+                'tmYRLabelDeltaF', 'tmYRLabelDirection', 'tmYRLabelFont',
+                'tmYRLabelFontAspectF', 'tmYRLabelFontColor', 'tmYRLabelFontHeightF',
+                'tmYRLabelFontQuality', 'tmYRLabelFontThicknessF',
+                'tmYRLabelFuncCode', 'tmYRLabelJust', 'tmYRLabelStride', 'tmYRLabels',
+                'tmYRLabelsOn', 'tmYRMajorLengthF', 'tmYRMajorLineColor',
+                'tmYRMajorOutwardLengthF', 'tmYRMajorThicknessF', 'tmYRMaxLabelLenF',
+                'tmYRMaxTicks', 'tmYRMinLabelSpacingF', 'tmYRMinorLengthF',
+                'tmYRMinorLineColor', 'tmYRMinorOn', 'tmYRMinorOutwardLengthF',
+                'tmYRMinorPerMajor', 'tmYRMinorThicknessF', 'tmYRMinorValues',
+                'tmYRMode', 'tmYROn', 'tmYRPrecision', 'tmYRStyle', 'tmYRTickEndF',
+                'tmYRTickSpacingF', 'tmYRTickStartF', 'tmYRValues', 'tmYUseLeft',
+                'trGridType', 'trLineInterpolationOn',
+                'trXAxisType', 'trXCoordPoints', 'trXInterPoints', 'trXLog',
+                'trXMaxF', 'trXMinF', 'trXReverse', 'trXSamples', 'trXTensionF',
+                'trYAxisType', 'trYCoordPoints', 'trYInterPoints', 'trYLog',
+                'trYMaxF', 'trYMinF', 'trYReverse', 'trYSamples', 'trYTensionF',
+                'txAngleF', 'txBackgroundFillColor', 'txConstantSpacingF', 'txDirection',
+                'txFont', 'HLU-Fonts', 'txFontAspectF', 'txFontColor',
+                'txFontHeightF', 'txFontOpacityF', 'txFontQuality',
+                'txFontThicknessF', 'txFuncCode', 'txJust', 'txPerimColor',
+                'txPerimDashLengthF', 'txPerimDashPattern', 'txPerimOn',
+                'txPerimSpaceF', 'txPerimThicknessF', 'txPosXF', 'txPosYF',
+                'txString', 'vcExplicitLabelBarLabelsOn', 'vcFillArrowEdgeColor',
+                'vcFillArrowEdgeThicknessF', 'vcFillArrowFillColor',
+                'vcFillArrowHeadInteriorXF', 'vcFillArrowHeadMinFracXF',
+                'vcFillArrowHeadMinFracYF', 'vcFillArrowHeadXF', 'vcFillArrowHeadYF',
+                'vcFillArrowMinFracWidthF', 'vcFillArrowWidthF', 'vcFillArrowsOn',
+                'vcFillOverEdge', 'vcGlyphOpacityF', 'vcGlyphStyle',
+                'vcLabelBarEndLabelsOn', 'vcLabelFontColor', 'vcLabelFontHeightF',
+                'vcLabelsOn', 'vcLabelsUseVectorColor', 'vcLevelColors',
+                'vcLevelCount', 'vcLevelPalette', 'vcLevelSelectionMode',
+                'vcLevelSpacingF', 'vcLevels', 'vcLineArrowColor',
+                'vcLineArrowHeadMaxSizeF', 'vcLineArrowHeadMinSizeF',
+                'vcLineArrowThicknessF', 'vcMagnitudeFormat',
+                'vcMagnitudeScaleFactorF', 'vcMagnitudeScaleValueF',
+                'vcMagnitudeScalingMode', 'vcMapDirection', 'vcMaxLevelCount',
+                'vcMaxLevelValF', 'vcMaxMagnitudeF', 'vcMinAnnoAngleF',
+                'vcMinAnnoArrowAngleF', 'vcMinAnnoArrowEdgeColor',
+                'vcMinAnnoArrowFillColor', 'vcMinAnnoArrowLineColor',
+                'vcMinAnnoArrowMinOffsetF', 'vcMinAnnoArrowSpaceF',
+                'vcMinAnnoArrowUseVecColor', 'vcMinAnnoBackgroundColor',
+                'vcMinAnnoConstantSpacingF', 'vcMinAnnoExplicitMagnitudeF',
+                'vcMinAnnoFont', 'vcMinAnnoFontAspectF', 'vcMinAnnoFontColor',
+                'vcMinAnnoFontHeightF', 'vcMinAnnoFontQuality',
+                'vcMinAnnoFontThicknessF', 'vcMinAnnoFuncCode', 'vcMinAnnoJust',
+                'vcMinAnnoOn', 'vcMinAnnoOrientation', 'vcMinAnnoOrthogonalPosF',
+                'vcMinAnnoParallelPosF', 'vcMinAnnoPerimColor', 'vcMinAnnoPerimOn',
+                'vcMinAnnoPerimSpaceF', 'vcMinAnnoPerimThicknessF', 'vcMinAnnoSide',
+                'vcMinAnnoString1', 'vcMinAnnoString1On', 'vcMinAnnoString2',
+                'vcMinAnnoString2On', 'vcMinAnnoTextDirection', 'vcMinAnnoZone',
+                'vcMinDistanceF', 'vcMinFracLengthF', 'vcMinLevelValF',
+                'vcMinMagnitudeF', 'vcMonoFillArrowEdgeColor',
+                'vcMonoFillArrowFillColor', 'vcMonoLineArrowColor',
+                'vcMonoWindBarbColor', 'vcNoDataLabelOn', 'vcNoDataLabelString',
+                'vcPositionMode', 'vcRefAnnoAngleF', 'vcRefAnnoArrowAngleF',
+                'vcRefAnnoArrowEdgeColor', 'vcRefAnnoArrowFillColor',
+                'vcRefAnnoArrowLineColor', 'vcRefAnnoArrowMinOffsetF',
+                'vcRefAnnoArrowSpaceF', 'vcRefAnnoArrowUseVecColor',
+                'vcRefAnnoBackgroundColor', 'vcRefAnnoConstantSpacingF',
+                'vcRefAnnoExplicitMagnitudeF', 'vcRefAnnoFont',
+                'vcRefAnnoFontAspectF', 'vcRefAnnoFontColor', 'vcRefAnnoFontHeightF',
+                'vcRefAnnoFontQuality', 'vcRefAnnoFontThicknessF',
+                'vcRefAnnoFuncCode', 'vcRefAnnoJust', 'vcRefAnnoOn',
+                'vcRefAnnoOrientation', 'vcRefAnnoOrthogonalPosF',
+                'vcRefAnnoParallelPosF', 'vcRefAnnoPerimColor', 'vcRefAnnoPerimOn',
+                'vcRefAnnoPerimSpaceF', 'vcRefAnnoPerimThicknessF', 'vcRefAnnoSide',
+                'vcRefAnnoString1', 'vcRefAnnoString1On', 'vcRefAnnoString2',
+                'vcRefAnnoString2On', 'vcRefAnnoTextDirection', 'vcRefAnnoZone',
+                'vcRefLengthF', 'vcRefMagnitudeF', 'vcScalarFieldData',
+                'vcScalarMissingValColor', 'vcScalarValueFormat',
+                'vcScalarValueScaleFactorF', 'vcScalarValueScaleValueF',
+                'vcScalarValueScalingMode', 'vcSpanLevelPalette', 'vcUseRefAnnoRes',
+                'vcUseScalarArray', 'vcVectorDrawOrder', 'vcVectorFieldData',
+                'vcWindBarbCalmCircleSizeF', 'vcWindBarbColor',
+                'vcWindBarbLineThicknessF', 'vcWindBarbScaleFactorF',
+                'vcWindBarbTickAngleF', 'vcWindBarbTickLengthF',
+                'vcWindBarbTickSpacingF', 'vcZeroFLabelAngleF',
+                'vcZeroFLabelBackgroundColor', 'vcZeroFLabelConstantSpacingF',
+                'vcZeroFLabelFont', 'vcZeroFLabelFontAspectF',
+                'vcZeroFLabelFontColor', 'vcZeroFLabelFontHeightF',
+                'vcZeroFLabelFontQuality', 'vcZeroFLabelFontThicknessF',
+                'vcZeroFLabelFuncCode', 'vcZeroFLabelJust', 'vcZeroFLabelOn',
+                'vcZeroFLabelOrthogonalPosF', 'vcZeroFLabelParallelPosF',
+                'vcZeroFLabelPerimColor', 'vcZeroFLabelPerimOn',
+                'vcZeroFLabelPerimSpaceF', 'vcZeroFLabelPerimThicknessF',
+                'vcZeroFLabelSide', 'vcZeroFLabelString', 'vcZeroFLabelTextDirection',
+                'vcZeroFLabelZone', 'vfCopyData', 'vfDataArray',
+                'vfExchangeDimensions', 'vfExchangeUVData', 'vfMagMaxV', 'vfMagMinV',
+                'vfMissingUValueV', 'vfMissingVValueV', 'vfPolarData',
+                'vfSingleMissingValue', 'vfUDataArray', 'vfUMaxV', 'vfUMinV',
+                'vfVDataArray', 'vfVMaxV', 'vfVMinV', 'vfXArray', 'vfXCActualEndF',
+                'vfXCActualStartF', 'vfXCEndIndex', 'vfXCEndSubsetV', 'vfXCEndV',
+                'vfXCStartIndex', 'vfXCStartSubsetV', 'vfXCStartV', 'vfXCStride',
+                'vfYArray', 'vfYCActualEndF', 'vfYCActualStartF', 'vfYCEndIndex',
+                'vfYCEndSubsetV', 'vfYCEndV', 'vfYCStartIndex', 'vfYCStartSubsetV',
+                'vfYCStartV', 'vfYCStride', 'vpAnnoManagerId', 'vpClipOn',
+                'vpHeightF', 'vpKeepAspect', 'vpOn', 'vpUseSegments', 'vpWidthF',
+                'vpXF', 'vpYF', 'wkAntiAlias', 'wkBackgroundColor', 'wkBackgroundOpacityF',
+                'wkColorMapLen', 'wkColorMap', 'wkColorModel', 'wkDashTableLength',
+                'wkDefGraphicStyleId', 'wkDeviceLowerX', 'wkDeviceLowerY',
+                'wkDeviceUpperX', 'wkDeviceUpperY', 'wkFileName', 'wkFillTableLength',
+                'wkForegroundColor', 'wkFormat', 'wkFullBackground', 'wkGksWorkId',
+                'wkHeight', 'wkMarkerTableLength', 'wkMetaName', 'wkOrientation',
+                'wkPDFFileName', 'wkPDFFormat', 'wkPDFResolution', 'wkPSFileName',
+                'wkPSFormat', 'wkPSResolution', 'wkPaperHeightF', 'wkPaperSize',
+                'wkPaperWidthF', 'wkPause', 'wkTopLevelViews', 'wkViews',
+                'wkVisualType', 'wkWidth', 'wkWindowId', 'wkXColorMode', 'wsCurrentSize',
+                'wsMaximumSize', 'wsThresholdSize', 'xyComputeXMax',
+                'xyComputeXMin', 'xyComputeYMax', 'xyComputeYMin', 'xyCoordData',
+                'xyCoordDataSpec', 'xyCurveDrawOrder', 'xyDashPattern',
+                'xyDashPatterns', 'xyExplicitLabels', 'xyExplicitLegendLabels',
+                'xyLabelMode', 'xyLineColor', 'xyLineColors', 'xyLineDashSegLenF',
+                'xyLineLabelConstantSpacingF', 'xyLineLabelFont',
+                'xyLineLabelFontAspectF', 'xyLineLabelFontColor',
+                'xyLineLabelFontColors', 'xyLineLabelFontHeightF',
+                'xyLineLabelFontQuality', 'xyLineLabelFontThicknessF',
+                'xyLineLabelFuncCode', 'xyLineThicknessF', 'xyLineThicknesses',
+                'xyMarkLineMode', 'xyMarkLineModes', 'xyMarker', 'xyMarkerColor',
+                'xyMarkerColors', 'xyMarkerSizeF', 'xyMarkerSizes',
+                'xyMarkerThicknessF', 'xyMarkerThicknesses', 'xyMarkers',
+                'xyMonoDashPattern', 'xyMonoLineColor', 'xyMonoLineLabelFontColor',
+                'xyMonoLineThickness', 'xyMonoMarkLineMode', 'xyMonoMarker',
+                'xyMonoMarkerColor', 'xyMonoMarkerSize', 'xyMonoMarkerThickness',
+                'xyXIrrTensionF', 'xyXIrregularPoints', 'xyXStyle', 'xyYIrrTensionF',
+                'xyYIrregularPoints', 'xyYStyle'), prefix=r'\b'),
+             Name.Builtin),
+
+            # Booleans
+            (r'\.(True|False)\.', Name.Builtin),
+            # Comparing Operators
+            (r'\.(eq|ne|lt|le|gt|ge|not|and|or|xor)\.', Operator.Word),
+        ],
+
+        'strings': [
+            (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double),
+        ],
+
+        'nums': [
+            (r'\d+(?![.e])(_[a-z]\w+)?', Number.Integer),
+            (r'[+-]?\d*\.\d+(e[-+]?\d+)?(_[a-z]\w+)?', Number.Float),
+            (r'[+-]?\d+\.\d*(e[-+]?\d+)?(_[a-z]\w+)?', Number.Float),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/nimrod.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/nimrod.py
new file mode 100644
index 000000000..365a8dcca
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/nimrod.py
@@ -0,0 +1,199 @@
+"""
+    pygments.lexers.nimrod
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Nim language (formerly known as Nimrod).
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, default, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error
+
+__all__ = ['NimrodLexer']
+
+
+class NimrodLexer(RegexLexer):
+    """
+    For Nim source code.
+    """
+
+    name = 'Nimrod'
+    url = 'http://nim-lang.org/'
+    aliases = ['nimrod', 'nim']
+    filenames = ['*.nim', '*.nimrod']
+    mimetypes = ['text/x-nim']
+    version_added = '1.5'
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    def underscorize(words):
+        newWords = []
+        new = []
+        for word in words:
+            for ch in word:
+                new.append(ch)
+                new.append("_?")
+            newWords.append(''.join(new))
+            new = []
+        return "|".join(newWords)
+
+    keywords = [
+        'addr', 'and', 'as', 'asm', 'bind', 'block', 'break', 'case',
+        'cast', 'concept', 'const', 'continue', 'converter', 'defer', 'discard',
+        'distinct', 'div', 'do', 'elif', 'else', 'end', 'enum', 'except',
+        'export', 'finally', 'for', 'if', 'in', 'yield', 'interface',
+        'is', 'isnot', 'iterator', 'let', 'mixin', 'mod',
+        'not', 'notin', 'object', 'of', 'or', 'out', 'ptr', 'raise',
+        'ref', 'return', 'shl', 'shr', 'static', 'try',
+        'tuple', 'type', 'using', 'when', 'while', 'xor'
+    ]
+
+    keywordsPseudo = [
+        'nil', 'true', 'false'
+    ]
+
+    opWords = [
+        'and', 'or', 'not', 'xor', 'shl', 'shr', 'div', 'mod', 'in',
+        'notin', 'is', 'isnot'
+    ]
+
+    types = [
+        'int', 'int8', 'int16', 'int32', 'int64', 'float', 'float32', 'float64',
+        'bool', 'char', 'range', 'array', 'seq', 'set', 'string'
+    ]
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'##\[', String.Doc, 'doccomment'),
+            (r'##.*$', String.Doc),
+            (r'#\[', Comment.Multiline, 'comment'),
+            (r'#.*$', Comment),
+
+            # Pragmas
+            (r'\{\.', String.Other, 'pragma'),
+
+            # Operators
+            (r'[*=><+\-/@$~&%!?|\\\[\]]', Operator),
+            (r'\.\.|\.|,|\[\.|\.\]|\{\.|\.\}|\(\.|\.\)|\{|\}|\(|\)|:|\^|`|;',
+             Punctuation),
+
+            # Case statement branch
+            (r'(\n\s*)(of)(\s)', bygroups(Text.Whitespace, Keyword,
+                                          Text.Whitespace), 'casebranch'),
+
+            # Strings
+            (r'(?:[\w]+)"', String, 'rdqs'),
+            (r'"""', String.Double, 'tdqs'),
+            ('"', String, 'dqs'),
+
+            # Char
+            ("'", String.Char, 'chars'),
+
+            # Keywords
+            (rf'({underscorize(opWords)})\b', Operator.Word),
+            (r'(proc|func|method|macro|template)(\s)(?![(\[\]])',
+             bygroups(Keyword, Text.Whitespace), 'funcname'),
+            (rf'({underscorize(keywords)})\b', Keyword),
+            (r'({})\b'.format(underscorize(['from', 'import', 'include', 'export'])),
+             Keyword.Namespace),
+            (r'(v_?a_?r)\b', Keyword.Declaration),
+            (rf'({underscorize(types)})\b', Name.Builtin),
+            (rf'({underscorize(keywordsPseudo)})\b', Keyword.Pseudo),
+
+            # Identifiers
+            (r'\b((?![_\d])\w)(((?!_)\w)|(_(?!_)\w))*', Name),
+
+            # Numbers
+            (r'[0-9][0-9_]*(?=([e.]|\'f(32|64)))',
+             Number.Float, ('float-suffix', 'float-number')),
+            (r'0x[a-f0-9][a-f0-9_]*', Number.Hex, 'int-suffix'),
+            (r'0b[01][01_]*', Number.Bin, 'int-suffix'),
+            (r'0o[0-7][0-7_]*', Number.Oct, 'int-suffix'),
+            (r'[0-9][0-9_]*', Number.Integer, 'int-suffix'),
+
+            # Whitespace
+            (r'\s+', Text.Whitespace),
+            (r'.+$', Error),
+        ],
+        'chars': [
+            (r'\\([\\abcefnrtvl"\']|x[a-f0-9]{2}|[0-9]{1,3})', String.Escape),
+            (r"'", String.Char, '#pop'),
+            (r".", String.Char)
+        ],
+        'strings': [
+            (r'(?|>=|>>|>|<=|<<|<|\+|-|=|/|\*|%|\+=|-=|!|@', Operator),
+            (r'\(|\)|\[|\]|,|\.\.\.|\.\.|\.|::|:', Punctuation),
+            (r'`\{[^`]*`\}', Text),  # Extern blocks won't be Lexed by Nit
+            (r'[\r\n\t ]+', Text),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/nix.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/nix.py
new file mode 100644
index 000000000..3fa88c65a
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/nix.py
@@ -0,0 +1,144 @@
+"""
+    pygments.lexers.nix
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the NixOS Nix language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal
+
+__all__ = ['NixLexer']
+
+
+class NixLexer(RegexLexer):
+    """
+    For the Nix language.
+    """
+
+    name = 'Nix'
+    url = 'http://nixos.org/nix/'
+    aliases = ['nixos', 'nix']
+    filenames = ['*.nix']
+    mimetypes = ['text/x-nix']
+    version_added = '2.0'
+
+    keywords = ['rec', 'with', 'let', 'in', 'inherit', 'assert', 'if',
+                'else', 'then', '...']
+    builtins = ['import', 'abort', 'baseNameOf', 'dirOf', 'isNull', 'builtins',
+                'map', 'removeAttrs', 'throw', 'toString', 'derivation']
+    operators = ['++', '+', '?', '.', '!', '//', '==', '/',
+                 '!=', '&&', '||', '->', '=', '<', '>', '*', '-']
+
+    punctuations = ["(", ")", "[", "]", ";", "{", "}", ":", ",", "@"]
+
+    tokens = {
+        'root': [
+            # comments starting with #
+            (r'#.*$', Comment.Single),
+
+            # multiline comments
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            # whitespace
+            (r'\s+', Text),
+
+            # keywords
+            ('({})'.format('|'.join(re.escape(entry) + '\\b' for entry in keywords)), Keyword),
+
+            # highlight the builtins
+            ('({})'.format('|'.join(re.escape(entry) + '\\b' for entry in builtins)),
+             Name.Builtin),
+
+            (r'\b(true|false|null)\b', Name.Constant),
+
+            # floats
+            (r'-?(\d+\.\d*|\.\d+)([eE][-+]?\d+)?', Number.Float),
+
+            # integers
+            (r'-?[0-9]+', Number.Integer),
+
+            # paths
+            (r'[\w.+-]*(\/[\w.+-]+)+', Literal),
+            (r'~(\/[\w.+-]+)+', Literal),
+            (r'\<[\w.+-]+(\/[\w.+-]+)*\>', Literal),
+
+            # operators
+            ('({})'.format('|'.join(re.escape(entry) for entry in operators)),
+             Operator),
+
+            # word operators
+            (r'\b(or|and)\b', Operator.Word),
+
+            (r'\{', Punctuation, 'block'),
+
+            # punctuations
+            ('({})'.format('|'.join(re.escape(entry) for entry in punctuations)), Punctuation),
+
+            # strings
+            (r'"', String.Double, 'doublequote'),
+            (r"''", String.Multiline, 'multiline'),
+
+            # urls
+            (r'[a-zA-Z][a-zA-Z0-9\+\-\.]*\:[\w%/?:@&=+$,\\.!~*\'-]+', Literal),
+
+            # names of variables
+            (r'[\w-]+(?=\s*=)', String.Symbol),
+            (r'[a-zA-Z_][\w\'-]*', Text),
+
+            (r"\$\{", String.Interpol, 'antiquote'),
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'multiline': [
+            (r"''(\$|'|\\n|\\r|\\t|\\)", String.Escape),
+            (r"''", String.Multiline, '#pop'),
+            (r'\$\{', String.Interpol, 'antiquote'),
+            (r"[^'\$]+", String.Multiline),
+            (r"\$[^\{']", String.Multiline),
+            (r"'[^']", String.Multiline),
+            (r"\$(?=')", String.Multiline),
+        ],
+        'doublequote': [
+            (r'\\(\\|"|\$|n)', String.Escape),
+            (r'"', String.Double, '#pop'),
+            (r'\$\{', String.Interpol, 'antiquote'),
+            (r'[^"\\\$]+', String.Double),
+            (r'\$[^\{"]', String.Double),
+            (r'\$(?=")', String.Double),
+            (r'\\', String.Double),
+        ],
+        'antiquote': [
+            (r"\}", String.Interpol, '#pop'),
+            # TODO: we should probably escape also here ''${ \${
+            (r"\$\{", String.Interpol, '#push'),
+            include('root'),
+        ],
+        'block': [
+            (r"\}", Punctuation, '#pop'),
+            include('root'),
+        ],
+    }
+
+    def analyse_text(text):
+        rv = 0.0
+        # TODO: let/in
+        if re.search(r'import.+?<[^>]+>', text):
+            rv += 0.4
+        if re.search(r'mkDerivation\s+(\(|\{|rec)', text):
+            rv += 0.4
+        if re.search(r'=\s+mkIf\s+', text):
+            rv += 0.4
+        if re.search(r'\{[a-zA-Z,\s]+\}:', text):
+            rv += 0.1
+        return rv
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/numbair.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/numbair.py
new file mode 100644
index 000000000..435863e13
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/numbair.py
@@ -0,0 +1,63 @@
+"""
+    pygments.lexers.numbair
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for other Numba Intermediate Representation.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, words
+from pygments.token import Whitespace, Name, String,  Punctuation, Keyword, \
+    Operator, Number
+
+__all__ = ["NumbaIRLexer"]
+
+class NumbaIRLexer(RegexLexer):
+    """
+    Lexer for Numba IR
+    """
+    name = 'Numba_IR'
+    url = "https://numba.readthedocs.io/en/stable/developer/architecture.html#stage-2-generate-the-numba-ir"
+    aliases = ['numba_ir', 'numbair']
+    filenames = ['*.numba_ir']
+    mimetypes = ['text/x-numba_ir', 'text/x-numbair']
+    version_added = '2.19'
+
+    identifier = r'\$[a-zA-Z0-9._]+'
+    fun_or_var = r'([a-zA-Z_]+[a-zA-Z0-9]*)'
+
+    tokens = {
+        'root' : [
+            (r'(label)(\ [0-9]+)(:)$',
+                bygroups(Keyword, Name.Label, Punctuation)),
+
+            (r'=', Operator),
+            include('whitespace'),
+            include('keyword'),
+
+            (identifier, Name.Variable),
+            (fun_or_var + r'(\()',
+                bygroups(Name.Function, Punctuation)),
+            (fun_or_var + r'(\=)',
+                bygroups(Name.Attribute, Punctuation)),
+            (fun_or_var, Name.Constant),
+            (r'[0-9]+', Number),
+
+            # 
+            (r'<[^>\n]*>', String),
+
+            (r'[=<>{}\[\]()*.,!\':]|x\b', Punctuation)
+        ],
+
+        'keyword':[
+            (words((
+                'del', 'jump', 'call', 'branch',
+            ), suffix=' '), Keyword),
+        ],
+
+        'whitespace': [
+            (r'(\n|\s)+', Whitespace),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/oberon.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/oberon.py
new file mode 100644
index 000000000..61f3c2d28
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/oberon.py
@@ -0,0 +1,120 @@
+"""
+    pygments.lexers.oberon
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Oberon family languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['ComponentPascalLexer']
+
+
+class ComponentPascalLexer(RegexLexer):
+    """
+    For Component Pascal source code.
+    """
+    name = 'Component Pascal'
+    aliases = ['componentpascal', 'cp']
+    filenames = ['*.cp', '*.cps']
+    mimetypes = ['text/x-component-pascal']
+    url = 'https://blackboxframework.org'
+    version_added = '2.1'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comments'),
+            include('punctuation'),
+            include('numliterals'),
+            include('strings'),
+            include('operators'),
+            include('builtins'),
+            include('identifiers'),
+        ],
+        'whitespace': [
+            (r'\n+', Text),  # blank lines
+            (r'\s+', Text),  # whitespace
+        ],
+        'comments': [
+            (r'\(\*([^$].*?)\*\)', Comment.Multiline),
+            # TODO: nested comments (* (* ... *) ... (* ... *) *) not supported!
+        ],
+        'punctuation': [
+            (r'[()\[\]{},.:;|]', Punctuation),
+        ],
+        'numliterals': [
+            (r'[0-9A-F]+X\b', Number.Hex),                 # char code
+            (r'[0-9A-F]+[HL]\b', Number.Hex),              # hexadecimal number
+            (r'[0-9]+\.[0-9]+E[+-][0-9]+', Number.Float),  # real number
+            (r'[0-9]+\.[0-9]+', Number.Float),             # real number
+            (r'[0-9]+', Number.Integer),                   # decimal whole number
+        ],
+        'strings': [
+            (r"'[^\n']*'", String),  # single quoted string
+            (r'"[^\n"]*"', String),  # double quoted string
+        ],
+        'operators': [
+            # Arithmetic Operators
+            (r'[+-]', Operator),
+            (r'[*/]', Operator),
+            # Relational Operators
+            (r'[=#<>]', Operator),
+            # Dereferencing Operator
+            (r'\^', Operator),
+            # Logical AND Operator
+            (r'&', Operator),
+            # Logical NOT Operator
+            (r'~', Operator),
+            # Assignment Symbol
+            (r':=', Operator),
+            # Range Constructor
+            (r'\.\.', Operator),
+            (r'\$', Operator),
+        ],
+        'identifiers': [
+            (r'([a-zA-Z_$][\w$]*)', Name),
+        ],
+        'builtins': [
+            (words((
+                'ANYPTR', 'ANYREC', 'BOOLEAN', 'BYTE', 'CHAR', 'INTEGER', 'LONGINT',
+                'REAL', 'SET', 'SHORTCHAR', 'SHORTINT', 'SHORTREAL'
+                ), suffix=r'\b'), Keyword.Type),
+            (words((
+                'ABS', 'ABSTRACT', 'ARRAY', 'ASH', 'ASSERT', 'BEGIN', 'BITS', 'BY',
+                'CAP', 'CASE', 'CHR', 'CLOSE', 'CONST', 'DEC', 'DIV', 'DO', 'ELSE',
+                'ELSIF', 'EMPTY', 'END', 'ENTIER', 'EXCL', 'EXIT', 'EXTENSIBLE', 'FOR',
+                'HALT', 'IF', 'IMPORT', 'IN', 'INC', 'INCL', 'IS', 'LEN', 'LIMITED',
+                'LONG', 'LOOP', 'MAX', 'MIN', 'MOD', 'MODULE', 'NEW', 'ODD', 'OF',
+                'OR', 'ORD', 'OUT', 'POINTER', 'PROCEDURE', 'RECORD', 'REPEAT', 'RETURN',
+                'SHORT', 'SHORTCHAR', 'SHORTINT', 'SIZE', 'THEN', 'TYPE', 'TO', 'UNTIL',
+                'VAR', 'WHILE', 'WITH'
+                ), suffix=r'\b'), Keyword.Reserved),
+            (r'(TRUE|FALSE|NIL|INF)\b', Keyword.Constant),
+        ]
+    }
+
+    def analyse_text(text):
+        """The only other lexer using .cp is the C++ one, so we check if for
+        a few common Pascal keywords here. Those are unfortunately quite
+        common across various business languages as well."""
+        result = 0
+        if 'BEGIN' in text:
+            result += 0.01
+        if 'END' in text:
+            result += 0.01
+        if 'PROCEDURE' in text:
+            result += 0.01
+        if 'END' in text:
+            result += 0.01
+
+        return result
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/objective.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/objective.py
new file mode 100644
index 000000000..899c2c44c
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/objective.py
@@ -0,0 +1,513 @@
+"""
+    pygments.lexers.objective
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Objective-C family languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this, words, \
+    inherit, default
+from pygments.token import Text, Keyword, Name, String, Operator, \
+    Number, Punctuation, Literal, Comment, Whitespace
+
+from pygments.lexers.c_cpp import CLexer, CppLexer
+
+__all__ = ['ObjectiveCLexer', 'ObjectiveCppLexer', 'LogosLexer', 'SwiftLexer']
+
+
+def objective(baselexer):
+    """
+    Generate a subclass of baselexer that accepts the Objective-C syntax
+    extensions.
+    """
+
+    # Have to be careful not to accidentally match JavaDoc/Doxygen syntax here,
+    # since that's quite common in ordinary C/C++ files.  It's OK to match
+    # JavaDoc/Doxygen keywords that only apply to Objective-C, mind.
+    #
+    # The upshot of this is that we CANNOT match @class or @interface
+    _oc_keywords = re.compile(r'@(?:end|implementation|protocol)')
+
+    # Matches [ ? identifier  ( identifier ? ] |  identifier? : )
+    # (note the identifier is *optional* when there is a ':'!)
+    _oc_message = re.compile(r'\[\s*[a-zA-Z_]\w*\s+'
+                             r'(?:[a-zA-Z_]\w*\s*\]|'
+                             r'(?:[a-zA-Z_]\w*)?:)')
+
+    class GeneratedObjectiveCVariant(baselexer):
+        """
+        Implements Objective-C syntax on top of an existing C family lexer.
+        """
+
+        tokens = {
+            'statements': [
+                (r'@"', String, 'string'),
+                (r'@(YES|NO)', Number),
+                (r"@'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+                (r'@(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
+                (r'@(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+                (r'@0x[0-9a-fA-F]+[Ll]?', Number.Hex),
+                (r'@0[0-7]+[Ll]?', Number.Oct),
+                (r'@\d+[Ll]?', Number.Integer),
+                (r'@\(', Literal, 'literal_number'),
+                (r'@\[', Literal, 'literal_array'),
+                (r'@\{', Literal, 'literal_dictionary'),
+                (words((
+                    '@selector', '@private', '@protected', '@public', '@encode',
+                    '@synchronized', '@try', '@throw', '@catch', '@finally',
+                    '@end', '@property', '@synthesize', '__bridge', '__bridge_transfer',
+                    '__autoreleasing', '__block', '__weak', '__strong', 'weak', 'strong',
+                    'copy', 'retain', 'assign', 'unsafe_unretained', 'atomic', 'nonatomic',
+                    'readonly', 'readwrite', 'setter', 'getter', 'typeof', 'in',
+                    'out', 'inout', 'release', 'class', '@dynamic', '@optional',
+                    '@required', '@autoreleasepool', '@import'), suffix=r'\b'),
+                 Keyword),
+                (words(('id', 'instancetype', 'Class', 'IMP', 'SEL', 'BOOL',
+                        'IBOutlet', 'IBAction', 'unichar'), suffix=r'\b'),
+                 Keyword.Type),
+                (r'@(true|false|YES|NO)\n', Name.Builtin),
+                (r'(YES|NO|nil|self|super)\b', Name.Builtin),
+                # Carbon types
+                (r'(Boolean|UInt8|SInt8|UInt16|SInt16|UInt32|SInt32)\b', Keyword.Type),
+                # Carbon built-ins
+                (r'(TRUE|FALSE)\b', Name.Builtin),
+                (r'(@interface|@implementation)(\s+)', bygroups(Keyword, Text),
+                 ('#pop', 'oc_classname')),
+                (r'(@class|@protocol)(\s+)', bygroups(Keyword, Text),
+                 ('#pop', 'oc_forward_classname')),
+                # @ can also prefix other expressions like @{...} or @(...)
+                (r'@', Punctuation),
+                inherit,
+            ],
+            'oc_classname': [
+                # interface definition that inherits
+                (r'([a-zA-Z$_][\w$]*)(\s*:\s*)([a-zA-Z$_][\w$]*)?(\s*)(\{)',
+                 bygroups(Name.Class, Text, Name.Class, Text, Punctuation),
+                 ('#pop', 'oc_ivars')),
+                (r'([a-zA-Z$_][\w$]*)(\s*:\s*)([a-zA-Z$_][\w$]*)?',
+                 bygroups(Name.Class, Text, Name.Class), '#pop'),
+                # interface definition for a category
+                (r'([a-zA-Z$_][\w$]*)(\s*)(\([a-zA-Z$_][\w$]*\))(\s*)(\{)',
+                 bygroups(Name.Class, Text, Name.Label, Text, Punctuation),
+                 ('#pop', 'oc_ivars')),
+                (r'([a-zA-Z$_][\w$]*)(\s*)(\([a-zA-Z$_][\w$]*\))',
+                 bygroups(Name.Class, Text, Name.Label), '#pop'),
+                # simple interface / implementation
+                (r'([a-zA-Z$_][\w$]*)(\s*)(\{)',
+                 bygroups(Name.Class, Text, Punctuation), ('#pop', 'oc_ivars')),
+                (r'([a-zA-Z$_][\w$]*)', Name.Class, '#pop')
+            ],
+            'oc_forward_classname': [
+                (r'([a-zA-Z$_][\w$]*)(\s*,\s*)',
+                 bygroups(Name.Class, Text), 'oc_forward_classname'),
+                (r'([a-zA-Z$_][\w$]*)(\s*;?)',
+                 bygroups(Name.Class, Text), '#pop')
+            ],
+            'oc_ivars': [
+                include('whitespace'),
+                include('statements'),
+                (';', Punctuation),
+                (r'\{', Punctuation, '#push'),
+                (r'\}', Punctuation, '#pop'),
+            ],
+            'root': [
+                # methods
+                (r'^([-+])(\s*)'                         # method marker
+                 r'(\(.*?\))?(\s*)'                      # return type
+                 r'([a-zA-Z$_][\w$]*:?)',        # begin of method name
+                 bygroups(Punctuation, Text, using(this),
+                          Text, Name.Function),
+                 'method'),
+                inherit,
+            ],
+            'method': [
+                include('whitespace'),
+                # TODO unsure if ellipses are allowed elsewhere, see
+                # discussion in Issue 789
+                (r',', Punctuation),
+                (r'\.\.\.', Punctuation),
+                (r'(\(.*?\))(\s*)([a-zA-Z$_][\w$]*)',
+                 bygroups(using(this), Text, Name.Variable)),
+                (r'[a-zA-Z$_][\w$]*:', Name.Function),
+                (';', Punctuation, '#pop'),
+                (r'\{', Punctuation, 'function'),
+                default('#pop'),
+            ],
+            'literal_number': [
+                (r'\(', Punctuation, 'literal_number_inner'),
+                (r'\)', Literal, '#pop'),
+                include('statement'),
+            ],
+            'literal_number_inner': [
+                (r'\(', Punctuation, '#push'),
+                (r'\)', Punctuation, '#pop'),
+                include('statement'),
+            ],
+            'literal_array': [
+                (r'\[', Punctuation, 'literal_array_inner'),
+                (r'\]', Literal, '#pop'),
+                include('statement'),
+            ],
+            'literal_array_inner': [
+                (r'\[', Punctuation, '#push'),
+                (r'\]', Punctuation, '#pop'),
+                include('statement'),
+            ],
+            'literal_dictionary': [
+                (r'\}', Literal, '#pop'),
+                include('statement'),
+            ],
+        }
+
+        def analyse_text(text):
+            if _oc_keywords.search(text):
+                return 1.0
+            elif '@"' in text:  # strings
+                return 0.8
+            elif re.search('@[0-9]+', text):
+                return 0.7
+            elif _oc_message.search(text):
+                return 0.8
+            return 0
+
+        def get_tokens_unprocessed(self, text, stack=('root',)):
+            from pygments.lexers._cocoa_builtins import COCOA_INTERFACES, \
+                COCOA_PROTOCOLS, COCOA_PRIMITIVES
+
+            for index, token, value in \
+                    baselexer.get_tokens_unprocessed(self, text, stack):
+                if token is Name or token is Name.Class:
+                    if value in COCOA_INTERFACES or value in COCOA_PROTOCOLS \
+                       or value in COCOA_PRIMITIVES:
+                        token = Name.Builtin.Pseudo
+
+                yield index, token, value
+
+    return GeneratedObjectiveCVariant
+
+
+class ObjectiveCLexer(objective(CLexer)):
+    """
+    For Objective-C source code with preprocessor directives.
+    """
+
+    name = 'Objective-C'
+    url = 'https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html'
+    aliases = ['objective-c', 'objectivec', 'obj-c', 'objc']
+    filenames = ['*.m', '*.h']
+    mimetypes = ['text/x-objective-c']
+    version_added = ''
+    priority = 0.05    # Lower than C
+
+
+class ObjectiveCppLexer(objective(CppLexer)):
+    """
+    For Objective-C++ source code with preprocessor directives.
+    """
+
+    name = 'Objective-C++'
+    aliases = ['objective-c++', 'objectivec++', 'obj-c++', 'objc++']
+    filenames = ['*.mm', '*.hh']
+    mimetypes = ['text/x-objective-c++']
+    version_added = ''
+    priority = 0.05    # Lower than C++
+
+
+class LogosLexer(ObjectiveCppLexer):
+    """
+    For Logos + Objective-C source code with preprocessor directives.
+    """
+
+    name = 'Logos'
+    aliases = ['logos']
+    filenames = ['*.x', '*.xi', '*.xm', '*.xmi']
+    mimetypes = ['text/x-logos']
+    version_added = '1.6'
+    priority = 0.25
+
+    tokens = {
+        'statements': [
+            (r'(%orig|%log)\b', Keyword),
+            (r'(%c)\b(\()(\s*)([a-zA-Z$_][\w$]*)(\s*)(\))',
+             bygroups(Keyword, Punctuation, Text, Name.Class, Text, Punctuation)),
+            (r'(%init)\b(\()',
+             bygroups(Keyword, Punctuation), 'logos_init_directive'),
+            (r'(%init)(?=\s*;)', bygroups(Keyword)),
+            (r'(%hook|%group)(\s+)([a-zA-Z$_][\w$]+)',
+             bygroups(Keyword, Text, Name.Class), '#pop'),
+            (r'(%subclass)(\s+)', bygroups(Keyword, Text),
+             ('#pop', 'logos_classname')),
+            inherit,
+        ],
+        'logos_init_directive': [
+            (r'\s+', Text),
+            (',', Punctuation, ('logos_init_directive', '#pop')),
+            (r'([a-zA-Z$_][\w$]*)(\s*)(=)(\s*)([^);]*)',
+             bygroups(Name.Class, Text, Punctuation, Text, Text)),
+            (r'([a-zA-Z$_][\w$]*)', Name.Class),
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'logos_classname': [
+            (r'([a-zA-Z$_][\w$]*)(\s*:\s*)([a-zA-Z$_][\w$]*)?',
+             bygroups(Name.Class, Text, Name.Class), '#pop'),
+            (r'([a-zA-Z$_][\w$]*)', Name.Class, '#pop')
+        ],
+        'root': [
+            (r'(%subclass)(\s+)', bygroups(Keyword, Text),
+             'logos_classname'),
+            (r'(%hook|%group)(\s+)([a-zA-Z$_][\w$]+)',
+             bygroups(Keyword, Text, Name.Class)),
+            (r'(%config)(\s*\(\s*)(\w+)(\s*=)(.*?)(\)\s*)',
+             bygroups(Keyword, Text, Name.Variable, Text, String, Text)),
+            (r'(%ctor)(\s*)(\{)', bygroups(Keyword, Text, Punctuation),
+             'function'),
+            (r'(%new)(\s*)(\()(.*?)(\))',
+             bygroups(Keyword, Text, Keyword, String, Keyword)),
+            (r'(\s*)(%end)(\s*)', bygroups(Text, Keyword, Text)),
+            inherit,
+        ],
+    }
+
+    _logos_keywords = re.compile(r'%(?:hook|ctor|init|c\()')
+
+    def analyse_text(text):
+        if LogosLexer._logos_keywords.search(text):
+            return 1.0
+        return 0
+
+
+class SwiftLexer(RegexLexer):
+    """
+    For Swift source.
+    """
+    name = 'Swift'
+    url = 'https://www.swift.org/'
+    filenames = ['*.swift']
+    aliases = ['swift']
+    mimetypes = ['text/x-swift']
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            # Whitespace and Comments
+            (r'\n', Text),
+            (r'\s+', Whitespace),
+            (r'//', Comment.Single, 'comment-single'),
+            (r'/\*', Comment.Multiline, 'comment-multi'),
+            (r'#(if|elseif|else|endif|available)\b', Comment.Preproc, 'preproc'),
+
+            # Keywords
+            include('keywords'),
+
+            # Global Types
+            (words((
+                'Array', 'AutoreleasingUnsafeMutablePointer', 'BidirectionalReverseView',
+                'Bit', 'Bool', 'CFunctionPointer', 'COpaquePointer', 'CVaListPointer',
+                'Character', 'ClosedInterval', 'CollectionOfOne', 'ContiguousArray',
+                'Dictionary', 'DictionaryGenerator', 'DictionaryIndex', 'Double',
+                'EmptyCollection', 'EmptyGenerator', 'EnumerateGenerator',
+                'EnumerateSequence', 'FilterCollectionView',
+                'FilterCollectionViewIndex', 'FilterGenerator', 'FilterSequenceView',
+                'Float', 'Float80', 'FloatingPointClassification', 'GeneratorOf',
+                'GeneratorOfOne', 'GeneratorSequence', 'HalfOpenInterval', 'HeapBuffer',
+                'HeapBufferStorage', 'ImplicitlyUnwrappedOptional', 'IndexingGenerator',
+                'Int', 'Int16', 'Int32', 'Int64', 'Int8', 'LazyBidirectionalCollection',
+                'LazyForwardCollection', 'LazyRandomAccessCollection',
+                'LazySequence', 'MapCollectionView', 'MapSequenceGenerator',
+                'MapSequenceView', 'MirrorDisposition', 'ObjectIdentifier', 'OnHeap',
+                'Optional', 'PermutationGenerator', 'QuickLookObject',
+                'RandomAccessReverseView', 'Range', 'RangeGenerator', 'RawByte', 'Repeat',
+                'ReverseBidirectionalIndex', 'ReverseRandomAccessIndex', 'SequenceOf',
+                'SinkOf', 'Slice', 'StaticString', 'StrideThrough', 'StrideThroughGenerator',
+                'StrideTo', 'StrideToGenerator', 'String', 'UInt', 'UInt16', 'UInt32',
+                'UInt64', 'UInt8', 'UTF16', 'UTF32', 'UTF8', 'UnicodeDecodingResult',
+                'UnicodeScalar', 'Unmanaged', 'UnsafeBufferPointer',
+                'UnsafeBufferPointerGenerator', 'UnsafeMutableBufferPointer',
+                'UnsafeMutablePointer', 'UnsafePointer', 'Zip2', 'ZipGenerator2',
+                # Protocols
+                'AbsoluteValuable', 'AnyObject', 'ArrayLiteralConvertible',
+                'BidirectionalIndexType', 'BitwiseOperationsType',
+                'BooleanLiteralConvertible', 'BooleanType', 'CVarArgType',
+                'CollectionType', 'Comparable', 'DebugPrintable',
+                'DictionaryLiteralConvertible', 'Equatable',
+                'ExtendedGraphemeClusterLiteralConvertible',
+                'ExtensibleCollectionType', 'FloatLiteralConvertible',
+                'FloatingPointType', 'ForwardIndexType', 'GeneratorType', 'Hashable',
+                'IntegerArithmeticType', 'IntegerLiteralConvertible', 'IntegerType',
+                'IntervalType', 'MirrorType', 'MutableCollectionType', 'MutableSliceable',
+                'NilLiteralConvertible', 'OutputStreamType', 'Printable',
+                'RandomAccessIndexType', 'RangeReplaceableCollectionType',
+                'RawOptionSetType', 'RawRepresentable', 'Reflectable', 'SequenceType',
+                'SignedIntegerType', 'SignedNumberType', 'SinkType', 'Sliceable',
+                'Streamable', 'Strideable', 'StringInterpolationConvertible',
+                'StringLiteralConvertible', 'UnicodeCodecType',
+                'UnicodeScalarLiteralConvertible', 'UnsignedIntegerType',
+                '_ArrayBufferType', '_BidirectionalIndexType', '_CocoaStringType',
+                '_CollectionType', '_Comparable', '_ExtensibleCollectionType',
+                '_ForwardIndexType', '_Incrementable', '_IntegerArithmeticType',
+                '_IntegerType', '_ObjectiveCBridgeable', '_RandomAccessIndexType',
+                '_RawOptionSetType', '_SequenceType', '_Sequence_Type',
+                '_SignedIntegerType', '_SignedNumberType', '_Sliceable', '_Strideable',
+                '_SwiftNSArrayRequiredOverridesType', '_SwiftNSArrayType',
+                '_SwiftNSCopyingType', '_SwiftNSDictionaryRequiredOverridesType',
+                '_SwiftNSDictionaryType', '_SwiftNSEnumeratorType',
+                '_SwiftNSFastEnumerationType', '_SwiftNSStringRequiredOverridesType',
+                '_SwiftNSStringType', '_UnsignedIntegerType',
+                # Variables
+                'C_ARGC', 'C_ARGV', 'Process',
+                # Typealiases
+                'Any', 'AnyClass', 'BooleanLiteralType', 'CBool', 'CChar', 'CChar16',
+                'CChar32', 'CDouble', 'CFloat', 'CInt', 'CLong', 'CLongLong', 'CShort',
+                'CSignedChar', 'CUnsignedInt', 'CUnsignedLong', 'CUnsignedShort',
+                'CWideChar', 'ExtendedGraphemeClusterType', 'Float32', 'Float64',
+                'FloatLiteralType', 'IntMax', 'IntegerLiteralType', 'StringLiteralType',
+                'UIntMax', 'UWord', 'UnicodeScalarType', 'Void', 'Word',
+                # Foundation/Cocoa
+                'NSErrorPointer', 'NSObjectProtocol', 'Selector'), suffix=r'\b'),
+             Name.Builtin),
+            # Functions
+            (words((
+                'abs', 'advance', 'alignof', 'alignofValue', 'assert', 'assertionFailure',
+                'contains', 'count', 'countElements', 'debugPrint', 'debugPrintln',
+                'distance', 'dropFirst', 'dropLast', 'dump', 'enumerate', 'equal',
+                'extend', 'fatalError', 'filter', 'find', 'first', 'getVaList', 'indices',
+                'insert', 'isEmpty', 'join', 'last', 'lazy', 'lexicographicalCompare',
+                'map', 'max', 'maxElement', 'min', 'minElement', 'numericCast', 'overlaps',
+                'partition', 'precondition', 'preconditionFailure', 'prefix', 'print',
+                'println', 'reduce', 'reflect', 'removeAll', 'removeAtIndex', 'removeLast',
+                'removeRange', 'reverse', 'sizeof', 'sizeofValue', 'sort', 'sorted',
+                'splice', 'split', 'startsWith', 'stride', 'strideof', 'strideofValue',
+                'suffix', 'swap', 'toDebugString', 'toString', 'transcode',
+                'underestimateCount', 'unsafeAddressOf', 'unsafeBitCast', 'unsafeDowncast',
+                'withExtendedLifetime', 'withUnsafeMutablePointer',
+                'withUnsafeMutablePointers', 'withUnsafePointer', 'withUnsafePointers',
+                'withVaList'), suffix=r'\b'),
+             Name.Builtin.Pseudo),
+
+            # Implicit Block Variables
+            (r'\$\d+', Name.Variable),
+
+            # Binary Literal
+            (r'0b[01_]+', Number.Bin),
+            # Octal Literal
+            (r'0o[0-7_]+', Number.Oct),
+            # Hexadecimal Literal
+            (r'0x[0-9a-fA-F_]+', Number.Hex),
+            # Decimal Literal
+            (r'[0-9][0-9_]*(\.[0-9_]+[eE][+\-]?[0-9_]+|'
+             r'\.[0-9_]*|[eE][+\-]?[0-9_]+)', Number.Float),
+            (r'[0-9][0-9_]*', Number.Integer),
+            # String Literal
+            (r'"""', String, 'string-multi'),
+            (r'"', String, 'string'),
+
+            # Operators and Punctuation
+            (r'[(){}\[\].,:;=@#`?]|->|[<&?](?=\w)|(?<=\w)[>!?]', Punctuation),
+            (r'[/=\-+!*%<>&|^?~]+', Operator),
+
+            # Identifier
+            (r'[a-zA-Z_]\w*', Name)
+        ],
+        'keywords': [
+            (words((
+                'as', 'async', 'await', 'break', 'case', 'catch', 'continue', 'default', 'defer',
+                'do', 'else', 'fallthrough', 'for', 'guard', 'if', 'in', 'is',
+                'repeat', 'return', '#selector', 'switch', 'throw', 'try',
+                'where', 'while'), suffix=r'\b'),
+             Keyword),
+            (r'@availability\([^)]+\)', Keyword.Reserved),
+            (words((
+                'associativity', 'convenience', 'dynamic', 'didSet', 'final',
+                'get', 'indirect', 'infix', 'inout', 'lazy', 'left', 'mutating',
+                'none', 'nonmutating', 'optional', 'override', 'postfix',
+                'precedence', 'prefix', 'Protocol', 'required', 'rethrows',
+                'right', 'set', 'throws', 'Type', 'unowned', 'weak', 'willSet',
+                '@availability', '@autoclosure', '@noreturn',
+                '@NSApplicationMain', '@NSCopying', '@NSManaged', '@objc',
+                '@UIApplicationMain', '@IBAction', '@IBDesignable',
+                '@IBInspectable', '@IBOutlet'), suffix=r'\b'),
+             Keyword.Reserved),
+            (r'(as|dynamicType|false|is|nil|self|Self|super|true|__COLUMN__'
+             r'|__FILE__|__FUNCTION__|__LINE__|_'
+             r'|#(?:file|line|column|function))\b', Keyword.Constant),
+            (r'import\b', Keyword.Declaration, 'module'),
+            (r'(class|enum|extension|struct|protocol)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Class)),
+            (r'(func)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Declaration, Whitespace, Name.Function)),
+            (r'(var|let)(\s+)([a-zA-Z_]\w*)', bygroups(Keyword.Declaration,
+             Whitespace, Name.Variable)),
+            (words((
+                'actor', 'associatedtype', 'class', 'deinit', 'enum', 'extension', 'func', 'import',
+                'init', 'internal', 'let', 'operator', 'private', 'protocol', 'public',
+                'static', 'struct', 'subscript', 'typealias', 'var'), suffix=r'\b'),
+             Keyword.Declaration)
+        ],
+        'comment': [
+            (r':param: [a-zA-Z_]\w*|:returns?:|(FIXME|MARK|TODO):',
+             Comment.Special)
+        ],
+
+        # Nested
+        'comment-single': [
+            (r'\n', Whitespace, '#pop'),
+            include('comment'),
+            (r'[^\n]+', Comment.Single)
+        ],
+        'comment-multi': [
+            include('comment'),
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]+', Comment.Multiline)
+        ],
+        'module': [
+            (r'\n', Whitespace, '#pop'),
+            (r'[a-zA-Z_]\w*', Name.Class),
+            include('root')
+        ],
+        'preproc': [
+            (r'\n', Whitespace, '#pop'),
+            include('keywords'),
+            (r'[A-Za-z]\w*', Comment.Preproc),
+            include('root')
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            include("string-common"),
+        ],
+        'string-multi': [
+            (r'"""', String, '#pop'),
+            include("string-common"),
+        ],
+        'string-common': [
+            (r'\\\(', String.Interpol, 'string-intp'),
+            (r"""\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}"""
+             r"""|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}""", String.Escape),
+            (r'[^\\"]+', String),
+            (r'\\', String)
+        ],
+        'string-intp': [
+            (r'\(', String.Interpol, '#push'),
+            (r'\)', String.Interpol, '#pop'),
+            include('root')
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text):
+        from pygments.lexers._cocoa_builtins import COCOA_INTERFACES, \
+            COCOA_PROTOCOLS, COCOA_PRIMITIVES
+
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name or token is Name.Class:
+                if value in COCOA_INTERFACES or value in COCOA_PROTOCOLS \
+                   or value in COCOA_PRIMITIVES:
+                    token = Name.Builtin.Pseudo
+
+            yield index, token, value
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ooc.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ooc.py
new file mode 100644
index 000000000..8a990801a
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ooc.py
@@ -0,0 +1,84 @@
+"""
+    pygments.lexers.ooc
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Ooc language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['OocLexer']
+
+
+class OocLexer(RegexLexer):
+    """
+    For Ooc source code
+    """
+    name = 'Ooc'
+    url = 'https://ooc-lang.github.io/'
+    aliases = ['ooc']
+    filenames = ['*.ooc']
+    mimetypes = ['text/x-ooc']
+    version_added = '1.2'
+
+    tokens = {
+        'root': [
+            (words((
+                'class', 'interface', 'implement', 'abstract', 'extends', 'from',
+                'this', 'super', 'new', 'const', 'final', 'static', 'import',
+                'use', 'extern', 'inline', 'proto', 'break', 'continue',
+                'fallthrough', 'operator', 'if', 'else', 'for', 'while', 'do',
+                'switch', 'case', 'as', 'in', 'version', 'return', 'true',
+                'false', 'null'), prefix=r'\b', suffix=r'\b'),
+             Keyword),
+            (r'include\b', Keyword, 'include'),
+            (r'(cover)([ \t]+)(from)([ \t]+)(\w+[*@]?)',
+             bygroups(Keyword, Text, Keyword, Text, Name.Class)),
+            (r'(func)((?:[ \t]|\\\n)+)(~[a-z_]\w*)',
+             bygroups(Keyword, Text, Name.Function)),
+            (r'\bfunc\b', Keyword),
+            # Note: %= not listed on https://ooc-lang.github.io/docs/lang/operators/
+            (r'//.*', Comment),
+            (r'(?s)/\*.*?\*/', Comment.Multiline),
+            (r'(==?|\+=?|-[=>]?|\*=?|/=?|:=|!=?|%=?|\?|>{1,3}=?|<{1,3}=?|\.\.|'
+             r'&&?|\|\|?|\^=?)', Operator),
+            (r'(\.)([ \t]*)([a-z]\w*)', bygroups(Operator, Text,
+                                                 Name.Function)),
+            (r'[A-Z][A-Z0-9_]+', Name.Constant),
+            (r'[A-Z]\w*([@*]|\[[ \t]*\])?', Name.Class),
+
+            (r'([a-z]\w*(?:~[a-z]\w*)?)((?:[ \t]|\\\n)*)(?=\()',
+             bygroups(Name.Function, Text)),
+            (r'[a-z]\w*', Name.Variable),
+
+            # : introduces types
+            (r'[:(){}\[\];,]', Punctuation),
+
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'0c[0-9]+', Number.Oct),
+            (r'0b[01]+', Number.Bin),
+            (r'[0-9_]\.[0-9_]*(?!\.)', Number.Float),
+            (r'[0-9_]+', Number.Decimal),
+
+            (r'"(?:\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\"])*"',
+             String.Double),
+            (r"'(?:\\.|\\[0-9]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'",
+             String.Char),
+            (r'@', Punctuation),  # pointer dereference
+            (r'\.', Punctuation),  # imports or chain operator
+
+            (r'\\[ \t\n]', Text),
+            (r'[ \t]+', Text),
+        ],
+        'include': [
+            (r'[\w/]+', Name),
+            (r',', Punctuation),
+            (r'[ \t]', Text),
+            (r'[;\n]', Text, '#pop'),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/openscad.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/openscad.py
new file mode 100644
index 000000000..b06de227c
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/openscad.py
@@ -0,0 +1,96 @@
+"""
+    pygments.lexers.openscad
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the OpenSCAD languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words, include
+from pygments.token import Text, Comment, Punctuation, Operator, Keyword, Name, Number, Whitespace, Literal, String
+
+__all__ = ['OpenScadLexer']
+
+
+class OpenScadLexer(RegexLexer):
+    """For openSCAD code.
+    """
+    name = "OpenSCAD"
+    url = "https://openscad.org/"
+    aliases = ["openscad"]
+    filenames = ["*.scad"]
+    mimetypes = ["application/x-openscad"]
+    version_added = '2.16'
+
+    tokens = {
+        "root": [
+            (r"[^\S\n]+", Whitespace),
+            (r'//', Comment.Single, 'comment-single'),
+            (r'/\*', Comment.Multiline, 'comment-multi'),
+            (r"[{}\[\]\(\),;:]", Punctuation),
+            (r"[*!#%\-+=?/]", Operator),
+            (r"<=|<|==|!=|>=|>|&&|\|\|", Operator),
+            (r"\$(f[asn]|t|vp[rtd]|children)", Operator),
+            (r"(undef|PI)\b", Keyword.Constant),
+            (
+                r"(use|include)((?:\s|\\\\s)+)",
+                bygroups(Keyword.Namespace, Text),
+                "includes",
+            ),
+            (r"(module)(\s*)([^\s\(]+)",
+             bygroups(Keyword.Namespace, Whitespace, Name.Namespace)),
+            (r"(function)(\s*)([^\s\(]+)",
+             bygroups(Keyword.Declaration, Whitespace, Name.Function)),
+            (words(("true", "false"), prefix=r"\b", suffix=r"\b"), Literal),
+            (words((
+                "function", "module", "include", "use", "for",
+                "intersection_for", "if", "else", "return"
+                ), prefix=r"\b", suffix=r"\b"), Keyword
+            ),
+            (words((
+                "circle", "square", "polygon", "text", "sphere", "cube",
+                "cylinder", "polyhedron", "translate", "rotate", "scale",
+                "resize", "mirror", "multmatrix", "color", "offset", "hull",
+                "minkowski", "union", "difference", "intersection", "abs",
+                "sign", "sin", "cos", "tan", "acos", "asin", "atan", "atan2",
+                "floor", "round", "ceil", "ln", "log", "pow", "sqrt", "exp",
+                "rands", "min", "max", "concat", "lookup", "str", "chr",
+                "search", "version", "version_num", "norm", "cross",
+                "parent_module", "echo", "import", "import_dxf",
+                "dxf_linear_extrude", "linear_extrude", "rotate_extrude",
+                "surface", "projection", "render", "dxf_cross",
+                "dxf_dim", "let", "assign", "len"
+                ), prefix=r"\b", suffix=r"\b"),
+                Name.Builtin
+            ),
+            (r"\bchildren\b", Name.Builtin.Pseudo),
+            (r'""".*?"""', String.Double),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"-?\d+(\.\d+)?(e[+-]?\d+)?", Number),
+            (r"\w+", Name),
+        ],
+        "includes": [
+            (
+                r"(<)([^>]*)(>)",
+                bygroups(Punctuation, Comment.PreprocFile, Punctuation),
+            ),
+        ],
+        'comment': [
+            (r':param: [a-zA-Z_]\w*|:returns?:|(FIXME|MARK|TODO):',
+             Comment.Special)
+        ],
+        'comment-single': [
+            (r'\n', Text, '#pop'),
+            include('comment'),
+            (r'[^\n]+', Comment.Single)
+        ],
+        'comment-multi': [
+            include('comment'),
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/other.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/other.py
new file mode 100644
index 000000000..2b7dfb4ab
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/other.py
@@ -0,0 +1,41 @@
+"""
+    pygments.lexers.other
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Just export lexer classes previously contained in this module.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+# ruff: noqa: F401
+from pygments.lexers.sql import SqlLexer, MySqlLexer, SqliteConsoleLexer
+from pygments.lexers.shell import BashLexer, BashSessionLexer, BatchLexer, \
+    TcshLexer
+from pygments.lexers.robotframework import RobotFrameworkLexer
+from pygments.lexers.testing import GherkinLexer
+from pygments.lexers.esoteric import BrainfuckLexer, BefungeLexer, RedcodeLexer
+from pygments.lexers.prolog import LogtalkLexer
+from pygments.lexers.snobol import SnobolLexer
+from pygments.lexers.rebol import RebolLexer
+from pygments.lexers.configs import KconfigLexer, Cfengine3Lexer
+from pygments.lexers.modeling import ModelicaLexer
+from pygments.lexers.scripting import AppleScriptLexer, MOOCodeLexer, \
+    HybrisLexer
+from pygments.lexers.graphics import PostScriptLexer, GnuplotLexer, \
+    AsymptoteLexer, PovrayLexer
+from pygments.lexers.business import ABAPLexer, OpenEdgeLexer, \
+    GoodDataCLLexer, MaqlLexer
+from pygments.lexers.automation import AutoItLexer, AutohotkeyLexer
+from pygments.lexers.dsls import ProtoBufLexer, BroLexer, PuppetLexer, \
+    MscgenLexer, VGLLexer
+from pygments.lexers.basic import CbmBasicV2Lexer
+from pygments.lexers.pawn import SourcePawnLexer, PawnLexer
+from pygments.lexers.ecl import ECLLexer
+from pygments.lexers.urbi import UrbiscriptLexer
+from pygments.lexers.smalltalk import SmalltalkLexer, NewspeakLexer
+from pygments.lexers.installers import NSISLexer, RPMSpecLexer
+from pygments.lexers.textedit import AwkLexer
+from pygments.lexers.smv import NuSMVLexer
+
+__all__ = []
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/parasail.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/parasail.py
new file mode 100644
index 000000000..150d6a9c4
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/parasail.py
@@ -0,0 +1,78 @@
+"""
+    pygments.lexers.parasail
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for ParaSail.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Literal
+
+__all__ = ['ParaSailLexer']
+
+
+class ParaSailLexer(RegexLexer):
+    """
+    For ParaSail source code.
+    """
+
+    name = 'ParaSail'
+    url = 'http://www.parasail-lang.org'
+    aliases = ['parasail']
+    filenames = ['*.psi', '*.psl']
+    mimetypes = ['text/x-parasail']
+    version_added = '2.1'
+
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'\b(and|or|xor)=', Operator.Word),
+            (r'\b(and(\s+then)?|or(\s+else)?|xor|rem|mod|'
+             r'(is|not)\s+null)\b',
+             Operator.Word),
+            # Keywords
+            (r'\b(abs|abstract|all|block|class|concurrent|const|continue|'
+             r'each|end|exit|extends|exports|forward|func|global|implements|'
+             r'import|in|interface|is|lambda|locked|new|not|null|of|op|'
+             r'optional|private|queued|ref|return|reverse|separate|some|'
+             r'type|until|var|with|'
+             # Control flow
+             r'if|then|else|elsif|case|for|while|loop)\b',
+             Keyword.Reserved),
+            (r'(abstract\s+)?(interface|class|op|func|type)',
+             Keyword.Declaration),
+            # Literals
+            (r'"[^"]*"', String),
+            (r'\\[\'ntrf"0]', String.Escape),
+            (r'#[a-zA-Z]\w*', Literal),       # Enumeration
+            include('numbers'),
+            (r"'[^']'", String.Char),
+            (r'[a-zA-Z]\w*', Name),
+            # Operators and Punctuation
+            (r'(<==|==>|<=>|\*\*=|<\|=|<<=|>>=|==|!=|=\?|<=|>=|'
+             r'\*\*|<<|>>|=>|:=|\+=|-=|\*=|\|=|\||/=|\+|-|\*|/|'
+             r'\.\.|<\.\.|\.\.<|<\.\.<)',
+             Operator),
+            (r'(<|>|\[|\]|\(|\)|\||:|;|,|.|\{|\}|->)',
+             Punctuation),
+            (r'\n+', Text),
+        ],
+        'numbers': [
+            (r'\d[0-9_]*#[0-9a-fA-F][0-9a-fA-F_]*#', Number.Hex),  # any base
+            (r'0[xX][0-9a-fA-F][0-9a-fA-F_]*', Number.Hex),        # C-like hex
+            (r'0[bB][01][01_]*', Number.Bin),                      # C-like bin
+            (r'\d[0-9_]*\.\d[0-9_]*[eE][+-]\d[0-9_]*',             # float exp
+             Number.Float),
+            (r'\d[0-9_]*\.\d[0-9_]*', Number.Float),               # float
+            (r'\d[0-9_]*', Number.Integer),                        # integer
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/parsers.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/parsers.py
new file mode 100644
index 000000000..7a4ed9d1d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/parsers.py
@@ -0,0 +1,798 @@
+"""
+    pygments.lexers.parsers
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for parser generators.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, DelegatingLexer, \
+    include, bygroups, using
+from pygments.token import Punctuation, Other, Text, Comment, Operator, \
+    Keyword, Name, String, Number, Whitespace
+from pygments.lexers.jvm import JavaLexer
+from pygments.lexers.c_cpp import CLexer, CppLexer
+from pygments.lexers.objective import ObjectiveCLexer
+from pygments.lexers.d import DLexer
+from pygments.lexers.dotnet import CSharpLexer
+from pygments.lexers.ruby import RubyLexer
+from pygments.lexers.python import PythonLexer
+from pygments.lexers.perl import PerlLexer
+
+__all__ = ['RagelLexer', 'RagelEmbeddedLexer', 'RagelCLexer', 'RagelDLexer',
+           'RagelCppLexer', 'RagelObjectiveCLexer', 'RagelRubyLexer',
+           'RagelJavaLexer', 'AntlrLexer', 'AntlrPythonLexer',
+           'AntlrPerlLexer', 'AntlrRubyLexer', 'AntlrCppLexer',
+           'AntlrCSharpLexer', 'AntlrObjectiveCLexer',
+           'AntlrJavaLexer', 'AntlrActionScriptLexer',
+           'TreetopLexer', 'EbnfLexer']
+
+
+class RagelLexer(RegexLexer):
+    """A pure `Ragel `_ lexer.  Use this
+    for fragments of Ragel.  For ``.rl`` files, use
+    :class:`RagelEmbeddedLexer` instead (or one of the
+    language-specific subclasses).
+
+    """
+
+    name = 'Ragel'
+    url = 'http://www.colm.net/open-source/ragel/'
+    aliases = ['ragel']
+    filenames = []
+    version_added = '1.1'
+
+    tokens = {
+        'whitespace': [
+            (r'\s+', Whitespace)
+        ],
+        'comments': [
+            (r'\#.*$', Comment),
+        ],
+        'keywords': [
+            (r'(access|action|alphtype)\b', Keyword),
+            (r'(getkey|write|machine|include)\b', Keyword),
+            (r'(any|ascii|extend|alpha|digit|alnum|lower|upper)\b', Keyword),
+            (r'(xdigit|cntrl|graph|print|punct|space|zlen|empty)\b', Keyword)
+        ],
+        'numbers': [
+            (r'0x[0-9A-Fa-f]+', Number.Hex),
+            (r'[+-]?[0-9]+', Number.Integer),
+        ],
+        'literals': [
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'\[(\\\\|\\[^\\]|[^\\\]])*\]', String),          # square bracket literals
+            (r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/', String.Regex),  # regular expressions
+        ],
+        'identifiers': [
+            (r'[a-zA-Z_]\w*', Name.Variable),
+        ],
+        'operators': [
+            (r',', Operator),                           # Join
+            (r'\||&|--?', Operator),                    # Union, Intersection and Subtraction
+            (r'\.|<:|:>>?', Operator),                  # Concatention
+            (r':', Operator),                           # Label
+            (r'->', Operator),                          # Epsilon Transition
+            (r'(>|\$|%|<|@|<>)(/|eof\b)', Operator),    # EOF Actions
+            (r'(>|\$|%|<|@|<>)(!|err\b)', Operator),    # Global Error Actions
+            (r'(>|\$|%|<|@|<>)(\^|lerr\b)', Operator),  # Local Error Actions
+            (r'(>|\$|%|<|@|<>)(~|to\b)', Operator),     # To-State Actions
+            (r'(>|\$|%|<|@|<>)(\*|from\b)', Operator),  # From-State Actions
+            (r'>|@|\$|%', Operator),                    # Transition Actions and Priorities
+            (r'\*|\?|\+|\{[0-9]*,[0-9]*\}', Operator),  # Repetition
+            (r'!|\^', Operator),                        # Negation
+            (r'\(|\)', Operator),                       # Grouping
+        ],
+        'root': [
+            include('literals'),
+            include('whitespace'),
+            include('comments'),
+            include('keywords'),
+            include('numbers'),
+            include('identifiers'),
+            include('operators'),
+            (r'\{', Punctuation, 'host'),
+            (r'=', Operator),
+            (r';', Punctuation),
+        ],
+        'host': [
+            (r'(' + r'|'.join((  # keep host code in largest possible chunks
+                r'[^{}\'"/#]+',  # exclude unsafe characters
+                r'[^\\]\\[{}]',  # allow escaped { or }
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\[^\\]|[^"\\])*"',
+                r"'(\\\\|\\[^\\]|[^'\\])*'",
+                r'//.*$\n?',            # single line comment
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+                r'\#.*$\n?',            # ruby comment
+
+                # regular expression: There's no reason for it to start
+                # with a * and this stops confusion with comments.
+                r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/',
+
+                # / is safe now that we've handled regex and javadoc comments
+                r'/',
+            )) + r')+', Other),
+
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+    }
+
+
+class RagelEmbeddedLexer(RegexLexer):
+    """
+    A lexer for Ragel embedded in a host language file.
+
+    This will only highlight Ragel statements. If you want host language
+    highlighting then call the language-specific Ragel lexer.
+    """
+
+    name = 'Embedded Ragel'
+    aliases = ['ragel-em']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    tokens = {
+        'root': [
+            (r'(' + r'|'.join((   # keep host code in largest possible chunks
+                r'[^%\'"/#]+',    # exclude unsafe characters
+                r'%(?=[^%]|$)',   # a single % sign is okay, just not 2 of them
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\[^\\]|[^"\\])*"',
+                r"'(\\\\|\\[^\\]|[^'\\])*'",
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+                r'//.*$\n?',  # single line comment
+                r'\#.*$\n?',  # ruby/ragel comment
+                r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/',  # regular expression
+
+                # / is safe now that we've handled regex and javadoc comments
+                r'/',
+            )) + r')+', Other),
+
+            # Single Line FSM.
+            # Please don't put a quoted newline in a single line FSM.
+            # That's just mean. It will break this.
+            (r'(%%)(?![{%])(.*)($|;)(\n?)', bygroups(Punctuation,
+                                                     using(RagelLexer),
+                                                     Punctuation, Text)),
+
+            # Multi Line FSM.
+            (r'(%%%%|%%)\{', Punctuation, 'multi-line-fsm'),
+        ],
+        'multi-line-fsm': [
+            (r'(' + r'|'.join((  # keep ragel code in largest possible chunks.
+                r'(' + r'|'.join((
+                    r'[^}\'"\[/#]',   # exclude unsafe characters
+                    r'\}(?=[^%]|$)',   # } is okay as long as it's not followed by %
+                    r'\}%(?=[^%]|$)',  # ...well, one %'s okay, just not two...
+                    r'[^\\]\\[{}]',   # ...and } is okay if it's escaped
+
+                    # allow / if it's preceded with one of these symbols
+                    # (ragel EOF actions)
+                    r'(>|\$|%|<|@|<>)/',
+
+                    # specifically allow regex followed immediately by *
+                    # so it doesn't get mistaken for a comment
+                    r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/\*',
+
+                    # allow / as long as it's not followed by another / or by a *
+                    r'/(?=[^/*]|$)',
+
+                    # We want to match as many of these as we can in one block.
+                    # Not sure if we need the + sign here,
+                    # does it help performance?
+                )) + r')+',
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\[^\\]|[^"\\])*"',
+                r"'(\\\\|\\[^\\]|[^'\\])*'",
+                r"\[(\\\\|\\[^\\]|[^\]\\])*\]",  # square bracket literal
+                r'/\*(.|\n)*?\*/',          # multi-line javadoc-style comment
+                r'//.*$\n?',                # single line comment
+                r'\#.*$\n?',                # ruby/ragel comment
+            )) + r')+', using(RagelLexer)),
+
+            (r'\}%%', Punctuation, '#pop'),
+        ]
+    }
+
+    def analyse_text(text):
+        return '@LANG: indep' in text
+
+
+class RagelRubyLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in a Ruby host file.
+    """
+
+    name = 'Ragel in Ruby Host'
+    aliases = ['ragel-ruby', 'ragel-rb']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(RubyLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: ruby' in text
+
+
+class RagelCLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in a C host file.
+    """
+
+    name = 'Ragel in C Host'
+    aliases = ['ragel-c']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(CLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: c' in text
+
+
+class RagelDLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in a D host file.
+    """
+
+    name = 'Ragel in D Host'
+    aliases = ['ragel-d']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(DLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: d' in text
+
+
+class RagelCppLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in a C++ host file.
+    """
+
+    name = 'Ragel in CPP Host'
+    aliases = ['ragel-cpp']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(CppLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: c++' in text
+
+
+class RagelObjectiveCLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in an Objective C host file.
+    """
+
+    name = 'Ragel in Objective C Host'
+    aliases = ['ragel-objc']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(ObjectiveCLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: objc' in text
+
+
+class RagelJavaLexer(DelegatingLexer):
+    """
+    A lexer for Ragel in a Java host file.
+    """
+
+    name = 'Ragel in Java Host'
+    aliases = ['ragel-java']
+    filenames = ['*.rl']
+    url = 'http://www.colm.net/open-source/ragel/'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(JavaLexer, RagelEmbeddedLexer, **options)
+
+    def analyse_text(text):
+        return '@LANG: java' in text
+
+
+class AntlrLexer(RegexLexer):
+    """
+    Generic ANTLR Lexer.
+    Should not be called directly, instead
+    use DelegatingLexer for your target language.
+    """
+
+    name = 'ANTLR'
+    aliases = ['antlr']
+    filenames = []
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    _id = r'[A-Za-z]\w*'
+    _TOKEN_REF = r'[A-Z]\w*'
+    _RULE_REF = r'[a-z]\w*'
+    _STRING_LITERAL = r'\'(?:\\\\|\\\'|[^\']*)\''
+    _INT = r'[0-9]+'
+
+    tokens = {
+        'whitespace': [
+            (r'\s+', Whitespace),
+        ],
+        'comments': [
+            (r'//.*$', Comment),
+            (r'/\*(.|\n)*?\*/', Comment),
+        ],
+        'root': [
+            include('whitespace'),
+            include('comments'),
+
+            (r'(lexer|parser|tree)?(\s*)(grammar\b)(\s*)(' + _id + ')(;)',
+             bygroups(Keyword, Whitespace, Keyword, Whitespace, Name.Class,
+                      Punctuation)),
+            # optionsSpec
+            (r'options\b', Keyword, 'options'),
+            # tokensSpec
+            (r'tokens\b', Keyword, 'tokens'),
+            # attrScope
+            (r'(scope)(\s*)(' + _id + r')(\s*)(\{)',
+             bygroups(Keyword, Whitespace, Name.Variable, Whitespace,
+                      Punctuation), 'action'),
+            # exception
+            (r'(catch|finally)\b', Keyword, 'exception'),
+            # action
+            (r'(@' + _id + r')(\s*)(::)?(\s*)(' + _id + r')(\s*)(\{)',
+             bygroups(Name.Label, Whitespace, Punctuation, Whitespace,
+                      Name.Label, Whitespace, Punctuation), 'action'),
+            # rule
+            (r'((?:protected|private|public|fragment)\b)?(\s*)(' + _id + ')(!)?',
+             bygroups(Keyword, Whitespace, Name.Label, Punctuation),
+             ('rule-alts', 'rule-prelims')),
+        ],
+        'exception': [
+            (r'\n', Whitespace, '#pop'),
+            (r'\s', Whitespace),
+            include('comments'),
+
+            (r'\[', Punctuation, 'nested-arg-action'),
+            (r'\{', Punctuation, 'action'),
+        ],
+        'rule-prelims': [
+            include('whitespace'),
+            include('comments'),
+
+            (r'returns\b', Keyword),
+            (r'\[', Punctuation, 'nested-arg-action'),
+            (r'\{', Punctuation, 'action'),
+            # throwsSpec
+            (r'(throws)(\s+)(' + _id + ')',
+             bygroups(Keyword, Whitespace, Name.Label)),
+            (r'(,)(\s*)(' + _id + ')',
+             bygroups(Punctuation, Whitespace, Name.Label)),  # Additional throws
+            # optionsSpec
+            (r'options\b', Keyword, 'options'),
+            # ruleScopeSpec - scope followed by target language code or name of action
+            # TODO finish implementing other possibilities for scope
+            # L173 ANTLRv3.g from ANTLR book
+            (r'(scope)(\s+)(\{)', bygroups(Keyword, Whitespace, Punctuation),
+             'action'),
+            (r'(scope)(\s+)(' + _id + r')(\s*)(;)',
+             bygroups(Keyword, Whitespace, Name.Label, Whitespace, Punctuation)),
+            # ruleAction
+            (r'(@' + _id + r')(\s*)(\{)',
+             bygroups(Name.Label, Whitespace, Punctuation), 'action'),
+            # finished prelims, go to rule alts!
+            (r':', Punctuation, '#pop')
+        ],
+        'rule-alts': [
+            include('whitespace'),
+            include('comments'),
+
+            # These might need to go in a separate 'block' state triggered by (
+            (r'options\b', Keyword, 'options'),
+            (r':', Punctuation),
+
+            # literals
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'<<([^>]|>[^>])>>', String),
+            # identifiers
+            # Tokens start with capital letter.
+            (r'\$?[A-Z_]\w*', Name.Constant),
+            # Rules start with small letter.
+            (r'\$?[a-z_]\w*', Name.Variable),
+            # operators
+            (r'(\+|\||->|=>|=|\(|\)|\.\.|\.|\?|\*|\^|!|\#|~)', Operator),
+            (r',', Punctuation),
+            (r'\[', Punctuation, 'nested-arg-action'),
+            (r'\{', Punctuation, 'action'),
+            (r';', Punctuation, '#pop')
+        ],
+        'tokens': [
+            include('whitespace'),
+            include('comments'),
+            (r'\{', Punctuation),
+            (r'(' + _TOKEN_REF + r')(\s*)(=)?(\s*)(' + _STRING_LITERAL
+             + r')?(\s*)(;)',
+             bygroups(Name.Label, Whitespace, Punctuation, Whitespace,
+                      String, Whitespace, Punctuation)),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'options': [
+            include('whitespace'),
+            include('comments'),
+            (r'\{', Punctuation),
+            (r'(' + _id + r')(\s*)(=)(\s*)(' +
+             '|'.join((_id, _STRING_LITERAL, _INT, r'\*')) + r')(\s*)(;)',
+             bygroups(Name.Variable, Whitespace, Punctuation, Whitespace,
+                      Text, Whitespace, Punctuation)),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'action': [
+            (r'(' + r'|'.join((    # keep host code in largest possible chunks
+                r'[^${}\'"/\\]+',  # exclude unsafe characters
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\[^\\]|[^"\\])*"',
+                r"'(\\\\|\\[^\\]|[^'\\])*'",
+                r'//.*$\n?',            # single line comment
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+
+                # regular expression: There's no reason for it to start
+                # with a * and this stops confusion with comments.
+                r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/',
+
+                # backslashes are okay, as long as we are not backslashing a %
+                r'\\(?!%)',
+
+                # Now that we've handled regex and javadoc comments
+                # it's safe to let / through.
+                r'/',
+            )) + r')+', Other),
+            (r'(\\)(%)', bygroups(Punctuation, Other)),
+            (r'(\$[a-zA-Z]+)(\.?)(text|value)?',
+             bygroups(Name.Variable, Punctuation, Name.Property)),
+            (r'\{', Punctuation, '#push'),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'nested-arg-action': [
+            (r'(' + r'|'.join((    # keep host code in largest possible chunks.
+                r'[^$\[\]\'"/]+',  # exclude unsafe characters
+
+                # strings and comments may safely contain unsafe characters
+                r'"(\\\\|\\[^\\]|[^"\\])*"',
+                r"'(\\\\|\\[^\\]|[^'\\])*'",
+                r'//.*$\n?',            # single line comment
+                r'/\*(.|\n)*?\*/',      # multi-line javadoc-style comment
+
+                # regular expression: There's no reason for it to start
+                # with a * and this stops confusion with comments.
+                r'/(?!\*)(\\\\|\\[^\\]|[^/\\])*/',
+
+                # Now that we've handled regex and javadoc comments
+                # it's safe to let / through.
+                r'/',
+            )) + r')+', Other),
+
+
+            (r'\[', Punctuation, '#push'),
+            (r'\]', Punctuation, '#pop'),
+            (r'(\$[a-zA-Z]+)(\.?)(text|value)?',
+             bygroups(Name.Variable, Punctuation, Name.Property)),
+            (r'(\\\\|\\\]|\\\[|[^\[\]])+', Other),
+        ]
+    }
+
+    def analyse_text(text):
+        return re.search(r'^\s*grammar\s+[a-zA-Z0-9]+\s*;', text, re.M)
+
+
+# http://www.antlr.org/wiki/display/ANTLR3/Code+Generation+Targets
+
+class AntlrCppLexer(DelegatingLexer):
+    """
+    ANTLR with C++ Target
+    """
+
+    name = 'ANTLR With CPP Target'
+    aliases = ['antlr-cpp']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(CppLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*C\s*;', text, re.M)
+
+
+class AntlrObjectiveCLexer(DelegatingLexer):
+    """
+    ANTLR with Objective-C Target
+    """
+
+    name = 'ANTLR With ObjectiveC Target'
+    aliases = ['antlr-objc']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(ObjectiveCLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*ObjC\s*;', text)
+
+
+class AntlrCSharpLexer(DelegatingLexer):
+    """
+    ANTLR with C# Target
+    """
+
+    name = 'ANTLR With C# Target'
+    aliases = ['antlr-csharp', 'antlr-c#']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(CSharpLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*CSharp2\s*;', text, re.M)
+
+
+class AntlrPythonLexer(DelegatingLexer):
+    """
+    ANTLR with Python Target
+    """
+
+    name = 'ANTLR With Python Target'
+    aliases = ['antlr-python']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(PythonLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*Python\s*;', text, re.M)
+
+
+class AntlrJavaLexer(DelegatingLexer):
+    """
+    ANTLR with Java Target
+    """
+
+    name = 'ANTLR With Java Target'
+    aliases = ['antlr-java']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(JavaLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        # Antlr language is Java by default
+        return AntlrLexer.analyse_text(text) and 0.9
+
+
+class AntlrRubyLexer(DelegatingLexer):
+    """
+    ANTLR with Ruby Target
+    """
+
+    name = 'ANTLR With Ruby Target'
+    aliases = ['antlr-ruby', 'antlr-rb']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(RubyLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*Ruby\s*;', text, re.M)
+
+
+class AntlrPerlLexer(DelegatingLexer):
+    """
+    ANTLR with Perl Target
+    """
+
+    name = 'ANTLR With Perl Target'
+    aliases = ['antlr-perl']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        super().__init__(PerlLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*Perl5\s*;', text, re.M)
+
+
+class AntlrActionScriptLexer(DelegatingLexer):
+    """
+    ANTLR with ActionScript Target
+    """
+
+    name = 'ANTLR With ActionScript Target'
+    aliases = ['antlr-actionscript', 'antlr-as']
+    filenames = ['*.G', '*.g']
+    url = 'https://www.antlr.org'
+    version_added = '1.1'
+
+    def __init__(self, **options):
+        from pygments.lexers.actionscript import ActionScriptLexer
+        super().__init__(ActionScriptLexer, AntlrLexer, **options)
+
+    def analyse_text(text):
+        return AntlrLexer.analyse_text(text) and \
+            re.search(r'^\s*language\s*=\s*ActionScript\s*;', text, re.M)
+
+
+class TreetopBaseLexer(RegexLexer):
+    """
+    A base lexer for `Treetop `_ grammars.
+    Not for direct use; use :class:`TreetopLexer` instead.
+
+    .. versionadded:: 1.6
+    """
+
+    tokens = {
+        'root': [
+            include('space'),
+            (r'require[ \t]+[^\n\r]+[\n\r]', Other),
+            (r'module\b', Keyword.Namespace, 'module'),
+            (r'grammar\b', Keyword, 'grammar'),
+        ],
+        'module': [
+            include('space'),
+            include('end'),
+            (r'module\b', Keyword, '#push'),
+            (r'grammar\b', Keyword, 'grammar'),
+            (r'[A-Z]\w*(?:::[A-Z]\w*)*', Name.Namespace),
+        ],
+        'grammar': [
+            include('space'),
+            include('end'),
+            (r'rule\b', Keyword, 'rule'),
+            (r'include\b', Keyword, 'include'),
+            (r'[A-Z]\w*', Name),
+        ],
+        'include': [
+            include('space'),
+            (r'[A-Z]\w*(?:::[A-Z]\w*)*', Name.Class, '#pop'),
+        ],
+        'rule': [
+            include('space'),
+            include('end'),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+            (r'([A-Za-z_]\w*)(:)', bygroups(Name.Label, Punctuation)),
+            (r'[A-Za-z_]\w*', Name),
+            (r'[()]', Punctuation),
+            (r'[?+*/&!~]', Operator),
+            (r'\[(?:\\.|\[:\^?[a-z]+:\]|[^\\\]])+\]', String.Regex),
+            (r'([0-9]*)(\.\.)([0-9]*)',
+             bygroups(Number.Integer, Operator, Number.Integer)),
+            (r'(<)([^>]+)(>)', bygroups(Punctuation, Name.Class, Punctuation)),
+            (r'\{', Punctuation, 'inline_module'),
+            (r'\.', String.Regex),
+        ],
+        'inline_module': [
+            (r'\{', Other, 'ruby'),
+            (r'\}', Punctuation, '#pop'),
+            (r'[^{}]+', Other),
+        ],
+        'ruby': [
+            (r'\{', Other, '#push'),
+            (r'\}', Other, '#pop'),
+            (r'[^{}]+', Other),
+        ],
+        'space': [
+            (r'[ \t\n\r]+', Whitespace),
+            (r'#[^\n]*', Comment.Single),
+        ],
+        'end': [
+            (r'end\b', Keyword, '#pop'),
+        ],
+    }
+
+
+class TreetopLexer(DelegatingLexer):
+    """
+    A lexer for Treetop grammars.
+    """
+
+    name = 'Treetop'
+    aliases = ['treetop']
+    filenames = ['*.treetop', '*.tt']
+    url = 'https://cjheath.github.io/treetop'
+    version_added = '1.6'
+
+    def __init__(self, **options):
+        super().__init__(RubyLexer, TreetopBaseLexer, **options)
+
+
+class EbnfLexer(RegexLexer):
+    """
+    Lexer for `ISO/IEC 14977 EBNF
+    `_
+    grammars.
+    """
+
+    name = 'EBNF'
+    aliases = ['ebnf']
+    filenames = ['*.ebnf']
+    mimetypes = ['text/x-ebnf']
+    url = 'https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form'
+    version_added = '2.0'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comment_start'),
+            include('identifier'),
+            (r'=', Operator, 'production'),
+        ],
+        'production': [
+            include('whitespace'),
+            include('comment_start'),
+            include('identifier'),
+            (r'"[^"]*"', String.Double),
+            (r"'[^']*'", String.Single),
+            (r'(\?[^?]*\?)', Name.Entity),
+            (r'[\[\]{}(),|]', Punctuation),
+            (r'-', Operator),
+            (r';', Punctuation, '#pop'),
+            (r'\.', Punctuation, '#pop'),
+        ],
+        'whitespace': [
+            (r'\s+', Text),
+        ],
+        'comment_start': [
+            (r'\(\*', Comment.Multiline, 'comment'),
+        ],
+        'comment': [
+            (r'[^*)]', Comment.Multiline),
+            include('comment_start'),
+            (r'\*\)', Comment.Multiline, '#pop'),
+            (r'[*)]', Comment.Multiline),
+        ],
+        'identifier': [
+            (r'([a-zA-Z][\w \-]*)', Keyword),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pascal.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pascal.py
new file mode 100644
index 000000000..5f40dcc86
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pascal.py
@@ -0,0 +1,644 @@
+"""
+    pygments.lexers.pascal
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Pascal family languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer
+from pygments.util import get_bool_opt, get_list_opt
+from pygments.token import Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error, Whitespace
+from pygments.scanner import Scanner
+
+# compatibility import
+from pygments.lexers.modula2 import Modula2Lexer # noqa: F401
+
+__all__ = ['DelphiLexer', 'PortugolLexer']
+
+
+class PortugolLexer(Lexer):
+    """For Portugol, a Pascal dialect with keywords in Portuguese."""
+    name = 'Portugol'
+    aliases = ['portugol']
+    filenames = ['*.alg', '*.portugol']
+    mimetypes = []
+    url = "https://www.apoioinformatica.inf.br/produtos/visualg/linguagem"
+    version_added = ''
+
+    def __init__(self, **options):
+        Lexer.__init__(self, **options)
+        self.lexer = DelphiLexer(**options, portugol=True)
+
+    def get_tokens_unprocessed(self, text):
+        return self.lexer.get_tokens_unprocessed(text)
+
+
+class DelphiLexer(Lexer):
+    """
+    For Delphi (Borland Object Pascal),
+    Turbo Pascal and Free Pascal source code.
+
+    Additional options accepted:
+
+    `turbopascal`
+        Highlight Turbo Pascal specific keywords (default: ``True``).
+    `delphi`
+        Highlight Borland Delphi specific keywords (default: ``True``).
+    `freepascal`
+        Highlight Free Pascal specific keywords (default: ``True``).
+    `units`
+        A list of units that should be considered builtin, supported are
+        ``System``, ``SysUtils``, ``Classes`` and ``Math``.
+        Default is to consider all of them builtin.
+    """
+    name = 'Delphi'
+    aliases = ['delphi', 'pas', 'pascal', 'objectpascal']
+    filenames = ['*.pas', '*.dpr']
+    mimetypes = ['text/x-pascal']
+    url = 'https://www.embarcadero.com/products/delphi'
+    version_added = ''
+
+    TURBO_PASCAL_KEYWORDS = (
+        'absolute', 'and', 'array', 'asm', 'begin', 'break', 'case',
+        'const', 'constructor', 'continue', 'destructor', 'div', 'do',
+        'downto', 'else', 'end', 'file', 'for', 'function', 'goto',
+        'if', 'implementation', 'in', 'inherited', 'inline', 'interface',
+        'label', 'mod', 'nil', 'not', 'object', 'of', 'on', 'operator',
+        'or', 'packed', 'procedure', 'program', 'record', 'reintroduce',
+        'repeat', 'self', 'set', 'shl', 'shr', 'string', 'then', 'to',
+        'type', 'unit', 'until', 'uses', 'var', 'while', 'with', 'xor'
+    )
+
+    DELPHI_KEYWORDS = (
+        'as', 'class', 'except', 'exports', 'finalization', 'finally',
+        'initialization', 'is', 'library', 'on', 'property', 'raise',
+        'threadvar', 'try'
+    )
+
+    FREE_PASCAL_KEYWORDS = (
+        'dispose', 'exit', 'false', 'new', 'true'
+    )
+
+    BLOCK_KEYWORDS = {
+        'begin', 'class', 'const', 'constructor', 'destructor', 'end',
+        'finalization', 'function', 'implementation', 'initialization',
+        'label', 'library', 'operator', 'procedure', 'program', 'property',
+        'record', 'threadvar', 'type', 'unit', 'uses', 'var'
+    }
+
+    FUNCTION_MODIFIERS = {
+        'alias', 'cdecl', 'export', 'inline', 'interrupt', 'nostackframe',
+        'pascal', 'register', 'safecall', 'softfloat', 'stdcall',
+        'varargs', 'name', 'dynamic', 'near', 'virtual', 'external',
+        'override', 'assembler'
+    }
+
+    # XXX: those aren't global. but currently we know no way for defining
+    #      them just for the type context.
+    DIRECTIVES = {
+        'absolute', 'abstract', 'assembler', 'cppdecl', 'default', 'far',
+        'far16', 'forward', 'index', 'oldfpccall', 'private', 'protected',
+        'published', 'public'
+    }
+
+    BUILTIN_TYPES = {
+        'ansichar', 'ansistring', 'bool', 'boolean', 'byte', 'bytebool',
+        'cardinal', 'char', 'comp', 'currency', 'double', 'dword',
+        'extended', 'int64', 'integer', 'iunknown', 'longbool', 'longint',
+        'longword', 'pansichar', 'pansistring', 'pbool', 'pboolean',
+        'pbyte', 'pbytearray', 'pcardinal', 'pchar', 'pcomp', 'pcurrency',
+        'pdate', 'pdatetime', 'pdouble', 'pdword', 'pextended', 'phandle',
+        'pint64', 'pinteger', 'plongint', 'plongword', 'pointer',
+        'ppointer', 'pshortint', 'pshortstring', 'psingle', 'psmallint',
+        'pstring', 'pvariant', 'pwidechar', 'pwidestring', 'pword',
+        'pwordarray', 'pwordbool', 'real', 'real48', 'shortint',
+        'shortstring', 'single', 'smallint', 'string', 'tclass', 'tdate',
+        'tdatetime', 'textfile', 'thandle', 'tobject', 'ttime', 'variant',
+        'widechar', 'widestring', 'word', 'wordbool'
+    }
+
+    BUILTIN_UNITS = {
+        'System': (
+            'abs', 'acquireexceptionobject', 'addr', 'ansitoutf8',
+            'append', 'arctan', 'assert', 'assigned', 'assignfile',
+            'beginthread', 'blockread', 'blockwrite', 'break', 'chdir',
+            'chr', 'close', 'closefile', 'comptocurrency', 'comptodouble',
+            'concat', 'continue', 'copy', 'cos', 'dec', 'delete',
+            'dispose', 'doubletocomp', 'endthread', 'enummodules',
+            'enumresourcemodules', 'eof', 'eoln', 'erase', 'exceptaddr',
+            'exceptobject', 'exclude', 'exit', 'exp', 'filepos', 'filesize',
+            'fillchar', 'finalize', 'findclasshinstance', 'findhinstance',
+            'findresourcehinstance', 'flush', 'frac', 'freemem',
+            'get8087cw', 'getdir', 'getlasterror', 'getmem',
+            'getmemorymanager', 'getmodulefilename', 'getvariantmanager',
+            'halt', 'hi', 'high', 'inc', 'include', 'initialize', 'insert',
+            'int', 'ioresult', 'ismemorymanagerset', 'isvariantmanagerset',
+            'length', 'ln', 'lo', 'low', 'mkdir', 'move', 'new', 'odd',
+            'olestrtostring', 'olestrtostrvar', 'ord', 'paramcount',
+            'paramstr', 'pi', 'pos', 'pred', 'ptr', 'pucs4chars', 'random',
+            'randomize', 'read', 'readln', 'reallocmem',
+            'releaseexceptionobject', 'rename', 'reset', 'rewrite', 'rmdir',
+            'round', 'runerror', 'seek', 'seekeof', 'seekeoln',
+            'set8087cw', 'setlength', 'setlinebreakstyle',
+            'setmemorymanager', 'setstring', 'settextbuf',
+            'setvariantmanager', 'sin', 'sizeof', 'slice', 'sqr', 'sqrt',
+            'str', 'stringofchar', 'stringtoolestr', 'stringtowidechar',
+            'succ', 'swap', 'trunc', 'truncate', 'typeinfo',
+            'ucs4stringtowidestring', 'unicodetoutf8', 'uniquestring',
+            'upcase', 'utf8decode', 'utf8encode', 'utf8toansi',
+            'utf8tounicode', 'val', 'vararrayredim', 'varclear',
+            'widecharlentostring', 'widecharlentostrvar',
+            'widechartostring', 'widechartostrvar',
+            'widestringtoucs4string', 'write', 'writeln'
+        ),
+        'SysUtils': (
+            'abort', 'addexitproc', 'addterminateproc', 'adjustlinebreaks',
+            'allocmem', 'ansicomparefilename', 'ansicomparestr',
+            'ansicomparetext', 'ansidequotedstr', 'ansiextractquotedstr',
+            'ansilastchar', 'ansilowercase', 'ansilowercasefilename',
+            'ansipos', 'ansiquotedstr', 'ansisamestr', 'ansisametext',
+            'ansistrcomp', 'ansistricomp', 'ansistrlastchar', 'ansistrlcomp',
+            'ansistrlicomp', 'ansistrlower', 'ansistrpos', 'ansistrrscan',
+            'ansistrscan', 'ansistrupper', 'ansiuppercase',
+            'ansiuppercasefilename', 'appendstr', 'assignstr', 'beep',
+            'booltostr', 'bytetocharindex', 'bytetocharlen', 'bytetype',
+            'callterminateprocs', 'changefileext', 'charlength',
+            'chartobyteindex', 'chartobytelen', 'comparemem', 'comparestr',
+            'comparetext', 'createdir', 'createguid', 'currentyear',
+            'currtostr', 'currtostrf', 'date', 'datetimetofiledate',
+            'datetimetostr', 'datetimetostring', 'datetimetosystemtime',
+            'datetimetotimestamp', 'datetostr', 'dayofweek', 'decodedate',
+            'decodedatefully', 'decodetime', 'deletefile', 'directoryexists',
+            'diskfree', 'disksize', 'disposestr', 'encodedate', 'encodetime',
+            'exceptionerrormessage', 'excludetrailingbackslash',
+            'excludetrailingpathdelimiter', 'expandfilename',
+            'expandfilenamecase', 'expanduncfilename', 'extractfiledir',
+            'extractfiledrive', 'extractfileext', 'extractfilename',
+            'extractfilepath', 'extractrelativepath', 'extractshortpathname',
+            'fileage', 'fileclose', 'filecreate', 'filedatetodatetime',
+            'fileexists', 'filegetattr', 'filegetdate', 'fileisreadonly',
+            'fileopen', 'fileread', 'filesearch', 'fileseek', 'filesetattr',
+            'filesetdate', 'filesetreadonly', 'filewrite', 'finalizepackage',
+            'findclose', 'findcmdlineswitch', 'findfirst', 'findnext',
+            'floattocurr', 'floattodatetime', 'floattodecimal', 'floattostr',
+            'floattostrf', 'floattotext', 'floattotextfmt', 'fmtloadstr',
+            'fmtstr', 'forcedirectories', 'format', 'formatbuf', 'formatcurr',
+            'formatdatetime', 'formatfloat', 'freeandnil', 'getcurrentdir',
+            'getenvironmentvariable', 'getfileversion', 'getformatsettings',
+            'getlocaleformatsettings', 'getmodulename', 'getpackagedescription',
+            'getpackageinfo', 'gettime', 'guidtostring', 'incamonth',
+            'includetrailingbackslash', 'includetrailingpathdelimiter',
+            'incmonth', 'initializepackage', 'interlockeddecrement',
+            'interlockedexchange', 'interlockedexchangeadd',
+            'interlockedincrement', 'inttohex', 'inttostr', 'isdelimiter',
+            'isequalguid', 'isleapyear', 'ispathdelimiter', 'isvalidident',
+            'languages', 'lastdelimiter', 'loadpackage', 'loadstr',
+            'lowercase', 'msecstotimestamp', 'newstr', 'nextcharindex', 'now',
+            'outofmemoryerror', 'quotedstr', 'raiselastoserror',
+            'raiselastwin32error', 'removedir', 'renamefile', 'replacedate',
+            'replacetime', 'safeloadlibrary', 'samefilename', 'sametext',
+            'setcurrentdir', 'showexception', 'sleep', 'stralloc', 'strbufsize',
+            'strbytetype', 'strcat', 'strcharlength', 'strcomp', 'strcopy',
+            'strdispose', 'strecopy', 'strend', 'strfmt', 'stricomp',
+            'stringreplace', 'stringtoguid', 'strlcat', 'strlcomp', 'strlcopy',
+            'strlen', 'strlfmt', 'strlicomp', 'strlower', 'strmove', 'strnew',
+            'strnextchar', 'strpas', 'strpcopy', 'strplcopy', 'strpos',
+            'strrscan', 'strscan', 'strtobool', 'strtobooldef', 'strtocurr',
+            'strtocurrdef', 'strtodate', 'strtodatedef', 'strtodatetime',
+            'strtodatetimedef', 'strtofloat', 'strtofloatdef', 'strtoint',
+            'strtoint64', 'strtoint64def', 'strtointdef', 'strtotime',
+            'strtotimedef', 'strupper', 'supports', 'syserrormessage',
+            'systemtimetodatetime', 'texttofloat', 'time', 'timestamptodatetime',
+            'timestamptomsecs', 'timetostr', 'trim', 'trimleft', 'trimright',
+            'tryencodedate', 'tryencodetime', 'tryfloattocurr', 'tryfloattodatetime',
+            'trystrtobool', 'trystrtocurr', 'trystrtodate', 'trystrtodatetime',
+            'trystrtofloat', 'trystrtoint', 'trystrtoint64', 'trystrtotime',
+            'unloadpackage', 'uppercase', 'widecomparestr', 'widecomparetext',
+            'widefmtstr', 'wideformat', 'wideformatbuf', 'widelowercase',
+            'widesamestr', 'widesametext', 'wideuppercase', 'win32check',
+            'wraptext'
+        ),
+        'Classes': (
+            'activateclassgroup', 'allocatehwnd', 'bintohex', 'checksynchronize',
+            'collectionsequal', 'countgenerations', 'deallocatehwnd', 'equalrect',
+            'extractstrings', 'findclass', 'findglobalcomponent', 'getclass',
+            'groupdescendantswith', 'hextobin', 'identtoint',
+            'initinheritedcomponent', 'inttoident', 'invalidpoint',
+            'isuniqueglobalcomponentname', 'linestart', 'objectbinarytotext',
+            'objectresourcetotext', 'objecttexttobinary', 'objecttexttoresource',
+            'pointsequal', 'readcomponentres', 'readcomponentresex',
+            'readcomponentresfile', 'rect', 'registerclass', 'registerclassalias',
+            'registerclasses', 'registercomponents', 'registerintegerconsts',
+            'registernoicon', 'registernonactivex', 'smallpoint', 'startclassgroup',
+            'teststreamformat', 'unregisterclass', 'unregisterclasses',
+            'unregisterintegerconsts', 'unregistermoduleclasses',
+            'writecomponentresfile'
+        ),
+        'Math': (
+            'arccos', 'arccosh', 'arccot', 'arccoth', 'arccsc', 'arccsch', 'arcsec',
+            'arcsech', 'arcsin', 'arcsinh', 'arctan2', 'arctanh', 'ceil',
+            'comparevalue', 'cosecant', 'cosh', 'cot', 'cotan', 'coth', 'csc',
+            'csch', 'cycletodeg', 'cycletograd', 'cycletorad', 'degtocycle',
+            'degtograd', 'degtorad', 'divmod', 'doubledecliningbalance',
+            'ensurerange', 'floor', 'frexp', 'futurevalue', 'getexceptionmask',
+            'getprecisionmode', 'getroundmode', 'gradtocycle', 'gradtodeg',
+            'gradtorad', 'hypot', 'inrange', 'interestpayment', 'interestrate',
+            'internalrateofreturn', 'intpower', 'isinfinite', 'isnan', 'iszero',
+            'ldexp', 'lnxp1', 'log10', 'log2', 'logn', 'max', 'maxintvalue',
+            'maxvalue', 'mean', 'meanandstddev', 'min', 'minintvalue', 'minvalue',
+            'momentskewkurtosis', 'netpresentvalue', 'norm', 'numberofperiods',
+            'payment', 'periodpayment', 'poly', 'popnstddev', 'popnvariance',
+            'power', 'presentvalue', 'radtocycle', 'radtodeg', 'radtograd',
+            'randg', 'randomrange', 'roundto', 'samevalue', 'sec', 'secant',
+            'sech', 'setexceptionmask', 'setprecisionmode', 'setroundmode',
+            'sign', 'simpleroundto', 'sincos', 'sinh', 'slndepreciation', 'stddev',
+            'sum', 'sumint', 'sumofsquares', 'sumsandsquares', 'syddepreciation',
+            'tan', 'tanh', 'totalvariance', 'variance'
+        )
+    }
+
+    ASM_REGISTERS = {
+        'ah', 'al', 'ax', 'bh', 'bl', 'bp', 'bx', 'ch', 'cl', 'cr0',
+        'cr1', 'cr2', 'cr3', 'cr4', 'cs', 'cx', 'dh', 'di', 'dl', 'dr0',
+        'dr1', 'dr2', 'dr3', 'dr4', 'dr5', 'dr6', 'dr7', 'ds', 'dx',
+        'eax', 'ebp', 'ebx', 'ecx', 'edi', 'edx', 'es', 'esi', 'esp',
+        'fs', 'gs', 'mm0', 'mm1', 'mm2', 'mm3', 'mm4', 'mm5', 'mm6',
+        'mm7', 'si', 'sp', 'ss', 'st0', 'st1', 'st2', 'st3', 'st4', 'st5',
+        'st6', 'st7', 'xmm0', 'xmm1', 'xmm2', 'xmm3', 'xmm4', 'xmm5',
+        'xmm6', 'xmm7'
+    }
+
+    ASM_INSTRUCTIONS = {
+        'aaa', 'aad', 'aam', 'aas', 'adc', 'add', 'and', 'arpl', 'bound',
+        'bsf', 'bsr', 'bswap', 'bt', 'btc', 'btr', 'bts', 'call', 'cbw',
+        'cdq', 'clc', 'cld', 'cli', 'clts', 'cmc', 'cmova', 'cmovae',
+        'cmovb', 'cmovbe', 'cmovc', 'cmovcxz', 'cmove', 'cmovg',
+        'cmovge', 'cmovl', 'cmovle', 'cmovna', 'cmovnae', 'cmovnb',
+        'cmovnbe', 'cmovnc', 'cmovne', 'cmovng', 'cmovnge', 'cmovnl',
+        'cmovnle', 'cmovno', 'cmovnp', 'cmovns', 'cmovnz', 'cmovo',
+        'cmovp', 'cmovpe', 'cmovpo', 'cmovs', 'cmovz', 'cmp', 'cmpsb',
+        'cmpsd', 'cmpsw', 'cmpxchg', 'cmpxchg486', 'cmpxchg8b', 'cpuid',
+        'cwd', 'cwde', 'daa', 'das', 'dec', 'div', 'emms', 'enter', 'hlt',
+        'ibts', 'icebp', 'idiv', 'imul', 'in', 'inc', 'insb', 'insd',
+        'insw', 'int', 'int01', 'int03', 'int1', 'int3', 'into', 'invd',
+        'invlpg', 'iret', 'iretd', 'iretw', 'ja', 'jae', 'jb', 'jbe',
+        'jc', 'jcxz', 'jcxz', 'je', 'jecxz', 'jg', 'jge', 'jl', 'jle',
+        'jmp', 'jna', 'jnae', 'jnb', 'jnbe', 'jnc', 'jne', 'jng', 'jnge',
+        'jnl', 'jnle', 'jno', 'jnp', 'jns', 'jnz', 'jo', 'jp', 'jpe',
+        'jpo', 'js', 'jz', 'lahf', 'lar', 'lcall', 'lds', 'lea', 'leave',
+        'les', 'lfs', 'lgdt', 'lgs', 'lidt', 'ljmp', 'lldt', 'lmsw',
+        'loadall', 'loadall286', 'lock', 'lodsb', 'lodsd', 'lodsw',
+        'loop', 'loope', 'loopne', 'loopnz', 'loopz', 'lsl', 'lss', 'ltr',
+        'mov', 'movd', 'movq', 'movsb', 'movsd', 'movsw', 'movsx',
+        'movzx', 'mul', 'neg', 'nop', 'not', 'or', 'out', 'outsb', 'outsd',
+        'outsw', 'pop', 'popa', 'popad', 'popaw', 'popf', 'popfd', 'popfw',
+        'push', 'pusha', 'pushad', 'pushaw', 'pushf', 'pushfd', 'pushfw',
+        'rcl', 'rcr', 'rdmsr', 'rdpmc', 'rdshr', 'rdtsc', 'rep', 'repe',
+        'repne', 'repnz', 'repz', 'ret', 'retf', 'retn', 'rol', 'ror',
+        'rsdc', 'rsldt', 'rsm', 'sahf', 'sal', 'salc', 'sar', 'sbb',
+        'scasb', 'scasd', 'scasw', 'seta', 'setae', 'setb', 'setbe',
+        'setc', 'setcxz', 'sete', 'setg', 'setge', 'setl', 'setle',
+        'setna', 'setnae', 'setnb', 'setnbe', 'setnc', 'setne', 'setng',
+        'setnge', 'setnl', 'setnle', 'setno', 'setnp', 'setns', 'setnz',
+        'seto', 'setp', 'setpe', 'setpo', 'sets', 'setz', 'sgdt', 'shl',
+        'shld', 'shr', 'shrd', 'sidt', 'sldt', 'smi', 'smint', 'smintold',
+        'smsw', 'stc', 'std', 'sti', 'stosb', 'stosd', 'stosw', 'str',
+        'sub', 'svdc', 'svldt', 'svts', 'syscall', 'sysenter', 'sysexit',
+        'sysret', 'test', 'ud1', 'ud2', 'umov', 'verr', 'verw', 'wait',
+        'wbinvd', 'wrmsr', 'wrshr', 'xadd', 'xbts', 'xchg', 'xlat',
+        'xlatb', 'xor'
+    }
+
+    PORTUGOL_KEYWORDS = (
+        'aleatorio',
+        'algoritmo',
+        'arquivo',
+        'ate',
+        'caso',
+        'cronometro',
+        'debug',
+        'e',
+        'eco',
+        'enquanto',
+        'entao',
+        'escolha',
+        'escreva',
+        'escreval',
+        'faca',
+        'falso',
+        'fimalgoritmo',
+        'fimenquanto',
+        'fimescolha',
+        'fimfuncao',
+        'fimpara',
+        'fimprocedimento',
+        'fimrepita',
+        'fimse',
+        'funcao',
+        'inicio',
+        'int',
+        'interrompa',
+        'leia',
+        'limpatela',
+        'mod',
+        'nao',
+        'ou',
+        'outrocaso',
+        'para',
+        'passo',
+        'pausa',
+        'procedimento',
+        'repita',
+        'retorne',
+        'se',
+        'senao',
+        'timer',
+        'var',
+        'vetor',
+        'verdadeiro',
+        'xou',
+        'div',
+        'mod',
+        'abs',
+        'arccos',
+        'arcsen',
+        'arctan',
+        'cos',
+        'cotan',
+        'Exp',
+        'grauprad',
+        'int',
+        'log',
+        'logn',
+        'pi',
+        'quad',
+        'radpgrau',
+        'raizq',
+        'rand',
+        'randi',
+        'sen',
+        'Tan',
+        'asc',
+        'carac',
+        'caracpnum',
+        'compr',
+        'copia',
+        'maiusc',
+        'minusc',
+        'numpcarac',
+        'pos',
+    )
+
+    PORTUGOL_BUILTIN_TYPES = {
+        'inteiro', 'real', 'caractere', 'logico'
+    }
+
+    def __init__(self, **options):
+        Lexer.__init__(self, **options)
+        self.keywords = set()
+        self.builtins = set()
+        if get_bool_opt(options, 'portugol', False):
+            self.keywords.update(self.PORTUGOL_KEYWORDS)
+            self.builtins.update(self.PORTUGOL_BUILTIN_TYPES)
+            self.is_portugol = True
+        else:
+            self.is_portugol = False
+
+            if get_bool_opt(options, 'turbopascal', True):
+                self.keywords.update(self.TURBO_PASCAL_KEYWORDS)
+            if get_bool_opt(options, 'delphi', True):
+                self.keywords.update(self.DELPHI_KEYWORDS)
+            if get_bool_opt(options, 'freepascal', True):
+                self.keywords.update(self.FREE_PASCAL_KEYWORDS)
+            for unit in get_list_opt(options, 'units', list(self.BUILTIN_UNITS)):
+                self.builtins.update(self.BUILTIN_UNITS[unit])
+
+    def get_tokens_unprocessed(self, text):
+        scanner = Scanner(text, re.DOTALL | re.MULTILINE | re.IGNORECASE)
+        stack = ['initial']
+        in_function_block = False
+        in_property_block = False
+        was_dot = False
+        next_token_is_function = False
+        next_token_is_property = False
+        collect_labels = False
+        block_labels = set()
+        brace_balance = [0, 0]
+
+        while not scanner.eos:
+            token = Error
+
+            if stack[-1] == 'initial':
+                if scanner.scan(r'\s+'):
+                    token = Whitespace
+                elif not self.is_portugol and scanner.scan(r'\{.*?\}|\(\*.*?\*\)'):
+                    if scanner.match.startswith('$'):
+                        token = Comment.Preproc
+                    else:
+                        token = Comment.Multiline
+                elif scanner.scan(r'//.*?$'):
+                    token = Comment.Single
+                elif self.is_portugol and scanner.scan(r'(<\-)|(>=)|(<=)|%|<|>|-|\+|\*|\=|(<>)|\/|\.|:|,'):
+                    token = Operator
+                elif not self.is_portugol and scanner.scan(r'[-+*\/=<>:;,.@\^]'):
+                    token = Operator
+                    # stop label highlighting on next ";"
+                    if collect_labels and scanner.match == ';':
+                        collect_labels = False
+                elif scanner.scan(r'[\(\)\[\]]+'):
+                    token = Punctuation
+                    # abort function naming ``foo = Function(...)``
+                    next_token_is_function = False
+                    # if we are in a function block we count the open
+                    # braces because ootherwise it's impossible to
+                    # determine the end of the modifier context
+                    if in_function_block or in_property_block:
+                        if scanner.match == '(':
+                            brace_balance[0] += 1
+                        elif scanner.match == ')':
+                            brace_balance[0] -= 1
+                        elif scanner.match == '[':
+                            brace_balance[1] += 1
+                        elif scanner.match == ']':
+                            brace_balance[1] -= 1
+                elif scanner.scan(r'[A-Za-z_][A-Za-z_0-9]*'):
+                    lowercase_name = scanner.match.lower()
+                    if lowercase_name == 'result':
+                        token = Name.Builtin.Pseudo
+                    elif lowercase_name in self.keywords:
+                        token = Keyword
+                        # if we are in a special block and a
+                        # block ending keyword occurs (and the parenthesis
+                        # is balanced) we end the current block context
+                        if self.is_portugol:
+                            if lowercase_name in ('funcao', 'procedimento'):
+                                in_function_block = True
+                                next_token_is_function = True
+                        else:
+                            if (in_function_block or in_property_block) and \
+                                    lowercase_name in self.BLOCK_KEYWORDS and \
+                                    brace_balance[0] <= 0 and \
+                                    brace_balance[1] <= 0:
+                                in_function_block = False
+                                in_property_block = False
+                                brace_balance = [0, 0]
+                                block_labels = set()
+                            if lowercase_name in ('label', 'goto'):
+                                collect_labels = True
+                            elif lowercase_name == 'asm':
+                                stack.append('asm')
+                            elif lowercase_name == 'property':
+                                in_property_block = True
+                                next_token_is_property = True
+                            elif lowercase_name in ('procedure', 'operator',
+                                                    'function', 'constructor',
+                                                    'destructor'):
+                                in_function_block = True
+                                next_token_is_function = True
+                    # we are in a function block and the current name
+                    # is in the set of registered modifiers. highlight
+                    # it as pseudo keyword
+                    elif not self.is_portugol and in_function_block and \
+                            lowercase_name in self.FUNCTION_MODIFIERS:
+                        token = Keyword.Pseudo
+                    # if we are in a property highlight some more
+                    # modifiers
+                    elif not self.is_portugol and in_property_block and \
+                            lowercase_name in ('read', 'write'):
+                        token = Keyword.Pseudo
+                        next_token_is_function = True
+                    # if the last iteration set next_token_is_function
+                    # to true we now want this name highlighted as
+                    # function. so do that and reset the state
+                    elif next_token_is_function:
+                        # Look if the next token is a dot. If yes it's
+                        # not a function, but a class name and the
+                        # part after the dot a function name
+                        if not self.is_portugol and scanner.test(r'\s*\.\s*'):
+                            token = Name.Class
+                        # it's not a dot, our job is done
+                        else:
+                            token = Name.Function
+                            next_token_is_function = False
+
+                            if self.is_portugol:
+                                block_labels.add(scanner.match.lower())
+
+                    # same for properties
+                    elif not self.is_portugol and next_token_is_property:
+                        token = Name.Property
+                        next_token_is_property = False
+                    # Highlight this token as label and add it
+                    # to the list of known labels
+                    elif not self.is_portugol and collect_labels:
+                        token = Name.Label
+                        block_labels.add(scanner.match.lower())
+                    # name is in list of known labels
+                    elif lowercase_name in block_labels:
+                        token = Name.Label
+                    elif self.is_portugol and lowercase_name in self.PORTUGOL_BUILTIN_TYPES:
+                        token = Keyword.Type
+                    elif not self.is_portugol and lowercase_name in self.BUILTIN_TYPES:
+                        token = Keyword.Type
+                    elif not self.is_portugol and lowercase_name in self.DIRECTIVES:
+                        token = Keyword.Pseudo
+                    # builtins are just builtins if the token
+                    # before isn't a dot
+                    elif not self.is_portugol and not was_dot and lowercase_name in self.builtins:
+                        token = Name.Builtin
+                    else:
+                        token = Name
+                elif self.is_portugol and scanner.scan(r"\""):
+                    token = String
+                    stack.append('string')
+                elif not self.is_portugol and scanner.scan(r"'"):
+                    token = String
+                    stack.append('string')
+                elif not self.is_portugol and scanner.scan(r'\#(\d+|\$[0-9A-Fa-f]+)'):
+                    token = String.Char
+                elif not self.is_portugol and scanner.scan(r'\$[0-9A-Fa-f]+'):
+                    token = Number.Hex
+                elif scanner.scan(r'\d+(?![eE]|\.[^.])'):
+                    token = Number.Integer
+                elif scanner.scan(r'\d+(\.\d+([eE][+-]?\d+)?|[eE][+-]?\d+)'):
+                    token = Number.Float
+                else:
+                    # if the stack depth is deeper than once, pop
+                    if len(stack) > 1:
+                        stack.pop()
+                    scanner.get_char()
+
+            elif stack[-1] == 'string':
+                if self.is_portugol:
+                    if scanner.scan(r"''"):
+                        token = String.Escape
+                    elif scanner.scan(r"\""):
+                        token = String
+                        stack.pop()
+                    elif scanner.scan(r"[^\"]*"):
+                        token = String
+                    else:
+                        scanner.get_char()
+                        stack.pop()
+                else:
+                    if scanner.scan(r"''"):
+                        token = String.Escape
+                    elif scanner.scan(r"'"):
+                        token = String
+                        stack.pop()
+                    elif scanner.scan(r"[^']*"):
+                        token = String
+                    else:
+                        scanner.get_char()
+                        stack.pop()
+            elif not self.is_portugol and stack[-1] == 'asm':
+                if scanner.scan(r'\s+'):
+                    token = Whitespace
+                elif scanner.scan(r'end'):
+                    token = Keyword
+                    stack.pop()
+                elif scanner.scan(r'\{.*?\}|\(\*.*?\*\)'):
+                    if scanner.match.startswith('$'):
+                        token = Comment.Preproc
+                    else:
+                        token = Comment.Multiline
+                elif scanner.scan(r'//.*?$'):
+                    token = Comment.Single
+                elif scanner.scan(r"'"):
+                    token = String
+                    stack.append('string')
+                elif scanner.scan(r'@@[A-Za-z_][A-Za-z_0-9]*'):
+                    token = Name.Label
+                elif scanner.scan(r'[A-Za-z_][A-Za-z_0-9]*'):
+                    lowercase_name = scanner.match.lower()
+                    if lowercase_name in self.ASM_INSTRUCTIONS:
+                        token = Keyword
+                    elif lowercase_name in self.ASM_REGISTERS:
+                        token = Name.Builtin
+                    else:
+                        token = Name
+                elif scanner.scan(r'[-+*\/=<>:;,.@\^]+'):
+                    token = Operator
+                elif scanner.scan(r'[\(\)\[\]]+'):
+                    token = Punctuation
+                elif scanner.scan(r'\$[0-9A-Fa-f]+'):
+                    token = Number.Hex
+                elif scanner.scan(r'\d+(?![eE]|\.[^.])'):
+                    token = Number.Integer
+                elif scanner.scan(r'\d+(\.\d+([eE][+-]?\d+)?|[eE][+-]?\d+)'):
+                    token = Number.Float
+                else:
+                    scanner.get_char()
+                    stack.pop()
+
+            # save the dot!!!11
+            if not self.is_portugol and scanner.match.strip():
+                was_dot = scanner.match == '.'
+
+            yield scanner.start_pos, token, scanner.match or ''
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pawn.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pawn.py
new file mode 100644
index 000000000..99d9c963d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pawn.py
@@ -0,0 +1,202 @@
+"""
+    pygments.lexers.pawn
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Pawn languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+from pygments.util import get_bool_opt
+
+__all__ = ['SourcePawnLexer', 'PawnLexer']
+
+
+class SourcePawnLexer(RegexLexer):
+    """
+    For SourcePawn source code with preprocessor directives.
+    """
+    name = 'SourcePawn'
+    aliases = ['sp']
+    filenames = ['*.sp']
+    mimetypes = ['text/x-sourcepawn']
+    url = 'https://github.com/alliedmodders/sourcepawn'
+    version_added = '1.6'
+
+    #: optional Comment or Whitespace
+    _ws = r'(?:\s|//.*?\n|/\*.*?\*/)+'
+    #: only one /* */ style comment
+    _ws1 = r'\s*(?:/[*].*?[*]/\s*)*'
+
+    tokens = {
+        'root': [
+            # preprocessor directives: without whitespace
+            (r'^#if\s+0', Comment.Preproc, 'if0'),
+            ('^#', Comment.Preproc, 'macro'),
+            # or with whitespace
+            ('^' + _ws1 + r'#if\s+0', Comment.Preproc, 'if0'),
+            ('^' + _ws1 + '#', Comment.Preproc, 'macro'),
+            (r'\n', Text),
+            (r'\s+', Text),
+            (r'\\\n', Text),  # line continuation
+            (r'/(\\\n)?/(\n|(.|\n)*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?\*(.|\n)*?\*(\\\n)?/', Comment.Multiline),
+            (r'[{}]', Punctuation),
+            (r'L?"', String, 'string'),
+            (r"L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*', Number.Float),
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex),
+            (r'0[0-7]+[LlUu]*', Number.Oct),
+            (r'\d+[LlUu]*', Number.Integer),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[()\[\],.;]', Punctuation),
+            (r'(case|const|continue|native|'
+             r'default|else|enum|for|if|new|operator|'
+             r'public|return|sizeof|static|decl|struct|switch)\b', Keyword),
+            (r'(bool|Float)\b', Keyword.Type),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),       # line continuation
+            (r'\\', String),         # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/\*(.|\n)*?\*/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?/-]', Operator),
+            (r'[()\[\],.;]', Punctuation),
+            (r'(switch|case|default|const|new|static|char|continue|break|'
+             r'if|else|for|while|do|operator|enum|'
+             r'public|return|sizeof|tagof|state|goto)\b', Keyword),
+            (r'(bool|Float)\b', Keyword.Type),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
+            (r'[^\\"\n]+', String),  # all other characters
+            (r'\\\n', String),       # line continuation
+            (r'\\', String),         # stray backslash
+        ],
+        'macro': [
+            (r'[^/\n]+', Comment.Preproc),
+            (r'/\*(.|\n)*?\*/', Comment.Multiline),
+            (r'//.*?\n', Comment.Single, '#pop'),
+            (r'/', Comment.Preproc),
+            (r'(?<=\\)\n', Comment.Preproc),
+            (r'\n', Comment.Preproc, '#pop'),
+        ],
+        'if0': [
+            (r'^\s*#if.*?(?<-]', Operator),
+            (r'[a-zA-Z][a-zA-Z0-9_-]*', Name),
+            (r'\?[a-zA-Z][a-zA-Z0-9_-]*', Name.Variable),
+            (r'[0-9]+\.[0-9]+', Number.Float),
+            (r'[0-9]+', Number.Integer),
+        ],
+        'keywords': [
+            (words((
+                ':requirements', ':types', ':constants',
+                ':predicates', ':functions', ':action', ':agent',
+                ':parameters', ':precondition', ':effect',
+                ':durative-action', ':duration', ':condition',
+                ':derived', ':domain', ':objects', ':init',
+                ':goal', ':metric', ':length', ':serial', ':parallel',
+                # the following are requirements
+                ':strips', ':typing', ':negative-preconditions',
+                ':disjunctive-preconditions', ':equality',
+                ':existential-preconditions', ':universal-preconditions',
+                ':conditional-effects', ':fluents', ':numeric-fluents',
+                ':object-fluents', ':adl', ':durative-actions',
+                ':continuous-effects', ':derived-predicates',
+                ':time-intial-literals', ':preferences',
+                ':constraints', ':action-costs', ':multi-agent',
+                ':unfactored-privacy', ':factored-privacy',
+                ':non-deterministic'
+                ), suffix=r'\b'), Keyword)
+        ],
+        'builtins': [
+            (words((
+                'define', 'domain', 'object', 'either', 'and',
+                'forall', 'preference', 'imply', 'or', 'exists',
+                'not', 'when', 'assign', 'scale-up', 'scale-down',
+                'increase', 'decrease', 'at', 'over', 'start',
+                'end', 'all', 'problem', 'always', 'sometime',
+                'within', 'at-most-once', 'sometime-after',
+                'sometime-before', 'always-within', 'hold-during',
+                'hold-after', 'minimize', 'maximize',
+                'total-time', 'is-violated'), suffix=r'\b'),
+                Name.Builtin)
+        ]
+    }
+
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/perl.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/perl.py
new file mode 100644
index 000000000..33f91f580
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/perl.py
@@ -0,0 +1,733 @@
+"""
+    pygments.lexers.perl
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Perl, Raku and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, bygroups, \
+    using, this, default, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+from pygments.util import shebang_matches
+
+__all__ = ['PerlLexer', 'Perl6Lexer']
+
+
+class PerlLexer(RegexLexer):
+    """
+    For Perl source code.
+    """
+
+    name = 'Perl'
+    url = 'https://www.perl.org'
+    aliases = ['perl', 'pl']
+    filenames = ['*.pl', '*.pm', '*.t', '*.perl']
+    mimetypes = ['text/x-perl', 'application/x-perl']
+    version_added = ''
+
+    flags = re.DOTALL | re.MULTILINE
+    # TODO: give this to a perl guy who knows how to parse perl...
+    tokens = {
+        'balanced-regex': [
+            (r'/(\\\\|\\[^\\]|[^\\/])*/[egimosx]*', String.Regex, '#pop'),
+            (r'!(\\\\|\\[^\\]|[^\\!])*![egimosx]*', String.Regex, '#pop'),
+            (r'\\(\\\\|[^\\])*\\[egimosx]*', String.Regex, '#pop'),
+            (r'\{(\\\\|\\[^\\]|[^\\}])*\}[egimosx]*', String.Regex, '#pop'),
+            (r'<(\\\\|\\[^\\]|[^\\>])*>[egimosx]*', String.Regex, '#pop'),
+            (r'\[(\\\\|\\[^\\]|[^\\\]])*\][egimosx]*', String.Regex, '#pop'),
+            (r'\((\\\\|\\[^\\]|[^\\)])*\)[egimosx]*', String.Regex, '#pop'),
+            (r'@(\\\\|\\[^\\]|[^\\@])*@[egimosx]*', String.Regex, '#pop'),
+            (r'%(\\\\|\\[^\\]|[^\\%])*%[egimosx]*', String.Regex, '#pop'),
+            (r'\$(\\\\|\\[^\\]|[^\\$])*\$[egimosx]*', String.Regex, '#pop'),
+        ],
+        'root': [
+            (r'\A\#!.+?$', Comment.Hashbang),
+            (r'\#.*?$', Comment.Single),
+            (r'^=[a-zA-Z0-9]+\s+.*?\n=cut', Comment.Multiline),
+            (words((
+                'case', 'continue', 'do', 'else', 'elsif', 'for', 'foreach',
+                'if', 'last', 'my', 'next', 'our', 'redo', 'reset', 'then',
+                'unless', 'until', 'while', 'print', 'new', 'BEGIN',
+                'CHECK', 'INIT', 'END', 'return'), suffix=r'\b'),
+             Keyword),
+            (r'(format)(\s+)(\w+)(\s*)(=)(\s*\n)',
+             bygroups(Keyword, Whitespace, Name, Whitespace, Punctuation, Whitespace), 'format'),
+            (r'(eq|lt|gt|le|ge|ne|not|and|or|cmp)\b', Operator.Word),
+            # common delimiters
+            (r's/(\\\\|\\[^\\]|[^\\/])*/(\\\\|\\[^\\]|[^\\/])*/[egimosx]*',
+                String.Regex),
+            (r's!(\\\\|\\!|[^!])*!(\\\\|\\!|[^!])*![egimosx]*', String.Regex),
+            (r's\\(\\\\|[^\\])*\\(\\\\|[^\\])*\\[egimosx]*', String.Regex),
+            (r's@(\\\\|\\[^\\]|[^\\@])*@(\\\\|\\[^\\]|[^\\@])*@[egimosx]*',
+                String.Regex),
+            (r's%(\\\\|\\[^\\]|[^\\%])*%(\\\\|\\[^\\]|[^\\%])*%[egimosx]*',
+                String.Regex),
+            # balanced delimiters
+            (r's\{(\\\\|\\[^\\]|[^\\}])*\}\s*', String.Regex, 'balanced-regex'),
+            (r's<(\\\\|\\[^\\]|[^\\>])*>\s*', String.Regex, 'balanced-regex'),
+            (r's\[(\\\\|\\[^\\]|[^\\\]])*\]\s*', String.Regex,
+                'balanced-regex'),
+            (r's\((\\\\|\\[^\\]|[^\\)])*\)\s*', String.Regex,
+                'balanced-regex'),
+
+            (r'm?/(\\\\|\\[^\\]|[^\\/\n])*/[gcimosx]*', String.Regex),
+            (r'm(?=[/!\\{<\[(@%$])', String.Regex, 'balanced-regex'),
+            (r'((?<==~)|(?<=\())\s*/(\\\\|\\[^\\]|[^\\/])*/[gcimosx]*',
+                String.Regex),
+            (r'\s+', Whitespace),
+            (words((
+                'abs', 'accept', 'alarm', 'atan2', 'bind', 'binmode', 'bless', 'caller', 'chdir',
+                'chmod', 'chomp', 'chop', 'chown', 'chr', 'chroot', 'close', 'closedir', 'connect',
+                'continue', 'cos', 'crypt', 'dbmclose', 'dbmopen', 'defined', 'delete', 'die',
+                'dump', 'each', 'endgrent', 'endhostent', 'endnetent', 'endprotoent',
+                'endpwent', 'endservent', 'eof', 'eval', 'exec', 'exists', 'exit', 'exp', 'fcntl',
+                'fileno', 'flock', 'fork', 'format', 'formline', 'getc', 'getgrent', 'getgrgid',
+                'getgrnam', 'gethostbyaddr', 'gethostbyname', 'gethostent', 'getlogin',
+                'getnetbyaddr', 'getnetbyname', 'getnetent', 'getpeername', 'getpgrp',
+                'getppid', 'getpriority', 'getprotobyname', 'getprotobynumber',
+                'getprotoent', 'getpwent', 'getpwnam', 'getpwuid', 'getservbyname',
+                'getservbyport', 'getservent', 'getsockname', 'getsockopt', 'glob', 'gmtime',
+                'goto', 'grep', 'hex', 'import', 'index', 'int', 'ioctl', 'join', 'keys', 'kill', 'last',
+                'lc', 'lcfirst', 'length', 'link', 'listen', 'local', 'localtime', 'log', 'lstat',
+                'map', 'mkdir', 'msgctl', 'msgget', 'msgrcv', 'msgsnd', 'my', 'next', 'oct', 'open',
+                'opendir', 'ord', 'our', 'pack', 'pipe', 'pop', 'pos', 'printf',
+                'prototype', 'push', 'quotemeta', 'rand', 'read', 'readdir',
+                'readline', 'readlink', 'readpipe', 'recv', 'redo', 'ref', 'rename',
+                'reverse', 'rewinddir', 'rindex', 'rmdir', 'scalar', 'seek', 'seekdir',
+                'select', 'semctl', 'semget', 'semop', 'send', 'setgrent', 'sethostent', 'setnetent',
+                'setpgrp', 'setpriority', 'setprotoent', 'setpwent', 'setservent',
+                'setsockopt', 'shift', 'shmctl', 'shmget', 'shmread', 'shmwrite', 'shutdown',
+                'sin', 'sleep', 'socket', 'socketpair', 'sort', 'splice', 'split', 'sprintf', 'sqrt',
+                'srand', 'stat', 'study', 'substr', 'symlink', 'syscall', 'sysopen', 'sysread',
+                'sysseek', 'system', 'syswrite', 'tell', 'telldir', 'tie', 'tied', 'time', 'times', 'tr',
+                'truncate', 'uc', 'ucfirst', 'umask', 'undef', 'unlink', 'unpack', 'unshift', 'untie',
+                'utime', 'values', 'vec', 'wait', 'waitpid', 'wantarray', 'warn', 'write'), suffix=r'\b'),
+             Name.Builtin),
+            (r'((__(DATA|DIE|WARN)__)|(STD(IN|OUT|ERR)))\b', Name.Builtin.Pseudo),
+            (r'(<<)([\'"]?)([a-zA-Z_]\w*)(\2;?\n.*?\n)(\3)(\n)',
+             bygroups(String, String, String.Delimiter, String, String.Delimiter, Whitespace)),
+            (r'__END__', Comment.Preproc, 'end-part'),
+            (r'\$\^[ADEFHILMOPSTWX]', Name.Variable.Global),
+            (r"\$[\\\"\[\]'&`+*.,;=%~?@$!<>(^|/-](?!\w)", Name.Variable.Global),
+            (r'[$@%#]+', Name.Variable, 'varname'),
+            (r'0_?[0-7]+(_[0-7]+)*', Number.Oct),
+            (r'0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*', Number.Hex),
+            (r'0b[01]+(_[01]+)*', Number.Bin),
+            (r'(?i)(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?',
+             Number.Float),
+            (r'(?i)\d+(_\d*)*e[+-]?\d+(_\d*)*', Number.Float),
+            (r'\d+(_\d+)*', Number.Integer),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r'`(\\\\|\\[^\\]|[^`\\])*`', String.Backtick),
+            (r'<([^\s>]+)>', String.Regex),
+            (r'(q|qq|qw|qr|qx)\{', String.Other, 'cb-string'),
+            (r'(q|qq|qw|qr|qx)\(', String.Other, 'rb-string'),
+            (r'(q|qq|qw|qr|qx)\[', String.Other, 'sb-string'),
+            (r'(q|qq|qw|qr|qx)\<', String.Other, 'lt-string'),
+            (r'(q|qq|qw|qr|qx)([\W_])(.|\n)*?\2', String.Other),
+            (r'(package)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)',
+             bygroups(Keyword, Whitespace, Name.Namespace)),
+            (r'(use|require|no)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)',
+             bygroups(Keyword, Whitespace, Name.Namespace)),
+            (r'(sub)(\s+)', bygroups(Keyword, Whitespace), 'funcname'),
+            (words((
+                'no', 'package', 'require', 'use'), suffix=r'\b'),
+             Keyword),
+            (r'(\[\]|\*\*|::|<<|>>|>=|<=>|<=|={3}|!=|=~|'
+             r'!~|&&?|\|\||\.{1,3})', Operator),
+            (r'[-+/*%=<>&^|!\\~]=?', Operator),
+            (r'[()\[\]:;,<>/?{}]', Punctuation),  # yes, there's no shortage
+                                                  # of punctuation in Perl!
+            (r'(?=\w)', Name, 'name'),
+        ],
+        'format': [
+            (r'\.\n', String.Interpol, '#pop'),
+            (r'[^\n]*\n', String.Interpol),
+        ],
+        'varname': [
+            (r'\s+', Whitespace),
+            (r'\{', Punctuation, '#pop'),    # hash syntax?
+            (r'\)|,', Punctuation, '#pop'),  # argument specifier
+            (r'\w+::', Name.Namespace),
+            (r'[\w:]+', Name.Variable, '#pop'),
+        ],
+        'name': [
+            (r'[a-zA-Z_]\w*(::[a-zA-Z_]\w*)*(::)?(?=\s*->)', Name.Namespace, '#pop'),
+            (r'[a-zA-Z_]\w*(::[a-zA-Z_]\w*)*::', Name.Namespace, '#pop'),
+            (r'[\w:]+', Name, '#pop'),
+            (r'[A-Z_]+(?=\W)', Name.Constant, '#pop'),
+            (r'(?=\W)', Text, '#pop'),
+        ],
+        'funcname': [
+            (r'[a-zA-Z_]\w*[!?]?', Name.Function),
+            (r'\s+', Whitespace),
+            # argument declaration
+            (r'(\([$@%]*\))(\s*)', bygroups(Punctuation, Whitespace)),
+            (r';', Punctuation, '#pop'),
+            (r'.*?\{', Punctuation, '#pop'),
+        ],
+        'cb-string': [
+            (r'\\[{}\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\{', String.Other, 'cb-string'),
+            (r'\}', String.Other, '#pop'),
+            (r'[^{}\\]+', String.Other)
+        ],
+        'rb-string': [
+            (r'\\[()\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\(', String.Other, 'rb-string'),
+            (r'\)', String.Other, '#pop'),
+            (r'[^()]+', String.Other)
+        ],
+        'sb-string': [
+            (r'\\[\[\]\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\[', String.Other, 'sb-string'),
+            (r'\]', String.Other, '#pop'),
+            (r'[^\[\]]+', String.Other)
+        ],
+        'lt-string': [
+            (r'\\[<>\\]', String.Other),
+            (r'\\', String.Other),
+            (r'\<', String.Other, 'lt-string'),
+            (r'\>', String.Other, '#pop'),
+            (r'[^<>]+', String.Other)
+        ],
+        'end-part': [
+            (r'.+', Comment.Preproc, '#pop')
+        ]
+    }
+
+    def analyse_text(text):
+        if shebang_matches(text, r'perl'):
+            return True
+
+        result = 0
+
+        if re.search(r'(?:my|our)\s+[$@%(]', text):
+            result += 0.9
+
+        if ':=' in text:
+            # := is not valid Perl, but it appears in unicon, so we should
+            # become less confident if we think we found Perl with :=
+            result /= 2
+
+        return result
+
+
+class Perl6Lexer(ExtendedRegexLexer):
+    """
+    For Raku (a.k.a. Perl 6) source code.
+    """
+
+    name = 'Perl6'
+    url = 'https://www.raku.org'
+    aliases = ['perl6', 'pl6', 'raku']
+    filenames = ['*.pl', '*.pm', '*.nqp', '*.p6', '*.6pl', '*.p6l', '*.pl6',
+                 '*.6pm', '*.p6m', '*.pm6', '*.t', '*.raku', '*.rakumod',
+                 '*.rakutest', '*.rakudoc']
+    mimetypes = ['text/x-perl6', 'application/x-perl6']
+    version_added = '2.0'
+    flags = re.MULTILINE | re.DOTALL
+
+    PERL6_IDENTIFIER_RANGE = r"['\w:-]"
+
+    PERL6_KEYWORDS = (
+        #Phasers
+        'BEGIN','CATCH','CHECK','CLOSE','CONTROL','DOC','END','ENTER','FIRST',
+        'INIT','KEEP','LAST','LEAVE','NEXT','POST','PRE','QUIT','UNDO',
+        #Keywords
+        'anon','augment','but','class','constant','default','does','else',
+        'elsif','enum','for','gather','given','grammar','has','if','import',
+        'is','let','loop','made','make','method','module','multi','my','need',
+        'orwith','our','proceed','proto','repeat','require','return',
+        'return-rw','returns','role','rule','state','sub','submethod','subset',
+        'succeed','supersede','token','try','unit','unless','until','use',
+        'when','while','with','without',
+        #Traits
+        'export','native','repr','required','rw','symbol',
+    )
+
+    PERL6_BUILTINS = (
+        'ACCEPTS','abs','abs2rel','absolute','accept','accessed','acos',
+        'acosec','acosech','acosh','acotan','acotanh','acquire','act','action',
+        'actions','add','add_attribute','add_enum_value','add_fallback',
+        'add_method','add_parent','add_private_method','add_role','add_trustee',
+        'adverb','after','all','allocate','allof','allowed','alternative-names',
+        'annotations','antipair','antipairs','any','anyof','app_lifetime',
+        'append','arch','archname','args','arity','Array','asec','asech','asin',
+        'asinh','ASSIGN-KEY','ASSIGN-POS','assuming','ast','at','atan','atan2',
+        'atanh','AT-KEY','atomic-assign','atomic-dec-fetch','atomic-fetch',
+        'atomic-fetch-add','atomic-fetch-dec','atomic-fetch-inc',
+        'atomic-fetch-sub','atomic-inc-fetch','AT-POS','attributes','auth',
+        'await','backtrace','Bag','BagHash','bail-out','base','basename',
+        'base-repeating','batch','BIND-KEY','BIND-POS','bind-stderr',
+        'bind-stdin','bind-stdout','bind-udp','bits','bless','block','Bool',
+        'bool-only','bounds','break','Bridge','broken','BUILD','build-date',
+        'bytes','cache','callframe','calling-package','CALL-ME','callsame',
+        'callwith','can','cancel','candidates','cando','can-ok','canonpath',
+        'caps','caption','Capture','cas','catdir','categorize','categorize-list',
+        'catfile','catpath','cause','ceiling','cglobal','changed','Channel',
+        'chars','chdir','child','child-name','child-typename','chmod','chomp',
+        'chop','chr','chrs','chunks','cis','classify','classify-list','cleanup',
+        'clone','close','closed','close-stdin','cmp-ok','code','codes','collate',
+        'column','comb','combinations','command','comment','compiler','Complex',
+        'compose','compose_type','composer','condition','config',
+        'configure_destroy','configure_type_checking','conj','connect',
+        'constraints','construct','contains','contents','copy','cos','cosec',
+        'cosech','cosh','cotan','cotanh','count','count-only','cpu-cores',
+        'cpu-usage','CREATE','create_type','cross','cue','curdir','curupdir','d',
+        'Date','DateTime','day','daycount','day-of-month','day-of-week',
+        'day-of-year','days-in-month','declaration','decode','decoder','deepmap',
+        'default','defined','DEFINITE','delayed','DELETE-KEY','DELETE-POS',
+        'denominator','desc','DESTROY','destroyers','devnull','diag',
+        'did-you-mean','die','dies-ok','dir','dirname','dir-sep','DISTROnames',
+        'do','does','does-ok','done','done-testing','duckmap','dynamic','e',
+        'eager','earlier','elems','emit','enclosing','encode','encoder',
+        'encoding','end','ends-with','enum_from_value','enum_value_list',
+        'enum_values','enums','eof','EVAL','eval-dies-ok','EVALFILE',
+        'eval-lives-ok','exception','excludes-max','excludes-min','EXISTS-KEY',
+        'EXISTS-POS','exit','exitcode','exp','expected','explicitly-manage',
+        'expmod','extension','f','fail','fails-like','fc','feature','file',
+        'filename','find_method','find_method_qualified','finish','first','flat',
+        'flatmap','flip','floor','flunk','flush','fmt','format','formatter',
+        'freeze','from','from-list','from-loop','from-posix','full',
+        'full-barrier','get','get_value','getc','gist','got','grab','grabpairs',
+        'grep','handle','handled','handles','hardware','has_accessor','Hash',
+        'head','headers','hh-mm-ss','hidden','hides','hour','how','hyper','id',
+        'illegal','im','in','indent','index','indices','indir','infinite',
+        'infix','infix:<+>','infix:<->','install_method_cache','Instant',
+        'instead','Int','int-bounds','interval','in-timezone','invalid-str',
+        'invert','invocant','IO','IO::Notification.watch-path','is_trusted',
+        'is_type','isa','is-absolute','isa-ok','is-approx','is-deeply',
+        'is-hidden','is-initial-thread','is-int','is-lazy','is-leap-year',
+        'isNaN','isnt','is-prime','is-relative','is-routine','is-setting',
+        'is-win','item','iterator','join','keep','kept','KERNELnames','key',
+        'keyof','keys','kill','kv','kxxv','l','lang','last','lastcall','later',
+        'lazy','lc','leading','level','like','line','lines','link','List',
+        'listen','live','lives-ok','local','lock','log','log10','lookup','lsb',
+        'made','MAIN','make','Map','match','max','maxpairs','merge','message',
+        'method','method_table','methods','migrate','min','minmax','minpairs',
+        'minute','misplaced','Mix','MixHash','mkdir','mode','modified','month',
+        'move','mro','msb','multi','multiness','my','name','named','named_names',
+        'narrow','nativecast','native-descriptor','nativesizeof','new','new_type',
+        'new-from-daycount','new-from-pairs','next','nextcallee','next-handle',
+        'nextsame','nextwith','NFC','NFD','NFKC','NFKD','nl-in','nl-out',
+        'nodemap','nok','none','norm','not','note','now','nude','Num',
+        'numerator','Numeric','of','offset','offset-in-hours','offset-in-minutes',
+        'ok','old','on-close','one','on-switch','open','opened','operation',
+        'optional','ord','ords','orig','os-error','osname','out-buffer','pack',
+        'package','package-kind','package-name','packages','pair','pairs',
+        'pairup','parameter','params','parent','parent-name','parents','parse',
+        'parse-base','parsefile','parse-names','parts','pass','path','path-sep',
+        'payload','peer-host','peer-port','periods','perl','permutations','phaser',
+        'pick','pickpairs','pid','placeholder','plan','plus','polar','poll',
+        'polymod','pop','pos','positional','posix','postfix','postmatch',
+        'precomp-ext','precomp-target','pred','prefix','prematch','prepend',
+        'print','printf','print-nl','print-to','private','private_method_table',
+        'proc','produce','Promise','prompt','protect','pull-one','push',
+        'push-all','push-at-least','push-exactly','push-until-lazy','put',
+        'qualifier-type','quit','r','race','radix','rand','range','Rat','raw',
+        're','read','readchars','readonly','ready','Real','reallocate','reals',
+        'reason','rebless','receive','recv','redispatcher','redo','reduce',
+        'rel2abs','relative','release','rename','repeated','replacement',
+        'report','reserved','resolve','restore','result','resume','rethrow',
+        'reverse','right','rindex','rmdir','role','roles_to_compose','rolish',
+        'roll','rootdir','roots','rotate','rotor','round','roundrobin',
+        'routine-type','run','rwx','s','samecase','samemark','samewith','say',
+        'schedule-on','scheduler','scope','sec','sech','second','seek','self',
+        'send','Set','set_hidden','set_name','set_package','set_rw','set_value',
+        'SetHash','set-instruments','setup_finalization','shape','share','shell',
+        'shift','sibling','sigil','sign','signal','signals','signature','sin',
+        'sinh','sink','sink-all','skip','skip-at-least','skip-at-least-pull-one',
+        'skip-one','skip-rest','sleep','sleep-timer','sleep-until','Slip','slurp',
+        'slurp-rest','slurpy','snap','snapper','so','socket-host','socket-port',
+        'sort','source','source-package','spawn','SPEC','splice','split',
+        'splitdir','splitpath','sprintf','spurt','sqrt','squish','srand','stable',
+        'start','started','starts-with','status','stderr','stdout','Str',
+        'sub_signature','subbuf','subbuf-rw','subname','subparse','subst',
+        'subst-mutate','substr','substr-eq','substr-rw','subtest','succ','sum',
+        'Supply','symlink','t','tail','take','take-rw','tan','tanh','tap',
+        'target','target-name','tc','tclc','tell','then','throttle','throw',
+        'throws-like','timezone','tmpdir','to','today','todo','toggle','to-posix',
+        'total','trailing','trans','tree','trim','trim-leading','trim-trailing',
+        'truncate','truncated-to','trusts','try_acquire','trying','twigil','type',
+        'type_captures','typename','uc','udp','uncaught_handler','unimatch',
+        'uniname','uninames','uniparse','uniprop','uniprops','unique','unival',
+        'univals','unlike','unlink','unlock','unpack','unpolar','unshift',
+        'unwrap','updir','USAGE','use-ok','utc','val','value','values','VAR',
+        'variable','verbose-config','version','VMnames','volume','vow','w','wait',
+        'warn','watch','watch-path','week','weekday-of-month','week-number',
+        'week-year','WHAT','when','WHERE','WHEREFORE','WHICH','WHO',
+        'whole-second','WHY','wordcase','words','workaround','wrap','write',
+        'write-to','x','yada','year','yield','yyyy-mm-dd','z','zip','zip-latest',
+
+    )
+
+    PERL6_BUILTIN_CLASSES = (
+        #Booleans
+        'False','True',
+        #Classes
+        'Any','Array','Associative','AST','atomicint','Attribute','Backtrace',
+        'Backtrace::Frame','Bag','Baggy','BagHash','Blob','Block','Bool','Buf',
+        'Callable','CallFrame','Cancellation','Capture','CArray','Channel','Code',
+        'compiler','Complex','ComplexStr','Cool','CurrentThreadScheduler',
+        'Cursor','Date','Dateish','DateTime','Distro','Duration','Encoding',
+        'Exception','Failure','FatRat','Grammar','Hash','HyperWhatever','Instant',
+        'Int','int16','int32','int64','int8','IntStr','IO','IO::ArgFiles',
+        'IO::CatHandle','IO::Handle','IO::Notification','IO::Path',
+        'IO::Path::Cygwin','IO::Path::QNX','IO::Path::Unix','IO::Path::Win32',
+        'IO::Pipe','IO::Socket','IO::Socket::Async','IO::Socket::INET','IO::Spec',
+        'IO::Spec::Cygwin','IO::Spec::QNX','IO::Spec::Unix','IO::Spec::Win32',
+        'IO::Special','Iterable','Iterator','Junction','Kernel','Label','List',
+        'Lock','Lock::Async','long','longlong','Macro','Map','Match',
+        'Metamodel::AttributeContainer','Metamodel::C3MRO','Metamodel::ClassHOW',
+        'Metamodel::EnumHOW','Metamodel::Finalization','Metamodel::MethodContainer',
+        'Metamodel::MROBasedMethodDispatch','Metamodel::MultipleInheritance',
+        'Metamodel::Naming','Metamodel::Primitives','Metamodel::PrivateMethodContainer',
+        'Metamodel::RoleContainer','Metamodel::Trusting','Method','Mix','MixHash',
+        'Mixy','Mu','NFC','NFD','NFKC','NFKD','Nil','Num','num32','num64',
+        'Numeric','NumStr','ObjAt','Order','Pair','Parameter','Perl','Pod::Block',
+        'Pod::Block::Code','Pod::Block::Comment','Pod::Block::Declarator',
+        'Pod::Block::Named','Pod::Block::Para','Pod::Block::Table','Pod::Heading',
+        'Pod::Item','Pointer','Positional','PositionalBindFailover','Proc',
+        'Proc::Async','Promise','Proxy','PseudoStash','QuantHash','Range','Rat',
+        'Rational','RatStr','Real','Regex','Routine','Scalar','Scheduler',
+        'Semaphore','Seq','Set','SetHash','Setty','Signature','size_t','Slip',
+        'Stash','Str','StrDistance','Stringy','Sub','Submethod','Supplier',
+        'Supplier::Preserving','Supply','Systemic','Tap','Telemetry',
+        'Telemetry::Instrument::Thread','Telemetry::Instrument::Usage',
+        'Telemetry::Period','Telemetry::Sampler','Thread','ThreadPoolScheduler',
+        'UInt','uint16','uint32','uint64','uint8','Uni','utf8','Variable',
+        'Version','VM','Whatever','WhateverCode','WrapHandle'
+    )
+
+    PERL6_OPERATORS = (
+        'X', 'Z', 'after', 'also', 'and', 'andthen', 'before', 'cmp', 'div',
+        'eq', 'eqv', 'extra', 'ff', 'fff', 'ge', 'gt', 'le', 'leg', 'lt', 'm',
+        'mm', 'mod', 'ne', 'or', 'orelse', 'rx', 's', 'tr', 'x', 'xor', 'xx',
+        '++', '--', '**', '!', '+', '-', '~', '?', '|', '||', '+^', '~^', '?^',
+        '^', '*', '/', '%', '%%', '+&', '+<', '+>', '~&', '~<', '~>', '?&',
+        'gcd', 'lcm', '+', '-', '+|', '+^', '~|', '~^', '?|', '?^',
+        '~', '&', '^', 'but', 'does', '<=>', '..', '..^', '^..', '^..^',
+        '!=', '==', '<', '<=', '>', '>=', '~~', '===', '!eqv',
+        '&&', '||', '^^', '//', 'min', 'max', '??', '!!', 'ff', 'fff', 'so',
+        'not', '<==', '==>', '<<==', '==>>','unicmp',
+    )
+
+    # Perl 6 has a *lot* of possible bracketing characters
+    # this list was lifted from STD.pm6 (https://github.com/perl6/std)
+    PERL6_BRACKETS = {
+        '\u0028': '\u0029', '\u003c': '\u003e', '\u005b': '\u005d',
+        '\u007b': '\u007d', '\u00ab': '\u00bb', '\u0f3a': '\u0f3b',
+        '\u0f3c': '\u0f3d', '\u169b': '\u169c', '\u2018': '\u2019',
+        '\u201a': '\u2019', '\u201b': '\u2019', '\u201c': '\u201d',
+        '\u201e': '\u201d', '\u201f': '\u201d', '\u2039': '\u203a',
+        '\u2045': '\u2046', '\u207d': '\u207e', '\u208d': '\u208e',
+        '\u2208': '\u220b', '\u2209': '\u220c', '\u220a': '\u220d',
+        '\u2215': '\u29f5', '\u223c': '\u223d', '\u2243': '\u22cd',
+        '\u2252': '\u2253', '\u2254': '\u2255', '\u2264': '\u2265',
+        '\u2266': '\u2267', '\u2268': '\u2269', '\u226a': '\u226b',
+        '\u226e': '\u226f', '\u2270': '\u2271', '\u2272': '\u2273',
+        '\u2274': '\u2275', '\u2276': '\u2277', '\u2278': '\u2279',
+        '\u227a': '\u227b', '\u227c': '\u227d', '\u227e': '\u227f',
+        '\u2280': '\u2281', '\u2282': '\u2283', '\u2284': '\u2285',
+        '\u2286': '\u2287', '\u2288': '\u2289', '\u228a': '\u228b',
+        '\u228f': '\u2290', '\u2291': '\u2292', '\u2298': '\u29b8',
+        '\u22a2': '\u22a3', '\u22a6': '\u2ade', '\u22a8': '\u2ae4',
+        '\u22a9': '\u2ae3', '\u22ab': '\u2ae5', '\u22b0': '\u22b1',
+        '\u22b2': '\u22b3', '\u22b4': '\u22b5', '\u22b6': '\u22b7',
+        '\u22c9': '\u22ca', '\u22cb': '\u22cc', '\u22d0': '\u22d1',
+        '\u22d6': '\u22d7', '\u22d8': '\u22d9', '\u22da': '\u22db',
+        '\u22dc': '\u22dd', '\u22de': '\u22df', '\u22e0': '\u22e1',
+        '\u22e2': '\u22e3', '\u22e4': '\u22e5', '\u22e6': '\u22e7',
+        '\u22e8': '\u22e9', '\u22ea': '\u22eb', '\u22ec': '\u22ed',
+        '\u22f0': '\u22f1', '\u22f2': '\u22fa', '\u22f3': '\u22fb',
+        '\u22f4': '\u22fc', '\u22f6': '\u22fd', '\u22f7': '\u22fe',
+        '\u2308': '\u2309', '\u230a': '\u230b', '\u2329': '\u232a',
+        '\u23b4': '\u23b5', '\u2768': '\u2769', '\u276a': '\u276b',
+        '\u276c': '\u276d', '\u276e': '\u276f', '\u2770': '\u2771',
+        '\u2772': '\u2773', '\u2774': '\u2775', '\u27c3': '\u27c4',
+        '\u27c5': '\u27c6', '\u27d5': '\u27d6', '\u27dd': '\u27de',
+        '\u27e2': '\u27e3', '\u27e4': '\u27e5', '\u27e6': '\u27e7',
+        '\u27e8': '\u27e9', '\u27ea': '\u27eb', '\u2983': '\u2984',
+        '\u2985': '\u2986', '\u2987': '\u2988', '\u2989': '\u298a',
+        '\u298b': '\u298c', '\u298d': '\u298e', '\u298f': '\u2990',
+        '\u2991': '\u2992', '\u2993': '\u2994', '\u2995': '\u2996',
+        '\u2997': '\u2998', '\u29c0': '\u29c1', '\u29c4': '\u29c5',
+        '\u29cf': '\u29d0', '\u29d1': '\u29d2', '\u29d4': '\u29d5',
+        '\u29d8': '\u29d9', '\u29da': '\u29db', '\u29f8': '\u29f9',
+        '\u29fc': '\u29fd', '\u2a2b': '\u2a2c', '\u2a2d': '\u2a2e',
+        '\u2a34': '\u2a35', '\u2a3c': '\u2a3d', '\u2a64': '\u2a65',
+        '\u2a79': '\u2a7a', '\u2a7d': '\u2a7e', '\u2a7f': '\u2a80',
+        '\u2a81': '\u2a82', '\u2a83': '\u2a84', '\u2a8b': '\u2a8c',
+        '\u2a91': '\u2a92', '\u2a93': '\u2a94', '\u2a95': '\u2a96',
+        '\u2a97': '\u2a98', '\u2a99': '\u2a9a', '\u2a9b': '\u2a9c',
+        '\u2aa1': '\u2aa2', '\u2aa6': '\u2aa7', '\u2aa8': '\u2aa9',
+        '\u2aaa': '\u2aab', '\u2aac': '\u2aad', '\u2aaf': '\u2ab0',
+        '\u2ab3': '\u2ab4', '\u2abb': '\u2abc', '\u2abd': '\u2abe',
+        '\u2abf': '\u2ac0', '\u2ac1': '\u2ac2', '\u2ac3': '\u2ac4',
+        '\u2ac5': '\u2ac6', '\u2acd': '\u2ace', '\u2acf': '\u2ad0',
+        '\u2ad1': '\u2ad2', '\u2ad3': '\u2ad4', '\u2ad5': '\u2ad6',
+        '\u2aec': '\u2aed', '\u2af7': '\u2af8', '\u2af9': '\u2afa',
+        '\u2e02': '\u2e03', '\u2e04': '\u2e05', '\u2e09': '\u2e0a',
+        '\u2e0c': '\u2e0d', '\u2e1c': '\u2e1d', '\u2e20': '\u2e21',
+        '\u3008': '\u3009', '\u300a': '\u300b', '\u300c': '\u300d',
+        '\u300e': '\u300f', '\u3010': '\u3011', '\u3014': '\u3015',
+        '\u3016': '\u3017', '\u3018': '\u3019', '\u301a': '\u301b',
+        '\u301d': '\u301e', '\ufd3e': '\ufd3f', '\ufe17': '\ufe18',
+        '\ufe35': '\ufe36', '\ufe37': '\ufe38', '\ufe39': '\ufe3a',
+        '\ufe3b': '\ufe3c', '\ufe3d': '\ufe3e', '\ufe3f': '\ufe40',
+        '\ufe41': '\ufe42', '\ufe43': '\ufe44', '\ufe47': '\ufe48',
+        '\ufe59': '\ufe5a', '\ufe5b': '\ufe5c', '\ufe5d': '\ufe5e',
+        '\uff08': '\uff09', '\uff1c': '\uff1e', '\uff3b': '\uff3d',
+        '\uff5b': '\uff5d', '\uff5f': '\uff60', '\uff62': '\uff63',
+    }
+
+    def _build_word_match(words, boundary_regex_fragment=None, prefix='', suffix=''):
+        if boundary_regex_fragment is None:
+            return r'\b(' + prefix + r'|'.join(re.escape(x) for x in words) + \
+                suffix + r')\b'
+        else:
+            return r'(? 0:
+                    next_open_pos = text.find(opening_chars, search_pos + n_chars)
+                    next_close_pos = text.find(closing_chars, search_pos + n_chars)
+
+                    if next_close_pos == -1:
+                        next_close_pos = len(text)
+                        nesting_level = 0
+                    elif next_open_pos != -1 and next_open_pos < next_close_pos:
+                        nesting_level += 1
+                        search_pos = next_open_pos
+                    else:  # next_close_pos < next_open_pos
+                        nesting_level -= 1
+                        search_pos = next_close_pos
+
+                end_pos = next_close_pos
+
+            if end_pos < 0:     # if we didn't find a closer, just highlight the
+                                # rest of the text in this class
+                end_pos = len(text)
+
+            if adverbs is not None and re.search(r':to\b', adverbs):
+                heredoc_terminator = text[match.start('delimiter') + n_chars:end_pos]
+                end_heredoc = re.search(r'^\s*' + re.escape(heredoc_terminator) +
+                                        r'\s*$', text[end_pos:], re.MULTILINE)
+
+                if end_heredoc:
+                    end_pos += end_heredoc.end()
+                else:
+                    end_pos = len(text)
+
+            yield match.start(), token_class, text[match.start():end_pos + n_chars]
+            context.pos = end_pos + n_chars
+
+        return callback
+
+    def opening_brace_callback(lexer, match, context):
+        stack = context.stack
+
+        yield match.start(), Text, context.text[match.start():match.end()]
+        context.pos = match.end()
+
+        # if we encounter an opening brace and we're one level
+        # below a token state, it means we need to increment
+        # the nesting level for braces so we know later when
+        # we should return to the token rules.
+        if len(stack) > 2 and stack[-2] == 'token':
+            context.perl6_token_nesting_level += 1
+
+    def closing_brace_callback(lexer, match, context):
+        stack = context.stack
+
+        yield match.start(), Text, context.text[match.start():match.end()]
+        context.pos = match.end()
+
+        # if we encounter a free closing brace and we're one level
+        # below a token state, it means we need to check the nesting
+        # level to see if we need to return to the token state.
+        if len(stack) > 2 and stack[-2] == 'token':
+            context.perl6_token_nesting_level -= 1
+            if context.perl6_token_nesting_level == 0:
+                stack.pop()
+
+    def embedded_perl6_callback(lexer, match, context):
+        context.perl6_token_nesting_level = 1
+        yield match.start(), Text, context.text[match.start():match.end()]
+        context.pos = match.end()
+        context.stack.append('root')
+
+    # If you're modifying these rules, be careful if you need to process '{' or '}'
+    # characters. We have special logic for processing these characters (due to the fact
+    # that you can nest Perl 6 code in regex blocks), so if you need to process one of
+    # them, make sure you also process the corresponding one!
+    tokens = {
+        'common': [
+            (r'#[`|=](?P(?P[' + ''.join(PERL6_BRACKETS) + r'])(?P=first_char)*)',
+             brackets_callback(Comment.Multiline)),
+            (r'#[^\n]*$', Comment.Single),
+            (r'^(\s*)=begin\s+(\w+)\b.*?^\1=end\s+\2', Comment.Multiline),
+            (r'^(\s*)=for.*?\n\s*?\n', Comment.Multiline),
+            (r'^=.*?\n\s*?\n', Comment.Multiline),
+            (r'(regex|token|rule)(\s*' + PERL6_IDENTIFIER_RANGE + '+:sym)',
+             bygroups(Keyword, Name), 'token-sym-brackets'),
+            (r'(regex|token|rule)(?!' + PERL6_IDENTIFIER_RANGE + r')(\s*' + PERL6_IDENTIFIER_RANGE + '+)?',
+             bygroups(Keyword, Name), 'pre-token'),
+            # deal with a special case in the Perl 6 grammar (role q { ... })
+            (r'(role)(\s+)(q)(\s*)', bygroups(Keyword, Whitespace, Name, Whitespace)),
+            (_build_word_match(PERL6_KEYWORDS, PERL6_IDENTIFIER_RANGE), Keyword),
+            (_build_word_match(PERL6_BUILTIN_CLASSES, PERL6_IDENTIFIER_RANGE, suffix='(?::[UD])?'),
+             Name.Builtin),
+            (_build_word_match(PERL6_BUILTINS, PERL6_IDENTIFIER_RANGE), Name.Builtin),
+            # copied from PerlLexer
+            (r'[$@%&][.^:?=!~]?' + PERL6_IDENTIFIER_RANGE + '+(?:<<.*?>>|<.*?>|«.*?»)*',
+             Name.Variable),
+            (r'\$[!/](?:<<.*?>>|<.*?>|«.*?»)*', Name.Variable.Global),
+            (r'::\?\w+', Name.Variable.Global),
+            (r'[$@%&]\*' + PERL6_IDENTIFIER_RANGE + '+(?:<<.*?>>|<.*?>|«.*?»)*',
+             Name.Variable.Global),
+            (r'\$(?:<.*?>)+', Name.Variable),
+            (r'(?:q|qq|Q)[a-zA-Z]?\s*(?P:[\w\s:]+)?\s*(?P(?P[^0-9a-zA-Z:\s])'
+             r'(?P=first_char)*)', brackets_callback(String)),
+            # copied from PerlLexer
+            (r'0_?[0-7]+(_[0-7]+)*', Number.Oct),
+            (r'0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*', Number.Hex),
+            (r'0b[01]+(_[01]+)*', Number.Bin),
+            (r'(?i)(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?',
+             Number.Float),
+            (r'(?i)\d+(_\d*)*e[+-]?\d+(_\d*)*', Number.Float),
+            (r'\d+(_\d+)*', Number.Integer),
+            (r'(?<=~~)\s*/(?:\\\\|\\/|.)*?/', String.Regex),
+            (r'(?<=[=(,])\s*/(?:\\\\|\\/|.)*?/', String.Regex),
+            (r'm\w+(?=\()', Name),
+            (r'(?:m|ms|rx)\s*(?P:[\w\s:]+)?\s*(?P(?P[^\w:\s])'
+             r'(?P=first_char)*)', brackets_callback(String.Regex)),
+            (r'(?:s|ss|tr)\s*(?::[\w\s:]+)?\s*/(?:\\\\|\\/|.)*?/(?:\\\\|\\/|.)*?/',
+             String.Regex),
+            (r'<[^\s=].*?\S>', String),
+            (_build_word_match(PERL6_OPERATORS), Operator),
+            (r'\w' + PERL6_IDENTIFIER_RANGE + '*', Name),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+        ],
+        'root': [
+            include('common'),
+            (r'\{', opening_brace_callback),
+            (r'\}', closing_brace_callback),
+            (r'.+?', Text),
+        ],
+        'pre-token': [
+            include('common'),
+            (r'\{', Text, ('#pop', 'token')),
+            (r'.+?', Text),
+        ],
+        'token-sym-brackets': [
+            (r'(?P(?P[' + ''.join(PERL6_BRACKETS) + '])(?P=first_char)*)',
+             brackets_callback(Name), ('#pop', 'pre-token')),
+            default(('#pop', 'pre-token')),
+        ],
+        'token': [
+            (r'\}', Text, '#pop'),
+            (r'(?<=:)(?:my|our|state|constant|temp|let).*?;', using(this)),
+            # make sure that quotes in character classes aren't treated as strings
+            (r'<(?:[-!?+.]\s*)?\[.*?\]>', String.Regex),
+            # make sure that '#' characters in quotes aren't treated as comments
+            (r"(?my|our)\s+)?(?:module|class|role|enum|grammar)', line)
+            if class_decl:
+                if saw_perl_decl or class_decl.group('scope') is not None:
+                    return True
+                rating = 0.05
+                continue
+            break
+
+        if ':=' in text:
+            # Same logic as above for PerlLexer
+            rating /= 2
+
+        return rating
+
+    def __init__(self, **options):
+        super().__init__(**options)
+        self.encoding = options.get('encoding', 'utf-8')
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/phix.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/phix.py
new file mode 100644
index 000000000..f0b03775e
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/phix.py
@@ -0,0 +1,363 @@
+"""
+    pygments.lexers.phix
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Phix.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Whitespace
+
+__all__ = ['PhixLexer']
+
+
+class PhixLexer(RegexLexer):
+    """
+    Pygments Lexer for Phix files (.exw).
+    See http://phix.x10.mx
+    """
+
+    name = 'Phix'
+    url = 'http://phix.x10.mx'
+    aliases = ['phix']
+    filenames = ['*.exw']
+    mimetypes = ['text/x-phix']
+    version_added = '2.14'
+
+    flags = re.MULTILINE    # nb: **NOT** re.DOTALL! (totally spanners comment handling)
+
+    preproc = (
+        'ifdef', 'elsifdef', 'elsedef'
+    )
+    # Note these lists are auto-generated by pwa/p2js.exw, when pwa\src\p2js_keywords.e (etc)
+    #     change, though of course subsequent copy/commit/pull requests are all manual steps.
+    types = (
+        'string', 'nullable_string', 'atom_string', 'atom', 'bool', 'boolean',
+        'cdCanvan', 'cdCanvas', 'complex', 'CURLcode', 'dictionary', 'int',
+        'integer', 'Ihandle', 'Ihandles', 'Ihandln', 'mpfr', 'mpq', 'mpz',
+        'mpz_or_string', 'number', 'rid_string', 'seq', 'sequence', 'timedate',
+        'object'
+    )
+    keywords = (
+        'abstract', 'class', 'continue', 'export', 'extends', 'nullable',
+        'private', 'public', 'static', 'struct', 'trace',
+        'and', 'break', 'by', 'case', 'catch', 'const', 'constant', 'debug',
+        'default', 'do', 'else', 'elsif', 'end', 'enum', 'exit', 'fallthru',
+        'fallthrough', 'for', 'forward', 'function', 'global', 'if', 'in',
+        'include', 'js', 'javascript', 'javascript_semantics', 'let', 'not',
+        'or', 'procedure', 'profile', 'profile_time', 'return', 'safe_mode',
+        'switch', 'then', 'to', 'try', 'type', 'type_check', 'until', 'warning',
+        'while', 'with', 'without', 'xor'
+    )
+    routines = (
+        'abort', 'abs', 'adjust_timedate', 'and_bits', 'and_bitsu', 'apply',
+        'append', 'arccos', 'arcsin', 'arctan', 'assert', 'atan2',
+        'atom_to_float32', 'atom_to_float64', 'bankers_rounding', 'beep',
+        'begins', 'binary_search', 'bits_to_int', 'bk_color', 'bytes_to_int',
+        'call_func', 'call_proc', 'cdCanvasActivate', 'cdCanvasArc',
+        'cdCanvasBegin', 'cdCanvasBox', 'cdCanvasChord', 'cdCanvasCircle',
+        'cdCanvasClear', 'cdCanvasEnd', 'cdCanvasFlush', 'cdCanvasFont',
+        'cdCanvasGetImageRGB', 'cdCanvasGetSize', 'cdCanvasGetTextAlignment',
+        'cdCanvasGetTextSize', 'cdCanvasLine', 'cdCanvasMark',
+        'cdCanvasMarkSize', 'cdCanvasMultiLineVectorText', 'cdCanvasPixel',
+        'cdCanvasRect', 'cdCanvasRoundedBox', 'cdCanvasRoundedRect',
+        'cdCanvasSector', 'cdCanvasSetAttribute', 'cdCanvasSetBackground',
+        'cdCanvasSetFillMode', 'cdCanvasSetForeground',
+        'cdCanvasSetInteriorStyle', 'cdCanvasSetLineStyle',
+        'cdCanvasSetLineWidth', 'cdCanvasSetTextAlignment', 'cdCanvasText',
+        'cdCanvasSetTextOrientation', 'cdCanvasGetTextOrientation',
+        'cdCanvasVectorText', 'cdCanvasVectorTextDirection',
+        'cdCanvasVectorTextSize', 'cdCanvasVertex', 'cdCreateCanvas',
+        'cdDecodeAlpha', 'cdDecodeColor', 'cdDecodeColorAlpha', 'cdEncodeAlpha',
+        'cdEncodeColor', 'cdEncodeColorAlpha', 'cdKillCanvas', 'cdVersion',
+        'cdVersionDate', 'ceil', 'change_timezone', 'choose', 'clear_screen',
+        'columnize', 'command_line', 'compare', 'complex_abs', 'complex_add',
+        'complex_arg', 'complex_conjugate', 'complex_cos', 'complex_cosh',
+        'complex_div', 'complex_exp', 'complex_imag', 'complex_inv',
+        'complex_log', 'complex_mul', 'complex_neg', 'complex_new',
+        'complex_norm', 'complex_power', 'complex_rho', 'complex_real',
+        'complex_round', 'complex_sin', 'complex_sinh', 'complex_sprint',
+        'complex_sqrt', 'complex_sub', 'complex_theta', 'concat', 'cos',
+        'crash', 'custom_sort', 'date', 'day_of_week', 'day_of_year',
+        'days_in_month', 'decode_base64', 'decode_flags', 'deep_copy', 'deld',
+        'deserialize', 'destroy_dict', 'destroy_queue', 'destroy_stack',
+        'dict_name', 'dict_size', 'elapsed', 'elapsed_short', 'encode_base64',
+        'equal', 'even', 'exp', 'extract', 'factorial', 'factors',
+        'file_size_k', 'find', 'find_all', 'find_any', 'find_replace', 'filter',
+        'flatten', 'float32_to_atom', 'float64_to_atom', 'floor',
+        'format_timedate', 'free_console', 'from_polar', 'gcd', 'get_file_base',
+        'get_file_extension', 'get_file_name', 'get_file_name_and_path',
+        'get_file_path', 'get_file_path_and_name', 'get_maxprime', 'get_prime',
+        'get_primes', 'get_primes_le', 'get_proper_dir', 'get_proper_path',
+        'get_rand', 'get_routine_info', 'get_test_abort', 'get_test_logfile',
+        'get_test_pause', 'get_test_verbosity', 'get_tzid', 'getd', 'getdd',
+        'getd_all_keys', 'getd_by_index', 'getd_index', 'getd_partial_key',
+        'glAttachShader', 'glBindBuffer', 'glBindTexture', 'glBufferData',
+        'glCanvasSpecialText', 'glClear', 'glClearColor', 'glColor',
+        'glCompileShader', 'glCreateBuffer', 'glCreateProgram',
+        'glCreateShader', 'glCreateTexture', 'glDeleteProgram',
+        'glDeleteShader', 'glDrawArrays', 'glEnable',
+        'glEnableVertexAttribArray', 'glFloat32Array', 'glInt32Array',
+        'glFlush', 'glGetAttribLocation', 'glGetError', 'glGetProgramInfoLog',
+        'glGetProgramParameter', 'glGetShaderInfoLog', 'glGetShaderParameter',
+        'glGetUniformLocation', 'glLinkProgram', 'glLoadIdentity',
+        'glMatrixMode', 'glOrtho', 'glRotatef', 'glShadeModel',
+        'glShaderSource', 'glSimpleA7texcoords', 'glTexImage2Dc',
+        'glTexParameteri', 'glTranslate', 'glUniform1f', 'glUniform1i',
+        'glUniformMatrix4fv', 'glUseProgram', 'glVertex',
+        'glVertexAttribPointer', 'glViewport', 'head', 'hsv_to_rgb', 'iff',
+        'iif', 'include_file', 'incl0de_file', 'insert', 'instance',
+        'int_to_bits', 'int_to_bytes', 'is_dict', 'is_integer', 's_leap_year',
+        'is_prime', 'is_prime2', 'islower', 'isupper', 'Icallback',
+        'iup_isdouble', 'iup_isprint', 'iup_XkeyBase', 'IupAppend', 'IupAlarm',
+        'IupBackgroundBox', 'IupButton', 'IupCalendar', 'IupCanvas',
+        'IupClipboard', 'IupClose', 'IupCloseOnEscape', 'IupControlsOpen',
+        'IupDatePick', 'IupDestroy', 'IupDialog', 'IupDrawArc', 'IupDrawBegin',
+        'IupDrawEnd', 'IupDrawGetSize', 'IupDrawGetTextSize', 'IupDrawLine',
+        'IupDrawRectangle', 'IupDrawText', 'IupExpander', 'IupFill',
+        'IupFlatLabel', 'IupFlatList', 'IupFlatTree', 'IupFlush', 'IupFrame',
+        'IupGetAttribute', 'IupGetAttributeId', 'IupGetAttributePtr',
+        'IupGetBrother', 'IupGetChild', 'IupGetChildCount', 'IupGetClassName',
+        'IupGetDialog', 'IupGetDialogChild', 'IupGetDouble', 'IupGetFocus',
+        'IupGetGlobal', 'IupGetGlobalInt', 'IupGetGlobalIntInt', 'IupGetInt',
+        'IupGetInt2', 'IupGetIntId', 'IupGetIntInt', 'IupGetParent',
+        'IupGLCanvas', 'IupGLCanvasOpen', 'IupGLMakeCurrent', 'IupGraph',
+        'IupHbox', 'IupHide', 'IupImage', 'IupImageRGBA', 'IupItem',
+        'iupKeyCodeToName', 'IupLabel', 'IupLink', 'IupList', 'IupMap',
+        'IupMenu', 'IupMenuItem', 'IupMessage', 'IupMessageDlg', 'IupMultiBox',
+        'IupMultiLine', 'IupNextField', 'IupNormaliser', 'IupOpen',
+        'IupPlayInput', 'IupPopup', 'IupPreviousField', 'IupProgressBar',
+        'IupRadio', 'IupRecordInput', 'IupRedraw', 'IupRefresh',
+        'IupRefreshChildren', 'IupSeparator', 'IupSetAttribute',
+        'IupSetAttributes', 'IupSetAttributeHandle', 'IupSetAttributeId',
+        'IupSetAttributePtr', 'IupSetCallback', 'IupSetCallbacks',
+        'IupSetDouble', 'IupSetFocus', 'IupSetGlobal', 'IupSetGlobalInt',
+        'IupSetGlobalFunction', 'IupSetHandle', 'IupSetInt',
+        'IupSetStrAttribute', 'IupSetStrGlobal', 'IupShow', 'IupShowXY',
+        'IupSplit', 'IupStoreAttribute', 'IupSubmenu', 'IupTable',
+        'IupTableClearSelected', 'IupTableClick_cb', 'IupTableGetSelected',
+        'IupTableResize_cb', 'IupTableSetData', 'IupTabs', 'IupText',
+        'IupTimer', 'IupToggle', 'IupTreeAddNodes', 'IupTreeView', 'IupUpdate',
+        'IupValuator', 'IupVbox', 'join', 'join_by', 'join_path', 'k_perm',
+        'largest', 'lcm', 'length', 'log', 'log10', 'log2', 'lower',
+        'm4_crossProduct', 'm4_inverse', 'm4_lookAt', 'm4_multiply',
+        'm4_normalize', 'm4_perspective', 'm4_subtractVectors', 'm4_xRotate',
+        'm4_yRotate', 'machine_bits', 'machine_word', 'match', 'match_all',
+        'match_replace', 'max', 'maxsq', 'min', 'minsq', 'mod', 'mpfr_add',
+        'mpfr_ceil', 'mpfr_cmp', 'mpfr_cmp_si', 'mpfr_const_pi', 'mpfr_div',
+        'mpfr_div_si', 'mpfr_div_z', 'mpfr_floor', 'mpfr_free', 'mpfr_get_d',
+        'mpfr_get_default_precision', 'mpfr_get_default_rounding_mode',
+        'mpfr_get_fixed', 'mpfr_get_precision', 'mpfr_get_si', 'mpfr_init',
+        'mpfr_inits', 'mpfr_init_set', 'mpfr_init_set_q', 'mpfr_init_set_z',
+        'mpfr_mul', 'mpfr_mul_si', 'mpfr_pow_si', 'mpfr_set', 'mpfr_set_d',
+        'mpfr_set_default_precision', 'mpfr_set_default_rounding_mode',
+        'mpfr_set_precision', 'mpfr_set_q', 'mpfr_set_si', 'mpfr_set_str',
+        'mpfr_set_z', 'mpfr_si_div', 'mpfr_si_sub', 'mpfr_sqrt', 'mpfr_sub',
+        'mpfr_sub_si', 'mpq_abs', 'mpq_add', 'mpq_add_si', 'mpq_canonicalize',
+        'mpq_cmp', 'mpq_cmp_si', 'mpq_div', 'mpq_div_2exp', 'mpq_free',
+        'mpq_get_den', 'mpq_get_num', 'mpq_get_str', 'mpq_init', 'mpq_init_set',
+        'mpq_init_set_si', 'mpq_init_set_str', 'mpq_init_set_z', 'mpq_inits',
+        'mpq_inv', 'mpq_mul', 'mpq_neg', 'mpq_set', 'mpq_set_si', 'mpq_set_str',
+        'mpq_set_z', 'mpq_sub', 'mpz_abs', 'mpz_add', 'mpz_addmul',
+        'mpz_addmul_ui', 'mpz_addmul_si', 'mpz_add_si', 'mpz_add_ui', 'mpz_and',
+        'mpz_bin_uiui', 'mpz_cdiv_q', 'mpz_cmp', 'mpz_cmp_si', 'mpz_divexact',
+        'mpz_divexact_ui', 'mpz_divisible_p', 'mpz_divisible_ui_p', 'mpz_even',
+        'mpz_fac_ui', 'mpz_factorstring', 'mpz_fdiv_q', 'mpz_fdiv_q_2exp',
+        'mpz_fdiv_q_ui', 'mpz_fdiv_qr', 'mpz_fdiv_r', 'mpz_fdiv_ui',
+        'mpz_fib_ui', 'mpz_fib2_ui', 'mpz_fits_atom', 'mpz_fits_integer',
+        'mpz_free', 'mpz_gcd', 'mpz_gcd_ui', 'mpz_get_atom', 'mpz_get_integer',
+        'mpz_get_short_str', 'mpz_get_str', 'mpz_init', 'mpz_init_set',
+        'mpz_inits', 'mpz_invert', 'mpz_lcm', 'mpz_lcm_ui', 'mpz_max',
+        'mpz_min', 'mpz_mod', 'mpz_mod_ui', 'mpz_mul', 'mpz_mul_2exp',
+        'mpz_mul_d', 'mpz_mul_si', 'mpz_neg', 'mpz_nthroot', 'mpz_odd',
+        'mpz_pollard_rho', 'mpz_pow_ui', 'mpz_powm', 'mpz_powm_ui', 'mpz_prime',
+        'mpz_prime_factors', 'mpz_prime_mr', 'mpz_rand', 'mpz_rand_ui',
+        'mpz_re_compose', 'mpz_remove', 'mpz_scan0', 'mpz_scan1', 'mpz_set',
+        'mpz_set_d', 'mpz_set_si', 'mpz_set_str', 'mpz_set_v', 'mpz_sign',
+        'mpz_sizeinbase', 'mpz_sqrt', 'mpz_sub', 'mpz_sub_si', 'mpz_sub_ui',
+        'mpz_si_sub', 'mpz_tdiv_q_2exp', 'mpz_tdiv_r_2exp', 'mpz_tstbit',
+        'mpz_ui_pow_ui', 'mpz_xor', 'named_dict', 'new_dict', 'new_queue',
+        'new_stack', 'not_bits', 'not_bitsu', 'odd', 'or_all', 'or_allu',
+        'or_bits', 'or_bitsu', 'ord', 'ordinal', 'ordinant',
+        'override_timezone', 'pad', 'pad_head', 'pad_tail', 'parse_date_string',
+        'papply', 'peep', 'peepn', 'peep_dict', 'permute', 'permutes',
+        'platform', 'pop', 'popn', 'pop_dict', 'power', 'pp', 'ppEx', 'ppExf',
+        'ppf', 'ppOpt', 'pq_add', 'pq_destroy', 'pq_empty', 'pq_new', 'pq_peek',
+        'pq_pop', 'pq_pop_data', 'pq_size', 'prepend', 'prime_factors',
+        'printf', 'product', 'proper', 'push', 'pushn', 'putd', 'puts',
+        'queue_empty', 'queue_size', 'rand', 'rand_range', 'reinstate',
+        'remainder', 'remove', 'remove_all', 'repeat', 'repeatch', 'replace',
+        'requires', 'reverse', 'rfind', 'rgb', 'rmatch', 'rmdr', 'rnd', 'round',
+        'routine_id', 'scanf', 'serialize', 'series', 'set_rand',
+        'set_test_abort', 'set_test_logfile', 'set_test_module',
+        'set_test_pause', 'set_test_verbosity', 'set_timedate_formats',
+        'set_timezone', 'setd', 'setd_default', 'shorten', 'sha256',
+        'shift_bits', 'shuffle', 'sign', 'sin', 'smallest', 'sort',
+        'sort_columns', 'speak', 'splice', 'split', 'split_any', 'split_by',
+        'sprint', 'sprintf', 'sq_abs', 'sq_add', 'sq_and', 'sq_and_bits',
+        'sq_arccos', 'sq_arcsin', 'sq_arctan', 'sq_atom', 'sq_ceil', 'sq_cmp',
+        'sq_cos', 'sq_div', 'sq_even', 'sq_eq', 'sq_floor', 'sq_floor_div',
+        'sq_ge', 'sq_gt', 'sq_int', 'sq_le', 'sq_log', 'sq_log10', 'sq_log2',
+        'sq_lt', 'sq_max', 'sq_min', 'sq_mod', 'sq_mul', 'sq_ne', 'sq_not',
+        'sq_not_bits', 'sq_odd', 'sq_or', 'sq_or_bits', 'sq_power', 'sq_rand',
+        'sq_remainder', 'sq_rmdr', 'sq_rnd', 'sq_round', 'sq_seq', 'sq_sign',
+        'sq_sin', 'sq_sqrt', 'sq_str', 'sq_sub', 'sq_tan', 'sq_trunc',
+        'sq_uminus', 'sq_xor', 'sq_xor_bits', 'sqrt', 'square_free',
+        'stack_empty', 'stack_size', 'substitute', 'substitute_all', 'sum',
+        'tail', 'tan', 'test_equal', 'test_fail', 'test_false',
+        'test_not_equal', 'test_pass', 'test_summary', 'test_true',
+        'text_color', 'throw', 'time', 'timedate_diff', 'timedelta',
+        'to_integer', 'to_number', 'to_rgb', 'to_string', 'traverse_dict',
+        'traverse_dict_partial_key', 'trim', 'trim_head', 'trim_tail', 'trunc',
+        'tagset', 'tagstart', 'typeof', 'unique', 'unix_dict', 'upper',
+        'utf8_to_utf32', 'utf32_to_utf8', 'version', 'vlookup', 'vslice',
+        'wglGetProcAddress', 'wildcard_file', 'wildcard_match', 'with_rho',
+        'with_theta', 'xml_new_doc', 'xml_new_element', 'xml_set_attribute',
+        'xml_sprint', 'xor_bits', 'xor_bitsu',
+        'accept', 'allocate', 'allocate_string', 'allow_break', 'ARM',
+        'atom_to_float80', 'c_func', 'c_proc', 'call_back', 'chdir',
+        'check_break', 'clearDib', 'close', 'closesocket', 'console',
+        'copy_file', 'create', 'create_directory', 'create_thread',
+        'curl_easy_cleanup', 'curl_easy_get_file', 'curl_easy_init',
+        'curl_easy_perform', 'curl_easy_perform_ex', 'curl_easy_setopt',
+        'curl_easy_strerror', 'curl_global_cleanup', 'curl_global_init',
+        'curl_slist_append', 'curl_slist_free_all', 'current_dir', 'cursor',
+        'define_c_func', 'define_c_proc', 'delete', 'delete_cs', 'delete_file',
+        'dir', 'DLL', 'drawDib', 'drawShadedPolygonToDib', 'ELF32', 'ELF64',
+        'enter_cs', 'eval', 'exit_thread', 'free', 'file_exists', 'final',
+        'float80_to_atom', 'format', 'get_bytes', 'get_file_date',
+        'get_file_size', 'get_file_type', 'get_interpreter', 'get_key',
+        'get_socket_error', 'get_text', 'get_thread_exitcode', 'get_thread_id',
+        'getc', 'getenv', 'gets', 'getsockaddr', 'glBegin', 'glCallList',
+        'glFrustum', 'glGenLists', 'glGetString', 'glLight', 'glMaterial',
+        'glNewList', 'glNormal', 'glPopMatrix', 'glPushMatrix', 'glRotate',
+        'glEnd', 'glEndList', 'glTexImage2D', 'goto', 'GUI', 'icons', 'ilASM',
+        'include_files', 'include_paths', 'init_cs', 'ip_to_string',
+        'IupConfig', 'IupConfigDialogClosed', 'IupConfigDialogShow',
+        'IupConfigGetVariableInt', 'IupConfigLoad', 'IupConfigSave',
+        'IupConfigSetVariableInt', 'IupExitLoop', 'IupFileDlg', 'IupFileList',
+        'IupGLSwapBuffers', 'IupHelp', 'IupLoopStep', 'IupMainLoop',
+        'IupNormalizer', 'IupPlot', 'IupPlotAdd', 'IupPlotBegin', 'IupPlotEnd',
+        'IupPlotInsert', 'IupSaveImage', 'IupTreeGetUserId', 'IupUser',
+        'IupVersion', 'IupVersionDate', 'IupVersionNumber', 'IupVersionShow',
+        'killDib', 'leave_cs', 'listen', 'manifest', 'mem_copy', 'mem_set',
+        'mpfr_gamma', 'mpfr_printf', 'mpfr_sprintf', 'mpz_export', 'mpz_import',
+        'namespace', 'new', 'newDib', 'open', 'open_dll', 'PE32', 'PE64',
+        'peek', 'peek_string', 'peek1s', 'peek1u', 'peek2s', 'peek2u', 'peek4s',
+        'peek4u', 'peek8s', 'peek8u', 'peekNS', 'peekns', 'peeknu', 'poke',
+        'poke2', 'poke4', 'poke8', 'pokeN', 'poke_string', 'poke_wstring',
+        'position', 'progress', 'prompt_number', 'prompt_string', 'read_file',
+        'read_lines', 'recv', 'resume_thread', 'seek', 'select', 'send',
+        'setHandler', 'shutdown', 'sleep', 'SO', 'sockaddr_in', 'socket',
+        'split_path', 'suspend_thread', 'system', 'system_exec', 'system_open',
+        'system_wait', 'task_clock_start', 'task_clock_stop', 'task_create',
+        'task_delay', 'task_list', 'task_schedule', 'task_self', 'task_status',
+        'task_suspend', 'task_yield', 'thread_safe_string', 'try_cs',
+        'utf8_to_utf16', 'utf16_to_utf8', 'utf16_to_utf32', 'utf32_to_utf16',
+        'video_config', 'WSACleanup', 'wait_thread', 'walk_dir', 'where',
+        'write_lines', 'wait_key'
+    )
+    constants = (
+        'ANY_QUEUE', 'ASCENDING', 'BLACK', 'BLOCK_CURSOR', 'BLUE',
+        'BRIGHT_CYAN', 'BRIGHT_BLUE', 'BRIGHT_GREEN', 'BRIGHT_MAGENTA',
+        'BRIGHT_RED', 'BRIGHT_WHITE', 'BROWN', 'C_DWORD', 'C_INT', 'C_POINTER',
+        'C_USHORT', 'C_WORD', 'CD_AMBER', 'CD_BLACK', 'CD_BLUE', 'CD_BOLD',
+        'CD_BOLD_ITALIC', 'CD_BOX', 'CD_CENTER', 'CD_CIRCLE', 'CD_CLOSED_LINES',
+        'CD_CONTINUOUS', 'CD_CUSTOM', 'CD_CYAN', 'CD_DARK_BLUE', 'CD_DARK_CYAN',
+        'CD_DARK_GRAY', 'CD_DARK_GREY', 'CD_DARK_GREEN', 'CD_DARK_MAGENTA',
+        'CD_DARK_RED', 'CD_DARK_YELLOW', 'CD_DASH_DOT', 'CD_DASH_DOT_DOT',
+        'CD_DASHED', 'CD_DBUFFER', 'CD_DEG2RAD', 'CD_DIAMOND', 'CD_DOTTED',
+        'CD_EAST', 'CD_EVENODD', 'CD_FILL', 'CD_GL', 'CD_GRAY', 'CD_GREY',
+        'CD_GREEN', 'CD_HATCH', 'CD_HOLLOW', 'CD_HOLLOW_BOX',
+        'CD_HOLLOW_CIRCLE', 'CD_HOLLOW_DIAMOND', 'CD_INDIGO', 'CD_ITALIC',
+        'CD_IUP', 'CD_IUPDBUFFER', 'CD_LIGHT_BLUE', 'CD_LIGHT_GRAY',
+        'CD_LIGHT_GREY', 'CD_LIGHT_GREEN', 'CD_LIGHT_PARCHMENT', 'CD_MAGENTA',
+        'CD_NAVY', 'CD_NORTH', 'CD_NORTH_EAST', 'CD_NORTH_WEST', 'CD_OLIVE',
+        'CD_OPEN_LINES', 'CD_ORANGE', 'CD_PARCHMENT', 'CD_PATTERN',
+        'CD_PRINTER', 'CD_PURPLE', 'CD_PLAIN', 'CD_PLUS', 'CD_QUERY',
+        'CD_RAD2DEG', 'CD_RED', 'CD_SILVER', 'CD_SOLID', 'CD_SOUTH_EAST',
+        'CD_SOUTH_WEST', 'CD_STAR', 'CD_STIPPLE', 'CD_STRIKEOUT',
+        'CD_UNDERLINE', 'CD_WEST', 'CD_WHITE', 'CD_WINDING', 'CD_VIOLET',
+        'CD_X', 'CD_YELLOW', 'CURLE_OK', 'CURLOPT_MAIL_FROM',
+        'CURLOPT_MAIL_RCPT', 'CURLOPT_PASSWORD', 'CURLOPT_READDATA',
+        'CURLOPT_READFUNCTION', 'CURLOPT_SSL_VERIFYPEER',
+        'CURLOPT_SSL_VERIFYHOST', 'CURLOPT_UPLOAD', 'CURLOPT_URL',
+        'CURLOPT_USE_SSL', 'CURLOPT_USERNAME', 'CURLOPT_VERBOSE',
+        'CURLOPT_WRITEFUNCTION', 'CURLUSESSL_ALL', 'CYAN', 'D_NAME',
+        'D_ATTRIBUTES', 'D_SIZE', 'D_YEAR', 'D_MONTH', 'D_DAY', 'D_HOUR',
+        'D_MINUTE', 'D_SECOND', 'D_CREATION', 'D_LASTACCESS', 'D_MODIFICATION',
+        'DT_YEAR', 'DT_MONTH', 'DT_DAY', 'DT_HOUR', 'DT_MINUTE', 'DT_SECOND',
+        'DT_DOW', 'DT_MSEC', 'DT_DOY', 'DT_GMT', 'EULER', 'E_CODE', 'E_ADDR',
+        'E_LINE', 'E_RTN', 'E_NAME', 'E_FILE', 'E_PATH', 'E_USER', 'false',
+        'False', 'FALSE', 'FIFO_QUEUE', 'FILETYPE_DIRECTORY', 'FILETYPE_FILE',
+        'GET_EOF', 'GET_FAIL', 'GET_IGNORE', 'GET_SUCCESS',
+        'GL_AMBIENT_AND_DIFFUSE', 'GL_ARRAY_BUFFER', 'GL_CLAMP',
+        'GL_CLAMP_TO_BORDER', 'GL_CLAMP_TO_EDGE', 'GL_COLOR_BUFFER_BIT',
+        'GL_COMPILE', 'GL_COMPILE_STATUS', 'GL_CULL_FACE',
+        'GL_DEPTH_BUFFER_BIT', 'GL_DEPTH_TEST', 'GL_EXTENSIONS', 'GL_FLAT',
+        'GL_FLOAT', 'GL_FRAGMENT_SHADER', 'GL_FRONT', 'GL_LIGHT0',
+        'GL_LIGHTING', 'GL_LINEAR', 'GL_LINK_STATUS', 'GL_MODELVIEW',
+        'GL_NEAREST', 'GL_NO_ERROR', 'GL_NORMALIZE', 'GL_POSITION',
+        'GL_PROJECTION', 'GL_QUAD_STRIP', 'GL_QUADS', 'GL_RENDERER',
+        'GL_REPEAT', 'GL_RGB', 'GL_RGBA', 'GL_SMOOTH', 'GL_STATIC_DRAW',
+        'GL_TEXTURE_2D', 'GL_TEXTURE_MAG_FILTER', 'GL_TEXTURE_MIN_FILTER',
+        'GL_TEXTURE_WRAP_S', 'GL_TEXTURE_WRAP_T', 'GL_TRIANGLES',
+        'GL_UNSIGNED_BYTE', 'GL_VENDOR', 'GL_VERSION', 'GL_VERTEX_SHADER',
+        'GRAY', 'GREEN', 'GT_LF_STRIPPED', 'GT_WHOLE_FILE', 'INVLN10',
+        'IUP_CLOSE', 'IUP_CONTINUE', 'IUP_DEFAULT', 'IUP_BLACK', 'IUP_BLUE',
+        'IUP_BUTTON1', 'IUP_BUTTON3', 'IUP_CENTER', 'IUP_CYAN', 'IUP_DARK_BLUE',
+        'IUP_DARK_CYAN', 'IUP_DARK_GRAY', 'IUP_DARK_GREY', 'IUP_DARK_GREEN',
+        'IUP_DARK_MAGENTA', 'IUP_DARK_RED', 'IUP_GRAY', 'IUP_GREY', 'IUP_GREEN',
+        'IUP_IGNORE', 'IUP_INDIGO', 'IUP_MAGENTA', 'IUP_MASK_INT',
+        'IUP_MASK_UINT', 'IUP_MOUSEPOS', 'IUP_NAVY', 'IUP_OLIVE', 'IUP_RECTEXT',
+        'IUP_RED', 'IUP_LIGHT_BLUE', 'IUP_LIGHT_GRAY', 'IUP_LIGHT_GREY',
+        'IUP_LIGHT_GREEN', 'IUP_ORANGE', 'IUP_PARCHMENT', 'IUP_PURPLE',
+        'IUP_SILVER', 'IUP_TEAL', 'IUP_VIOLET', 'IUP_WHITE', 'IUP_YELLOW',
+        'K_BS', 'K_cA', 'K_cC', 'K_cD', 'K_cF5', 'K_cK', 'K_cM', 'K_cN', 'K_cO',
+        'K_cP', 'K_cR', 'K_cS', 'K_cT', 'K_cW', 'K_CR', 'K_DEL', 'K_DOWN',
+        'K_END', 'K_ESC', 'K_F1', 'K_F2', 'K_F3', 'K_F4', 'K_F5', 'K_F6',
+        'K_F7', 'K_F8', 'K_F9', 'K_F10', 'K_F11', 'K_F12', 'K_HOME', 'K_INS',
+        'K_LEFT', 'K_MIDDLE', 'K_PGDN', 'K_PGUP', 'K_RIGHT', 'K_SP', 'K_TAB',
+        'K_UP', 'K_h', 'K_i', 'K_j', 'K_p', 'K_r', 'K_s', 'JS', 'LIFO_QUEUE',
+        'LINUX', 'MAX_HEAP', 'MAGENTA', 'MIN_HEAP', 'Nan', 'NO_CURSOR', 'null',
+        'NULL', 'PI', 'pp_Ascii', 'pp_Brkt', 'pp_Date', 'pp_File', 'pp_FltFmt',
+        'pp_Indent', 'pp_IntCh', 'pp_IntFmt', 'pp_Maxlen', 'pp_Nest',
+        'pp_Pause', 'pp_Q22', 'pp_StrFmt', 'RED', 'SEEK_OK', 'SLASH',
+        'TEST_ABORT', 'TEST_CRASH', 'TEST_PAUSE', 'TEST_PAUSE_FAIL',
+        'TEST_QUIET', 'TEST_SHOW_ALL', 'TEST_SHOW_FAILED', 'TEST_SUMMARY',
+        'true', 'True', 'TRUE', 'VC_SCRNLINES', 'WHITE', 'WINDOWS', 'YELLOW'
+    )
+
+    tokens = {
+        'root': [
+            (r"\s+", Whitespace),
+            (r'/\*|--/\*|#\[', Comment.Multiline, 'comment'),
+            (r'(?://|--|#!).*$', Comment.Single),
+#Alt:
+#           (r'//.*$|--.*$|#!.*$', Comment.Single),
+            (r'"([^"\\]|\\.)*"', String.Other),
+            (r'\'[^\']*\'', String.Other),
+            (r'`[^`]*`', String.Other),
+
+            (words(types, prefix=r'\b', suffix=r'\b'), Name.Function),
+            (words(routines, prefix=r'\b', suffix=r'\b'), Name.Function),
+            (words(preproc, prefix=r'\b', suffix=r'\b'), Keyword.Declaration),
+            (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword.Declaration),
+            (words(constants, prefix=r'\b', suffix=r'\b'), Name.Constant),
+            # Aside: Phix only supports/uses the ascii/non-unicode tilde
+            (r'!=|==|<<|>>|:=|[-~+/*%=<>&^|\.(){},?:\[\]$\\;#]', Operator),
+            (r'[\w-]+', Text)
+        ],
+        'comment': [
+            (r'[^*/#]+', Comment.Multiline),
+            (r'/\*|#\[', Comment.Multiline, '#push'),
+            (r'\*/|#\]', Comment.Multiline, '#pop'),
+            (r'[*/#]', Comment.Multiline)
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/php.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/php.py
new file mode 100644
index 000000000..82d4aeb3d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/php.py
@@ -0,0 +1,334 @@
+"""
+    pygments.lexers.php
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for PHP and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, include, bygroups, default, \
+    using, this, words, do_insertions, line_re
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Other, Generic
+from pygments.util import get_bool_opt, get_list_opt, shebang_matches
+
+__all__ = ['ZephirLexer', 'PsyshConsoleLexer', 'PhpLexer']
+
+
+class ZephirLexer(RegexLexer):
+    """
+    For Zephir language source code.
+
+    Zephir is a compiled high level language aimed
+    to the creation of C-extensions for PHP.
+    """
+
+    name = 'Zephir'
+    url = 'http://zephir-lang.com/'
+    aliases = ['zephir']
+    filenames = ['*.zep']
+    version_added = '2.0'
+
+    zephir_keywords = ['fetch', 'echo', 'isset', 'empty']
+    zephir_type = ['bit', 'bits', 'string']
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'/', Operator, '#pop'),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            (r'^(?=\s|/)', Text, 'slashstartsregex'),
+            include('commentsandwhitespace'),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|'
+             r'(<<|>>>?|==?|!=?|->|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'(for|in|while|do|break|return|continue|switch|case|default|if|else|loop|'
+             r'require|inline|throw|try|catch|finally|new|delete|typeof|instanceof|void|'
+             r'namespace|use|extends|this|fetch|isset|unset|echo|fetch|likely|unlikely|'
+             r'empty)\b', Keyword, 'slashstartsregex'),
+            (r'(var|let|with|function)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(abstract|boolean|bool|char|class|const|double|enum|export|extends|final|'
+             r'native|goto|implements|import|int|string|interface|long|ulong|char|uchar|'
+             r'float|unsigned|private|protected|public|short|static|self|throws|reverse|'
+             r'transient|volatile|readonly)\b', Keyword.Reserved),
+            (r'(true|false|null|undefined)\b', Keyword.Constant),
+            (r'(Array|Boolean|Date|_REQUEST|_COOKIE|_SESSION|'
+             r'_GET|_POST|_SERVER|this|stdClass|range|count|iterator|'
+             r'window)\b', Name.Builtin),
+            (r'[$a-zA-Z_][\w\\]*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ]
+    }
+
+
+class PsyshConsoleLexer(Lexer):
+    """
+    For PsySH console output, such as:
+
+    .. sourcecode:: psysh
+
+        >>> $greeting = function($name): string {
+        ...     return "Hello, {$name}";
+        ... };
+        => Closure($name): string {#2371 …3}
+        >>> $greeting('World')
+        => "Hello, World"
+    """
+    name = 'PsySH console session for PHP'
+    url = 'https://psysh.org/'
+    aliases = ['psysh']
+    version_added = '2.7'
+
+    def __init__(self, **options):
+        options['startinline'] = True
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        phplexer = PhpLexer(**self.options)
+        curcode = ''
+        insertions = []
+        for match in line_re.finditer(text):
+            line = match.group()
+            if line.startswith('>>> ') or line.startswith('... '):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:4])]))
+                curcode += line[4:]
+            elif line.rstrip() == '...':
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, '...')]))
+                curcode += line[3:]
+            else:
+                if curcode:
+                    yield from do_insertions(
+                        insertions, phplexer.get_tokens_unprocessed(curcode))
+                    curcode = ''
+                    insertions = []
+                yield match.start(), Generic.Output, line
+        if curcode:
+            yield from do_insertions(insertions,
+                                     phplexer.get_tokens_unprocessed(curcode))
+
+
+class PhpLexer(RegexLexer):
+    """
+    For PHP source code.
+    For PHP embedded in HTML, use the `HtmlPhpLexer`.
+
+    Additional options accepted:
+
+    `startinline`
+        If given and ``True`` the lexer starts highlighting with
+        php code (i.e.: no starting ``>> from pygments.lexers._php_builtins import MODULES
+            >>> MODULES.keys()
+            ['PHP Options/Info', 'Zip', 'dba', ...]
+
+        In fact the names of those modules match the module names from
+        the php documentation.
+    """
+
+    name = 'PHP'
+    url = 'https://www.php.net/'
+    aliases = ['php', 'php3', 'php4', 'php5']
+    filenames = ['*.php', '*.php[345]', '*.inc']
+    mimetypes = ['text/x-php']
+    version_added = ''
+
+    # Note that a backslash is included, PHP uses a backslash as a namespace
+    # separator.
+    _ident_inner = r'(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*'
+    # But not inside strings.
+    _ident_nons = r'(?:[_a-z]|[^\x00-\x7f])(?:\w|[^\x00-\x7f])*'
+
+    flags = re.IGNORECASE | re.DOTALL | re.MULTILINE
+    tokens = {
+        'root': [
+            (r'<\?(php)?', Comment.Preproc, 'php'),
+            (r'[^<]+', Other),
+            (r'<', Other)
+        ],
+        'php': [
+            (r'\?>', Comment.Preproc, '#pop'),
+            (r'(<<<)([\'"]?)(' + _ident_nons + r')(\2\n.*?\n\s*)(\3)(;?)(\n)',
+             bygroups(String, String, String.Delimiter, String, String.Delimiter,
+                      Punctuation, Text)),
+            (r'\s+', Text),
+            (r'#\[', Punctuation, 'attribute'),
+            (r'#.*?\n', Comment.Single),
+            (r'//.*?\n', Comment.Single),
+            # put the empty comment here, it is otherwise seen as
+            # the start of a docstring
+            (r'/\*\*/', Comment.Multiline),
+            (r'/\*\*.*?\*/', String.Doc),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'(->|::)(\s*)(' + _ident_nons + ')',
+             bygroups(Operator, Text, Name.Attribute)),
+            (r'[~!%^&*+=|:.<>/@-]+', Operator),
+            (r'\?', Operator),  # don't add to the charclass above!
+            (r'[\[\]{}();,]+', Punctuation),
+            (r'(new)(\s+)(class)\b', bygroups(Keyword, Text, Keyword)),
+            (r'(class)(\s+)', bygroups(Keyword, Text), 'classname'),
+            (r'(function)(\s*)(?=\()', bygroups(Keyword, Text)),
+            (r'(function)(\s+)(&?)(\s*)',
+             bygroups(Keyword, Text, Operator, Text), 'functionname'),
+            (r'(const)(\s+)(' + _ident_inner + ')',
+             bygroups(Keyword, Text, Name.Constant)),
+            (r'(and|E_PARSE|old_function|E_ERROR|or|as|E_WARNING|parent|'
+             r'eval|PHP_OS|break|exit|case|extends|PHP_VERSION|cfunction|'
+             r'FALSE|print|for|require|continue|foreach|require_once|'
+             r'declare|return|default|static|do|switch|die|stdClass|'
+             r'echo|else|TRUE|elseif|var|empty|if|xor|enddeclare|include|'
+             r'virtual|endfor|include_once|while|endforeach|global|'
+             r'endif|list|endswitch|new|endwhile|not|'
+             r'array|E_ALL|NULL|final|php_user_filter|interface|'
+             r'implements|public|private|protected|abstract|clone|try|'
+             r'catch|throw|this|use|namespace|trait|yield|'
+             r'finally|match)\b', Keyword),
+            (r'(true|false|null)\b', Keyword.Constant),
+            include('magicconstants'),
+            (r'\$\{', Name.Variable, 'variablevariable'),
+            (r'\$+' + _ident_inner, Name.Variable),
+            (_ident_inner, Name.Other),
+            (r'(\d+\.\d*|\d*\.\d+)(e[+-]?[0-9]+)?', Number.Float),
+            (r'\d+e[+-]?[0-9]+', Number.Float),
+            (r'0[0-7]+', Number.Oct),
+            (r'0x[a-f0-9]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'0b[01]+', Number.Bin),
+            (r"'([^'\\]*(?:\\.[^'\\]*)*)'", String.Single),
+            (r'`([^`\\]*(?:\\.[^`\\]*)*)`', String.Backtick),
+            (r'"', String.Double, 'string'),
+        ],
+        'variablevariable': [
+            (r'\}', Name.Variable, '#pop'),
+            include('php')
+        ],
+        'magicfuncs': [
+            # source: http://php.net/manual/en/language.oop5.magic.php
+            (words((
+                '__construct', '__destruct', '__call', '__callStatic', '__get', '__set',
+                '__isset', '__unset', '__sleep', '__wakeup', '__toString', '__invoke',
+                '__set_state', '__clone', '__debugInfo',), suffix=r'\b'),
+             Name.Function.Magic),
+        ],
+        'magicconstants': [
+            # source: http://php.net/manual/en/language.constants.predefined.php
+            (words((
+                '__LINE__', '__FILE__', '__DIR__', '__FUNCTION__', '__CLASS__',
+                '__TRAIT__', '__METHOD__', '__NAMESPACE__',),
+                suffix=r'\b'),
+             Name.Constant),
+        ],
+        'classname': [
+            (_ident_inner, Name.Class, '#pop')
+        ],
+        'functionname': [
+            include('magicfuncs'),
+            (_ident_inner, Name.Function, '#pop'),
+            default('#pop')
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'[^{$"\\]+', String.Double),
+            (r'\\([nrt"$\\]|[0-7]{1,3}|x[0-9a-f]{1,2})', String.Escape),
+            (r'\$' + _ident_nons + r'(\[\S+?\]|->' + _ident_nons + ')?',
+             String.Interpol),
+            (r'(\{\$\{)(.*?)(\}\})',
+             bygroups(String.Interpol, using(this, _startinline=True),
+                      String.Interpol)),
+            (r'(\{)(\$.*?)(\})',
+             bygroups(String.Interpol, using(this, _startinline=True),
+                      String.Interpol)),
+            (r'(\$\{)(\S+)(\})',
+             bygroups(String.Interpol, Name.Variable, String.Interpol)),
+            (r'[${\\]', String.Double)
+        ],
+        'attribute': [
+            (r'\]', Punctuation, '#pop'),
+            (r'\(', Punctuation, 'attributeparams'),
+            (_ident_inner, Name.Decorator),
+            include('php')
+        ],
+        'attributeparams': [
+            (r'\)', Punctuation, '#pop'),
+            include('php')
+        ],
+    }
+
+    def __init__(self, **options):
+        self.funcnamehighlighting = get_bool_opt(
+            options, 'funcnamehighlighting', True)
+        self.disabledmodules = get_list_opt(
+            options, 'disabledmodules', ['unknown'])
+        self.startinline = get_bool_opt(options, 'startinline', False)
+
+        # private option argument for the lexer itself
+        if '_startinline' in options:
+            self.startinline = options.pop('_startinline')
+
+        # collect activated functions in a set
+        self._functions = set()
+        if self.funcnamehighlighting:
+            from pygments.lexers._php_builtins import MODULES
+            for key, value in MODULES.items():
+                if key not in self.disabledmodules:
+                    self._functions.update(value)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        stack = ['root']
+        if self.startinline:
+            stack.append('php')
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text, stack):
+            if token is Name.Other:
+                if value in self._functions:
+                    yield index, Name.Builtin, value
+                    continue
+            yield index, token, value
+
+    def analyse_text(text):
+        if shebang_matches(text, r'php'):
+            return True
+        rv = 0.0
+        if re.search(r'<\?(?!xml)', text):
+            rv += 0.3
+        return rv
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pointless.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pointless.py
new file mode 100644
index 000000000..adedb757d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pointless.py
@@ -0,0 +1,70 @@
+"""
+    pygments.lexers.pointless
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Pointless.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Error, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text
+
+__all__ = ['PointlessLexer']
+
+
+class PointlessLexer(RegexLexer):
+    """
+    For Pointless source code.
+    """
+
+    name = 'Pointless'
+    url = 'https://ptls.dev'
+    aliases = ['pointless']
+    filenames = ['*.ptls']
+    version_added = '2.7'
+
+    ops = words([
+        "+", "-", "*", "/", "**", "%", "+=", "-=", "*=",
+        "/=", "**=", "%=", "|>", "=", "==", "!=", "<", ">",
+        "<=", ">=", "=>", "$", "++",
+    ])
+
+    keywords = words([
+        "if", "then", "else", "where", "with", "cond",
+        "case", "and", "or", "not", "in", "as", "for",
+        "requires", "throw", "try", "catch", "when",
+        "yield", "upval",
+    ], suffix=r'\b')
+
+    tokens = {
+        'root': [
+            (r'[ \n\r]+', Text),
+            (r'--.*$', Comment.Single),
+            (r'"""', String, 'multiString'),
+            (r'"', String, 'string'),
+            (r'[\[\](){}:;,.]', Punctuation),
+            (ops, Operator),
+            (keywords, Keyword),
+            (r'\d+|\d*\.\d+', Number),
+            (r'(true|false)\b', Name.Builtin),
+            (r'[A-Z][a-zA-Z0-9]*\b', String.Symbol),
+            (r'output\b', Name.Variable.Magic),
+            (r'(export|import)\b', Keyword.Namespace),
+            (r'[a-z][a-zA-Z0-9]*\b', Name.Variable)
+        ],
+        'multiString': [
+            (r'\\.', String.Escape),
+            (r'"""', String, '#pop'),
+            (r'"', String),
+            (r'[^\\"]+', String),
+        ],
+        'string': [
+            (r'\\.', String.Escape),
+            (r'"', String, '#pop'),
+            (r'\n', Error),
+            (r'[^\\"]+', String),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pony.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pony.py
new file mode 100644
index 000000000..055423a46
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/pony.py
@@ -0,0 +1,93 @@
+"""
+    pygments.lexers.pony
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Pony and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['PonyLexer']
+
+
+class PonyLexer(RegexLexer):
+    """
+    For Pony source code.
+    """
+
+    name = 'Pony'
+    aliases = ['pony']
+    filenames = ['*.pony']
+    url = 'https://www.ponylang.io'
+    version_added = '2.4'
+
+    _caps = r'(iso|trn|ref|val|box|tag)'
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'//.*\n', Comment.Single),
+            (r'/\*', Comment.Multiline, 'nested_comment'),
+            (r'"""(?:.|\n)*?"""', String.Doc),
+            (r'"', String, 'string'),
+            (r'\'.*\'', String.Char),
+            (r'=>|[]{}:().~;,|&!^?[]', Punctuation),
+            (words((
+                'addressof', 'and', 'as', 'consume', 'digestof', 'is', 'isnt',
+                'not', 'or'),
+                suffix=r'\b'),
+             Operator.Word),
+            (r'!=|==|<<|>>|[-+/*%=<>]', Operator),
+            (words((
+                'box', 'break', 'compile_error', 'compile_intrinsic',
+                'continue', 'do', 'else', 'elseif', 'embed', 'end', 'error',
+                'for', 'if', 'ifdef', 'in', 'iso', 'lambda', 'let', 'match',
+                'object', 'recover', 'ref', 'repeat', 'return', 'tag', 'then',
+                'this', 'trn', 'try', 'until', 'use', 'var', 'val', 'where',
+                'while', 'with', '#any', '#read', '#send', '#share'),
+                suffix=r'\b'),
+             Keyword),
+            (r'(actor|class|struct|primitive|interface|trait|type)((?:\s)+)',
+             bygroups(Keyword, Text), 'typename'),
+            (r'(new|fun|be)((?:\s)+)', bygroups(Keyword, Text), 'methodname'),
+            (words((
+                'I8', 'U8', 'I16', 'U16', 'I32', 'U32', 'I64', 'U64', 'I128',
+                'U128', 'ILong', 'ULong', 'ISize', 'USize', 'F32', 'F64',
+                'Bool', 'Pointer', 'None', 'Any', 'Array', 'String',
+                'Iterator'),
+                suffix=r'\b'),
+             Name.Builtin.Type),
+            (r'_?[A-Z]\w*', Name.Type),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'(true|false)\b', Name.Builtin),
+            (r'_\d*', Name),
+            (r'_?[a-z][\w\']*', Name)
+        ],
+        'typename': [
+            (_caps + r'?((?:\s)*)(_?[A-Z]\w*)',
+             bygroups(Keyword, Text, Name.Class), '#pop')
+        ],
+        'methodname': [
+            (_caps + r'?((?:\s)*)(_?[a-z]\w*)',
+             bygroups(Keyword, Text, Name.Function), '#pop')
+        ],
+        'nested_comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline)
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r'\\"', String),
+            (r'[^\\"]+', String)
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/praat.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/praat.py
new file mode 100644
index 000000000..054f5b61e
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/praat.py
@@ -0,0 +1,303 @@
+"""
+    pygments.lexers.praat
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Praat
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, bygroups, include
+from pygments.token import Name, Text, Comment, Keyword, String, Punctuation, \
+    Number, Operator, Whitespace
+
+__all__ = ['PraatLexer']
+
+
+class PraatLexer(RegexLexer):
+    """
+    For Praat scripts.
+    """
+
+    name = 'Praat'
+    url = 'http://www.praat.org'
+    aliases = ['praat']
+    filenames = ['*.praat', '*.proc', '*.psc']
+    version_added = '2.1'
+
+    keywords = (
+        'if', 'then', 'else', 'elsif', 'elif', 'endif', 'fi', 'for', 'from', 'to',
+        'endfor', 'endproc', 'while', 'endwhile', 'repeat', 'until', 'select', 'plus',
+        'minus', 'demo', 'assert', 'stopwatch', 'nocheck', 'nowarn', 'noprogress',
+        'editor', 'endeditor', 'clearinfo',
+    )
+
+    functions_string = (
+        'backslashTrigraphsToUnicode', 'chooseDirectory', 'chooseReadFile',
+        'chooseWriteFile', 'date', 'demoKey', 'do', 'environment', 'extractLine',
+        'extractWord', 'fixed', 'info', 'left', 'mid', 'percent', 'readFile', 'replace',
+        'replace_regex', 'right', 'selected', 'string', 'unicodeToBackslashTrigraphs',
+    )
+
+    functions_numeric = (
+        'abs', 'appendFile', 'appendFileLine', 'appendInfo', 'appendInfoLine', 'arccos',
+        'arccosh', 'arcsin', 'arcsinh', 'arctan', 'arctan2', 'arctanh', 'barkToHertz',
+        'beginPause', 'beginSendPraat', 'besselI', 'besselK', 'beta', 'beta2',
+        'binomialP', 'binomialQ', 'boolean', 'ceiling', 'chiSquareP', 'chiSquareQ',
+        'choice', 'comment', 'cos', 'cosh', 'createDirectory', 'deleteFile',
+        'demoClicked', 'demoClickedIn', 'demoCommandKeyPressed',
+        'demoExtraControlKeyPressed', 'demoInput', 'demoKeyPressed',
+        'demoOptionKeyPressed', 'demoShiftKeyPressed', 'demoShow', 'demoWaitForInput',
+        'demoWindowTitle', 'demoX', 'demoY', 'differenceLimensToPhon', 'do', 'editor',
+        'endPause', 'endSendPraat', 'endsWith', 'erb', 'erbToHertz', 'erf', 'erfc',
+        'exitScript', 'exp', 'extractNumber', 'fileReadable', 'fisherP', 'fisherQ',
+        'floor', 'gaussP', 'gaussQ', 'hertzToBark', 'hertzToErb', 'hertzToMel',
+        'hertzToSemitones', 'imax', 'imin', 'incompleteBeta', 'incompleteGammaP', 'index',
+        'index_regex', 'integer', 'invBinomialP', 'invBinomialQ', 'invChiSquareQ', 'invFisherQ',
+        'invGaussQ', 'invSigmoid', 'invStudentQ', 'length', 'ln', 'lnBeta', 'lnGamma',
+        'log10', 'log2', 'max', 'melToHertz', 'min', 'minusObject', 'natural', 'number',
+        'numberOfColumns', 'numberOfRows', 'numberOfSelected', 'objectsAreIdentical',
+        'option', 'optionMenu', 'pauseScript', 'phonToDifferenceLimens', 'plusObject',
+        'positive', 'randomBinomial', 'randomGauss', 'randomInteger', 'randomPoisson',
+        'randomUniform', 'real', 'readFile', 'removeObject', 'rindex', 'rindex_regex',
+        'round', 'runScript', 'runSystem', 'runSystem_nocheck', 'selectObject',
+        'selected', 'semitonesToHertz', 'sentence', 'sentencetext', 'sigmoid', 'sin', 'sinc',
+        'sincpi', 'sinh', 'soundPressureToPhon', 'sqrt', 'startsWith', 'studentP',
+        'studentQ', 'tan', 'tanh', 'text', 'variableExists', 'word', 'writeFile', 'writeFileLine',
+        'writeInfo', 'writeInfoLine',
+    )
+
+    functions_array = (
+        'linear', 'randomGauss', 'randomInteger', 'randomUniform', 'zero',
+    )
+
+    objects = (
+        'Activation', 'AffineTransform', 'AmplitudeTier', 'Art', 'Artword',
+        'Autosegment', 'BarkFilter', 'BarkSpectrogram', 'CCA', 'Categories',
+        'Cepstrogram', 'Cepstrum', 'Cepstrumc', 'ChebyshevSeries', 'ClassificationTable',
+        'Cochleagram', 'Collection', 'ComplexSpectrogram', 'Configuration', 'Confusion',
+        'ContingencyTable', 'Corpus', 'Correlation', 'Covariance',
+        'CrossCorrelationTable', 'CrossCorrelationTables', 'DTW', 'DataModeler',
+        'Diagonalizer', 'Discriminant', 'Dissimilarity', 'Distance', 'Distributions',
+        'DurationTier', 'EEG', 'ERP', 'ERPTier', 'EditCostsTable', 'EditDistanceTable',
+        'Eigen', 'Excitation', 'Excitations', 'ExperimentMFC', 'FFNet', 'FeatureWeights',
+        'FileInMemory', 'FilesInMemory', 'Formant', 'FormantFilter', 'FormantGrid',
+        'FormantModeler', 'FormantPoint', 'FormantTier', 'GaussianMixture', 'HMM',
+        'HMM_Observation', 'HMM_ObservationSequence', 'HMM_State', 'HMM_StateSequence',
+        'Harmonicity', 'ISpline', 'Index', 'Intensity', 'IntensityTier', 'IntervalTier',
+        'KNN', 'KlattGrid', 'KlattTable', 'LFCC', 'LPC', 'Label', 'LegendreSeries',
+        'LinearRegression', 'LogisticRegression', 'LongSound', 'Ltas', 'MFCC', 'MSpline',
+        'ManPages', 'Manipulation', 'Matrix', 'MelFilter', 'MelSpectrogram',
+        'MixingMatrix', 'Movie', 'Network', 'Object', 'OTGrammar', 'OTHistory', 'OTMulti',
+        'PCA', 'PairDistribution', 'ParamCurve', 'Pattern', 'Permutation', 'Photo',
+        'Pitch', 'PitchModeler', 'PitchTier', 'PointProcess', 'Polygon', 'Polynomial',
+        'PowerCepstrogram', 'PowerCepstrum', 'Procrustes', 'RealPoint', 'RealTier',
+        'ResultsMFC', 'Roots', 'SPINET', 'SSCP', 'SVD', 'Salience', 'ScalarProduct',
+        'Similarity', 'SimpleString', 'SortedSetOfString', 'Sound', 'Speaker',
+        'Spectrogram', 'Spectrum', 'SpectrumTier', 'SpeechSynthesizer', 'SpellingChecker',
+        'Strings', 'StringsIndex', 'Table', 'TableOfReal', 'TextGrid', 'TextInterval',
+        'TextPoint', 'TextTier', 'Tier', 'Transition', 'VocalTract', 'VocalTractTier',
+        'Weight', 'WordList',
+    )
+
+    variables_numeric = (
+        'macintosh', 'windows', 'unix', 'praatVersion', 'pi', 'e', 'undefined',
+    )
+
+    variables_string = (
+        'praatVersion', 'tab', 'shellDirectory', 'homeDirectory',
+        'preferencesDirectory', 'newline', 'temporaryDirectory',
+        'defaultDirectory',
+    )
+
+    object_attributes = (
+        'ncol', 'nrow', 'xmin', 'ymin', 'xmax', 'ymax', 'nx', 'ny', 'dx', 'dy',
+    )
+
+    tokens = {
+        'root': [
+            (r'(\s+)(#.*?$)',  bygroups(Whitespace, Comment.Single)),
+            (r'^#.*?$',        Comment.Single),
+            (r';[^\n]*',       Comment.Single),
+            (r'\s+',           Whitespace),
+
+            (r'\bprocedure\b', Keyword,       'procedure_definition'),
+            (r'\bcall\b',      Keyword,       'procedure_call'),
+            (r'@',             Name.Function, 'procedure_call'),
+
+            include('function_call'),
+
+            (words(keywords, suffix=r'\b'), Keyword),
+
+            (r'(\bform\b)(\s+)([^\n]+)',
+             bygroups(Keyword, Whitespace, String), 'old_form'),
+
+            (r'(print(?:line|tab)?|echo|exit|asserterror|pause|send(?:praat|socket)|'
+             r'include|execute|system(?:_nocheck)?)(\s+)',
+             bygroups(Keyword, Whitespace), 'string_unquoted'),
+
+            (r'(goto|label)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Label)),
+
+            include('variable_name'),
+            include('number'),
+
+            (r'"', String, 'string'),
+
+            (words((objects), suffix=r'(?=\s+\S+\n)'), Name.Class, 'string_unquoted'),
+
+            (r'\b[A-Z]', Keyword, 'command'),
+            (r'(\.{3}|[)(,])', Punctuation),
+        ],
+        'command': [
+            (r'( ?[\w()-]+ ?)', Keyword),
+
+            include('string_interpolated'),
+
+            (r'\.{3}', Keyword, ('#pop', 'old_arguments')),
+            (r':', Keyword, ('#pop', 'comma_list')),
+            (r'\s', Whitespace, '#pop'),
+        ],
+        'procedure_call': [
+            (r'\s+', Whitespace),
+            (r'([\w.]+)(?:(:)|(?:(\s*)(\()))',
+             bygroups(Name.Function, Punctuation,
+                      Text.Whitespace, Punctuation), '#pop'),
+            (r'([\w.]+)', Name.Function, ('#pop', 'old_arguments')),
+        ],
+        'procedure_definition': [
+            (r'\s', Whitespace),
+            (r'([\w.]+)(\s*?[(:])',
+             bygroups(Name.Function, Whitespace), '#pop'),
+            (r'([\w.]+)([^\n]*)',
+             bygroups(Name.Function, Text), '#pop'),
+        ],
+        'function_call': [
+            (words(functions_string, suffix=r'\$(?=\s*[:(])'), Name.Function, 'function'),
+            (words(functions_array, suffix=r'#(?=\s*[:(])'),   Name.Function, 'function'),
+            (words(functions_numeric, suffix=r'(?=\s*[:(])'),  Name.Function, 'function'),
+        ],
+        'function': [
+            (r'\s+',   Whitespace),
+            (r':',     Punctuation, ('#pop', 'comma_list')),
+            (r'\s*\(', Punctuation, ('#pop', 'comma_list')),
+        ],
+        'comma_list': [
+            (r'(\s*\n\s*)(\.{3})', bygroups(Whitespace, Punctuation)),
+
+            (r'(\s*)(?:([)\]])|(\n))', bygroups(
+                Whitespace, Punctuation, Whitespace), '#pop'),
+
+            (r'\s+', Whitespace),
+            (r'"',   String, 'string'),
+            (r'\b(if|then|else|fi|endif)\b', Keyword),
+
+            include('function_call'),
+            include('variable_name'),
+            include('operator'),
+            include('number'),
+
+            (r'[()]', Text),
+            (r',', Punctuation),
+        ],
+        'old_arguments': [
+            (r'\n', Whitespace, '#pop'),
+
+            include('variable_name'),
+            include('operator'),
+            include('number'),
+
+            (r'"', String, 'string'),
+            (r'[^\n]', Text),
+        ],
+        'number': [
+            (r'\n', Whitespace, '#pop'),
+            (r'\b\d+(\.\d*)?([eE][-+]?\d+)?%?', Number),
+        ],
+        'object_reference': [
+            include('string_interpolated'),
+            (r'([a-z][a-zA-Z0-9_]*|\d+)', Name.Builtin),
+
+            (words(object_attributes, prefix=r'\.'), Name.Builtin, '#pop'),
+
+            (r'\$', Name.Builtin),
+            (r'\[', Text, '#pop'),
+        ],
+        'variable_name': [
+            include('operator'),
+            include('number'),
+
+            (words(variables_string,  suffix=r'\$'), Name.Variable.Global),
+            (words(variables_numeric,
+             suffix=r'(?=[^a-zA-Z0-9_."\'$#\[:(]|\s|^|$)'),
+             Name.Variable.Global),
+
+            (words(objects, prefix=r'\b', suffix=r"(_)"),
+             bygroups(Name.Builtin, Name.Builtin),
+             'object_reference'),
+
+            (r'\.?_?[a-z][\w.]*(\$|#)?', Text),
+            (r'[\[\]]', Punctuation, 'comma_list'),
+
+            include('string_interpolated'),
+        ],
+        'operator': [
+            (r'([+\/*<>=!-]=?|[&*|][&*|]?|\^|<>)',       Operator),
+            (r'(?', Punctuation),
+            (r'"(?:\\x[0-9a-fA-F]+\\|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|'
+             r'\\[0-7]+\\|\\["\\abcefnrstv]|[^\\"])*"', String.Double),
+            (r"'(?:''|[^'])*'", String.Atom),  # quoted atom
+            # Needs to not be followed by an atom.
+            # (r'=(?=\s|[a-zA-Z\[])', Operator),
+            (r'is\b', Operator),
+            (r'(<|>|=<|>=|==|=:=|=|/|//|\*|\+|-)(?=\s|[a-zA-Z0-9\[])',
+             Operator),
+            (r'(mod|div|not)\b', Operator),
+            (r'_', Keyword),  # The don't-care variable
+            (r'([a-z]+)(:)', bygroups(Name.Namespace, Punctuation)),
+            (r'([a-z\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]'
+             r'[\w$\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]*)'
+             r'(\s*)(:-|-->)',
+             bygroups(Name.Function, Text, Operator)),  # function defn
+            (r'([a-z\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]'
+             r'[\w$\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]*)'
+             r'(\s*)(\()',
+             bygroups(Name.Function, Text, Punctuation)),
+            (r'[a-z\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]'
+             r'[\w$\u00c0-\u1fff\u3040-\ud7ff\ue000-\uffef]*',
+             String.Atom),  # atom, characters
+            # This one includes !
+            (r'[#&*+\-./:<=>?@\\^~\u00a1-\u00bf\u2010-\u303f]+',
+             String.Atom),  # atom, graphics
+            (r'[A-Z_]\w*', Name.Variable),
+            (r'\s+|[\u2000-\u200f\ufff0-\ufffe\uffef]', Text),
+        ],
+        'nested-comment': [
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'[^*/]+', Comment.Multiline),
+            (r'[*/]', Comment.Multiline),
+        ],
+    }
+
+    def analyse_text(text):
+        """Competes with IDL and Visual Prolog on *.pro"""
+        if ':-' in text:
+            # Visual Prolog also uses :-
+            return 0.5
+        else:
+            return 0
+
+
+class LogtalkLexer(RegexLexer):
+    """
+    For Logtalk source code.
+    """
+
+    name = 'Logtalk'
+    url = 'http://logtalk.org/'
+    aliases = ['logtalk']
+    filenames = ['*.lgt', '*.logtalk']
+    mimetypes = ['text/x-logtalk']
+    version_added = '0.10'
+
+    tokens = {
+        'root': [
+            # Directives
+            (r'^\s*:-\s', Punctuation, 'directive'),
+            # Comments
+            (r'%.*?\n', Comment),
+            (r'/\*(.|\n)*?\*/', Comment),
+            # Whitespace
+            (r'\n', Text),
+            (r'\s+', Text),
+            # Numbers
+            (r"0'[\\]?.", Number),
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+\.?\d*((e|E)(\+|-)?\d+)?', Number),
+            # Variables
+            (r'([A-Z_][a-zA-Z0-9_]*)', Name.Variable),
+            # Event handlers
+            (r'(after|before)(?=[(])', Keyword),
+            # Message forwarding handler
+            (r'forward(?=[(])', Keyword),
+            # Execution-context methods
+            (r'(context|parameter|this|se(lf|nder))(?=[(])', Keyword),
+            # Reflection
+            (r'(current_predicate|predicate_property)(?=[(])', Keyword),
+            # DCGs and term expansion
+            (r'(expand_(goal|term)|(goal|term)_expansion|phrase)(?=[(])', Keyword),
+            # Entity
+            (r'(abolish|c(reate|urrent))_(object|protocol|category)(?=[(])', Keyword),
+            (r'(object|protocol|category)_property(?=[(])', Keyword),
+            # Entity relations
+            (r'co(mplements_object|nforms_to_protocol)(?=[(])', Keyword),
+            (r'extends_(object|protocol|category)(?=[(])', Keyword),
+            (r'imp(lements_protocol|orts_category)(?=[(])', Keyword),
+            (r'(instantiat|specializ)es_class(?=[(])', Keyword),
+            # Events
+            (r'(current_event|(abolish|define)_events)(?=[(])', Keyword),
+            # Flags
+            (r'(create|current|set)_logtalk_flag(?=[(])', Keyword),
+            # Compiling, loading, and library paths
+            (r'logtalk_(compile|l(ibrary_path|oad|oad_context)|make(_target_action)?)(?=[(])', Keyword),
+            (r'\blogtalk_make\b', Keyword),
+            # Database
+            (r'(clause|retract(all)?)(?=[(])', Keyword),
+            (r'a(bolish|ssert(a|z))(?=[(])', Keyword),
+            # Control constructs
+            (r'(ca(ll|tch)|throw)(?=[(])', Keyword),
+            (r'(fa(il|lse)|true|(instantiation|system)_error)\b', Keyword),
+            (r'(uninstantiation|type|domain|existence|permission|representation|evaluation|resource|syntax)_error(?=[(])', Keyword),
+            # All solutions
+            (r'((bag|set)of|f(ind|or)all)(?=[(])', Keyword),
+            # Multi-threading predicates
+            (r'threaded(_(ca(ll|ncel)|once|ignore|exit|peek|wait|notify))?(?=[(])', Keyword),
+            # Engine predicates
+            (r'threaded_engine(_(create|destroy|self|next|next_reified|yield|post|fetch))?(?=[(])', Keyword),
+            # Term unification
+            (r'(subsumes_term|unify_with_occurs_check)(?=[(])', Keyword),
+            # Term creation and decomposition
+            (r'(functor|arg|copy_term|numbervars|term_variables)(?=[(])', Keyword),
+            # Evaluable functors
+            (r'(div|rem|m(ax|in|od)|abs|sign)(?=[(])', Keyword),
+            (r'float(_(integer|fractional)_part)?(?=[(])', Keyword),
+            (r'(floor|t(an|runcate)|round|ceiling)(?=[(])', Keyword),
+            # Other arithmetic functors
+            (r'(cos|a(cos|sin|tan|tan2)|exp|log|s(in|qrt)|xor)(?=[(])', Keyword),
+            # Term testing
+            (r'(var|atom(ic)?|integer|float|c(allable|ompound)|n(onvar|umber)|ground|acyclic_term)(?=[(])', Keyword),
+            # Term comparison
+            (r'compare(?=[(])', Keyword),
+            # Stream selection and control
+            (r'(curren|se)t_(in|out)put(?=[(])', Keyword),
+            (r'(open|close)(?=[(])', Keyword),
+            (r'flush_output(?=[(])', Keyword),
+            (r'(at_end_of_stream|flush_output)\b', Keyword),
+            (r'(stream_property|at_end_of_stream|set_stream_position)(?=[(])', Keyword),
+            # Character and byte input/output
+            (r'(nl|(get|peek|put)_(byte|c(har|ode)))(?=[(])', Keyword),
+            (r'\bnl\b', Keyword),
+            # Term input/output
+            (r'read(_term)?(?=[(])', Keyword),
+            (r'write(q|_(canonical|term))?(?=[(])', Keyword),
+            (r'(current_)?op(?=[(])', Keyword),
+            (r'(current_)?char_conversion(?=[(])', Keyword),
+            # Atomic term processing
+            (r'atom_(length|c(hars|o(ncat|des)))(?=[(])', Keyword),
+            (r'(char_code|sub_atom)(?=[(])', Keyword),
+            (r'number_c(har|ode)s(?=[(])', Keyword),
+            # Implementation defined hooks functions
+            (r'(se|curren)t_prolog_flag(?=[(])', Keyword),
+            (r'\bhalt\b', Keyword),
+            (r'halt(?=[(])', Keyword),
+            # Message sending operators
+            (r'(::|:|\^\^)', Operator),
+            # External call
+            (r'[{}]', Keyword),
+            # Logic and control
+            (r'(ignore|once)(?=[(])', Keyword),
+            (r'\brepeat\b', Keyword),
+            # Sorting
+            (r'(key)?sort(?=[(])', Keyword),
+            # Bitwise functors
+            (r'(>>|<<|/\\|\\\\|\\)', Operator),
+            # Predicate aliases
+            (r'\bas\b', Operator),
+            # Arithmetic evaluation
+            (r'\bis\b', Keyword),
+            # Arithmetic comparison
+            (r'(=:=|=\\=|<|=<|>=|>)', Operator),
+            # Term creation and decomposition
+            (r'=\.\.', Operator),
+            # Term unification
+            (r'(=|\\=)', Operator),
+            # Term comparison
+            (r'(==|\\==|@=<|@<|@>=|@>)', Operator),
+            # Evaluable functors
+            (r'(//|[-+*/])', Operator),
+            (r'\b(e|pi|div|mod|rem)\b', Operator),
+            # Other arithmetic functors
+            (r'\b\*\*\b', Operator),
+            # DCG rules
+            (r'-->', Operator),
+            # Control constructs
+            (r'([!;]|->)', Operator),
+            # Logic and control
+            (r'\\+', Operator),
+            # Mode operators
+            (r'[?@]', Operator),
+            # Existential quantifier
+            (r'\^', Operator),
+            # Punctuation
+            (r'[()\[\],.|]', Text),
+            # Atoms
+            (r"[a-z][a-zA-Z0-9_]*", Text),
+            (r"'", String, 'quoted_atom'),
+            # Double-quoted terms
+            (r'"', String, 'double_quoted_term'),
+        ],
+
+        'quoted_atom': [
+            (r"''", String),
+            (r"'", String, '#pop'),
+            (r'\\([\\abfnrtv"\']|(x[a-fA-F0-9]+|[0-7]+)\\)', String.Escape),
+            (r"[^\\'\n]+", String),
+            (r'\\', String),
+        ],
+
+        'double_quoted_term': [
+            (r'""', String),
+            (r'"', String, '#pop'),
+            (r'\\([\\abfnrtv"\']|(x[a-fA-F0-9]+|[0-7]+)\\)', String.Escape),
+            (r'[^\\"\n]+', String),
+            (r'\\', String),
+        ],
+
+        'directive': [
+            # Conditional compilation directives
+            (r'(el)?if(?=[(])', Keyword, 'root'),
+            (r'(e(lse|ndif))(?=[.])', Keyword, 'root'),
+            # Entity directives
+            (r'(category|object|protocol)(?=[(])', Keyword, 'entityrelations'),
+            (r'(end_(category|object|protocol))(?=[.])', Keyword, 'root'),
+            # Predicate scope directives
+            (r'(public|protected|private)(?=[(])', Keyword, 'root'),
+            # Other directives
+            (r'e(n(coding|sure_loaded)|xport)(?=[(])', Keyword, 'root'),
+            (r'in(clude|itialization|fo)(?=[(])', Keyword, 'root'),
+            (r'(built_in|dynamic|synchronized|threaded)(?=[.])', Keyword, 'root'),
+            (r'(alias|d(ynamic|iscontiguous)|m(eta_(non_terminal|predicate)|ode|ultifile)|s(et_(logtalk|prolog)_flag|ynchronized))(?=[(])', Keyword, 'root'),
+            (r'op(?=[(])', Keyword, 'root'),
+            (r'(c(alls|oinductive)|module|reexport|use(s|_module))(?=[(])', Keyword, 'root'),
+            (r'[a-z][a-zA-Z0-9_]*(?=[(])', Text, 'root'),
+            (r'[a-z][a-zA-Z0-9_]*(?=[.])', Text, 'root'),
+        ],
+
+        'entityrelations': [
+            (r'(complements|extends|i(nstantiates|mp(lements|orts))|specializes)(?=[(])', Keyword),
+            # Numbers
+            (r"0'[\\]?.", Number),
+            (r'0b[01]+', Number.Bin),
+            (r'0o[0-7]+', Number.Oct),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+\.?\d*((e|E)(\+|-)?\d+)?', Number),
+            # Variables
+            (r'([A-Z_][a-zA-Z0-9_]*)', Name.Variable),
+            # Atoms
+            (r"[a-z][a-zA-Z0-9_]*", Text),
+            (r"'", String, 'quoted_atom'),
+            # Double-quoted terms
+            (r'"', String, 'double_quoted_term'),
+            # End of entity-opening directive
+            (r'([)]\.)', Text, 'root'),
+            # Scope operator
+            (r'(::)', Operator),
+            # Punctuation
+            (r'[()\[\],.|]', Text),
+            # Comments
+            (r'%.*?\n', Comment),
+            (r'/\*(.|\n)*?\*/', Comment),
+            # Whitespace
+            (r'\n', Text),
+            (r'\s+', Text),
+        ]
+    }
+
+    def analyse_text(text):
+        if ':- object(' in text:
+            return 1.0
+        elif ':- protocol(' in text:
+            return 1.0
+        elif ':- category(' in text:
+            return 1.0
+        elif re.search(r'^:-\s[a-z]', text, re.M):
+            return 0.9
+        else:
+            return 0.0
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/promql.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/promql.py
new file mode 100644
index 000000000..cad3c254a
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/promql.py
@@ -0,0 +1,176 @@
+"""
+    pygments.lexers.promql
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Prometheus Query Language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, default, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Whitespace
+
+__all__ = ["PromQLLexer"]
+
+
+class PromQLLexer(RegexLexer):
+    """
+    For PromQL queries.
+
+    For details about the grammar see:
+    https://github.com/prometheus/prometheus/tree/master/promql/parser
+
+    .. versionadded: 2.7
+    """
+
+    name = "PromQL"
+    url = 'https://prometheus.io/docs/prometheus/latest/querying/basics/'
+    aliases = ["promql"]
+    filenames = ["*.promql"]
+    version_added = ''
+
+    base_keywords = (
+        words(
+            (
+                "bool",
+                "by",
+                "group_left",
+                "group_right",
+                "ignoring",
+                "offset",
+                "on",
+                "without",
+            ),
+            suffix=r"\b",
+        ),
+        Keyword,
+    )
+
+    aggregator_keywords = (
+        words(
+            (
+                "sum",
+                "min",
+                "max",
+                "avg",
+                "group",
+                "stddev",
+                "stdvar",
+                "count",
+                "count_values",
+                "bottomk",
+                "topk",
+                "quantile",
+            ),
+            suffix=r"\b",
+        ),
+        Keyword,
+    )
+
+    function_keywords = (
+        words(
+            (
+                "abs",
+                "absent",
+                "absent_over_time",
+                "avg_over_time",
+                "ceil",
+                "changes",
+                "clamp_max",
+                "clamp_min",
+                "count_over_time",
+                "day_of_month",
+                "day_of_week",
+                "days_in_month",
+                "delta",
+                "deriv",
+                "exp",
+                "floor",
+                "histogram_quantile",
+                "holt_winters",
+                "hour",
+                "idelta",
+                "increase",
+                "irate",
+                "label_join",
+                "label_replace",
+                "ln",
+                "log10",
+                "log2",
+                "max_over_time",
+                "min_over_time",
+                "minute",
+                "month",
+                "predict_linear",
+                "quantile_over_time",
+                "rate",
+                "resets",
+                "round",
+                "scalar",
+                "sort",
+                "sort_desc",
+                "sqrt",
+                "stddev_over_time",
+                "stdvar_over_time",
+                "sum_over_time",
+                "time",
+                "timestamp",
+                "vector",
+                "year",
+            ),
+            suffix=r"\b",
+        ),
+        Keyword.Reserved,
+    )
+
+    tokens = {
+        "root": [
+            (r"\n", Whitespace),
+            (r"\s+", Whitespace),
+            (r",", Punctuation),
+            # Keywords
+            base_keywords,
+            aggregator_keywords,
+            function_keywords,
+            # Offsets
+            (r"[1-9][0-9]*[smhdwy]", String),
+            # Numbers
+            (r"-?[0-9]+\.[0-9]+", Number.Float),
+            (r"-?[0-9]+", Number.Integer),
+            # Comments
+            (r"#.*?$", Comment.Single),
+            # Operators
+            (r"(\+|\-|\*|\/|\%|\^)", Operator),
+            (r"==|!=|>=|<=|<|>", Operator),
+            (r"and|or|unless", Operator.Word),
+            # Metrics
+            (r"[_a-zA-Z][a-zA-Z0-9_]+", Name.Variable),
+            # Params
+            (r'(["\'])(.*?)(["\'])', bygroups(Punctuation, String, Punctuation)),
+            # Other states
+            (r"\(", Operator, "function"),
+            (r"\)", Operator),
+            (r"\{", Punctuation, "labels"),
+            (r"\[", Punctuation, "range"),
+        ],
+        "labels": [
+            (r"\}", Punctuation, "#pop"),
+            (r"\n", Whitespace),
+            (r"\s+", Whitespace),
+            (r",", Punctuation),
+            (r'([_a-zA-Z][a-zA-Z0-9_]*?)(\s*?)(=~|!=|=|!~)(\s*?)("|\')(.*?)("|\')',
+             bygroups(Name.Label, Whitespace, Operator, Whitespace,
+                      Punctuation, String, Punctuation)),
+        ],
+        "range": [
+            (r"\]", Punctuation, "#pop"),
+            (r"[1-9][0-9]*[smhdwy]", String),
+        ],
+        "function": [
+            (r"\)", Operator, "#pop"),
+            (r"\(", Operator, "#push"),
+            default("#pop"),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/prql.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/prql.py
new file mode 100644
index 000000000..ee95d2d47
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/prql.py
@@ -0,0 +1,251 @@
+"""
+    pygments.lexers.prql
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the PRQL query language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, combined, words, include, bygroups
+from pygments.token import Comment, Literal, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text, Whitespace
+
+__all__ = ['PrqlLexer']
+
+
+class PrqlLexer(RegexLexer):
+    """
+    For PRQL source code.
+
+    grammar: https://github.com/PRQL/prql/tree/main/grammars
+    """
+
+    name = 'PRQL'
+    url = 'https://prql-lang.org/'
+    aliases = ['prql']
+    filenames = ['*.prql']
+    mimetypes = ['application/prql', 'application/x-prql']
+    version_added = '2.17'
+
+    builtinTypes = words((
+        "bool",
+        "int",
+        "int8", "int16", "int32", "int64", "int128",
+        "float",
+        "text",
+        "set"), suffix=r'\b')
+
+    def innerstring_rules(ttype):
+        return [
+            # the new style '{}'.format(...) string formatting
+            (r'\{'
+             r'((\w+)((\.\w+)|(\[[^\]]+\]))*)?'  # field name
+             r'(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?'
+             r'\}', String.Interpol),
+
+            (r'[^\\\'"%{\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            (r'%|(\{{1,2})', ttype)
+        ]
+
+    def fstring_rules(ttype):
+        return [
+            (r'\}', String.Interpol),
+            (r'\{', String.Interpol, 'expr-inside-fstring'),
+            (r'[^\\\'"{}\n]+', ttype),
+            (r'[\'"\\]', ttype),
+        ]
+
+    tokens = {
+        'root': [
+
+            # Comments
+            (r'#!.*', String.Doc),
+            (r'#.*', Comment.Single),
+
+            # Whitespace
+            (r'\s+', Whitespace),
+
+            # Modules
+            (r'^(\s*)(module)(\s*)',
+             bygroups(Whitespace, Keyword.Namespace, Whitespace),
+             'imports'),
+
+            (builtinTypes, Keyword.Type),
+
+            # Main
+            (r'^prql ', Keyword.Reserved),
+
+            ('let', Keyword.Declaration),
+
+            include('keywords'),
+            include('expr'),
+
+            # Transforms
+            (r'^[A-Za-z_][a-zA-Z0-9_]*', Keyword),
+        ],
+        'expr': [
+            # non-raw f-strings
+            ('(f)(""")', bygroups(String.Affix, String.Double),
+             combined('fstringescape', 'tdqf')),
+            ("(f)(''')", bygroups(String.Affix, String.Single),
+             combined('fstringescape', 'tsqf')),
+            ('(f)(")', bygroups(String.Affix, String.Double),
+             combined('fstringescape', 'dqf')),
+            ("(f)(')", bygroups(String.Affix, String.Single),
+             combined('fstringescape', 'sqf')),
+
+            # non-raw s-strings
+            ('(s)(""")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'tdqf')),
+            ("(s)(''')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'tsqf')),
+            ('(s)(")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'dqf')),
+            ("(s)(')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'sqf')),
+
+            # raw strings
+            ('(?i)(r)(""")',
+             bygroups(String.Affix, String.Double), 'tdqs'),
+            ("(?i)(r)(''')",
+             bygroups(String.Affix, String.Single), 'tsqs'),
+            ('(?i)(r)(")',
+             bygroups(String.Affix, String.Double), 'dqs'),
+            ("(?i)(r)(')",
+             bygroups(String.Affix, String.Single), 'sqs'),
+
+            # non-raw strings
+            ('"""', String.Double, combined('stringescape', 'tdqs')),
+            ("'''", String.Single, combined('stringescape', 'tsqs')),
+            ('"', String.Double, combined('stringescape', 'dqs')),
+            ("'", String.Single, combined('stringescape', 'sqs')),
+
+            # Time and dates
+            (r'@\d{4}-\d{2}-\d{2}T\d{2}(:\d{2})?(:\d{2})?(\.\d{1,6})?(Z|[+-]\d{1,2}(:\d{1,2})?)?', Literal.Date),
+            (r'@\d{4}-\d{2}-\d{2}', Literal.Date),
+            (r'@\d{2}(:\d{2})?(:\d{2})?(\.\d{1,6})?(Z|[+-]\d{1,2}(:\d{1,2})?)?', Literal.Date),
+
+            (r'[^\S\n]+', Text),
+            include('numbers'),
+            (r'->|=>|==|!=|>=|<=|~=|&&|\|\||\?\?|\/\/', Operator),
+            (r'[-~+/*%=<>&^|.@]', Operator),
+            (r'[]{}:(),;[]', Punctuation),
+            include('functions'),
+
+            # Variable Names
+            (r'[A-Za-z_][a-zA-Z0-9_]*', Name.Variable),
+        ],
+        'numbers': [
+            (r'(\d(?:_?\d)*\.(?:\d(?:_?\d)*)?|(?:\d(?:_?\d)*)?\.\d(?:_?\d)*)'
+             r'([eE][+-]?\d(?:_?\d)*)?', Number.Float),
+            (r'\d(?:_?\d)*[eE][+-]?\d(?:_?\d)*j?', Number.Float),
+            (r'0[oO](?:_?[0-7])+', Number.Oct),
+            (r'0[bB](?:_?[01])+', Number.Bin),
+            (r'0[xX](?:_?[a-fA-F0-9])+', Number.Hex),
+            (r'\d(?:_?\d)*', Number.Integer),
+        ],
+        'fstringescape': [
+            include('stringescape'),
+        ],
+        'bytesescape': [
+            (r'\\([\\bfnrt"\']|\n|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape)
+        ],
+        'stringescape': [
+            (r'\\(N\{.*?\}|u\{[a-fA-F0-9]{1,6}\})', String.Escape),
+            include('bytesescape')
+        ],
+        'fstrings-single': fstring_rules(String.Single),
+        'fstrings-double': fstring_rules(String.Double),
+        'strings-single': innerstring_rules(String.Single),
+        'strings-double': innerstring_rules(String.Double),
+        'dqf': [
+            (r'"', String.Double, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
+            include('fstrings-double')
+        ],
+        'sqf': [
+            (r"'", String.Single, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
+            include('fstrings-single')
+        ],
+        'dqs': [
+            (r'"', String.Double, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),  # included here for raw strings
+            include('strings-double')
+        ],
+        'sqs': [
+            (r"'", String.Single, '#pop'),
+            (r"\\\\|\\'|\\\n", String.Escape),  # included here for raw strings
+            include('strings-single')
+        ],
+        'tdqf': [
+            (r'"""', String.Double, '#pop'),
+            include('fstrings-double'),
+            (r'\n', String.Double)
+        ],
+        'tsqf': [
+            (r"'''", String.Single, '#pop'),
+            include('fstrings-single'),
+            (r'\n', String.Single)
+        ],
+        'tdqs': [
+            (r'"""', String.Double, '#pop'),
+            include('strings-double'),
+            (r'\n', String.Double)
+        ],
+        'tsqs': [
+            (r"'''", String.Single, '#pop'),
+            include('strings-single'),
+            (r'\n', String.Single)
+        ],
+
+        'expr-inside-fstring': [
+            (r'[{([]', Punctuation, 'expr-inside-fstring-inner'),
+            # without format specifier
+            (r'(=\s*)?'         # debug (https://bugs.python.org/issue36817)
+             r'\}', String.Interpol, '#pop'),
+            # with format specifier
+            # we'll catch the remaining '}' in the outer scope
+            (r'(=\s*)?'         # debug (https://bugs.python.org/issue36817)
+             r':', String.Interpol, '#pop'),
+            (r'\s+', Whitespace),  # allow new lines
+            include('expr'),
+        ],
+        'expr-inside-fstring-inner': [
+            (r'[{([]', Punctuation, 'expr-inside-fstring-inner'),
+            (r'[])}]', Punctuation, '#pop'),
+            (r'\s+', Whitespace),  # allow new lines
+            include('expr'),
+        ],
+        'keywords': [
+            (words((
+                'into', 'case', 'type', 'module', 'internal',
+            ), suffix=r'\b'),
+                Keyword),
+            (words(('true', 'false', 'null'), suffix=r'\b'), Keyword.Constant),
+        ],
+        'functions': [
+            (words((
+                "min", "max", "sum", "average", "stddev", "every", "any",
+                "concat_array", "count", "lag", "lead", "first", "last",
+                "rank", "rank_dense", "row_number", "round", "as", "in",
+                "tuple_every", "tuple_map", "tuple_zip", "_eq", "_is_null",
+                "from_text", "lower", "upper", "read_parquet", "read_csv"),
+                suffix=r'\b'),
+             Name.Function),
+        ],
+
+        'comment': [
+            (r'-(?!\})', Comment.Multiline),
+            (r'\{-', Comment.Multiline, 'comment'),
+            (r'[^-}]', Comment.Multiline),
+            (r'-\}', Comment.Multiline, '#pop'),
+        ],
+
+        'imports': [
+            (r'\w+(\.\w+)*', Name.Class, '#pop'),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ptx.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ptx.py
new file mode 100644
index 000000000..784ca13a6
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ptx.py
@@ -0,0 +1,119 @@
+"""
+    pygments.lexers.ptx
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for other PTX language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Comment, Keyword, Name, String, Number, \
+    Punctuation, Whitespace, Operator
+
+__all__ = ["PtxLexer"]
+
+
+class PtxLexer(RegexLexer):
+    """
+    For NVIDIA `PTX `_
+    source.
+    """
+    name = 'PTX'
+    url = "https://docs.nvidia.com/cuda/parallel-thread-execution/"
+    filenames = ['*.ptx']
+    aliases = ['ptx']
+    mimetypes = ['text/x-ptx']
+    version_added = '2.16'
+
+    #: optional Comment or Whitespace
+    string = r'"[^"]*?"'
+    followsym = r'[a-zA-Z0-9_$]'
+    identifier = r'([-a-zA-Z$._][\w\-$.]*|' + string + ')'
+    block_label = r'(' + identifier + r'|(\d+))'
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+
+            (block_label + r'\s*:', Name.Label),
+
+            include('keyword'),
+
+            (r'%' + identifier, Name.Variable),
+            (r'%\d+', Name.Variable.Anonymous),
+            (r'c?' + string, String),
+            (identifier, Name.Variable),
+            (r';', Punctuation),
+            (r'[*+-/]', Operator),
+
+            (r'0[xX][a-fA-F0-9]+', Number),
+            (r'-?\d+(?:[.]\d+)?(?:[eE][-+]?\d+(?:[.]\d+)?)?', Number),
+
+            (r'[=<>{}\[\]()*.,!]|x\b', Punctuation)
+
+        ],
+        'whitespace': [
+            (r'(\n|\s+)+', Whitespace),
+            (r'//.*?\n', Comment)
+        ],
+
+        'keyword': [
+            # Instruction keywords
+            (words((
+                'abs', 'discard', 'min', 'shf', 'vadd',
+                'activemask', 'div', 'mma', 'shfl', 'vadd2',
+                'add', 'dp2a', 'mov', 'shl', 'vadd4',
+                'addc', 'dp4a', 'movmatrix', 'shr', 'vavrg2',
+                'alloca', 'elect', 'mul', 'sin', 'vavrg4',
+                'and', 'ex2', 'mul24', 'slct', 'vmad',
+                'applypriority', 'exit', 'multimem', 'sqrt', 'vmax',
+                'atom', 'fence', 'nanosleep', 'st', 'vmax2',
+                'bar', 'fma', 'neg', 'stackrestore', 'vmax4',
+                'barrier', 'fns', 'not', 'stacksave', 'vmin',
+                'bfe', 'getctarank', 'or', 'stmatrix', 'vmin2',
+                'bfi', 'griddepcontrol', 'pmevent', 'sub', 'vmin4',
+                'bfind', 'isspacep', 'popc', 'subc', 'vote',
+                'bmsk', 'istypep', 'prefetch', 'suld', 'vset',
+                'bra', 'ld', 'prefetchu', 'suq', 'vset2',
+                'brev', 'ldmatrix', 'prmt', 'sured', 'vset4',
+                'brkpt', 'ldu', 'rcp', 'sust', 'vshl',
+                'brx', 'lg2', 'red', 'szext', 'vshr',
+                'call', 'lop3', 'redux', 'tanh', 'vsub',
+                'clz', 'mad', 'rem', 'testp', 'vsub2',
+                'cnot', 'mad24', 'ret', 'tex', 'vsub4',
+                'copysign', 'madc', 'rsqrt', 'tld4', 'wgmma',
+                'cos', 'mapa', 'sad', 'trap', 'wmma',
+                'cp', 'match', 'selp', 'txq', 'xor',
+                'createpolicy', 'max', 'set', 'vabsdiff', 'cvt',
+                'mbarrier', 'setmaxnreg', 'vabsdiff2', 'cvta',
+                'membar', 'setp', 'vabsdiff4')), Keyword),
+            # State Spaces and Suffixes
+            (words((
+                'reg', '.sreg', '.const', '.global',
+                '.local', '.param', '.shared', '.tex',
+                '.wide', '.loc'
+            )), Keyword.Pseudo),
+            # PTX Directives
+            (words((
+                '.address_size', '.explicitcluster', '.maxnreg', '.section',
+                '.alias', '.extern', '.maxntid', '.shared',
+                '.align', '.file', '.minnctapersm', '.sreg',
+                '.branchtargets', '.func', '.noreturn', '.target',
+                '.callprototype', '.global', '.param', '.tex',
+                '.calltargets', '.loc', '.pragma', '.version',
+                '.common', '.local', '.reg', '.visible',
+                '.const', '.maxclusterrank', '.reqnctapercluster', '.weak',
+                '.entry', '.maxnctapersm', '.reqntid')), Keyword.Reserved),
+            # Fundamental Types
+            (words((
+                '.s8', '.s16', '.s32', '.s64',
+                '.u8', '.u16', '.u32', '.u64',
+                '.f16', '.f16x2', '.f32', '.f64',
+                '.b8', '.b16', '.b32', '.b64',
+                '.pred'
+            )), Keyword.Type)
+        ],
+
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/python.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/python.py
new file mode 100644
index 000000000..805f6ff2a
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/python.py
@@ -0,0 +1,1201 @@
+"""
+    pygments.lexers.python
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Python and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import keyword
+
+from pygments.lexer import DelegatingLexer, RegexLexer, include, \
+    bygroups, using, default, words, combined, this
+from pygments.util import get_bool_opt, shebang_matches
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Other, Error, Whitespace
+from pygments import unistring as uni
+
+__all__ = ['PythonLexer', 'PythonConsoleLexer', 'PythonTracebackLexer',
+           'Python2Lexer', 'Python2TracebackLexer',
+           'CythonLexer', 'DgLexer', 'NumPyLexer']
+
+
+class PythonLexer(RegexLexer):
+    """
+    For Python source code (version 3.x).
+
+    .. versionchanged:: 2.5
+       This is now the default ``PythonLexer``.  It is still available as the
+       alias ``Python3Lexer``.
+    """
+
+    name = 'Python'
+    url = 'https://www.python.org'
+    aliases = ['python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark', 'pyi']
+    filenames = [
+        '*.py',
+        '*.pyw',
+        # Type stubs
+        '*.pyi',
+        # Jython
+        '*.jy',
+        # Sage
+        '*.sage',
+        # SCons
+        '*.sc',
+        'SConstruct',
+        'SConscript',
+        # Skylark/Starlark (used by Bazel, Buck, and Pants)
+        '*.bzl',
+        'BUCK',
+        'BUILD',
+        'BUILD.bazel',
+        'WORKSPACE',
+        # Twisted Application infrastructure
+        '*.tac',
+    ]
+    mimetypes = ['text/x-python', 'application/x-python',
+                 'text/x-python3', 'application/x-python3']
+    version_added = '0.10'
+
+    uni_name = f"[{uni.xid_start}][{uni.xid_continue}]*"
+
+    def innerstring_rules(ttype):
+        return [
+            # the old style '%s' % (...) string formatting (still valid in Py3)
+            (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?'
+             '[hlL]?[E-GXc-giorsaux%]', String.Interpol),
+            # the new style '{}'.format(...) string formatting
+            (r'\{'
+             r'((\w+)((\.\w+)|(\[[^\]]+\]))*)?'  # field name
+             r'(\![sra])?'                       # conversion
+             r'(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?'
+             r'\}', String.Interpol),
+
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"%{\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # unhandled string formatting sign
+            (r'%|(\{{1,2})', ttype)
+            # newlines are an error (use "nl" state)
+        ]
+
+    def fstring_rules(ttype):
+        return [
+            # Assuming that a '}' is the closing brace after format specifier.
+            # Sadly, this means that we won't detect syntax error. But it's
+            # more important to parse correct syntax correctly, than to
+            # highlight invalid syntax.
+            (r'\}', String.Interpol),
+            (r'\{', String.Interpol, 'expr-inside-fstring'),
+            # backslashes, quotes and formatting signs must be parsed one at a time
+            (r'[^\\\'"{}\n]+', ttype),
+            (r'[\'"\\]', ttype),
+            # newlines are an error (use "nl" state)
+        ]
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")',
+             bygroups(Whitespace, String.Affix, String.Doc)),
+            (r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')",
+             bygroups(Whitespace, String.Affix, String.Doc)),
+            (r'\A#!.+$', Comment.Hashbang),
+            (r'#.*$', Comment.Single),
+            (r'\\\n', Text),
+            (r'\\', Text),
+            include('keywords'),
+            include('soft-keywords'),
+            (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'funcname'),
+            (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'classname'),
+            (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace),
+             'fromimport'),
+            (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace),
+             'import'),
+            include('expr'),
+        ],
+        'expr': [
+            # raw f-strings
+            ('(?i)(rf|fr)(""")',
+             bygroups(String.Affix, String.Double),
+             combined('rfstringescape', 'tdqf')),
+            ("(?i)(rf|fr)(''')",
+             bygroups(String.Affix, String.Single),
+             combined('rfstringescape', 'tsqf')),
+            ('(?i)(rf|fr)(")',
+             bygroups(String.Affix, String.Double),
+             combined('rfstringescape', 'dqf')),
+            ("(?i)(rf|fr)(')",
+             bygroups(String.Affix, String.Single),
+             combined('rfstringescape', 'sqf')),
+            # non-raw f-strings
+            ('([fF])(""")', bygroups(String.Affix, String.Double),
+             combined('fstringescape', 'tdqf')),
+            ("([fF])(''')", bygroups(String.Affix, String.Single),
+             combined('fstringescape', 'tsqf')),
+            ('([fF])(")', bygroups(String.Affix, String.Double),
+             combined('fstringescape', 'dqf')),
+            ("([fF])(')", bygroups(String.Affix, String.Single),
+             combined('fstringescape', 'sqf')),
+            # raw bytes and strings
+            ('(?i)(rb|br|r)(""")',
+             bygroups(String.Affix, String.Double), 'tdqs'),
+            ("(?i)(rb|br|r)(''')",
+             bygroups(String.Affix, String.Single), 'tsqs'),
+            ('(?i)(rb|br|r)(")',
+             bygroups(String.Affix, String.Double), 'dqs'),
+            ("(?i)(rb|br|r)(')",
+             bygroups(String.Affix, String.Single), 'sqs'),
+            # non-raw strings
+            ('([uU]?)(""")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'tdqs')),
+            ("([uU]?)(''')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'tsqs')),
+            ('([uU]?)(")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'dqs')),
+            ("([uU]?)(')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'sqs')),
+            # non-raw bytes
+            ('([bB])(""")', bygroups(String.Affix, String.Double),
+             combined('bytesescape', 'tdqs')),
+            ("([bB])(''')", bygroups(String.Affix, String.Single),
+             combined('bytesescape', 'tsqs')),
+            ('([bB])(")', bygroups(String.Affix, String.Double),
+             combined('bytesescape', 'dqs')),
+            ("([bB])(')", bygroups(String.Affix, String.Single),
+             combined('bytesescape', 'sqs')),
+
+            (r'[^\S\n]+', Text),
+            include('numbers'),
+            (r'!=|==|<<|>>|:=|[-~+/*%=<>&^|.]', Operator),
+            (r'[]{}:(),;[]', Punctuation),
+            (r'(in|is|and|or|not)\b', Operator.Word),
+            include('expr-keywords'),
+            include('builtins'),
+            include('magicfuncs'),
+            include('magicvars'),
+            include('name'),
+        ],
+        'expr-inside-fstring': [
+            (r'[{([]', Punctuation, 'expr-inside-fstring-inner'),
+            # without format specifier
+            (r'(=\s*)?'         # debug (https://bugs.python.org/issue36817)
+             r'(\![sraf])?'     # conversion
+             r'\}', String.Interpol, '#pop'),
+            # with format specifier
+            # we'll catch the remaining '}' in the outer scope
+            (r'(=\s*)?'         # debug (https://bugs.python.org/issue36817)
+             r'(\![sraf])?'     # conversion
+             r':', String.Interpol, '#pop'),
+            (r'\s+', Whitespace),  # allow new lines
+            include('expr'),
+        ],
+        'expr-inside-fstring-inner': [
+            (r'[{([]', Punctuation, 'expr-inside-fstring-inner'),
+            (r'[])}]', Punctuation, '#pop'),
+            (r'\s+', Whitespace),  # allow new lines
+            include('expr'),
+        ],
+        'expr-keywords': [
+            # Based on https://docs.python.org/3/reference/expressions.html
+            (words((
+                'async for', 'await', 'else', 'for', 'if', 'lambda',
+                'yield', 'yield from'), suffix=r'\b'),
+             Keyword),
+            (words(('True', 'False', 'None'), suffix=r'\b'), Keyword.Constant),
+        ],
+        'keywords': [
+            (words((
+                'assert', 'async', 'await', 'break', 'continue', 'del', 'elif',
+                'else', 'except', 'finally', 'for', 'global', 'if', 'lambda',
+                'pass', 'raise', 'nonlocal', 'return', 'try', 'while', 'yield',
+                'yield from', 'as', 'with'), suffix=r'\b'),
+             Keyword),
+            (words(('True', 'False', 'None'), suffix=r'\b'), Keyword.Constant),
+        ],
+        'soft-keywords': [
+            # `match`, `case` and `_` soft keywords
+            (r'(^[ \t]*)'              # at beginning of line + possible indentation
+             r'(match|case)\b'         # a possible keyword
+             r'(?![ \t]*(?:'           # not followed by...
+             r'[:,;=^&|@~)\]}]|(?:' +  # characters and keywords that mean this isn't
+                                       # pattern matching (but None/True/False is ok)
+             r'|'.join(k for k in keyword.kwlist if k[0].islower()) + r')\b))',
+             bygroups(Text, Keyword), 'soft-keywords-inner'),
+        ],
+        'soft-keywords-inner': [
+            # optional `_` keyword
+            (r'(\s+)([^\n_]*)(_\b)', bygroups(Whitespace, using(this), Keyword)),
+            default('#pop')
+        ],
+        'builtins': [
+            (words((
+                '__import__', 'abs', 'aiter', 'all', 'any', 'bin', 'bool', 'bytearray',
+                'breakpoint', 'bytes', 'callable', 'chr', 'classmethod', 'compile',
+                'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval',
+                'filter', 'float', 'format', 'frozenset', 'getattr', 'globals',
+                'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'isinstance',
+                'issubclass', 'iter', 'len', 'list', 'locals', 'map', 'max',
+                'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow',
+                'print', 'property', 'range', 'repr', 'reversed', 'round', 'set',
+                'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super',
+                'tuple', 'type', 'vars', 'zip'), prefix=r'(?>|[-~+/*%=<>&^|.]', Operator),
+            include('keywords'),
+            (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'funcname'),
+            (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'classname'),
+            (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace),
+             'fromimport'),
+            (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace),
+             'import'),
+            include('builtins'),
+            include('magicfuncs'),
+            include('magicvars'),
+            include('backtick'),
+            ('([rR]|[uUbB][rR]|[rR][uUbB])(""")',
+             bygroups(String.Affix, String.Double), 'tdqs'),
+            ("([rR]|[uUbB][rR]|[rR][uUbB])(''')",
+             bygroups(String.Affix, String.Single), 'tsqs'),
+            ('([rR]|[uUbB][rR]|[rR][uUbB])(")',
+             bygroups(String.Affix, String.Double), 'dqs'),
+            ("([rR]|[uUbB][rR]|[rR][uUbB])(')",
+             bygroups(String.Affix, String.Single), 'sqs'),
+            ('([uUbB]?)(""")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'tdqs')),
+            ("([uUbB]?)(''')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'tsqs')),
+            ('([uUbB]?)(")', bygroups(String.Affix, String.Double),
+             combined('stringescape', 'dqs')),
+            ("([uUbB]?)(')", bygroups(String.Affix, String.Single),
+             combined('stringescape', 'sqs')),
+            include('name'),
+            include('numbers'),
+        ],
+        'keywords': [
+            (words((
+                'assert', 'break', 'continue', 'del', 'elif', 'else', 'except',
+                'exec', 'finally', 'for', 'global', 'if', 'lambda', 'pass',
+                'print', 'raise', 'return', 'try', 'while', 'yield',
+                'yield from', 'as', 'with'), suffix=r'\b'),
+             Keyword),
+        ],
+        'builtins': [
+            (words((
+                '__import__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin',
+                'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod',
+                'cmp', 'coerce', 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod',
+                'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float',
+                'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'hex', 'id',
+                'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len',
+                'list', 'locals', 'long', 'map', 'max', 'min', 'next', 'object',
+                'oct', 'open', 'ord', 'pow', 'property', 'range', 'raw_input', 'reduce',
+                'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
+                'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type',
+                'unichr', 'unicode', 'vars', 'xrange', 'zip'),
+                prefix=r'(?>> )(.*\n)', bygroups(Generic.Prompt, Other.Code), 'continuations'),
+            # This happens, e.g., when tracebacks are embedded in documentation;
+            # trailing whitespaces are often stripped in such contexts.
+            (r'(>>>)(\n)', bygroups(Generic.Prompt, Whitespace)),
+            (r'(\^C)?Traceback \(most recent call last\):\n', Other.Traceback, 'traceback'),
+            # SyntaxError starts with this
+            (r'  File "[^"]+", line \d+', Other.Traceback, 'traceback'),
+            (r'.*\n', Generic.Output),
+        ],
+        'continuations': [
+            (r'(\.\.\. )(.*\n)', bygroups(Generic.Prompt, Other.Code)),
+            # See above.
+            (r'(\.\.\.)(\n)', bygroups(Generic.Prompt, Whitespace)),
+            default('#pop'),
+        ],
+        'traceback': [
+            # As soon as we see a traceback, consume everything until the next
+            # >>> prompt.
+            (r'(?=>>>( |$))', Text, '#pop'),
+            (r'(KeyboardInterrupt)(\n)', bygroups(Name.Class, Whitespace)),
+            (r'.*\n', Other.Traceback),
+        ],
+    }
+
+
+class PythonConsoleLexer(DelegatingLexer):
+    """
+    For Python console output or doctests, such as:
+
+    .. sourcecode:: pycon
+
+        >>> a = 'foo'
+        >>> print(a)
+        foo
+        >>> 1 / 0
+        Traceback (most recent call last):
+          File "", line 1, in 
+        ZeroDivisionError: integer division or modulo by zero
+
+    Additional options:
+
+    `python3`
+        Use Python 3 lexer for code.  Default is ``True``.
+
+        .. versionadded:: 1.0
+        .. versionchanged:: 2.5
+           Now defaults to ``True``.
+    """
+
+    name = 'Python console session'
+    aliases = ['pycon', 'python-console']
+    mimetypes = ['text/x-python-doctest']
+    url = 'https://python.org'
+    version_added = ''
+
+    def __init__(self, **options):
+        python3 = get_bool_opt(options, 'python3', True)
+        if python3:
+            pylexer = PythonLexer
+            tblexer = PythonTracebackLexer
+        else:
+            pylexer = Python2Lexer
+            tblexer = Python2TracebackLexer
+        # We have two auxiliary lexers. Use DelegatingLexer twice with
+        # different tokens.  TODO: DelegatingLexer should support this
+        # directly, by accepting a tuplet of auxiliary lexers and a tuple of
+        # distinguishing tokens. Then we wouldn't need this intermediary
+        # class.
+        class _ReplaceInnerCode(DelegatingLexer):
+            def __init__(self, **options):
+                super().__init__(pylexer, _PythonConsoleLexerBase, Other.Code, **options)
+        super().__init__(tblexer, _ReplaceInnerCode, Other.Traceback, **options)
+
+
+class PythonTracebackLexer(RegexLexer):
+    """
+    For Python 3.x tracebacks, with support for chained exceptions.
+
+    .. versionchanged:: 2.5
+       This is now the default ``PythonTracebackLexer``.  It is still available
+       as the alias ``Python3TracebackLexer``.
+    """
+
+    name = 'Python Traceback'
+    aliases = ['pytb', 'py3tb']
+    filenames = ['*.pytb', '*.py3tb']
+    mimetypes = ['text/x-python-traceback', 'text/x-python3-traceback']
+    url = 'https://python.org'
+    version_added = '1.0'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'^(\^C)?Traceback \(most recent call last\):\n', Generic.Traceback, 'intb'),
+            (r'^During handling of the above exception, another '
+             r'exception occurred:\n\n', Generic.Traceback),
+            (r'^The above exception was the direct cause of the '
+             r'following exception:\n\n', Generic.Traceback),
+            (r'^(?=  File "[^"]+", line \d+)', Generic.Traceback, 'intb'),
+            (r'^.*\n', Other),
+        ],
+        'intb': [
+            (r'^(  File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Text, Name, Whitespace)),
+            (r'^(  File )("[^"]+")(, line )(\d+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Whitespace)),
+            (r'^(    )(.+)(\n)',
+             bygroups(Whitespace, using(PythonLexer), Whitespace), 'markers'),
+            (r'^([ \t]*)(\.\.\.)(\n)',
+             bygroups(Whitespace, Comment, Whitespace)),  # for doctests...
+            (r'^([^:]+)(: )(.+)(\n)',
+             bygroups(Generic.Error, Text, Name, Whitespace), '#pop'),
+            (r'^([a-zA-Z_][\w.]*)(:?\n)',
+             bygroups(Generic.Error, Whitespace), '#pop'),
+            default('#pop'),
+        ],
+        'markers': [
+            # Either `PEP 657 `
+            # error locations in Python 3.11+, or single-caret markers
+            # for syntax errors before that.
+            (r'^( {4,})([~^]+)(\n)',
+             bygroups(Whitespace, Punctuation.Marker, Whitespace),
+             '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+Python3TracebackLexer = PythonTracebackLexer
+
+
+class Python2TracebackLexer(RegexLexer):
+    """
+    For Python tracebacks.
+
+    .. versionchanged:: 2.5
+       This class has been renamed from ``PythonTracebackLexer``.
+       ``PythonTracebackLexer`` now refers to the Python 3 variant.
+    """
+
+    name = 'Python 2.x Traceback'
+    aliases = ['py2tb']
+    filenames = ['*.py2tb']
+    mimetypes = ['text/x-python2-traceback']
+    url = 'https://python.org'
+    version_added = '0.7'
+
+    tokens = {
+        'root': [
+            # Cover both (most recent call last) and (innermost last)
+            # The optional ^C allows us to catch keyboard interrupt signals.
+            (r'^(\^C)?(Traceback.*\n)',
+             bygroups(Text, Generic.Traceback), 'intb'),
+            # SyntaxError starts with this.
+            (r'^(?=  File "[^"]+", line \d+)', Generic.Traceback, 'intb'),
+            (r'^.*\n', Other),
+        ],
+        'intb': [
+            (r'^(  File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Text, Name, Whitespace)),
+            (r'^(  File )("[^"]+")(, line )(\d+)(\n)',
+             bygroups(Text, Name.Builtin, Text, Number, Whitespace)),
+            (r'^(    )(.+)(\n)',
+             bygroups(Text, using(Python2Lexer), Whitespace), 'marker'),
+            (r'^([ \t]*)(\.\.\.)(\n)',
+             bygroups(Text, Comment, Whitespace)),  # for doctests...
+            (r'^([^:]+)(: )(.+)(\n)',
+             bygroups(Generic.Error, Text, Name, Whitespace), '#pop'),
+            (r'^([a-zA-Z_]\w*)(:?\n)',
+             bygroups(Generic.Error, Whitespace), '#pop')
+        ],
+        'marker': [
+            # For syntax errors.
+            (r'( {4,})(\^)', bygroups(Text, Punctuation.Marker), '#pop'),
+            default('#pop'),
+        ],
+    }
+
+
+class CythonLexer(RegexLexer):
+    """
+    For Pyrex and Cython source code.
+    """
+
+    name = 'Cython'
+    url = 'https://cython.org'
+    aliases = ['cython', 'pyx', 'pyrex']
+    filenames = ['*.pyx', '*.pxd', '*.pxi']
+    mimetypes = ['text/x-cython', 'application/x-cython']
+    version_added = '1.1'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'^(\s*)("""(?:.|\n)*?""")', bygroups(Whitespace, String.Doc)),
+            (r"^(\s*)('''(?:.|\n)*?''')", bygroups(Whitespace, String.Doc)),
+            (r'[^\S\n]+', Text),
+            (r'#.*$', Comment),
+            (r'[]{}:(),;[]', Punctuation),
+            (r'\\\n', Whitespace),
+            (r'\\', Text),
+            (r'(in|is|and|or|not)\b', Operator.Word),
+            (r'(<)([a-zA-Z0-9.?]+)(>)',
+             bygroups(Punctuation, Keyword.Type, Punctuation)),
+            (r'!=|==|<<|>>|[-~+/*%=<>&^|.?]', Operator),
+            (r'(from)(\d+)(<=)(\s+)(<)(\d+)(:)',
+             bygroups(Keyword, Number.Integer, Operator, Whitespace, Operator,
+                      Name, Punctuation)),
+            include('keywords'),
+            (r'(def|property)(\s+)', bygroups(Keyword, Whitespace), 'funcname'),
+            (r'(cp?def)(\s+)', bygroups(Keyword, Whitespace), 'cdef'),
+            # (should actually start a block with only cdefs)
+            (r'(cdef)(:)', bygroups(Keyword, Punctuation)),
+            (r'(class|struct)(\s+)', bygroups(Keyword, Whitespace), 'classname'),
+            (r'(from)(\s+)', bygroups(Keyword, Whitespace), 'fromimport'),
+            (r'(c?import)(\s+)', bygroups(Keyword, Whitespace), 'import'),
+            include('builtins'),
+            include('backtick'),
+            ('(?:[rR]|[uU][rR]|[rR][uU])"""', String, 'tdqs'),
+            ("(?:[rR]|[uU][rR]|[rR][uU])'''", String, 'tsqs'),
+            ('(?:[rR]|[uU][rR]|[rR][uU])"', String, 'dqs'),
+            ("(?:[rR]|[uU][rR]|[rR][uU])'", String, 'sqs'),
+            ('[uU]?"""', String, combined('stringescape', 'tdqs')),
+            ("[uU]?'''", String, combined('stringescape', 'tsqs')),
+            ('[uU]?"', String, combined('stringescape', 'dqs')),
+            ("[uU]?'", String, combined('stringescape', 'sqs')),
+            include('name'),
+            include('numbers'),
+        ],
+        'keywords': [
+            (words((
+                'assert', 'async', 'await', 'break', 'by', 'continue', 'ctypedef', 'del', 'elif',
+                'else', 'except', 'except?', 'exec', 'finally', 'for', 'fused', 'gil',
+                'global', 'if', 'include', 'lambda', 'nogil', 'pass', 'print',
+                'raise', 'return', 'try', 'while', 'yield', 'as', 'with'), suffix=r'\b'),
+             Keyword),
+            (r'(DEF|IF|ELIF|ELSE)\b', Comment.Preproc),
+        ],
+        'builtins': [
+            (words((
+                '__import__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bint',
+                'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr',
+                'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'delattr',
+                'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit',
+                'file', 'filter', 'float', 'frozenset', 'getattr', 'globals',
+                'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'intern', 'isinstance',
+                'issubclass', 'iter', 'len', 'list', 'locals', 'long', 'map', 'max',
+                'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'Py_ssize_t',
+                'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed',
+                'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod',
+                'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'unsigned',
+                'vars', 'xrange', 'zip'), prefix=r'(??/\\:']?:)(\s*)(\{)",
+             bygroups(Name.Function, Whitespace, Operator, Whitespace, Punctuation),
+             "functions"),
+            # Variable Names
+            (r"([.]?[a-zA-Z][\w.]*)(\s*)([-.~=!@#$%^&*_+|,<>?/\\:']?:)",
+             bygroups(Name.Variable, Whitespace, Operator)),
+            # Functions
+            (r"\{", Punctuation, "functions"),
+            # Parentheses
+            (r"\(", Punctuation, "parentheses"),
+            # Brackets
+            (r"\[", Punctuation, "brackets"),
+            # Errors
+            (r"'`([a-zA-Z][\w.]*)?", Name.Exception),
+            # File Symbols
+            (r"`:([a-zA-Z/][\w./]*)?", String.Symbol),
+            # Symbols
+            (r"`([a-zA-Z][\w.]*)?", String.Symbol),
+            # Numbers
+            include("numbers"),
+            # Variable Names
+            (r"[a-zA-Z][\w.]*", Name),
+            # Operators
+            (r"[-=+*#$%@!~^&:.,<>'\\|/?_]", Operator),
+            # Punctuation
+            (r";", Punctuation),
+        ],
+        "functions": [
+            include("root"),
+            (r"\}", Punctuation, "#pop"),
+        ],
+        "parentheses": [
+            include("root"),
+            (r"\)", Punctuation, "#pop"),
+        ],
+        "brackets": [
+            include("root"),
+            (r"\]", Punctuation, "#pop"),
+        ],
+        "numbers": [
+            # Binary Values
+            (r"[01]+b", Number.Bin),
+            # Nulls/Infinities
+            (r"0[nNwW][cefghijmndzuvtp]?", Number),
+            # Timestamps
+            ((r"(?:[0-9]{4}[.][0-9]{2}[.][0-9]{2}|[0-9]+)"
+              "D(?:[0-9](?:[0-9](?::[0-9]{2}"
+              "(?::[0-9]{2}(?:[.][0-9]*)?)?)?)?)?"), Literal.Date),
+            # Datetimes
+            ((r"[0-9]{4}[.][0-9]{2}"
+              "(?:m|[.][0-9]{2}(?:T(?:[0-9]{2}:[0-9]{2}"
+              "(?::[0-9]{2}(?:[.][0-9]*)?)?)?)?)"), Literal.Date),
+            # Times
+            (r"[0-9]{2}:[0-9]{2}(?::[0-9]{2}(?:[.][0-9]{1,3})?)?",
+             Literal.Date),
+            # GUIDs
+            (r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}",
+             Number.Hex),
+            # Byte Vectors
+            (r"0x[0-9a-fA-F]+", Number.Hex),
+            # Floats
+            (r"([0-9]*[.]?[0-9]+|[0-9]+[.]?[0-9]*)[eE][+-]?[0-9]+[ef]?",
+             Number.Float),
+            (r"([0-9]*[.][0-9]+|[0-9]+[.][0-9]*)[ef]?", Number.Float),
+            (r"[0-9]+[ef]", Number.Float),
+            # Characters
+            (r"[0-9]+c", Number),
+            # Integers
+            (r"[0-9]+[ihtuv]", Number.Integer),
+            # Long Integers
+            (r"[0-9]+[jnp]?", Number.Integer.Long),
+        ],
+        "comments": [
+            (r"[^\\]+", Comment.Multiline),
+            (r"^\\", Comment.Multiline, "#pop"),
+            (r"\\", Comment.Multiline),
+        ],
+        "strings": [
+            (r'[^"\\]+', String.Double),
+            (r"\\.", String.Escape),
+            (r'"', String.Double, "#pop"),
+        ],
+    }
+
+
+class QLexer(KLexer):
+    """
+    For `Q `_ source code.
+    """
+
+    name = "Q"
+    aliases = ["q"]
+    filenames = ["*.q"]
+    version_added = '2.12'
+
+    tokens = {
+        "root": [
+            (words(("aj", "aj0", "ajf", "ajf0", "all", "and", "any", "asc",
+                    "asof", "attr", "avgs", "ceiling", "cols", "count", "cross",
+                    "csv", "cut", "deltas", "desc", "differ", "distinct", "dsave",
+                    "each", "ej", "ema", "eval", "except", "fby", "fills", "first",
+                    "fkeys", "flip", "floor", "get", "group", "gtime", "hclose",
+                    "hcount", "hdel", "hsym", "iasc", "idesc", "ij", "ijf",
+                    "inter", "inv", "key", "keys", "lj", "ljf", "load", "lower",
+                    "lsq", "ltime", "ltrim", "mavg", "maxs", "mcount", "md5",
+                    "mdev", "med", "meta", "mins", "mmax", "mmin", "mmu", "mod",
+                    "msum", "neg", "next", "not", "null", "or", "over", "parse",
+                    "peach", "pj", "prds", "prior", "prev", "rand", "rank", "ratios",
+                    "raze", "read0", "read1", "reciprocal", "reval", "reverse",
+                    "rload", "rotate", "rsave", "rtrim", "save", "scan", "scov",
+                    "sdev", "set", "show", "signum", "ssr", "string", "sublist",
+                    "sums", "sv", "svar", "system", "tables", "til", "trim", "txf",
+                    "type", "uj", "ujf", "ungroup", "union", "upper", "upsert",
+                    "value", "view", "views", "vs", "where", "wj", "wj1", "ww",
+                    "xasc", "xbar", "xcol", "xcols", "xdesc", "xgroup", "xkey",
+                    "xlog", "xprev", "xrank"),
+                    suffix=r"\b"), Name.Builtin,
+            ),
+            inherit,
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/qlik.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/qlik.py
new file mode 100644
index 000000000..a29f89f35
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/qlik.py
@@ -0,0 +1,117 @@
+"""
+    pygments.lexers.qlik
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the qlik scripting language
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text
+from pygments.lexers._qlik_builtins import OPERATORS_LIST, STATEMENT_LIST, \
+    SCRIPT_FUNCTIONS, CONSTANT_LIST
+
+__all__ = ["QlikLexer"]
+
+
+class QlikLexer(RegexLexer):
+    """
+    Lexer for qlik code, including .qvs files
+    """
+
+    name = "Qlik"
+    aliases = ["qlik", "qlikview", "qliksense", "qlikscript"]
+    filenames = ["*.qvs", "*.qvw"]
+    url = "https://qlik.com"
+    version_added = '2.12'
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        # Handle multi-line comments
+        "comment": [
+            (r"\*/", Comment.Multiline, "#pop"),
+            (r"[^*]+", Comment.Multiline),
+        ],
+        # Handle numbers
+        "numerics": [
+            (r"\b\d+\.\d+(e\d+)?[fd]?\b", Number.Float),
+            (r"\b\d+\b", Number.Integer),
+        ],
+        # Handle variable names in things
+        "interp": [
+            (
+                r"(\$\()(\w+)(\))",
+                bygroups(String.Interpol, Name.Variable, String.Interpol),
+            ),
+        ],
+        # Handle strings
+        "string": [
+            (r"'", String, "#pop"),
+            include("interp"),
+            (r"[^'$]+", String),
+            (r"\$", String),
+        ],
+        #
+        "assignment": [
+            (r";", Punctuation, "#pop"),
+            include("root"),
+        ],
+        "field_name_quote": [
+            (r'"', String.Symbol, "#pop"),
+            include("interp"),
+            (r"[^\"$]+", String.Symbol),
+            (r"\$", String.Symbol),
+        ],
+        "field_name_bracket": [
+            (r"\]", String.Symbol, "#pop"),
+            include("interp"),
+            (r"[^\]$]+", String.Symbol),
+            (r"\$", String.Symbol),
+        ],
+        "function": [(r"\)", Punctuation, "#pop"), include("root")],
+        "root": [
+            # Whitespace and comments
+            (r"\s+", Text.Whitespace),
+            (r"/\*", Comment.Multiline, "comment"),
+            (r"//.*\n", Comment.Single),
+            # variable assignment
+            (r"(let|set)(\s+)", bygroups(Keyword.Declaration, Text.Whitespace),
+             "assignment"),
+            # Word operators
+            (words(OPERATORS_LIST["words"], prefix=r"\b", suffix=r"\b"),
+             Operator.Word),
+            # Statements
+            (words(STATEMENT_LIST, suffix=r"\b"), Keyword),
+            # Table names
+            (r"[a-z]\w*:", Keyword.Declaration),
+            # Constants
+            (words(CONSTANT_LIST, suffix=r"\b"), Keyword.Constant),
+            # Functions
+            (words(SCRIPT_FUNCTIONS, suffix=r"(?=\s*\()"), Name.Builtin,
+             "function"),
+            # interpolation - e.g. $(variableName)
+            include("interp"),
+            # Quotes denote a field/file name
+            (r'"', String.Symbol, "field_name_quote"),
+            # Square brackets denote a field/file name
+            (r"\[", String.Symbol, "field_name_bracket"),
+            # Strings
+            (r"'", String, "string"),
+            # Numbers
+            include("numerics"),
+            # Operator symbols
+            (words(OPERATORS_LIST["symbols"]), Operator),
+            # Strings denoted by single quotes
+            (r"'.+?'", String),
+            # Words as text
+            (r"\b\w+\b", Text),
+            # Basic punctuation
+            (r"[,;.()\\/]", Punctuation),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/qvt.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/qvt.py
new file mode 100644
index 000000000..302d1b6ed
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/qvt.py
@@ -0,0 +1,153 @@
+"""
+    pygments.lexers.qvt
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for QVT Operational language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include, combined, default, \
+    words
+from pygments.token import Text, Comment, Operator, Keyword, Punctuation, \
+    Name, String, Number
+
+__all__ = ['QVToLexer']
+
+
+class QVToLexer(RegexLexer):
+    """
+    For the QVT Operational Mapping language.
+
+    Reference for implementing this: «Meta Object Facility (MOF) 2.0
+    Query/View/Transformation Specification», Version 1.1 - January 2011
+    (https://www.omg.org/spec/QVT/1.1/), see §8.4, «Concrete Syntax» in
+    particular.
+
+    Notable tokens assignments:
+
+    - Name.Class is assigned to the identifier following any of the following
+      keywords: metamodel, class, exception, primitive, enum, transformation
+      or library
+
+    - Name.Function is assigned to the names of mappings and queries
+
+    - Name.Builtin.Pseudo is assigned to the pre-defined variables 'this',
+      'self' and 'result'.
+    """
+    # With obvious borrowings & inspiration from the Java, Python and C lexers
+
+    name = 'QVTO'
+    aliases = ['qvto', 'qvt']
+    filenames = ['*.qvto']
+    url = 'https://www.omg.org/spec/QVT/1.1'
+    version_added = ''
+
+    tokens = {
+        'root': [
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'(--|//)(\s*)(directive:)?(.*)$',
+             bygroups(Comment, Comment, Comment.Preproc, Comment)),
+            # Uncomment the following if you want to distinguish between
+            # '/*' and '/**', à la javadoc
+            # (r'/[*]{2}(.|\n)*?[*]/', Comment.Multiline),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+            (r'\\\n', Text),
+            (r'(and|not|or|xor|##?)\b', Operator.Word),
+            (r'(:{1,2}=|[-+]=)\b', Operator.Word),
+            (r'(@|<<|>>)\b', Keyword),  # stereotypes
+            (r'!=|<>|==|=|!->|->|>=|<=|[.]{3}|[+/*%=<>&|.~]', Operator),
+            (r'[]{}:(),;[]', Punctuation),
+            (r'(true|false|unlimited|null)\b', Keyword.Constant),
+            (r'(this|self|result)\b', Name.Builtin.Pseudo),
+            (r'(var)\b', Keyword.Declaration),
+            (r'(from|import)\b', Keyword.Namespace, 'fromimport'),
+            (r'(metamodel|class|exception|primitive|enum|transformation|'
+             r'library)(\s+)(\w+)',
+             bygroups(Keyword.Word, Text, Name.Class)),
+            (r'(exception)(\s+)(\w+)',
+             bygroups(Keyword.Word, Text, Name.Exception)),
+            (r'(main)\b', Name.Function),
+            (r'(mapping|helper|query)(\s+)',
+             bygroups(Keyword.Declaration, Text), 'operation'),
+            (r'(assert)(\s+)\b', bygroups(Keyword, Text), 'assert'),
+            (r'(Bag|Collection|Dict|OrderedSet|Sequence|Set|Tuple|List)\b',
+             Keyword.Type),
+            include('keywords'),
+            ('"', String, combined('stringescape', 'dqs')),
+            ("'", String, combined('stringescape', 'sqs')),
+            include('name'),
+            include('numbers'),
+            # (r'([a-zA-Z_]\w*)(::)([a-zA-Z_]\w*)',
+            # bygroups(Text, Text, Text)),
+        ],
+
+        'fromimport': [
+            (r'(?:[ \t]|\\\n)+', Text),
+            (r'[a-zA-Z_][\w.]*', Name.Namespace),
+            default('#pop'),
+        ],
+
+        'operation': [
+            (r'::', Text),
+            (r'(.*::)([a-zA-Z_]\w*)([ \t]*)(\()',
+             bygroups(Text, Name.Function, Text, Punctuation), '#pop')
+        ],
+
+        'assert': [
+            (r'(warning|error|fatal)\b', Keyword, '#pop'),
+            default('#pop'),  # all else: go back
+        ],
+
+        'keywords': [
+            (words((
+                'abstract', 'access', 'any', 'assert', 'blackbox', 'break',
+                'case', 'collect', 'collectNested', 'collectOne', 'collectselect',
+                'collectselectOne', 'composes', 'compute', 'configuration',
+                'constructor', 'continue', 'datatype', 'default', 'derived',
+                'disjuncts', 'do', 'elif', 'else', 'end', 'endif', 'except',
+                'exists', 'extends', 'forAll', 'forEach', 'forOne', 'from', 'if',
+                'implies', 'in', 'inherits', 'init', 'inout', 'intermediate',
+                'invresolve', 'invresolveIn', 'invresolveone', 'invresolveoneIn',
+                'isUnique', 'iterate', 'late', 'let', 'literal', 'log', 'map',
+                'merges', 'modeltype', 'new', 'object', 'one', 'ordered', 'out',
+                'package', 'population', 'property', 'raise', 'readonly',
+                'references', 'refines', 'reject', 'resolve', 'resolveIn',
+                'resolveone', 'resolveoneIn', 'return', 'select', 'selectOne',
+                'sortedBy', 'static', 'switch', 'tag', 'then', 'try', 'typedef',
+                'unlimited', 'uses', 'when', 'where', 'while', 'with', 'xcollect',
+                'xmap', 'xselect'), suffix=r'\b'), Keyword),
+        ],
+
+        # There is no need to distinguish between String.Single and
+        # String.Double: 'strings' is factorised for 'dqs' and 'sqs'
+        'strings': [
+            (r'[^\\\'"\n]+', String),
+            # quotes, percents and backslashes must be parsed one at a time
+            (r'[\'"\\]', String),
+        ],
+        'stringescape': [
+            (r'\\([\\btnfr"\']|u[0-3][0-7]{2}|u[0-7]{1,2})', String.Escape)
+        ],
+        'dqs': [  # double-quoted string
+            (r'"', String, '#pop'),
+            (r'\\\\|\\"', String.Escape),
+            include('strings')
+        ],
+        'sqs': [  # single-quoted string
+            (r"'", String, '#pop'),
+            (r"\\\\|\\'", String.Escape),
+            include('strings')
+        ],
+        'name': [
+            (r'[a-zA-Z_]\w*', Name),
+        ],
+        # numbers: excerpt taken from the python lexer
+        'numbers': [
+            (r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+[eE][+-]?[0-9]+', Number.Float),
+            (r'\d+', Number.Integer)
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/r.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/r.py
new file mode 100644
index 000000000..d3f65ba2d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/r.py
@@ -0,0 +1,196 @@
+"""
+    pygments.lexers.r
+    ~~~~~~~~~~~~~~~~~
+
+    Lexers for the R/S languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, include, do_insertions
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Generic, Whitespace
+
+__all__ = ['RConsoleLexer', 'SLexer', 'RdLexer']
+
+
+line_re  = re.compile('.*?\n')
+
+
+class RConsoleLexer(Lexer):
+    """
+    For R console transcripts or R CMD BATCH output files.
+    """
+
+    name = 'RConsole'
+    aliases = ['rconsole', 'rout']
+    filenames = ['*.Rout']
+    url = 'https://www.r-project.org'
+    version_added = ''
+    _example = "rconsole/r-console-transcript.Rout"
+
+    def get_tokens_unprocessed(self, text):
+        slexer = SLexer(**self.options)
+
+        current_code_block = ''
+        insertions = []
+
+        for match in line_re.finditer(text):
+            line = match.group()
+            if line.startswith('>') or line.startswith('+'):
+                # Colorize the prompt as such,
+                # then put rest of line into current_code_block
+                insertions.append((len(current_code_block),
+                                   [(0, Generic.Prompt, line[:2])]))
+                current_code_block += line[2:]
+            else:
+                # We have reached a non-prompt line!
+                # If we have stored prompt lines, need to process them first.
+                if current_code_block:
+                    # Weave together the prompts and highlight code.
+                    yield from do_insertions(
+                        insertions, slexer.get_tokens_unprocessed(current_code_block))
+                    # Reset vars for next code block.
+                    current_code_block = ''
+                    insertions = []
+                # Now process the actual line itself, this is output from R.
+                yield match.start(), Generic.Output, line
+
+        # If we happen to end on a code block with nothing after it, need to
+        # process the last code block. This is neither elegant nor DRY so
+        # should be changed.
+        if current_code_block:
+            yield from do_insertions(
+                insertions, slexer.get_tokens_unprocessed(current_code_block))
+
+
+class SLexer(RegexLexer):
+    """
+    For S, S-plus, and R source code.
+    """
+
+    name = 'S'
+    aliases = ['splus', 's', 'r']
+    filenames = ['*.S', '*.R', '.Rhistory', '.Rprofile', '.Renviron']
+    mimetypes = ['text/S-plus', 'text/S', 'text/x-r-source', 'text/x-r',
+                 'text/x-R', 'text/x-r-history', 'text/x-r-profile']
+    url = 'https://www.r-project.org'
+    version_added = '0.10'
+
+    valid_name = r'`[^`\\]*(?:\\.[^`\\]*)*`|(?:[a-zA-Z]|\.[A-Za-z_.])[\w.]*|\.'
+    tokens = {
+        'comments': [
+            (r'#.*$', Comment.Single),
+        ],
+        'valid_name': [
+            (valid_name, Name),
+        ],
+        'function_name': [
+            (rf'({valid_name})\s*(?=\()', Name.Function),
+        ],
+        'punctuation': [
+            (r'\[{1,2}|\]{1,2}|\(|\)|;|,', Punctuation),
+        ],
+        'keywords': [
+            (r'(if|else|for|while|repeat|in|next|break|return|switch|function)'
+             r'(?![\w.])',
+             Keyword.Reserved),
+        ],
+        'operators': [
+            (r'<>?|-|==|<=|>=|\|>|<|>|&&?|!=|\|\|?|\?', Operator),
+            (r'\*|\+|\^|/|!|%[^%]*%|=|~|\$|@|:{1,3}', Operator),
+        ],
+        'builtin_symbols': [
+            (r'(NULL|NA(_(integer|real|complex|character)_)?|'
+             r'letters|LETTERS|Inf|TRUE|FALSE|NaN|pi|\.\.(\.|[0-9]+))'
+             r'(?![\w.])',
+             Keyword.Constant),
+            (r'(T|F)\b', Name.Builtin.Pseudo),
+        ],
+        'numbers': [
+            # hex number
+            (r'0[xX][a-fA-F0-9]+([pP][0-9]+)?[Li]?', Number.Hex),
+            # decimal number
+            (r'[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+|\.)([eE][+-]?[0-9]+)?[Li]?',
+             Number),
+        ],
+        'statements': [
+            include('comments'),
+            # whitespaces
+            (r'\s+', Whitespace),
+            (r'\'', String, 'string_squote'),
+            (r'\"', String, 'string_dquote'),
+            include('builtin_symbols'),
+            include('keywords'),
+            include('function_name'),
+            include('valid_name'),
+            include('numbers'),
+            include('punctuation'),
+            include('operators'),
+        ],
+        'root': [
+            # calls:
+            include('statements'),
+            # blocks:
+            (r'\{|\}', Punctuation),
+            # (r'\{', Punctuation, 'block'),
+            (r'.', Text),
+        ],
+        # 'block': [
+        #    include('statements'),
+        #    ('\{', Punctuation, '#push'),
+        #    ('\}', Punctuation, '#pop')
+        # ],
+        'string_squote': [
+            (r'([^\'\\]|\\.)*\'', String, '#pop'),
+        ],
+        'string_dquote': [
+            (r'([^"\\]|\\.)*"', String, '#pop'),
+        ],
+    }
+
+    def analyse_text(text):
+        if re.search(r'[a-z0-9_\])\s]<-(?!-)', text):
+            return 0.11
+
+
+class RdLexer(RegexLexer):
+    """
+    Pygments Lexer for R documentation (Rd) files
+
+    This is a very minimal implementation, highlighting little more
+    than the macros. A description of Rd syntax is found in `Writing R
+    Extensions `_
+    and `Parsing Rd files `_.
+    """
+    name = 'Rd'
+    aliases = ['rd']
+    filenames = ['*.Rd']
+    mimetypes = ['text/x-r-doc']
+    url = 'http://cran.r-project.org/doc/manuals/R-exts.html'
+    version_added = '1.6'
+
+    # To account for verbatim / LaTeX-like / and R-like areas
+    # would require parsing.
+    tokens = {
+        'root': [
+            # catch escaped brackets and percent sign
+            (r'\\[\\{}%]', String.Escape),
+            # comments
+            (r'%.*$', Comment),
+            # special macros with no arguments
+            (r'\\(?:cr|l?dots|R|tab)\b', Keyword.Constant),
+            # macros
+            (r'\\[a-zA-Z]+\b', Keyword),
+            # special preprocessor macros
+            (r'^\s*#(?:ifn?def|endif).*\b', Comment.Preproc),
+            # non-escaped brackets
+            (r'[{}]', Name.Builtin),
+            # everything else
+            (r'[^\\%\n{}]+', Text),
+            (r'.', Text),
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rdf.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rdf.py
new file mode 100644
index 000000000..4930c1b38
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rdf.py
@@ -0,0 +1,468 @@
+"""
+    pygments.lexers.rdf
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for semantic web and RDF query languages and markup.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, default
+from pygments.token import Keyword, Punctuation, String, Number, Operator, \
+    Generic, Whitespace, Name, Literal, Comment, Text
+
+__all__ = ['SparqlLexer', 'TurtleLexer', 'ShExCLexer']
+
+
+class SparqlLexer(RegexLexer):
+    """
+    Lexer for SPARQL query language.
+    """
+    name = 'SPARQL'
+    aliases = ['sparql']
+    filenames = ['*.rq', '*.sparql']
+    mimetypes = ['application/sparql-query']
+    url = 'https://www.w3.org/TR/sparql11-query'
+    version_added = '2.0'
+
+    # character group definitions ::
+
+    PN_CHARS_BASE_GRP = ('a-zA-Z'
+                         '\u00c0-\u00d6'
+                         '\u00d8-\u00f6'
+                         '\u00f8-\u02ff'
+                         '\u0370-\u037d'
+                         '\u037f-\u1fff'
+                         '\u200c-\u200d'
+                         '\u2070-\u218f'
+                         '\u2c00-\u2fef'
+                         '\u3001-\ud7ff'
+                         '\uf900-\ufdcf'
+                         '\ufdf0-\ufffd')
+
+    PN_CHARS_U_GRP = (PN_CHARS_BASE_GRP + '_')
+
+    PN_CHARS_GRP = (PN_CHARS_U_GRP +
+                    r'\-' +
+                    r'0-9' +
+                    '\u00b7' +
+                    '\u0300-\u036f' +
+                    '\u203f-\u2040')
+
+    HEX_GRP = '0-9A-Fa-f'
+
+    PN_LOCAL_ESC_CHARS_GRP = r' _~.\-!$&"()*+,;=/?#@%'
+
+    # terminal productions ::
+
+    PN_CHARS_BASE = '[' + PN_CHARS_BASE_GRP + ']'
+
+    PN_CHARS_U = '[' + PN_CHARS_U_GRP + ']'
+
+    PN_CHARS = '[' + PN_CHARS_GRP + ']'
+
+    HEX = '[' + HEX_GRP + ']'
+
+    PN_LOCAL_ESC_CHARS = '[' + PN_LOCAL_ESC_CHARS_GRP + ']'
+
+    IRIREF = r'<(?:[^<>"{}|^`\\\x00-\x20])*>'
+
+    BLANK_NODE_LABEL = '_:[0-9' + PN_CHARS_U_GRP + '](?:[' + PN_CHARS_GRP + \
+                       '.]*' + PN_CHARS + ')?'
+
+    PN_PREFIX = PN_CHARS_BASE + '(?:[' + PN_CHARS_GRP + '.]*' + PN_CHARS + ')?'
+
+    VARNAME = '[0-9' + PN_CHARS_U_GRP + '][' + PN_CHARS_U_GRP + \
+              '0-9\u00b7\u0300-\u036f\u203f-\u2040]*'
+
+    PERCENT = '%' + HEX + HEX
+
+    PN_LOCAL_ESC = r'\\' + PN_LOCAL_ESC_CHARS
+
+    PLX = '(?:' + PERCENT + ')|(?:' + PN_LOCAL_ESC + ')'
+
+    PN_LOCAL = ('(?:[' + PN_CHARS_U_GRP + ':0-9' + ']|' + PLX + ')' +
+                '(?:(?:[' + PN_CHARS_GRP + '.:]|' + PLX + ')*(?:[' +
+                PN_CHARS_GRP + ':]|' + PLX + '))?')
+
+    EXPONENT = r'[eE][+-]?\d+'
+
+    # Lexer token definitions ::
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            # keywords ::
+            (r'(?i)(select|construct|describe|ask|where|filter|group\s+by|minus|'
+             r'distinct|reduced|from\s+named|from|order\s+by|desc|asc|limit|'
+             r'offset|values|bindings|load|into|clear|drop|create|add|move|copy|'
+             r'insert\s+data|delete\s+data|delete\s+where|with|delete|insert|'
+             r'using\s+named|using|graph|default|named|all|optional|service|'
+             r'silent|bind|undef|union|not\s+in|in|as|having|to|prefix|base)\b', Keyword),
+            (r'(a)\b', Keyword),
+            # IRIs ::
+            ('(' + IRIREF + ')', Name.Label),
+            # blank nodes ::
+            ('(' + BLANK_NODE_LABEL + ')', Name.Label),
+            #  # variables ::
+            ('[?$]' + VARNAME, Name.Variable),
+            # prefixed names ::
+            (r'(' + PN_PREFIX + r')?(\:)(' + PN_LOCAL + r')?',
+             bygroups(Name.Namespace, Punctuation, Name.Tag)),
+            # function names ::
+            (r'(?i)(str|lang|langmatches|datatype|bound|iri|uri|bnode|rand|abs|'
+             r'ceil|floor|round|concat|strlen|ucase|lcase|encode_for_uri|'
+             r'contains|strstarts|strends|strbefore|strafter|year|month|day|'
+             r'hours|minutes|seconds|timezone|tz|now|uuid|struuid|md5|sha1|sha256|sha384|'
+             r'sha512|coalesce|if|strlang|strdt|sameterm|isiri|isuri|isblank|'
+             r'isliteral|isnumeric|regex|substr|replace|exists|not\s+exists|'
+             r'count|sum|min|max|avg|sample|group_concat|separator)\b',
+             Name.Function),
+            # boolean literals ::
+            (r'(true|false)', Keyword.Constant),
+            # double literals ::
+            (r'[+\-]?(\d+\.\d*' + EXPONENT + r'|\.?\d+' + EXPONENT + ')', Number.Float),
+            # decimal literals ::
+            (r'[+\-]?(\d+\.\d*|\.\d+)', Number.Float),
+            # integer literals ::
+            (r'[+\-]?\d+', Number.Integer),
+            # operators ::
+            (r'(\|\||&&|=|\*|\-|\+|/|!=|<=|>=|!|<|>)', Operator),
+            # punctuation characters ::
+            (r'[(){}.;,:^\[\]]', Punctuation),
+            # line comments ::
+            (r'#[^\n]*', Comment),
+            # strings ::
+            (r'"""', String, 'triple-double-quoted-string'),
+            (r'"', String, 'single-double-quoted-string'),
+            (r"'''", String, 'triple-single-quoted-string'),
+            (r"'", String, 'single-single-quoted-string'),
+        ],
+        'triple-double-quoted-string': [
+            (r'"""', String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'single-double-quoted-string': [
+            (r'"', String, 'end-of-string'),
+            (r'[^"\\\n]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'triple-single-quoted-string': [
+            (r"'''", String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String.Escape, 'string-escape'),
+        ],
+        'single-single-quoted-string': [
+            (r"'", String, 'end-of-string'),
+            (r"[^'\\\n]+", String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'string-escape': [
+            (r'u' + HEX + '{4}', String.Escape, '#pop'),
+            (r'U' + HEX + '{8}', String.Escape, '#pop'),
+            (r'.', String.Escape, '#pop'),
+        ],
+        'end-of-string': [
+            (r'(@)([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)',
+             bygroups(Operator, Name.Function), '#pop:2'),
+            (r'\^\^', Operator, '#pop:2'),
+            default('#pop:2'),
+        ],
+    }
+
+
+class TurtleLexer(RegexLexer):
+    """
+    Lexer for Turtle data language.
+    """
+    name = 'Turtle'
+    aliases = ['turtle']
+    filenames = ['*.ttl']
+    mimetypes = ['text/turtle', 'application/x-turtle']
+    url = 'https://www.w3.org/TR/turtle'
+    version_added = '2.1'
+
+    # character group definitions ::
+    PN_CHARS_BASE_GRP = ('a-zA-Z'
+                         '\u00c0-\u00d6'
+                         '\u00d8-\u00f6'
+                         '\u00f8-\u02ff'
+                         '\u0370-\u037d'
+                         '\u037f-\u1fff'
+                         '\u200c-\u200d'
+                         '\u2070-\u218f'
+                         '\u2c00-\u2fef'
+                         '\u3001-\ud7ff'
+                         '\uf900-\ufdcf'
+                         '\ufdf0-\ufffd')
+
+    PN_CHARS_U_GRP = (PN_CHARS_BASE_GRP + '_')
+
+    PN_CHARS_GRP = (PN_CHARS_U_GRP +
+                    r'\-' +
+                    r'0-9' +
+                    '\u00b7' +
+                    '\u0300-\u036f' +
+                    '\u203f-\u2040')
+
+    PN_CHARS = '[' + PN_CHARS_GRP + ']'
+
+    PN_CHARS_BASE = '[' + PN_CHARS_BASE_GRP + ']'
+
+    PN_PREFIX = PN_CHARS_BASE + '(?:[' + PN_CHARS_GRP + '.]*' + PN_CHARS + ')?'
+
+    HEX_GRP = '0-9A-Fa-f'
+
+    HEX = '[' + HEX_GRP + ']'
+
+    PERCENT = '%' + HEX + HEX
+
+    PN_LOCAL_ESC_CHARS_GRP = r' _~.\-!$&"()*+,;=/?#@%'
+
+    PN_LOCAL_ESC_CHARS = '[' + PN_LOCAL_ESC_CHARS_GRP + ']'
+
+    PN_LOCAL_ESC = r'\\' + PN_LOCAL_ESC_CHARS
+
+    PLX = '(?:' + PERCENT + ')|(?:' + PN_LOCAL_ESC + ')'
+
+    PN_LOCAL = ('(?:[' + PN_CHARS_U_GRP + ':0-9' + ']|' + PLX + ')' +
+                '(?:(?:[' + PN_CHARS_GRP + '.:]|' + PLX + ')*(?:[' +
+                PN_CHARS_GRP + ':]|' + PLX + '))?')
+
+    patterns = {
+        'PNAME_NS': r'((?:[a-zA-Z][\w-]*)?\:)',  # Simplified character range
+        'IRIREF': r'(<[^<>"{}|^`\\\x00-\x20]*>)'
+    }
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+
+            # Base / prefix
+            (r'(@base|BASE)(\s+){IRIREF}(\s*)(\.?)'.format(**patterns),
+             bygroups(Keyword, Whitespace, Name.Variable, Whitespace,
+                      Punctuation)),
+            (r'(@prefix|PREFIX)(\s+){PNAME_NS}(\s+){IRIREF}(\s*)(\.?)'.format(**patterns),
+             bygroups(Keyword, Whitespace, Name.Namespace, Whitespace,
+                      Name.Variable, Whitespace, Punctuation)),
+
+            # The shorthand predicate 'a'
+            (r'(?<=\s)a(?=\s)', Keyword.Type),
+
+            # IRIREF
+            (r'{IRIREF}'.format(**patterns), Name.Variable),
+
+            # PrefixedName
+            (r'(' + PN_PREFIX + r')?(\:)(' + PN_LOCAL + r')?',
+             bygroups(Name.Namespace, Punctuation, Name.Tag)),
+
+            # BlankNodeLabel
+            (r'(_)(:)([' + PN_CHARS_U_GRP + r'0-9]([' + PN_CHARS_GRP + r'.]*' + PN_CHARS + ')?)',
+             bygroups(Name.Namespace, Punctuation, Name.Tag)),
+
+            # Comment
+            (r'#[^\n]+', Comment),
+
+            (r'\b(true|false)\b', Literal),
+            (r'[+\-]?\d*\.\d+', Number.Float),
+            (r'[+\-]?\d*(:?\.\d+)?E[+\-]?\d+', Number.Float),
+            (r'[+\-]?\d+', Number.Integer),
+            (r'[\[\](){}.;,:^]', Punctuation),
+
+            (r'"""', String, 'triple-double-quoted-string'),
+            (r'"', String, 'single-double-quoted-string'),
+            (r"'''", String, 'triple-single-quoted-string'),
+            (r"'", String, 'single-single-quoted-string'),
+        ],
+        'triple-double-quoted-string': [
+            (r'"""', String, 'end-of-string'),
+            (r'[^\\]+(?=""")', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'single-double-quoted-string': [
+            (r'"', String, 'end-of-string'),
+            (r'[^"\\\n]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'triple-single-quoted-string': [
+            (r"'''", String, 'end-of-string'),
+            (r"[^\\]+(?=''')", String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'single-single-quoted-string': [
+            (r"'", String, 'end-of-string'),
+            (r"[^'\\\n]+", String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'string-escape': [
+            (r'.', String, '#pop'),
+        ],
+        'end-of-string': [
+            (r'(@)([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)',
+             bygroups(Operator, Generic.Emph), '#pop:2'),
+
+            (r'(\^\^){IRIREF}'.format(**patterns), bygroups(Operator, Generic.Emph), '#pop:2'),
+
+            default('#pop:2'),
+
+        ],
+    }
+
+    # Turtle and Tera Term macro files share the same file extension
+    # but each has a recognizable and distinct syntax.
+    def analyse_text(text):
+        for t in ('@base ', 'BASE ', '@prefix ', 'PREFIX '):
+            if re.search(rf'^\s*{t}', text):
+                return 0.80
+
+
+class ShExCLexer(RegexLexer):
+    """
+    Lexer for ShExC shape expressions language syntax.
+    """
+    name = 'ShExC'
+    aliases = ['shexc', 'shex']
+    filenames = ['*.shex']
+    mimetypes = ['text/shex']
+    url = 'https://shex.io/shex-semantics/#shexc'
+    version_added = ''
+
+    # character group definitions ::
+
+    PN_CHARS_BASE_GRP = ('a-zA-Z'
+                         '\u00c0-\u00d6'
+                         '\u00d8-\u00f6'
+                         '\u00f8-\u02ff'
+                         '\u0370-\u037d'
+                         '\u037f-\u1fff'
+                         '\u200c-\u200d'
+                         '\u2070-\u218f'
+                         '\u2c00-\u2fef'
+                         '\u3001-\ud7ff'
+                         '\uf900-\ufdcf'
+                         '\ufdf0-\ufffd')
+
+    PN_CHARS_U_GRP = (PN_CHARS_BASE_GRP + '_')
+
+    PN_CHARS_GRP = (PN_CHARS_U_GRP +
+                    r'\-' +
+                    r'0-9' +
+                    '\u00b7' +
+                    '\u0300-\u036f' +
+                    '\u203f-\u2040')
+
+    HEX_GRP = '0-9A-Fa-f'
+
+    PN_LOCAL_ESC_CHARS_GRP = r"_~.\-!$&'()*+,;=/?#@%"
+
+    # terminal productions ::
+
+    PN_CHARS_BASE = '[' + PN_CHARS_BASE_GRP + ']'
+
+    PN_CHARS_U = '[' + PN_CHARS_U_GRP + ']'
+
+    PN_CHARS = '[' + PN_CHARS_GRP + ']'
+
+    HEX = '[' + HEX_GRP + ']'
+
+    PN_LOCAL_ESC_CHARS = '[' + PN_LOCAL_ESC_CHARS_GRP + ']'
+
+    UCHAR_NO_BACKSLASH = '(?:u' + HEX + '{4}|U' + HEX + '{8})'
+
+    UCHAR = r'\\' + UCHAR_NO_BACKSLASH
+
+    IRIREF = r'<(?:[^\x00-\x20<>"{}|^`\\]|' + UCHAR + ')*>'
+
+    BLANK_NODE_LABEL = '_:[0-9' + PN_CHARS_U_GRP + '](?:[' + PN_CHARS_GRP + \
+                       '.]*' + PN_CHARS + ')?'
+
+    PN_PREFIX = PN_CHARS_BASE + '(?:[' + PN_CHARS_GRP + '.]*' + PN_CHARS + ')?'
+
+    PERCENT = '%' + HEX + HEX
+
+    PN_LOCAL_ESC = r'\\' + PN_LOCAL_ESC_CHARS
+
+    PLX = '(?:' + PERCENT + ')|(?:' + PN_LOCAL_ESC + ')'
+
+    PN_LOCAL = ('(?:[' + PN_CHARS_U_GRP + ':0-9' + ']|' + PLX + ')' +
+                '(?:(?:[' + PN_CHARS_GRP + '.:]|' + PLX + ')*(?:[' +
+                PN_CHARS_GRP + ':]|' + PLX + '))?')
+
+    EXPONENT = r'[eE][+-]?\d+'
+
+    # Lexer token definitions ::
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            # keywords ::
+            (r'(?i)(base|prefix|start|external|'
+             r'literal|iri|bnode|nonliteral|length|minlength|maxlength|'
+             r'mininclusive|minexclusive|maxinclusive|maxexclusive|'
+             r'totaldigits|fractiondigits|'
+             r'closed|extra)\b', Keyword),
+            (r'(a)\b', Keyword),
+            # IRIs ::
+            ('(' + IRIREF + ')', Name.Label),
+            # blank nodes ::
+            ('(' + BLANK_NODE_LABEL + ')', Name.Label),
+            # prefixed names ::
+            (r'(' + PN_PREFIX + r')?(\:)(' + PN_LOCAL + ')?',
+             bygroups(Name.Namespace, Punctuation, Name.Tag)),
+            # boolean literals ::
+            (r'(true|false)', Keyword.Constant),
+            # double literals ::
+            (r'[+\-]?(\d+\.\d*' + EXPONENT + r'|\.?\d+' + EXPONENT + ')', Number.Float),
+            # decimal literals ::
+            (r'[+\-]?(\d+\.\d*|\.\d+)', Number.Float),
+            # integer literals ::
+            (r'[+\-]?\d+', Number.Integer),
+            # operators ::
+            (r'[@|$&=*+?^\-~]', Operator),
+            # operator keywords ::
+            (r'(?i)(and|or|not)\b', Operator.Word),
+            # punctuation characters ::
+            (r'[(){}.;,:^\[\]]', Punctuation),
+            # line comments ::
+            (r'#[^\n]*', Comment),
+            # strings ::
+            (r'"""', String, 'triple-double-quoted-string'),
+            (r'"', String, 'single-double-quoted-string'),
+            (r"'''", String, 'triple-single-quoted-string'),
+            (r"'", String, 'single-single-quoted-string'),
+        ],
+        'triple-double-quoted-string': [
+            (r'"""', String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'single-double-quoted-string': [
+            (r'"', String, 'end-of-string'),
+            (r'[^"\\\n]+', String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'triple-single-quoted-string': [
+            (r"'''", String, 'end-of-string'),
+            (r'[^\\]+', String),
+            (r'\\', String.Escape, 'string-escape'),
+        ],
+        'single-single-quoted-string': [
+            (r"'", String, 'end-of-string'),
+            (r"[^'\\\n]+", String),
+            (r'\\', String, 'string-escape'),
+        ],
+        'string-escape': [
+            (UCHAR_NO_BACKSLASH, String.Escape, '#pop'),
+            (r'.', String.Escape, '#pop'),
+        ],
+        'end-of-string': [
+            (r'(@)([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)',
+             bygroups(Operator, Name.Function), '#pop:2'),
+            (r'\^\^', Operator, '#pop:2'),
+            default('#pop:2'),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rebol.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rebol.py
new file mode 100644
index 000000000..4b37a7494
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rebol.py
@@ -0,0 +1,419 @@
+"""
+    pygments.lexers.rebol
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the REBOL and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Generic, Whitespace
+
+__all__ = ['RebolLexer', 'RedLexer']
+
+
+class RebolLexer(RegexLexer):
+    """
+    A REBOL lexer.
+    """
+    name = 'REBOL'
+    aliases = ['rebol']
+    filenames = ['*.r', '*.r3', '*.reb']
+    mimetypes = ['text/x-rebol']
+    url = 'http://www.rebol.com'
+    version_added = '1.1'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    escape_re = r'(?:\^\([0-9a-f]{1,4}\)*)'
+
+    def word_callback(lexer, match):
+        word = match.group()
+
+        if re.match(".*:$", word):
+            yield match.start(), Generic.Subheading, word
+        elif re.match(
+            r'(native|alias|all|any|as-string|as-binary|bind|bound\?|case|'
+            r'catch|checksum|comment|debase|dehex|exclude|difference|disarm|'
+            r'either|else|enbase|foreach|remove-each|form|free|get|get-env|if|'
+            r'in|intersect|loop|minimum-of|maximum-of|mold|new-line|'
+            r'new-line\?|not|now|prin|print|reduce|compose|construct|repeat|'
+            r'reverse|save|script\?|set|shift|switch|throw|to-hex|trace|try|'
+            r'type\?|union|unique|unless|unprotect|unset|until|use|value\?|'
+            r'while|compress|decompress|secure|open|close|read|read-io|'
+            r'write-io|write|update|query|wait|input\?|exp|log-10|log-2|'
+            r'log-e|square-root|cosine|sine|tangent|arccosine|arcsine|'
+            r'arctangent|protect|lowercase|uppercase|entab|detab|connected\?|'
+            r'browse|launch|stats|get-modes|set-modes|to-local-file|'
+            r'to-rebol-file|encloak|decloak|create-link|do-browser|bind\?|'
+            r'hide|draw|show|size-text|textinfo|offset-to-caret|'
+            r'caret-to-offset|local-request-file|rgb-to-hsv|hsv-to-rgb|'
+            r'crypt-strength\?|dh-make-key|dh-generate-key|dh-compute-key|'
+            r'dsa-make-key|dsa-generate-key|dsa-make-signature|'
+            r'dsa-verify-signature|rsa-make-key|rsa-generate-key|'
+            r'rsa-encrypt)$', word):
+            yield match.start(), Name.Builtin, word
+        elif re.match(
+            r'(add|subtract|multiply|divide|remainder|power|and~|or~|xor~|'
+            r'minimum|maximum|negate|complement|absolute|random|head|tail|'
+            r'next|back|skip|at|pick|first|second|third|fourth|fifth|sixth|'
+            r'seventh|eighth|ninth|tenth|last|path|find|select|make|to|copy\*|'
+            r'insert|remove|change|poke|clear|trim|sort|min|max|abs|cp|'
+            r'copy)$', word):
+            yield match.start(), Name.Function, word
+        elif re.match(
+            r'(error|source|input|license|help|install|echo|Usage|with|func|'
+            r'throw-on-error|function|does|has|context|probe|\?\?|as-pair|'
+            r'mod|modulo|round|repend|about|set-net|append|join|rejoin|reform|'
+            r'remold|charset|array|replace|move|extract|forskip|forall|alter|'
+            r'first+|also|take|for|forever|dispatch|attempt|what-dir|'
+            r'change-dir|clean-path|list-dir|dirize|rename|split-path|delete|'
+            r'make-dir|delete-dir|in-dir|confirm|dump-obj|upgrade|what|'
+            r'build-tag|process-source|build-markup|decode-cgi|read-cgi|'
+            r'write-user|save-user|set-user-name|protect-system|parse-xml|'
+            r'cvs-date|cvs-version|do-boot|get-net-info|desktop|layout|'
+            r'scroll-para|get-face|alert|set-face|uninstall|unfocus|'
+            r'request-dir|center-face|do-events|net-error|decode-url|'
+            r'parse-header|parse-header-date|parse-email-addrs|import-email|'
+            r'send|build-attach-body|resend|show-popup|hide-popup|open-events|'
+            r'find-key-face|do-face|viewtop|confine|find-window|'
+            r'insert-event-func|remove-event-func|inform|dump-pane|dump-face|'
+            r'flag-face|deflag-face|clear-fields|read-net|vbug|path-thru|'
+            r'read-thru|load-thru|do-thru|launch-thru|load-image|'
+            r'request-download|do-face-alt|set-font|set-para|get-style|'
+            r'set-style|make-face|stylize|choose|hilight-text|hilight-all|'
+            r'unlight-text|focus|scroll-drag|clear-face|reset-face|scroll-face|'
+            r'resize-face|load-stock|load-stock-block|notify|request|flash|'
+            r'request-color|request-pass|request-text|request-list|'
+            r'request-date|request-file|dbug|editor|link-relative-path|'
+            r'emailer|parse-error)$', word):
+            yield match.start(), Keyword.Namespace, word
+        elif re.match(
+            r'(halt|quit|do|load|q|recycle|call|run|ask|parse|view|unview|'
+            r'return|exit|break)$', word):
+            yield match.start(), Name.Exception, word
+        elif re.match('REBOL$', word):
+            yield match.start(), Generic.Heading, word
+        elif re.match("to-.*", word):
+            yield match.start(), Keyword, word
+        elif re.match(r'(\+|-|\*|/|//|\*\*|and|or|xor|=\?|=|==|<>|<|>|<=|>=)$',
+                      word):
+            yield match.start(), Operator, word
+        elif re.match(r".*\?$", word):
+            yield match.start(), Keyword, word
+        elif re.match(r".*\!$", word):
+            yield match.start(), Keyword.Type, word
+        elif re.match("'.*", word):
+            yield match.start(), Name.Variable.Instance, word  # lit-word
+        elif re.match("#.*", word):
+            yield match.start(), Name.Label, word  # issue
+        elif re.match("%.*", word):
+            yield match.start(), Name.Decorator, word  # file
+        else:
+            yield match.start(), Name.Variable, word
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'#"', String.Char, 'char'),
+            (r'#\{[0-9a-f]*\}', Number.Hex),
+            (r'2#\{', Number.Hex, 'bin2'),
+            (r'64#\{[0-9a-z+/=\s]*\}', Number.Hex),
+            (r'"', String, 'string'),
+            (r'\{', String, 'string2'),
+            (r';#+.*\n', Comment.Special),
+            (r';\*+.*\n', Comment.Preproc),
+            (r';.*\n', Comment),
+            (r'%"', Name.Decorator, 'stringFile'),
+            (r'%[^(^{")\s\[\]]+', Name.Decorator),
+            (r'[+-]?([a-z]{1,3})?\$\d+(\.\d+)?', Number.Float),  # money
+            (r'[+-]?\d+\:\d+(\:\d+)?(\.\d+)?', String.Other),    # time
+            (r'\d+[\-/][0-9a-z]+[\-/]\d+(\/\d+\:\d+((\:\d+)?'
+             r'([.\d+]?([+-]?\d+:\d+)?)?)?)?', String.Other),   # date
+            (r'\d+(\.\d+)+\.\d+', Keyword.Constant),             # tuple
+            (r'\d+X\d+', Keyword.Constant),                   # pair
+            (r'[+-]?\d+(\'\d+)?([.,]\d*)?E[+-]?\d+', Number.Float),
+            (r'[+-]?\d+(\'\d+)?[.,]\d*', Number.Float),
+            (r'[+-]?\d+(\'\d+)?', Number),
+            (r'[\[\]()]', Generic.Strong),
+            (r'[a-z]+[^(^{"\s:)]*://[^(^{"\s)]*', Name.Decorator),  # url
+            (r'mailto:[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),  # url
+            (r'[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),         # email
+            (r'comment\s"', Comment, 'commentString1'),
+            (r'comment\s\{', Comment, 'commentString2'),
+            (r'comment\s\[', Comment, 'commentBlock'),
+            (r'comment\s[^(\s{"\[]+', Comment),
+            (r'/[^(^{")\s/[\]]*', Name.Attribute),
+            (r'([^(^{")\s/[\]]+)(?=[:({"\s/\[\]])', word_callback),
+            (r'<[\w:.-]*>', Name.Tag),
+            (r'<[^(<>\s")]+', Name.Tag, 'tag'),
+            (r'([^(^{")\s]+)', Text),
+        ],
+        'string': [
+            (r'[^(^")]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'"', String, '#pop'),
+        ],
+        'string2': [
+            (r'[^(^{})]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'\{', String, '#push'),
+            (r'\}', String, '#pop'),
+        ],
+        'stringFile': [
+            (r'[^(^")]+', Name.Decorator),
+            (escape_re, Name.Decorator),
+            (r'\^.', Name.Decorator),
+            (r'"', Name.Decorator, '#pop'),
+        ],
+        'char': [
+            (escape_re + '"', String.Char, '#pop'),
+            (r'\^."', String.Char, '#pop'),
+            (r'."', String.Char, '#pop'),
+        ],
+        'tag': [
+            (escape_re, Name.Tag),
+            (r'"', Name.Tag, 'tagString'),
+            (r'[^(<>\r\n")]+', Name.Tag),
+            (r'>', Name.Tag, '#pop'),
+        ],
+        'tagString': [
+            (r'[^(^")]+', Name.Tag),
+            (escape_re, Name.Tag),
+            (r'[(|)]+', Name.Tag),
+            (r'\^.', Name.Tag),
+            (r'"', Name.Tag, '#pop'),
+        ],
+        'tuple': [
+            (r'(\d+\.)+', Keyword.Constant),
+            (r'\d+', Keyword.Constant, '#pop'),
+        ],
+        'bin2': [
+            (r'\s+', Number.Hex),
+            (r'([01]\s*){8}', Number.Hex),
+            (r'\}', Number.Hex, '#pop'),
+        ],
+        'commentString1': [
+            (r'[^(^")]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'"', Comment, '#pop'),
+        ],
+        'commentString2': [
+            (r'[^(^{})]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'\{', Comment, '#push'),
+            (r'\}', Comment, '#pop'),
+        ],
+        'commentBlock': [
+            (r'\[', Comment, '#push'),
+            (r'\]', Comment, '#pop'),
+            (r'"', Comment, "commentString1"),
+            (r'\{', Comment, "commentString2"),
+            (r'[^(\[\]"{)]+', Comment),
+        ],
+    }
+
+    def analyse_text(text):
+        """
+        Check if code contains REBOL header and so it probably not R code
+        """
+        if re.match(r'^\s*REBOL\s*\[', text, re.IGNORECASE):
+            # The code starts with REBOL header
+            return 1.0
+        elif re.search(r'\s*REBOL\s*\[', text, re.IGNORECASE):
+            # The code contains REBOL header but also some text before it
+            return 0.5
+
+
+class RedLexer(RegexLexer):
+    """
+    A Red-language lexer.
+    """
+    name = 'Red'
+    aliases = ['red', 'red/system']
+    filenames = ['*.red', '*.reds']
+    mimetypes = ['text/x-red', 'text/x-red-system']
+    url = 'https://www.red-lang.org'
+    version_added = '2.0'
+
+    flags = re.IGNORECASE | re.MULTILINE
+
+    escape_re = r'(?:\^\([0-9a-f]{1,4}\)*)'
+
+    def word_callback(lexer, match):
+        word = match.group()
+
+        if re.match(".*:$", word):
+            yield match.start(), Generic.Subheading, word
+        elif re.match(r'(if|unless|either|any|all|while|until|loop|repeat|'
+                      r'foreach|forall|func|function|does|has|switch|'
+                      r'case|reduce|compose|get|set|print|prin|equal\?|'
+                      r'not-equal\?|strict-equal\?|lesser\?|greater\?|lesser-or-equal\?|'
+                      r'greater-or-equal\?|same\?|not|type\?|stats|'
+                      r'bind|union|replace|charset|routine)$', word):
+            yield match.start(), Name.Builtin, word
+        elif re.match(r'(make|random|reflect|to|form|mold|absolute|add|divide|multiply|negate|'
+                      r'power|remainder|round|subtract|even\?|odd\?|and~|complement|or~|xor~|'
+                      r'append|at|back|change|clear|copy|find|head|head\?|index\?|insert|'
+                      r'length\?|next|pick|poke|remove|reverse|select|sort|skip|swap|tail|tail\?|'
+                      r'take|trim|create|close|delete|modify|open|open\?|query|read|rename|'
+                      r'update|write)$', word):
+            yield match.start(), Name.Function, word
+        elif re.match(r'(yes|on|no|off|true|false|tab|cr|lf|newline|escape|slash|sp|space|null|'
+                      r'none|crlf|dot|null-byte)$', word):
+            yield match.start(), Name.Builtin.Pseudo, word
+        elif re.match(r'(#system-global|#include|#enum|#define|#either|#if|#import|#export|'
+                      r'#switch|#default|#get-definition)$', word):
+            yield match.start(), Keyword.Namespace, word
+        elif re.match(r'(system|halt|quit|quit-return|do|load|q|recycle|call|run|ask|parse|'
+                      r'raise-error|return|exit|break|alias|push|pop|probe|\?\?|spec-of|body-of|'
+                      r'quote|forever)$', word):
+            yield match.start(), Name.Exception, word
+        elif re.match(r'(action\?|block\?|char\?|datatype\?|file\?|function\?|get-path\?|zero\?|'
+                      r'get-word\?|integer\?|issue\?|lit-path\?|lit-word\?|logic\?|native\?|'
+                      r'op\?|paren\?|path\?|refinement\?|set-path\?|set-word\?|string\?|unset\?|'
+                      r'any-struct\?|none\?|word\?|any-series\?)$', word):
+            yield match.start(), Keyword, word
+        elif re.match(r'(JNICALL|stdcall|cdecl|infix)$', word):
+            yield match.start(), Keyword.Namespace, word
+        elif re.match("to-.*", word):
+            yield match.start(), Keyword, word
+        elif re.match(r'(\+|-\*\*|-|\*\*|//|/|\*|and|or|xor|=\?|===|==|=|<>|<=|>=|'
+                      r'<<<|>>>|<<|>>|<|>%)$', word):
+            yield match.start(), Operator, word
+        elif re.match(r".*\!$", word):
+            yield match.start(), Keyword.Type, word
+        elif re.match("'.*", word):
+            yield match.start(), Name.Variable.Instance, word  # lit-word
+        elif re.match("#.*", word):
+            yield match.start(), Name.Label, word  # issue
+        elif re.match("%.*", word):
+            yield match.start(), Name.Decorator, word  # file
+        elif re.match(":.*", word):
+            yield match.start(), Generic.Subheading, word  # get-word
+        else:
+            yield match.start(), Name.Variable, word
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'#"', String.Char, 'char'),
+            (r'#\{[0-9a-f\s]*\}', Number.Hex),
+            (r'2#\{', Number.Hex, 'bin2'),
+            (r'64#\{[0-9a-z+/=\s]*\}', Number.Hex),
+            (r'([0-9a-f]+)(h)((\s)|(?=[\[\]{}"()]))',
+             bygroups(Number.Hex, Name.Variable, Whitespace)),
+            (r'"', String, 'string'),
+            (r'\{', String, 'string2'),
+            (r';#+.*\n', Comment.Special),
+            (r';\*+.*\n', Comment.Preproc),
+            (r';.*\n', Comment),
+            (r'%"', Name.Decorator, 'stringFile'),
+            (r'%[^(^{")\s\[\]]+', Name.Decorator),
+            (r'[+-]?([a-z]{1,3})?\$\d+(\.\d+)?', Number.Float),  # money
+            (r'[+-]?\d+\:\d+(\:\d+)?(\.\d+)?', String.Other),    # time
+            (r'\d+[\-/][0-9a-z]+[\-/]\d+(/\d+:\d+((:\d+)?'
+             r'([\.\d+]?([+-]?\d+:\d+)?)?)?)?', String.Other),   # date
+            (r'\d+(\.\d+)+\.\d+', Keyword.Constant),             # tuple
+            (r'\d+X\d+', Keyword.Constant),                   # pair
+            (r'[+-]?\d+(\'\d+)?([.,]\d*)?E[+-]?\d+', Number.Float),
+            (r'[+-]?\d+(\'\d+)?[.,]\d*', Number.Float),
+            (r'[+-]?\d+(\'\d+)?', Number),
+            (r'[\[\]()]', Generic.Strong),
+            (r'[a-z]+[^(^{"\s:)]*://[^(^{"\s)]*', Name.Decorator),  # url
+            (r'mailto:[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),  # url
+            (r'[^(^{"@\s)]+@[^(^{"@\s)]+', Name.Decorator),         # email
+            (r'comment\s"', Comment, 'commentString1'),
+            (r'comment\s\{', Comment, 'commentString2'),
+            (r'comment\s\[', Comment, 'commentBlock'),
+            (r'comment\s[^(\s{"\[]+', Comment),
+            (r'/[^(^{^")\s/[\]]*', Name.Attribute),
+            (r'([^(^{^")\s/[\]]+)(?=[:({"\s/\[\]])', word_callback),
+            (r'<[\w:.-]*>', Name.Tag),
+            (r'<[^(<>\s")]+', Name.Tag, 'tag'),
+            (r'([^(^{")\s]+)', Text),
+        ],
+        'string': [
+            (r'[^(^")]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'"', String, '#pop'),
+        ],
+        'string2': [
+            (r'[^(^{})]+', String),
+            (escape_re, String.Escape),
+            (r'[(|)]+', String),
+            (r'\^.', String.Escape),
+            (r'\{', String, '#push'),
+            (r'\}', String, '#pop'),
+        ],
+        'stringFile': [
+            (r'[^(^")]+', Name.Decorator),
+            (escape_re, Name.Decorator),
+            (r'\^.', Name.Decorator),
+            (r'"', Name.Decorator, '#pop'),
+        ],
+        'char': [
+            (escape_re + '"', String.Char, '#pop'),
+            (r'\^."', String.Char, '#pop'),
+            (r'."', String.Char, '#pop'),
+        ],
+        'tag': [
+            (escape_re, Name.Tag),
+            (r'"', Name.Tag, 'tagString'),
+            (r'[^(<>\r\n")]+', Name.Tag),
+            (r'>', Name.Tag, '#pop'),
+        ],
+        'tagString': [
+            (r'[^(^")]+', Name.Tag),
+            (escape_re, Name.Tag),
+            (r'[(|)]+', Name.Tag),
+            (r'\^.', Name.Tag),
+            (r'"', Name.Tag, '#pop'),
+        ],
+        'tuple': [
+            (r'(\d+\.)+', Keyword.Constant),
+            (r'\d+', Keyword.Constant, '#pop'),
+        ],
+        'bin2': [
+            (r'\s+', Number.Hex),
+            (r'([01]\s*){8}', Number.Hex),
+            (r'\}', Number.Hex, '#pop'),
+        ],
+        'commentString1': [
+            (r'[^(^")]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'"', Comment, '#pop'),
+        ],
+        'commentString2': [
+            (r'[^(^{})]+', Comment),
+            (escape_re, Comment),
+            (r'[(|)]+', Comment),
+            (r'\^.', Comment),
+            (r'\{', Comment, '#push'),
+            (r'\}', Comment, '#pop'),
+        ],
+        'commentBlock': [
+            (r'\[', Comment, '#push'),
+            (r'\]', Comment, '#pop'),
+            (r'"', Comment, "commentString1"),
+            (r'\{', Comment, "commentString2"),
+            (r'[^(\[\]"{)]+', Comment),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rego.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rego.py
new file mode 100644
index 000000000..6f2e3e9e6
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rego.py
@@ -0,0 +1,57 @@
+"""
+    pygments.lexers.rego
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Rego policy languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Operator, Keyword, Name, String, Number, Punctuation, Whitespace
+
+class RegoLexer(RegexLexer):
+    """
+    For Rego source.
+    """
+    name = 'Rego'
+    url = 'https://www.openpolicyagent.org/docs/latest/policy-language/'
+    filenames = ['*.rego']
+    aliases = ['rego']
+    mimetypes = ['text/x-rego']
+    version_added = '2.19'
+
+    reserved_words = (
+        'as', 'contains', 'data', 'default', 'else', 'every', 'false',
+        'if', 'in', 'import', 'package', 'not', 'null',
+        'some', 'true', 'with'
+    )
+
+    builtins = (
+        # https://www.openpolicyagent.org/docs/latest/philosophy/#the-opa-document-model
+        'data',  # Global variable for accessing base and virtual documents
+        'input', # Represents synchronously pushed base documents
+    )
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'#.*?$', Comment.Single),
+            (words(reserved_words, suffix=r'\b'), Keyword),
+            (words(builtins, suffix=r'\b'), Name.Builtin),
+            (r'[a-zA-Z_][a-zA-Z0-9_]*', Name),
+            (r'"(\\\\|\\"|[^"])*"', String.Double),
+            (r'`[^`]*`', String.Backtick),
+            (r'-?\d+(\.\d+)?', Number),
+            (r'(==|!=|<=|>=|:=)', Operator),  # Compound operators
+            (r'[=<>+\-*/%&|]', Operator),     # Single-character operators
+            (r'[\[\]{}(),.:;]', Punctuation),
+        ]
+    }
+
+__all__ = ['RegoLexer']
+
+
+
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/resource.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/resource.py
new file mode 100644
index 000000000..9593c2124
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/resource.py
@@ -0,0 +1,83 @@
+"""
+    pygments.lexers.resource
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for resource definition files.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Comment, String, Number, Operator, Text, \
+    Keyword, Name
+
+__all__ = ['ResourceLexer']
+
+
+class ResourceLexer(RegexLexer):
+    """Lexer for ICU Resource bundles.
+    """
+    name = 'ResourceBundle'
+    aliases = ['resourcebundle', 'resource']
+    filenames = []
+    url = 'https://unicode-org.github.io/icu/userguide/locale/resources.html'
+    version_added = '2.0'
+
+    _types = (':table', ':array', ':string', ':bin', ':import', ':intvector',
+              ':int', ':alias')
+
+    flags = re.MULTILINE | re.IGNORECASE
+    tokens = {
+        'root': [
+            (r'//.*?$', Comment),
+            (r'"', String, 'string'),
+            (r'-?\d+', Number.Integer),
+            (r'[,{}]', Operator),
+            (r'([^\s{{:]+)(\s*)({}?)'.format('|'.join(_types)),
+             bygroups(Name, Text, Keyword)),
+            (r'\s+', Text),
+            (words(_types), Keyword),
+        ],
+        'string': [
+            (r'(\\x[0-9a-f]{2}|\\u[0-9a-f]{4}|\\U00[0-9a-f]{6}|'
+             r'\\[0-7]{1,3}|\\c.|\\[abtnvfre\'"?\\]|\\\{|[^"{\\])+', String),
+            (r'\{', String.Escape, 'msgname'),
+            (r'"', String, '#pop')
+        ],
+        'msgname': [
+            (r'([^{},]+)(\s*)', bygroups(Name, String.Escape), ('#pop', 'message'))
+        ],
+        'message': [
+            (r'\{', String.Escape, 'msgname'),
+            (r'\}', String.Escape, '#pop'),
+            (r'(,)(\s*)([a-z]+)(\s*\})',
+             bygroups(Operator, String.Escape, Keyword, String.Escape), '#pop'),
+            (r'(,)(\s*)([a-z]+)(\s*)(,)(\s*)(offset)(\s*)(:)(\s*)(-?\d+)(\s*)',
+             bygroups(Operator, String.Escape, Keyword, String.Escape, Operator,
+                      String.Escape, Operator.Word, String.Escape, Operator,
+                      String.Escape, Number.Integer, String.Escape), 'choice'),
+            (r'(,)(\s*)([a-z]+)(\s*)(,)(\s*)',
+             bygroups(Operator, String.Escape, Keyword, String.Escape, Operator,
+                      String.Escape), 'choice'),
+            (r'\s+', String.Escape)
+        ],
+        'choice': [
+            (r'(=|<|>|<=|>=|!=)(-?\d+)(\s*\{)',
+             bygroups(Operator, Number.Integer, String.Escape), 'message'),
+            (r'([a-z]+)(\s*\{)', bygroups(Keyword.Type, String.Escape), 'str'),
+            (r'\}', String.Escape, ('#pop', '#pop')),
+            (r'\s+', String.Escape)
+        ],
+        'str': [
+            (r'\}', String.Escape, '#pop'),
+            (r'\{', String.Escape, 'msgname'),
+            (r'[^{}]+', String)
+        ]
+    }
+
+    def analyse_text(text):
+        if text.startswith('root:table'):
+            return 1.0
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ride.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ride.py
new file mode 100644
index 000000000..4d60c29cb
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ride.py
@@ -0,0 +1,138 @@
+"""
+    pygments.lexers.ride
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Ride programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, include
+from pygments.token import Comment, Keyword, Name, Number, Punctuation, \
+    String, Text
+
+__all__ = ['RideLexer']
+
+
+class RideLexer(RegexLexer):
+    """
+    For Ride source code.
+    """
+
+    name = 'Ride'
+    aliases = ['ride']
+    filenames = ['*.ride']
+    mimetypes = ['text/x-ride']
+    url = 'https://docs.waves.tech/en/ride'
+    version_added = '2.6'
+
+    validName = r'[a-zA-Z_][a-zA-Z0-9_\']*'
+
+    builtinOps = (
+        '||', '|', '>=', '>', '==', '!',
+        '=', '<=', '<', '::', ':+', ':', '!=', '/',
+        '.', '=>', '-', '+', '*', '&&', '%', '++',
+    )
+
+    globalVariablesName = (
+        'NOALG', 'MD5', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512',
+        'SHA3224', 'SHA3256', 'SHA3384', 'SHA3512', 'nil', 'this', 'unit',
+        'height', 'lastBlock', 'Buy', 'Sell', 'CEILING', 'FLOOR', 'DOWN',
+        'HALFDOWN', 'HALFEVEN', 'HALFUP', 'UP',
+    )
+
+    typesName = (
+        'Unit', 'Int', 'Boolean', 'ByteVector', 'String', 'Address', 'Alias',
+        'Transfer', 'AssetPair', 'DataEntry', 'Order', 'Transaction',
+        'GenesisTransaction', 'PaymentTransaction', 'ReissueTransaction',
+        'BurnTransaction', 'MassTransferTransaction', 'ExchangeTransaction',
+        'TransferTransaction', 'SetAssetScriptTransaction',
+        'InvokeScriptTransaction', 'IssueTransaction', 'LeaseTransaction',
+        'LeaseCancelTransaction', 'CreateAliasTransaction',
+        'SetScriptTransaction', 'SponsorFeeTransaction', 'DataTransaction',
+        'WriteSet', 'AttachedPayment', 'ScriptTransfer', 'TransferSet',
+        'ScriptResult', 'Invocation', 'Asset', 'BlockInfo', 'Issue', 'Reissue',
+        'Burn', 'NoAlg', 'Md5', 'Sha1', 'Sha224', 'Sha256', 'Sha384', 'Sha512',
+        'Sha3224', 'Sha3256', 'Sha3384', 'Sha3512', 'BinaryEntry',
+        'BooleanEntry', 'IntegerEntry', 'StringEntry', 'List', 'Ceiling',
+        'Down', 'Floor', 'HalfDown', 'HalfEven', 'HalfUp', 'Up',
+    )
+
+    functionsName = (
+        'fraction', 'size', 'toBytes', 'take', 'drop', 'takeRight', 'dropRight',
+        'toString', 'isDefined', 'extract', 'throw', 'getElement', 'value',
+        'cons', 'toUtf8String', 'toInt', 'indexOf', 'lastIndexOf', 'split',
+        'parseInt', 'parseIntValue', 'keccak256', 'blake2b256', 'sha256',
+        'sigVerify', 'toBase58String', 'fromBase58String', 'toBase64String',
+        'fromBase64String', 'transactionById', 'transactionHeightById',
+        'getInteger', 'getBoolean', 'getBinary', 'getString',
+        'addressFromPublicKey', 'addressFromString', 'addressFromRecipient',
+        'assetBalance', 'wavesBalance', 'getIntegerValue', 'getBooleanValue',
+        'getBinaryValue', 'getStringValue', 'addressFromStringValue',
+        'assetInfo', 'rsaVerify', 'checkMerkleProof', 'median',
+        'valueOrElse', 'valueOrErrorMessage', 'contains', 'log', 'pow',
+        'toBase16String', 'fromBase16String', 'blockInfoByHeight',
+        'transferTransactionById',
+    )
+
+    reservedWords = words((
+        'match', 'case', 'else', 'func', 'if',
+        'let', 'then', '@Callable', '@Verifier',
+    ), suffix=r'\b')
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'#.*', Comment.Single),
+            # Whitespace
+            (r'\s+', Text),
+            # Strings
+            (r'"', String, 'doublequote'),
+            (r'utf8\'', String, 'utf8quote'),
+            (r'base(58|64|16)\'', String, 'singlequote'),
+            # Keywords
+            (reservedWords, Keyword.Reserved),
+            (r'\{-#.*?#-\}', Keyword.Reserved),
+            (r'FOLD<\d+>', Keyword.Reserved),
+            # Types
+            (words(typesName), Keyword.Type),
+            # Main
+            # (specialName, Keyword.Reserved),
+            # Prefix Operators
+            (words(builtinOps, prefix=r'\(', suffix=r'\)'), Name.Function),
+            # Infix Operators
+            (words(builtinOps), Name.Function),
+            (words(globalVariablesName), Name.Function),
+            (words(functionsName), Name.Function),
+            # Numbers
+            include('numbers'),
+            # Variable Names
+            (validName, Name.Variable),
+            # Parens
+            (r'[,()\[\]{}]', Punctuation),
+        ],
+
+        'doublequote': [
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\[nrfvb\\"]', String.Escape),
+            (r'[^"]', String),
+            (r'"', String, '#pop'),
+        ],
+
+        'utf8quote': [
+            (r'\\u[0-9a-fA-F]{4}', String.Escape),
+            (r'\\[nrfvb\\\']', String.Escape),
+            (r'[^\']', String),
+            (r'\'', String, '#pop'),
+        ],
+
+        'singlequote': [
+            (r'[^\']', String),
+            (r'\'', String, '#pop'),
+        ],
+
+        'numbers': [
+            (r'_?\d+', Number.Integer),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rita.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rita.py
new file mode 100644
index 000000000..536aafffd
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rita.py
@@ -0,0 +1,42 @@
+"""
+    pygments.lexers.rita
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for RITA language
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Comment, Operator, Keyword, Name, Literal, \
+    Punctuation, Whitespace
+
+__all__ = ['RitaLexer']
+
+
+class RitaLexer(RegexLexer):
+    """
+    Lexer for RITA.
+    """
+    name = 'Rita'
+    url = 'https://github.com/zaibacu/rita-dsl'
+    filenames = ['*.rita']
+    aliases = ['rita']
+    mimetypes = ['text/rita']
+    version_added = '2.11'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'#(.*?)\n', Comment.Single),
+            (r'@(.*?)\n', Operator),  # Yes, whole line as an operator
+            (r'"(\w|\d|\s|(\\")|[\'_\-./,\?\!])+?"', Literal),
+            (r'\'(\w|\d|\s|(\\\')|["_\-./,\?\!])+?\'', Literal),
+            (r'([A-Z_]+)', Keyword),
+            (r'([a-z0-9_]+)', Name),
+            (r'((->)|[!?+*|=])', Operator),
+            (r'[\(\),\{\}]', Punctuation)
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rnc.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rnc.py
new file mode 100644
index 000000000..b7a06bb91
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rnc.py
@@ -0,0 +1,66 @@
+"""
+    pygments.lexers.rnc
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Relax-NG Compact syntax
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Punctuation
+
+__all__ = ['RNCCompactLexer']
+
+
+class RNCCompactLexer(RegexLexer):
+    """
+    For RelaxNG-compact syntax.
+    """
+
+    name = 'Relax-NG Compact'
+    url = 'http://relaxng.org'
+    aliases = ['rng-compact', 'rnc']
+    filenames = ['*.rnc']
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            (r'namespace\b', Keyword.Namespace),
+            (r'(?:default|datatypes)\b', Keyword.Declaration),
+            (r'##.*$', Comment.Preproc),
+            (r'#.*$', Comment.Single),
+            (r'"[^"]*"', String.Double),
+            # TODO single quoted strings and escape sequences outside of
+            # double-quoted strings
+            (r'(?:element|attribute|mixed)\b', Keyword.Declaration, 'variable'),
+            (r'(text\b|xsd:[^ ]+)', Keyword.Type, 'maybe_xsdattributes'),
+            (r'[,?&*=|~]|>>', Operator),
+            (r'[(){}]', Punctuation),
+            (r'.', Text),
+        ],
+
+        # a variable has been declared using `element` or `attribute`
+        'variable': [
+            (r'[^{]+', Name.Variable),
+            (r'\{', Punctuation, '#pop'),
+        ],
+
+        # after an xsd: declaration there may be attributes
+        'maybe_xsdattributes': [
+            (r'\{', Punctuation, 'xsdattributes'),
+            (r'\}', Punctuation, '#pop'),
+            (r'.', Text),
+        ],
+
+        # attributes take the form { key1 = value1 key2 = value2 ... }
+        'xsdattributes': [
+            (r'[^ =}]', Name.Attribute),
+            (r'=', Operator),
+            (r'"[^"]*"', String.Double),
+            (r'\}', Punctuation, '#pop'),
+            (r'.', Text),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/roboconf.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/roboconf.py
new file mode 100644
index 000000000..31adba9f4
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/roboconf.py
@@ -0,0 +1,81 @@
+"""
+    pygments.lexers.roboconf
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Roboconf DSL.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words, re
+from pygments.token import Text, Operator, Keyword, Name, Comment
+
+__all__ = ['RoboconfGraphLexer', 'RoboconfInstancesLexer']
+
+
+class RoboconfGraphLexer(RegexLexer):
+    """
+    Lexer for Roboconf graph files.
+    """
+    name = 'Roboconf Graph'
+    aliases = ['roboconf-graph']
+    filenames = ['*.graph']
+    url = 'https://roboconf.github.io/en/user-guide/graph-definition.html'
+    version_added = '2.1'
+
+    flags = re.IGNORECASE | re.MULTILINE
+    tokens = {
+        'root': [
+            # Skip white spaces
+            (r'\s+', Text),
+
+            # There is one operator
+            (r'=', Operator),
+
+            # Keywords
+            (words(('facet', 'import'), suffix=r'\s*\b', prefix=r'\b'), Keyword),
+            (words((
+                'installer', 'extends', 'exports', 'imports', 'facets',
+                'children'), suffix=r'\s*:?', prefix=r'\b'), Name),
+
+            # Comments
+            (r'#.*\n', Comment),
+
+            # Default
+            (r'[^#]', Text),
+            (r'.*\n', Text)
+        ]
+    }
+
+
+class RoboconfInstancesLexer(RegexLexer):
+    """
+    Lexer for Roboconf instances files.
+    """
+    name = 'Roboconf Instances'
+    aliases = ['roboconf-instances']
+    filenames = ['*.instances']
+    url = 'https://roboconf.github.io'
+    version_added = '2.1'
+
+    flags = re.IGNORECASE | re.MULTILINE
+    tokens = {
+        'root': [
+
+            # Skip white spaces
+            (r'\s+', Text),
+
+            # Keywords
+            (words(('instance of', 'import'), suffix=r'\s*\b', prefix=r'\b'), Keyword),
+            (words(('name', 'count'), suffix=r's*:?', prefix=r'\b'), Name),
+            (r'\s*[\w.-]+\s*:', Name),
+
+            # Comments
+            (r'#.*\n', Comment),
+
+            # Default
+            (r'[^#]', Text),
+            (r'.*\n', Text)
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/robotframework.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/robotframework.py
new file mode 100644
index 000000000..f92d56750
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/robotframework.py
@@ -0,0 +1,551 @@
+"""
+    pygments.lexers.robotframework
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Robot Framework.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+#  Copyright 2012 Nokia Siemens Networks Oyj
+#
+#  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.
+
+import re
+
+from pygments.lexer import Lexer
+from pygments.token import Token
+
+__all__ = ['RobotFrameworkLexer']
+
+
+HEADING = Token.Generic.Heading
+SETTING = Token.Keyword.Namespace
+IMPORT = Token.Name.Namespace
+TC_KW_NAME = Token.Generic.Subheading
+KEYWORD = Token.Name.Function
+ARGUMENT = Token.String
+VARIABLE = Token.Name.Variable
+COMMENT = Token.Comment
+SEPARATOR = Token.Punctuation
+SYNTAX = Token.Punctuation
+GHERKIN = Token.Generic.Emph
+ERROR = Token.Error
+
+
+def normalize(string, remove=''):
+    string = string.lower()
+    for char in remove + ' ':
+        if char in string:
+            string = string.replace(char, '')
+    return string
+
+
+class RobotFrameworkLexer(Lexer):
+    """
+    For Robot Framework test data.
+
+    Supports both space and pipe separated plain text formats.
+    """
+    name = 'RobotFramework'
+    url = 'http://robotframework.org'
+    aliases = ['robotframework']
+    filenames = ['*.robot', '*.resource']
+    mimetypes = ['text/x-robotframework']
+    version_added = '1.6'
+
+    def __init__(self, **options):
+        options['tabsize'] = 2
+        options['encoding'] = 'UTF-8'
+        Lexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        row_tokenizer = RowTokenizer()
+        var_tokenizer = VariableTokenizer()
+        index = 0
+        for row in text.splitlines():
+            for value, token in row_tokenizer.tokenize(row):
+                for value, token in var_tokenizer.tokenize(value, token):
+                    if value:
+                        yield index, token, str(value)
+                        index += len(value)
+
+
+class VariableTokenizer:
+
+    def tokenize(self, string, token):
+        var = VariableSplitter(string, identifiers='$@%&')
+        if var.start < 0 or token in (COMMENT, ERROR):
+            yield string, token
+            return
+        for value, token in self._tokenize(var, string, token):
+            if value:
+                yield value, token
+
+    def _tokenize(self, var, string, orig_token):
+        before = string[:var.start]
+        yield before, orig_token
+        yield var.identifier + '{', SYNTAX
+        yield from self.tokenize(var.base, VARIABLE)
+        yield '}', SYNTAX
+        if var.index is not None:
+            yield '[', SYNTAX
+            yield from self.tokenize(var.index, VARIABLE)
+            yield ']', SYNTAX
+        yield from self.tokenize(string[var.end:], orig_token)
+
+
+class RowTokenizer:
+
+    def __init__(self):
+        self._table = UnknownTable()
+        self._splitter = RowSplitter()
+        testcases = TestCaseTable()
+        settings = SettingTable(testcases.set_default_template)
+        variables = VariableTable()
+        keywords = KeywordTable()
+        self._tables = {'settings': settings, 'setting': settings,
+                        'metadata': settings,
+                        'variables': variables, 'variable': variables,
+                        'testcases': testcases, 'testcase': testcases,
+                        'tasks': testcases, 'task': testcases,
+                        'keywords': keywords, 'keyword': keywords,
+                        'userkeywords': keywords, 'userkeyword': keywords}
+
+    def tokenize(self, row):
+        commented = False
+        heading = False
+        for index, value in enumerate(self._splitter.split(row)):
+            # First value, and every second after that, is a separator.
+            index, separator = divmod(index-1, 2)
+            if value.startswith('#'):
+                commented = True
+            elif index == 0 and value.startswith('*'):
+                self._table = self._start_table(value)
+                heading = True
+            yield from self._tokenize(value, index, commented,
+                                      separator, heading)
+        self._table.end_row()
+
+    def _start_table(self, header):
+        name = normalize(header, remove='*')
+        return self._tables.get(name, UnknownTable())
+
+    def _tokenize(self, value, index, commented, separator, heading):
+        if commented:
+            yield value, COMMENT
+        elif separator:
+            yield value, SEPARATOR
+        elif heading:
+            yield value, HEADING
+        else:
+            yield from self._table.tokenize(value, index)
+
+
+class RowSplitter:
+    _space_splitter = re.compile('( {2,})')
+    _pipe_splitter = re.compile(r'((?:^| +)\|(?: +|$))')
+
+    def split(self, row):
+        splitter = (row.startswith('| ') and self._split_from_pipes
+                    or self._split_from_spaces)
+        yield from splitter(row)
+        yield '\n'
+
+    def _split_from_spaces(self, row):
+        yield ''  # Start with (pseudo)separator similarly as with pipes
+        yield from self._space_splitter.split(row)
+
+    def _split_from_pipes(self, row):
+        _, separator, rest = self._pipe_splitter.split(row, 1)
+        yield separator
+        while self._pipe_splitter.search(rest):
+            cell, separator, rest = self._pipe_splitter.split(rest, 1)
+            yield cell
+            yield separator
+        yield rest
+
+
+class Tokenizer:
+    _tokens = None
+
+    def __init__(self):
+        self._index = 0
+
+    def tokenize(self, value):
+        values_and_tokens = self._tokenize(value, self._index)
+        self._index += 1
+        if isinstance(values_and_tokens, type(Token)):
+            values_and_tokens = [(value, values_and_tokens)]
+        return values_and_tokens
+
+    def _tokenize(self, value, index):
+        index = min(index, len(self._tokens) - 1)
+        return self._tokens[index]
+
+    def _is_assign(self, value):
+        if value.endswith('='):
+            value = value[:-1].strip()
+        var = VariableSplitter(value, identifiers='$@&')
+        return var.start == 0 and var.end == len(value)
+
+
+class Comment(Tokenizer):
+    _tokens = (COMMENT,)
+
+
+class Setting(Tokenizer):
+    _tokens = (SETTING, ARGUMENT)
+    _keyword_settings = ('suitesetup', 'suiteprecondition', 'suiteteardown',
+                         'suitepostcondition', 'testsetup', 'tasksetup', 'testprecondition',
+                         'testteardown','taskteardown', 'testpostcondition', 'testtemplate', 'tasktemplate')
+    _import_settings = ('library', 'resource', 'variables')
+    _other_settings = ('documentation', 'metadata', 'forcetags', 'defaulttags',
+                       'testtimeout','tasktimeout')
+    _custom_tokenizer = None
+
+    def __init__(self, template_setter=None):
+        Tokenizer.__init__(self)
+        self._template_setter = template_setter
+
+    def _tokenize(self, value, index):
+        if index == 1 and self._template_setter:
+            self._template_setter(value)
+        if index == 0:
+            normalized = normalize(value)
+            if normalized in self._keyword_settings:
+                self._custom_tokenizer = KeywordCall(support_assign=False)
+            elif normalized in self._import_settings:
+                self._custom_tokenizer = ImportSetting()
+            elif normalized not in self._other_settings:
+                return ERROR
+        elif self._custom_tokenizer:
+            return self._custom_tokenizer.tokenize(value)
+        return Tokenizer._tokenize(self, value, index)
+
+
+class ImportSetting(Tokenizer):
+    _tokens = (IMPORT, ARGUMENT)
+
+
+class TestCaseSetting(Setting):
+    _keyword_settings = ('setup', 'precondition', 'teardown', 'postcondition',
+                         'template')
+    _import_settings = ()
+    _other_settings = ('documentation', 'tags', 'timeout')
+
+    def _tokenize(self, value, index):
+        if index == 0:
+            type = Setting._tokenize(self, value[1:-1], index)
+            return [('[', SYNTAX), (value[1:-1], type), (']', SYNTAX)]
+        return Setting._tokenize(self, value, index)
+
+
+class KeywordSetting(TestCaseSetting):
+    _keyword_settings = ('teardown',)
+    _other_settings = ('documentation', 'arguments', 'return', 'timeout', 'tags')
+
+
+class Variable(Tokenizer):
+    _tokens = (SYNTAX, ARGUMENT)
+
+    def _tokenize(self, value, index):
+        if index == 0 and not self._is_assign(value):
+            return ERROR
+        return Tokenizer._tokenize(self, value, index)
+
+
+class KeywordCall(Tokenizer):
+    _tokens = (KEYWORD, ARGUMENT)
+
+    def __init__(self, support_assign=True):
+        Tokenizer.__init__(self)
+        self._keyword_found = not support_assign
+        self._assigns = 0
+
+    def _tokenize(self, value, index):
+        if not self._keyword_found and self._is_assign(value):
+            self._assigns += 1
+            return SYNTAX  # VariableTokenizer tokenizes this later.
+        if self._keyword_found:
+            return Tokenizer._tokenize(self, value, index - self._assigns)
+        self._keyword_found = True
+        return GherkinTokenizer().tokenize(value, KEYWORD)
+
+
+class GherkinTokenizer:
+    _gherkin_prefix = re.compile('^(Given|When|Then|And|But) ', re.IGNORECASE)
+
+    def tokenize(self, value, token):
+        match = self._gherkin_prefix.match(value)
+        if not match:
+            return [(value, token)]
+        end = match.end()
+        return [(value[:end], GHERKIN), (value[end:], token)]
+
+
+class TemplatedKeywordCall(Tokenizer):
+    _tokens = (ARGUMENT,)
+
+
+class ForLoop(Tokenizer):
+
+    def __init__(self):
+        Tokenizer.__init__(self)
+        self._in_arguments = False
+
+    def _tokenize(self, value, index):
+        token = self._in_arguments and ARGUMENT or SYNTAX
+        if value.upper() in ('IN', 'IN RANGE'):
+            self._in_arguments = True
+        return token
+
+
+class _Table:
+    _tokenizer_class = None
+
+    def __init__(self, prev_tokenizer=None):
+        self._tokenizer = self._tokenizer_class()
+        self._prev_tokenizer = prev_tokenizer
+        self._prev_values_on_row = []
+
+    def tokenize(self, value, index):
+        if self._continues(value, index):
+            self._tokenizer = self._prev_tokenizer
+            yield value, SYNTAX
+        else:
+            yield from self._tokenize(value, index)
+        self._prev_values_on_row.append(value)
+
+    def _continues(self, value, index):
+        return value == '...' and all(self._is_empty(t)
+                                      for t in self._prev_values_on_row)
+
+    def _is_empty(self, value):
+        return value in ('', '\\')
+
+    def _tokenize(self, value, index):
+        return self._tokenizer.tokenize(value)
+
+    def end_row(self):
+        self.__init__(prev_tokenizer=self._tokenizer)
+
+
+class UnknownTable(_Table):
+    _tokenizer_class = Comment
+
+    def _continues(self, value, index):
+        return False
+
+
+class VariableTable(_Table):
+    _tokenizer_class = Variable
+
+
+class SettingTable(_Table):
+    _tokenizer_class = Setting
+
+    def __init__(self, template_setter, prev_tokenizer=None):
+        _Table.__init__(self, prev_tokenizer)
+        self._template_setter = template_setter
+
+    def _tokenize(self, value, index):
+        if index == 0 and normalize(value) == 'testtemplate':
+            self._tokenizer = Setting(self._template_setter)
+        return _Table._tokenize(self, value, index)
+
+    def end_row(self):
+        self.__init__(self._template_setter, prev_tokenizer=self._tokenizer)
+
+
+class TestCaseTable(_Table):
+    _setting_class = TestCaseSetting
+    _test_template = None
+    _default_template = None
+
+    @property
+    def _tokenizer_class(self):
+        if self._test_template or (self._default_template and
+                                   self._test_template is not False):
+            return TemplatedKeywordCall
+        return KeywordCall
+
+    def _continues(self, value, index):
+        return index > 0 and _Table._continues(self, value, index)
+
+    def _tokenize(self, value, index):
+        if index == 0:
+            if value:
+                self._test_template = None
+            return GherkinTokenizer().tokenize(value, TC_KW_NAME)
+        if index == 1 and self._is_setting(value):
+            if self._is_template(value):
+                self._test_template = False
+                self._tokenizer = self._setting_class(self.set_test_template)
+            else:
+                self._tokenizer = self._setting_class()
+        if index == 1 and self._is_for_loop(value):
+            self._tokenizer = ForLoop()
+        if index == 1 and self._is_empty(value):
+            return [(value, SYNTAX)]
+        return _Table._tokenize(self, value, index)
+
+    def _is_setting(self, value):
+        return value.startswith('[') and value.endswith(']')
+
+    def _is_template(self, value):
+        return normalize(value) == '[template]'
+
+    def _is_for_loop(self, value):
+        return value.startswith(':') and normalize(value, remove=':') == 'for'
+
+    def set_test_template(self, template):
+        self._test_template = self._is_template_set(template)
+
+    def set_default_template(self, template):
+        self._default_template = self._is_template_set(template)
+
+    def _is_template_set(self, template):
+        return normalize(template) not in ('', '\\', 'none', '${empty}')
+
+
+class KeywordTable(TestCaseTable):
+    _tokenizer_class = KeywordCall
+    _setting_class = KeywordSetting
+
+    def _is_template(self, value):
+        return False
+
+
+# Following code copied directly from Robot Framework 2.7.5.
+
+class VariableSplitter:
+
+    def __init__(self, string, identifiers):
+        self.identifier = None
+        self.base = None
+        self.index = None
+        self.start = -1
+        self.end = -1
+        self._identifiers = identifiers
+        self._may_have_internal_variables = False
+        try:
+            self._split(string)
+        except ValueError:
+            pass
+        else:
+            self._finalize()
+
+    def get_replaced_base(self, variables):
+        if self._may_have_internal_variables:
+            return variables.replace_string(self.base)
+        return self.base
+
+    def _finalize(self):
+        self.identifier = self._variable_chars[0]
+        self.base = ''.join(self._variable_chars[2:-1])
+        self.end = self.start + len(self._variable_chars)
+        if self._has_list_or_dict_variable_index():
+            self.index = ''.join(self._list_and_dict_variable_index_chars[1:-1])
+            self.end += len(self._list_and_dict_variable_index_chars)
+
+    def _has_list_or_dict_variable_index(self):
+        return self._list_and_dict_variable_index_chars\
+        and self._list_and_dict_variable_index_chars[-1] == ']'
+
+    def _split(self, string):
+        start_index, max_index = self._find_variable(string)
+        self.start = start_index
+        self._open_curly = 1
+        self._state = self._variable_state
+        self._variable_chars = [string[start_index], '{']
+        self._list_and_dict_variable_index_chars = []
+        self._string = string
+        start_index += 2
+        for index, char in enumerate(string[start_index:]):
+            index += start_index  # Giving start to enumerate only in Py 2.6+
+            try:
+                self._state(char, index)
+            except StopIteration:
+                return
+            if index  == max_index and not self._scanning_list_variable_index():
+                return
+
+    def _scanning_list_variable_index(self):
+        return self._state in [self._waiting_list_variable_index_state,
+                               self._list_variable_index_state]
+
+    def _find_variable(self, string):
+        max_end_index = string.rfind('}')
+        if max_end_index == -1:
+            raise ValueError('No variable end found')
+        if self._is_escaped(string, max_end_index):
+            return self._find_variable(string[:max_end_index])
+        start_index = self._find_start_index(string, 1, max_end_index)
+        if start_index == -1:
+            raise ValueError('No variable start found')
+        return start_index, max_end_index
+
+    def _find_start_index(self, string, start, end):
+        index = string.find('{', start, end) - 1
+        if index < 0:
+            return -1
+        if self._start_index_is_ok(string, index):
+            return index
+        return self._find_start_index(string, index+2, end)
+
+    def _start_index_is_ok(self, string, index):
+        return string[index] in self._identifiers\
+        and not self._is_escaped(string, index)
+
+    def _is_escaped(self, string, index):
+        escaped = False
+        while index > 0 and string[index-1] == '\\':
+            index -= 1
+            escaped = not escaped
+        return escaped
+
+    def _variable_state(self, char, index):
+        self._variable_chars.append(char)
+        if char == '}' and not self._is_escaped(self._string, index):
+            self._open_curly -= 1
+            if self._open_curly == 0:
+                if not self._is_list_or_dict_variable():
+                    raise StopIteration
+                self._state = self._waiting_list_variable_index_state
+        elif char in self._identifiers:
+            self._state = self._internal_variable_start_state
+
+    def _is_list_or_dict_variable(self):
+        return self._variable_chars[0] in ('@','&')
+
+    def _internal_variable_start_state(self, char, index):
+        self._state = self._variable_state
+        if char == '{':
+            self._variable_chars.append(char)
+            self._open_curly += 1
+            self._may_have_internal_variables = True
+        else:
+            self._variable_state(char, index)
+
+    def _waiting_list_variable_index_state(self, char, index):
+        if char != '[':
+            raise StopIteration
+        self._list_and_dict_variable_index_chars.append(char)
+        self._state = self._list_variable_index_state
+
+    def _list_variable_index_state(self, char, index):
+        self._list_and_dict_variable_index_chars.append(char)
+        if char == ']':
+            raise StopIteration
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ruby.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ruby.py
new file mode 100644
index 000000000..72aaeb5fe
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/ruby.py
@@ -0,0 +1,518 @@
+"""
+    pygments.lexers.ruby
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Ruby and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, ExtendedRegexLexer, include, \
+    bygroups, default, LexerContext, do_insertions, words, line_re
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error, Generic, Whitespace
+from pygments.util import shebang_matches
+
+__all__ = ['RubyLexer', 'RubyConsoleLexer', 'FancyLexer']
+
+
+RUBY_OPERATORS = (
+    '*', '**', '-', '+', '-@', '+@', '/', '%', '&', '|', '^', '`', '~',
+    '[]', '[]=', '<<', '>>', '<', '<>', '<=>', '>', '>=', '==', '==='
+)
+
+
+class RubyLexer(ExtendedRegexLexer):
+    """
+    For Ruby source code.
+    """
+
+    name = 'Ruby'
+    url = 'http://www.ruby-lang.org'
+    aliases = ['ruby', 'rb', 'duby']
+    filenames = ['*.rb', '*.rbw', 'Rakefile', '*.rake', '*.gemspec',
+                 '*.rbx', '*.duby', 'Gemfile', 'Vagrantfile']
+    mimetypes = ['text/x-ruby', 'application/x-ruby']
+    version_added = ''
+
+    flags = re.DOTALL | re.MULTILINE
+
+    def heredoc_callback(self, match, ctx):
+        # okay, this is the hardest part of parsing Ruby...
+        # match: 1 = <<[-~]?, 2 = quote? 3 = name 4 = quote? 5 = rest of line
+
+        start = match.start(1)
+        yield start, Operator, match.group(1)        # <<[-~]?
+        yield match.start(2), String.Heredoc, match.group(2)   # quote ", ', `
+        yield match.start(3), String.Delimiter, match.group(3) # heredoc name
+        yield match.start(4), String.Heredoc, match.group(4)   # quote again
+
+        heredocstack = ctx.__dict__.setdefault('heredocstack', [])
+        outermost = not bool(heredocstack)
+        heredocstack.append((match.group(1) in ('<<-', '<<~'), match.group(3)))
+
+        ctx.pos = match.start(5)
+        ctx.end = match.end(5)
+        # this may find other heredocs, so limit the recursion depth
+        if len(heredocstack) < 100:
+            yield from self.get_tokens_unprocessed(context=ctx)
+        else:
+            yield ctx.pos, String.Heredoc, match.group(5)
+        ctx.pos = match.end()
+
+        if outermost:
+            # this is the outer heredoc again, now we can process them all
+            for tolerant, hdname in heredocstack:
+                lines = []
+                for match in line_re.finditer(ctx.text, ctx.pos):
+                    if tolerant:
+                        check = match.group().strip()
+                    else:
+                        check = match.group().rstrip()
+                    if check == hdname:
+                        for amatch in lines:
+                            yield amatch.start(), String.Heredoc, amatch.group()
+                        yield match.start(), String.Delimiter, match.group()
+                        ctx.pos = match.end()
+                        break
+                    else:
+                        lines.append(match)
+                else:
+                    # end of heredoc not found -- error!
+                    for amatch in lines:
+                        yield amatch.start(), Error, amatch.group()
+            ctx.end = len(ctx.text)
+            del heredocstack[:]
+
+    def gen_rubystrings_rules():
+        def intp_regex_callback(self, match, ctx):
+            yield match.start(1), String.Regex, match.group(1)  # begin
+            nctx = LexerContext(match.group(3), 0, ['interpolated-regex'])
+            for i, t, v in self.get_tokens_unprocessed(context=nctx):
+                yield match.start(3)+i, t, v
+            yield match.start(4), String.Regex, match.group(4)  # end[mixounse]*
+            ctx.pos = match.end()
+
+        def intp_string_callback(self, match, ctx):
+            yield match.start(1), String.Other, match.group(1)
+            nctx = LexerContext(match.group(3), 0, ['interpolated-string'])
+            for i, t, v in self.get_tokens_unprocessed(context=nctx):
+                yield match.start(3)+i, t, v
+            yield match.start(4), String.Other, match.group(4)  # end
+            ctx.pos = match.end()
+
+        states = {}
+        states['strings'] = [
+            # easy ones
+            (r'\:@{0,2}[a-zA-Z_]\w*[!?]?', String.Symbol),
+            (words(RUBY_OPERATORS, prefix=r'\:@{0,2}'), String.Symbol),
+            (r":'(\\\\|\\[^\\]|[^'\\])*'", String.Symbol),
+            (r':"', String.Symbol, 'simple-sym'),
+            (r'([a-zA-Z_]\w*)(:)(?!:)',
+             bygroups(String.Symbol, Punctuation)),  # Since Ruby 1.9
+            (r'"', String.Double, 'simple-string-double'),
+            (r"'", String.Single, 'simple-string-single'),
+            (r'(?', '<>', 'ab'):
+            states[name+'-intp-string'] = [
+                (r'\\[\\' + bracecc + ']', String.Other),
+                (lbrace, String.Other, '#push'),
+                (rbrace, String.Other, '#pop'),
+                include('string-intp-escaped'),
+                (r'[\\#' + bracecc + ']', String.Other),
+                (r'[^\\#' + bracecc + ']+', String.Other),
+            ]
+            states['strings'].append((r'%[QWx]?' + lbrace, String.Other,
+                                      name+'-intp-string'))
+            states[name+'-string'] = [
+                (r'\\[\\' + bracecc + ']', String.Other),
+                (lbrace, String.Other, '#push'),
+                (rbrace, String.Other, '#pop'),
+                (r'[\\#' + bracecc + ']', String.Other),
+                (r'[^\\#' + bracecc + ']+', String.Other),
+            ]
+            states['strings'].append((r'%[qsw]' + lbrace, String.Other,
+                                      name+'-string'))
+            states[name+'-regex'] = [
+                (r'\\[\\' + bracecc + ']', String.Regex),
+                (lbrace, String.Regex, '#push'),
+                (rbrace + '[mixounse]*', String.Regex, '#pop'),
+                include('string-intp'),
+                (r'[\\#' + bracecc + ']', String.Regex),
+                (r'[^\\#' + bracecc + ']+', String.Regex),
+            ]
+            states['strings'].append((r'%r' + lbrace, String.Regex,
+                                      name+'-regex'))
+
+        # these must come after %!
+        states['strings'] += [
+            # %r regex
+            (r'(%r([\W_]))((?:\\\2|(?!\2).)*)(\2[mixounse]*)',
+             intp_regex_callback),
+            # regular fancy strings with qsw
+            (r'%[qsw]([\W_])((?:\\\1|(?!\1).)*)\1', String.Other),
+            (r'(%[QWx]([\W_]))((?:\\\2|(?!\2).)*)(\2)',
+             intp_string_callback),
+            # special forms of fancy strings after operators or
+            # in method calls with braces
+            (r'(?<=[-+/*%=<>&!^|~,(])(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)',
+             bygroups(Whitespace, String.Other, None)),
+            # and because of fixed width lookbehinds the whole thing a
+            # second time for line startings...
+            (r'^(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)',
+             bygroups(Whitespace, String.Other, None)),
+            # all regular fancy strings without qsw
+            (r'(%([^a-zA-Z0-9\s]))((?:\\\2|(?!\2).)*)(\2)',
+             intp_string_callback),
+        ]
+
+        return states
+
+    tokens = {
+        'root': [
+            (r'\A#!.+?$', Comment.Hashbang),
+            (r'#.*?$', Comment.Single),
+            (r'=begin\s.*?\n=end.*?$', Comment.Multiline),
+            # keywords
+            (words((
+                'BEGIN', 'END', 'alias', 'begin', 'break', 'case', 'defined?',
+                'do', 'else', 'elsif', 'end', 'ensure', 'for', 'if', 'in', 'next', 'redo',
+                'rescue', 'raise', 'retry', 'return', 'super', 'then', 'undef',
+                'unless', 'until', 'when', 'while', 'yield'), suffix=r'\b'),
+             Keyword),
+            # start of function, class and module names
+            (r'(module)(\s+)([a-zA-Z_]\w*'
+             r'(?:::[a-zA-Z_]\w*)*)',
+             bygroups(Keyword, Whitespace, Name.Namespace)),
+            (r'(def)(\s+)', bygroups(Keyword, Whitespace), 'funcname'),
+            (r'def(?=[*%&^`~+-/\[<>=])', Keyword, 'funcname'),
+            (r'(class)(\s+)', bygroups(Keyword, Whitespace), 'classname'),
+            # special methods
+            (words((
+                'initialize', 'new', 'loop', 'include', 'extend', 'raise', 'attr_reader',
+                'attr_writer', 'attr_accessor', 'attr', 'catch', 'throw', 'private',
+                'module_function', 'public', 'protected', 'true', 'false', 'nil'),
+                suffix=r'\b'),
+             Keyword.Pseudo),
+            (r'(not|and|or)\b', Operator.Word),
+            (words((
+                'autoload', 'block_given', 'const_defined', 'eql', 'equal', 'frozen', 'include',
+                'instance_of', 'is_a', 'iterator', 'kind_of', 'method_defined', 'nil',
+                'private_method_defined', 'protected_method_defined',
+                'public_method_defined', 'respond_to', 'tainted'), suffix=r'\?'),
+             Name.Builtin),
+            (r'(chomp|chop|exit|gsub|sub)!', Name.Builtin),
+            (words((
+                'Array', 'Float', 'Integer', 'String', '__id__', '__send__', 'abort',
+                'ancestors', 'at_exit', 'autoload', 'binding', 'callcc', 'caller',
+                'catch', 'chomp', 'chop', 'class_eval', 'class_variables',
+                'clone', 'const_defined?', 'const_get', 'const_missing', 'const_set',
+                'constants', 'display', 'dup', 'eval', 'exec', 'exit', 'extend', 'fail', 'fork',
+                'format', 'freeze', 'getc', 'gets', 'global_variables', 'gsub',
+                'hash', 'id', 'included_modules', 'inspect', 'instance_eval',
+                'instance_method', 'instance_methods',
+                'instance_variable_get', 'instance_variable_set', 'instance_variables',
+                'lambda', 'load', 'local_variables', 'loop',
+                'method', 'method_missing', 'methods', 'module_eval', 'name',
+                'object_id', 'open', 'p', 'print', 'printf', 'private_class_method',
+                'private_instance_methods',
+                'private_methods', 'proc', 'protected_instance_methods',
+                'protected_methods', 'public_class_method',
+                'public_instance_methods', 'public_methods',
+                'putc', 'puts', 'raise', 'rand', 'readline', 'readlines', 'require',
+                'scan', 'select', 'self', 'send', 'set_trace_func', 'singleton_methods', 'sleep',
+                'split', 'sprintf', 'srand', 'sub', 'syscall', 'system', 'taint',
+                'test', 'throw', 'to_a', 'to_s', 'trace_var', 'trap', 'untaint',
+                'untrace_var', 'warn'), prefix=r'(?~!:])|'
+             r'(?<=(?:\s|;)when\s)|'
+             r'(?<=(?:\s|;)or\s)|'
+             r'(?<=(?:\s|;)and\s)|'
+             r'(?<=\.index\s)|'
+             r'(?<=\.scan\s)|'
+             r'(?<=\.sub\s)|'
+             r'(?<=\.sub!\s)|'
+             r'(?<=\.gsub\s)|'
+             r'(?<=\.gsub!\s)|'
+             r'(?<=\.match\s)|'
+             r'(?<=(?:\s|;)if\s)|'
+             r'(?<=(?:\s|;)elsif\s)|'
+             r'(?<=^when\s)|'
+             r'(?<=^index\s)|'
+             r'(?<=^scan\s)|'
+             r'(?<=^sub\s)|'
+             r'(?<=^gsub\s)|'
+             r'(?<=^sub!\s)|'
+             r'(?<=^gsub!\s)|'
+             r'(?<=^match\s)|'
+             r'(?<=^if\s)|'
+             r'(?<=^elsif\s)'
+             r')(\s*)(/)', bygroups(Text, String.Regex), 'multiline-regex'),
+            # multiline regex (in method calls or subscripts)
+            (r'(?<=\(|,|\[)/', String.Regex, 'multiline-regex'),
+            # multiline regex (this time the funny no whitespace rule)
+            (r'(\s+)(/)(?![\s=])', bygroups(Whitespace, String.Regex),
+             'multiline-regex'),
+            # lex numbers and ignore following regular expressions which
+            # are division operators in fact (grrrr. i hate that. any
+            # better ideas?)
+            # since pygments 0.7 we also eat a "?" operator after numbers
+            # so that the char operator does not work. Chars are not allowed
+            # there so that you can use the ternary operator.
+            # stupid example:
+            #   x>=0?n[x]:""
+            (r'(0_?[0-7]+(?:_[0-7]+)*)(\s*)([/?])?',
+             bygroups(Number.Oct, Whitespace, Operator)),
+            (r'(0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*)(\s*)([/?])?',
+             bygroups(Number.Hex, Whitespace, Operator)),
+            (r'(0b[01]+(?:_[01]+)*)(\s*)([/?])?',
+             bygroups(Number.Bin, Whitespace, Operator)),
+            (r'([\d]+(?:_\d+)*)(\s*)([/?])?',
+             bygroups(Number.Integer, Whitespace, Operator)),
+            # Names
+            (r'@@[a-zA-Z_]\w*', Name.Variable.Class),
+            (r'@[a-zA-Z_]\w*', Name.Variable.Instance),
+            (r'\$\w+', Name.Variable.Global),
+            (r'\$[!@&`\'+~=/\\,;.<>_*$?:"^-]', Name.Variable.Global),
+            (r'\$-[0adFiIlpvw]', Name.Variable.Global),
+            (r'::', Operator),
+            include('strings'),
+            # chars
+            (r'\?(\\[MC]-)*'  # modifiers
+             r'(\\([\\abefnrstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)'
+             r'(?!\w)',
+             String.Char),
+            (r'[A-Z]\w+', Name.Constant),
+            # this is needed because ruby attributes can look
+            # like keywords (class) or like this: ` ?!?
+            (words(RUBY_OPERATORS, prefix=r'(\.|::)'),
+             bygroups(Operator, Name.Operator)),
+            (r'(\.|::)([a-zA-Z_]\w*[!?]?|[*%&^`~+\-/\[<>=])',
+             bygroups(Operator, Name)),
+            (r'[a-zA-Z_]\w*[!?]?', Name),
+            (r'(\[|\]|\*\*|<>?|>=|<=|<=>|=~|={3}|'
+             r'!~|&&?|\|\||\.{1,3})', Operator),
+            (r'[-+/*%=<>&!^|~]=?', Operator),
+            (r'[(){};,/?:\\]', Punctuation),
+            (r'\s+', Whitespace)
+        ],
+        'funcname': [
+            (r'\(', Punctuation, 'defexpr'),
+            (r'(?:([a-zA-Z_]\w*)(\.))?'  # optional scope name, like "self."
+             r'('
+                r'[a-zA-Z\u0080-\uffff][a-zA-Z0-9_\u0080-\uffff]*[!?=]?'  # method name
+                r'|!=|!~|=~|\*\*?|[-+!~]@?|[/%&|^]|<=>|<[<=]?|>[>=]?|===?'  # or operator override
+                r'|\[\]=?'  # or element reference/assignment override
+                r'|`'  # or the undocumented backtick override
+             r')',
+             bygroups(Name.Class, Operator, Name.Function), '#pop'),
+            default('#pop')
+        ],
+        'classname': [
+            (r'\(', Punctuation, 'defexpr'),
+            (r'<<', Operator, '#pop'),
+            (r'[A-Z_]\w*', Name.Class, '#pop'),
+            default('#pop')
+        ],
+        'defexpr': [
+            (r'(\))(\.|::)?', bygroups(Punctuation, Operator), '#pop'),
+            (r'\(', Operator, '#push'),
+            include('root')
+        ],
+        'in-intp': [
+            (r'\{', String.Interpol, '#push'),
+            (r'\}', String.Interpol, '#pop'),
+            include('root'),
+        ],
+        'string-intp': [
+            (r'#\{', String.Interpol, 'in-intp'),
+            (r'#@@?[a-zA-Z_]\w*', String.Interpol),
+            (r'#\$[a-zA-Z_]\w*', String.Interpol)
+        ],
+        'string-intp-escaped': [
+            include('string-intp'),
+            (r'\\([\\abefnrstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})',
+             String.Escape)
+        ],
+        'interpolated-regex': [
+            include('string-intp'),
+            (r'[\\#]', String.Regex),
+            (r'[^\\#]+', String.Regex),
+        ],
+        'interpolated-string': [
+            include('string-intp'),
+            (r'[\\#]', String.Other),
+            (r'[^\\#]+', String.Other),
+        ],
+        'multiline-regex': [
+            include('string-intp'),
+            (r'\\\\', String.Regex),
+            (r'\\/', String.Regex),
+            (r'[\\#]', String.Regex),
+            (r'[^\\/#]+', String.Regex),
+            (r'/[mixounse]*', String.Regex, '#pop'),
+        ],
+        'end-part': [
+            (r'.+', Comment.Preproc, '#pop')
+        ]
+    }
+    tokens.update(gen_rubystrings_rules())
+
+    def analyse_text(text):
+        return shebang_matches(text, r'ruby(1\.\d)?')
+
+
+class RubyConsoleLexer(Lexer):
+    """
+    For Ruby interactive console (**irb**) output.
+    """
+    name = 'Ruby irb session'
+    aliases = ['rbcon', 'irb']
+    mimetypes = ['text/x-ruby-shellsession']
+    url = 'https://www.ruby-lang.org'
+    version_added = ''
+    _example = 'rbcon/console'
+
+    _prompt_re = re.compile(r'irb\([a-zA-Z_]\w*\):\d{3}:\d+[>*"\'] '
+                            r'|>> |\?> ')
+
+    def get_tokens_unprocessed(self, text):
+        rblexer = RubyLexer(**self.options)
+
+        curcode = ''
+        insertions = []
+        for match in line_re.finditer(text):
+            line = match.group()
+            m = self._prompt_re.match(line)
+            if m is not None:
+                end = m.end()
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, line[:end])]))
+                curcode += line[end:]
+            else:
+                if curcode:
+                    yield from do_insertions(
+                        insertions, rblexer.get_tokens_unprocessed(curcode))
+                    curcode = ''
+                    insertions = []
+                yield match.start(), Generic.Output, line
+        if curcode:
+            yield from do_insertions(
+                insertions, rblexer.get_tokens_unprocessed(curcode))
+
+
+class FancyLexer(RegexLexer):
+    """
+    Pygments Lexer For Fancy.
+
+    Fancy is a self-hosted, pure object-oriented, dynamic,
+    class-based, concurrent general-purpose programming language
+    running on Rubinius, the Ruby VM.
+    """
+    name = 'Fancy'
+    url = 'https://github.com/bakkdoor/fancy'
+    filenames = ['*.fy', '*.fancypack']
+    aliases = ['fancy', 'fy']
+    mimetypes = ['text/x-fancysrc']
+    version_added = '1.5'
+
+    tokens = {
+        # copied from PerlLexer:
+        'balanced-regex': [
+            (r'/(\\\\|\\[^\\]|[^/\\])*/[egimosx]*', String.Regex, '#pop'),
+            (r'!(\\\\|\\[^\\]|[^!\\])*![egimosx]*', String.Regex, '#pop'),
+            (r'\\(\\\\|[^\\])*\\[egimosx]*', String.Regex, '#pop'),
+            (r'\{(\\\\|\\[^\\]|[^}\\])*\}[egimosx]*', String.Regex, '#pop'),
+            (r'<(\\\\|\\[^\\]|[^>\\])*>[egimosx]*', String.Regex, '#pop'),
+            (r'\[(\\\\|\\[^\\]|[^\]\\])*\][egimosx]*', String.Regex, '#pop'),
+            (r'\((\\\\|\\[^\\]|[^)\\])*\)[egimosx]*', String.Regex, '#pop'),
+            (r'@(\\\\|\\[^\\]|[^@\\])*@[egimosx]*', String.Regex, '#pop'),
+            (r'%(\\\\|\\[^\\]|[^%\\])*%[egimosx]*', String.Regex, '#pop'),
+            (r'\$(\\\\|\\[^\\]|[^$\\])*\$[egimosx]*', String.Regex, '#pop'),
+        ],
+        'root': [
+            (r'\s+', Whitespace),
+
+            # balanced delimiters (copied from PerlLexer):
+            (r's\{(\\\\|\\[^\\]|[^}\\])*\}\s*', String.Regex, 'balanced-regex'),
+            (r's<(\\\\|\\[^\\]|[^>\\])*>\s*', String.Regex, 'balanced-regex'),
+            (r's\[(\\\\|\\[^\\]|[^\]\\])*\]\s*', String.Regex, 'balanced-regex'),
+            (r's\((\\\\|\\[^\\]|[^)\\])*\)\s*', String.Regex, 'balanced-regex'),
+            (r'm?/(\\\\|\\[^\\]|[^///\n])*/[gcimosx]*', String.Regex),
+            (r'm(?=[/!\\{<\[(@%$])', String.Regex, 'balanced-regex'),
+
+            # Comments
+            (r'#(.*?)\n', Comment.Single),
+            # Symbols
+            (r'\'([^\'\s\[\](){}]+|\[\])', String.Symbol),
+            # Multi-line DoubleQuotedString
+            (r'"""(\\\\|\\[^\\]|[^\\])*?"""', String),
+            # DoubleQuotedString
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            # keywords
+            (r'(def|class|try|catch|finally|retry|return|return_local|match|'
+             r'case|->|=>)\b', Keyword),
+            # constants
+            (r'(self|super|nil|false|true)\b', Name.Constant),
+            (r'[(){};,/?|:\\]', Punctuation),
+            # names
+            (words((
+                'Object', 'Array', 'Hash', 'Directory', 'File', 'Class', 'String',
+                'Number', 'Enumerable', 'FancyEnumerable', 'Block', 'TrueClass',
+                'NilClass', 'FalseClass', 'Tuple', 'Symbol', 'Stack', 'Set',
+                'FancySpec', 'Method', 'Package', 'Range'), suffix=r'\b'),
+             Name.Builtin),
+            # functions
+            (r'[a-zA-Z](\w|[-+?!=*/^><%])*:', Name.Function),
+            # operators, must be below functions
+            (r'[-+*/~,<>=&!?%^\[\].$]+', Operator),
+            (r'[A-Z]\w*', Name.Constant),
+            (r'@[a-zA-Z_]\w*', Name.Variable.Instance),
+            (r'@@[a-zA-Z_]\w*', Name.Variable.Class),
+            ('@@?', Operator),
+            (r'[a-zA-Z_]\w*', Name),
+            # numbers - / checks are necessary to avoid mismarking regexes,
+            # see comment in RubyLexer
+            (r'(0[oO]?[0-7]+(?:_[0-7]+)*)(\s*)([/?])?',
+             bygroups(Number.Oct, Whitespace, Operator)),
+            (r'(0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*)(\s*)([/?])?',
+             bygroups(Number.Hex, Whitespace, Operator)),
+            (r'(0[bB][01]+(?:_[01]+)*)(\s*)([/?])?',
+             bygroups(Number.Bin, Whitespace, Operator)),
+            (r'([\d]+(?:_\d+)*)(\s*)([/?])?',
+             bygroups(Number.Integer, Whitespace, Operator)),
+            (r'\d+([eE][+-]?[0-9]+)|\d+\.\d+([eE][+-]?[0-9]+)?', Number.Float),
+            (r'\d+', Number.Integer)
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rust.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rust.py
new file mode 100644
index 000000000..634104755
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/rust.py
@@ -0,0 +1,222 @@
+"""
+    pygments.lexers.rust
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Rust language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, words, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['RustLexer']
+
+
+class RustLexer(RegexLexer):
+    """
+    Lexer for the Rust programming language (version 1.47).
+    """
+    name = 'Rust'
+    url = 'https://www.rust-lang.org/'
+    filenames = ['*.rs', '*.rs.in']
+    aliases = ['rust', 'rs']
+    mimetypes = ['text/rust', 'text/x-rust']
+    version_added = '1.6'
+
+    keyword_types = (words((
+        'u8', 'u16', 'u32', 'u64', 'u128', 'i8', 'i16', 'i32', 'i64', 'i128',
+        'usize', 'isize', 'f32', 'f64', 'char', 'str', 'bool',
+    ), suffix=r'\b'), Keyword.Type)
+
+    builtin_funcs_types = (words((
+        'Copy', 'Send', 'Sized', 'Sync', 'Unpin',
+        'Drop', 'Fn', 'FnMut', 'FnOnce', 'drop',
+        'Box', 'ToOwned', 'Clone',
+        'PartialEq', 'PartialOrd', 'Eq', 'Ord',
+        'AsRef', 'AsMut', 'Into', 'From', 'Default',
+        'Iterator', 'Extend', 'IntoIterator', 'DoubleEndedIterator',
+        'ExactSizeIterator',
+        'Option', 'Some', 'None',
+        'Result', 'Ok', 'Err',
+        'String', 'ToString', 'Vec',
+    ), suffix=r'\b'), Name.Builtin)
+
+    builtin_macros = (words((
+        'asm', 'assert', 'assert_eq', 'assert_ne', 'cfg', 'column',
+        'compile_error', 'concat', 'concat_idents', 'dbg', 'debug_assert',
+        'debug_assert_eq', 'debug_assert_ne', 'env', 'eprint', 'eprintln',
+        'file', 'format', 'format_args', 'format_args_nl', 'global_asm',
+        'include', 'include_bytes', 'include_str',
+        'is_aarch64_feature_detected',
+        'is_arm_feature_detected',
+        'is_mips64_feature_detected',
+        'is_mips_feature_detected',
+        'is_powerpc64_feature_detected',
+        'is_powerpc_feature_detected',
+        'is_x86_feature_detected',
+        'line', 'llvm_asm', 'log_syntax', 'macro_rules', 'matches',
+        'module_path', 'option_env', 'panic', 'print', 'println', 'stringify',
+        'thread_local', 'todo', 'trace_macros', 'unimplemented', 'unreachable',
+        'vec', 'write', 'writeln',
+    ), suffix=r'!'), Name.Function.Magic)
+
+    tokens = {
+        'root': [
+            # rust allows a file to start with a shebang, but if the first line
+            # starts with #![ then it's not a shebang but a crate attribute.
+            (r'#![^[\r\n].*$', Comment.Preproc),
+            default('base'),
+        ],
+        'base': [
+            # Whitespace and Comments
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'//!.*?\n', String.Doc),
+            (r'///(\n|[^/].*?\n)', String.Doc),
+            (r'//(.*?)\n', Comment.Single),
+            (r'/\*\*(\n|[^/*])', String.Doc, 'doccomment'),
+            (r'/\*!', String.Doc, 'doccomment'),
+            (r'/\*', Comment.Multiline, 'comment'),
+
+            # Macro parameters
+            (r"""\$([a-zA-Z_]\w*|\(,?|\),?|,?)""", Comment.Preproc),
+            # Keywords
+            (words(('as', 'async', 'await', 'box', 'const', 'crate', 'dyn',
+                    'else', 'extern', 'for', 'if', 'impl', 'in', 'loop',
+                    'match', 'move', 'mut', 'pub', 'ref', 'return', 'static',
+                    'super', 'trait', 'unsafe', 'use', 'where', 'while'),
+                   suffix=r'\b'), Keyword),
+            (words(('abstract', 'become', 'do', 'final', 'macro', 'override',
+                    'priv', 'typeof', 'try', 'unsized', 'virtual', 'yield'),
+                   suffix=r'\b'), Keyword.Reserved),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'self\b', Name.Builtin.Pseudo),
+            (r'mod\b', Keyword, 'modname'),
+            (r'let\b', Keyword.Declaration),
+            (r'fn\b', Keyword, 'funcname'),
+            (r'(struct|enum|type|union)\b', Keyword, 'typename'),
+            (r'(default)(\s+)(type|fn)\b', bygroups(Keyword, Whitespace, Keyword)),
+            keyword_types,
+            (r'[sS]elf\b', Name.Builtin.Pseudo),
+            # Prelude (taken from Rust's src/libstd/prelude.rs)
+            builtin_funcs_types,
+            builtin_macros,
+            # Path separators, so types don't catch them.
+            (r'::\b', Punctuation),
+            # Types in positions.
+            (r'(?::|->)', Punctuation, 'typename'),
+            # Labels
+            (r'(break|continue)(\b\s*)(\'[A-Za-z_]\w*)?',
+             bygroups(Keyword, Text.Whitespace, Name.Label)),
+
+            # Character literals
+            (r"""'(\\['"\\nrt]|\\x[0-7][0-9a-fA-F]|\\0"""
+             r"""|\\u\{[0-9a-fA-F]{1,6}\}|.)'""",
+             String.Char),
+            (r"""b'(\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\0"""
+             r"""|\\u\{[0-9a-fA-F]{1,6}\}|.)'""",
+             String.Char),
+
+            # Binary literals
+            (r'0b[01_]+', Number.Bin, 'number_lit'),
+            # Octal literals
+            (r'0o[0-7_]+', Number.Oct, 'number_lit'),
+            # Hexadecimal literals
+            (r'0[xX][0-9a-fA-F_]+', Number.Hex, 'number_lit'),
+            # Decimal literals
+            (r'[0-9][0-9_]*(\.[0-9_]+[eE][+\-]?[0-9_]+|'
+             r'\.[0-9_]*(?!\.)|[eE][+\-]?[0-9_]+)', Number.Float,
+             'number_lit'),
+            (r'[0-9][0-9_]*', Number.Integer, 'number_lit'),
+
+            # String literals
+            (r'b"', String, 'bytestring'),
+            (r'"', String, 'string'),
+            (r'(?s)b?r(#*)".*?"\1', String),
+
+            # Lifetime names
+            (r"'", Operator, 'lifetime'),
+
+            # Operators and Punctuation
+            (r'\.\.=?', Operator),
+            (r'[{}()\[\],.;]', Punctuation),
+            (r'[+\-*/%&|<>^!~@=:?]', Operator),
+
+            # Identifiers
+            (r'[a-zA-Z_]\w*', Name),
+            # Raw identifiers
+            (r'r#[a-zA-Z_]\w*', Name),
+
+            # Attributes
+            (r'#!?\[', Comment.Preproc, 'attribute['),
+
+            # Misc
+            # Lone hashes: not used in Rust syntax, but allowed in macro
+            # arguments, most famously for quote::quote!()
+            (r'#', Punctuation),
+        ],
+        'comment': [
+            (r'[^*/]+', Comment.Multiline),
+            (r'/\*', Comment.Multiline, '#push'),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'[*/]', Comment.Multiline),
+        ],
+        'doccomment': [
+            (r'[^*/]+', String.Doc),
+            (r'/\*', String.Doc, '#push'),
+            (r'\*/', String.Doc, '#pop'),
+            (r'[*/]', String.Doc),
+        ],
+        'modname': [
+            (r'\s+', Whitespace),
+            (r'[a-zA-Z_]\w*', Name.Namespace, '#pop'),
+            default('#pop'),
+        ],
+        'funcname': [
+            (r'\s+', Whitespace),
+            (r'[a-zA-Z_]\w*', Name.Function, '#pop'),
+            default('#pop'),
+        ],
+        'typename': [
+            (r'\s+', Whitespace),
+            (r'&', Keyword.Pseudo),
+            (r"'", Operator, 'lifetime'),
+            builtin_funcs_types,
+            keyword_types,
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+            default('#pop'),
+        ],
+        'lifetime': [
+            (r"(static|_)", Name.Builtin),
+            (r"[a-zA-Z_]+\w*", Name.Attribute),
+            default('#pop'),
+        ],
+        'number_lit': [
+            (r'[ui](8|16|32|64|size)', Keyword, '#pop'),
+            (r'f(32|64)', Keyword, '#pop'),
+            default('#pop'),
+        ],
+        'string': [
+            (r'"', String, '#pop'),
+            (r"""\\['"\\nrt]|\\x[0-7][0-9a-fA-F]|\\0"""
+             r"""|\\u\{[0-9a-fA-F]{1,6}\}""", String.Escape),
+            (r'[^\\"]+', String),
+            (r'\\', String),
+        ],
+        'bytestring': [
+            (r"""\\x[89a-fA-F][0-9a-fA-F]""", String.Escape),
+            include('string'),
+        ],
+        'attribute_common': [
+            (r'"', String, 'string'),
+            (r'\[', Comment.Preproc, 'attribute['),
+        ],
+        'attribute[': [
+            include('attribute_common'),
+            (r'\]', Comment.Preproc, '#pop'),
+            (r'[^"\]\[]+', Comment.Preproc),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sas.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sas.py
new file mode 100644
index 000000000..1b2ad432d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sas.py
@@ -0,0 +1,227 @@
+"""
+    pygments.lexers.sas
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for SAS.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Comment, Keyword, Name, Number, String, Text, \
+    Other, Generic
+
+__all__ = ['SASLexer']
+
+
+class SASLexer(RegexLexer):
+    """
+    For SAS files.
+    """
+    # Syntax from syntax/sas.vim by James Kidd 
+
+    name      = 'SAS'
+    aliases   = ['sas']
+    filenames = ['*.SAS', '*.sas']
+    mimetypes = ['text/x-sas', 'text/sas', 'application/x-sas']
+    url = 'https://en.wikipedia.org/wiki/SAS_(software)'
+    version_added = '2.2'
+    flags     = re.IGNORECASE | re.MULTILINE
+
+    builtins_macros = (
+        "bquote", "nrbquote", "cmpres", "qcmpres", "compstor", "datatyp",
+        "display", "do", "else", "end", "eval", "global", "goto", "if",
+        "index", "input", "keydef", "label", "left", "length", "let",
+        "local", "lowcase", "macro", "mend", "nrquote",
+        "nrstr", "put", "qleft", "qlowcase", "qscan",
+        "qsubstr", "qsysfunc", "qtrim", "quote", "qupcase", "scan",
+        "str", "substr", "superq", "syscall", "sysevalf", "sysexec",
+        "sysfunc", "sysget", "syslput", "sysprod", "sysrc", "sysrput",
+        "then", "to", "trim", "unquote", "until", "upcase", "verify",
+        "while", "window"
+    )
+
+    builtins_conditionals = (
+        "do", "if", "then", "else", "end", "until", "while"
+    )
+
+    builtins_statements = (
+        "abort", "array", "attrib", "by", "call", "cards", "cards4",
+        "catname", "continue", "datalines", "datalines4", "delete", "delim",
+        "delimiter", "display", "dm", "drop", "endsas", "error", "file",
+        "filename", "footnote", "format", "goto", "in", "infile", "informat",
+        "input", "keep", "label", "leave", "length", "libname", "link",
+        "list", "lostcard", "merge", "missing", "modify", "options", "output",
+        "out", "page", "put", "redirect", "remove", "rename", "replace",
+        "retain", "return", "select", "set", "skip", "startsas", "stop",
+        "title", "update", "waitsas", "where", "window", "x", "systask"
+    )
+
+    builtins_sql = (
+        "add", "and", "alter", "as", "cascade", "check", "create",
+        "delete", "describe", "distinct", "drop", "foreign", "from",
+        "group", "having", "index", "insert", "into", "in", "key", "like",
+        "message", "modify", "msgtype", "not", "null", "on", "or",
+        "order", "primary", "references", "reset", "restrict", "select",
+        "set", "table", "unique", "update", "validate", "view", "where"
+    )
+
+    builtins_functions = (
+        "abs", "addr", "airy", "arcos", "arsin", "atan", "attrc",
+        "attrn", "band", "betainv", "blshift", "bnot", "bor",
+        "brshift", "bxor", "byte", "cdf", "ceil", "cexist", "cinv",
+        "close", "cnonct", "collate", "compbl", "compound",
+        "compress", "cos", "cosh", "css", "curobs", "cv", "daccdb",
+        "daccdbsl", "daccsl", "daccsyd", "dacctab", "dairy", "date",
+        "datejul", "datepart", "datetime", "day", "dclose", "depdb",
+        "depdbsl", "depsl", "depsyd",
+        "deptab", "dequote", "dhms", "dif", "digamma",
+        "dim", "dinfo", "dnum", "dopen", "doptname", "doptnum",
+        "dread", "dropnote", "dsname", "erf", "erfc", "exist", "exp",
+        "fappend", "fclose", "fcol", "fdelete", "fetch", "fetchobs",
+        "fexist", "fget", "fileexist", "filename", "fileref",
+        "finfo", "finv", "fipname", "fipnamel", "fipstate", "floor",
+        "fnonct", "fnote", "fopen", "foptname", "foptnum", "fpoint",
+        "fpos", "fput", "fread", "frewind", "frlen", "fsep", "fuzz",
+        "fwrite", "gaminv", "gamma", "getoption", "getvarc", "getvarn",
+        "hbound", "hms", "hosthelp", "hour", "ibessel", "index",
+        "indexc", "indexw", "input", "inputc", "inputn", "int",
+        "intck", "intnx", "intrr", "irr", "jbessel", "juldate",
+        "kurtosis", "lag", "lbound", "left", "length", "lgamma",
+        "libname", "libref", "log", "log10", "log2", "logpdf", "logpmf",
+        "logsdf", "lowcase", "max", "mdy", "mean", "min", "minute",
+        "mod", "month", "mopen", "mort", "n", "netpv", "nmiss",
+        "normal", "note", "npv", "open", "ordinal", "pathname",
+        "pdf", "peek", "peekc", "pmf", "point", "poisson", "poke",
+        "probbeta", "probbnml", "probchi", "probf", "probgam",
+        "probhypr", "probit", "probnegb", "probnorm", "probt",
+        "put", "putc", "putn", "qtr", "quote", "ranbin", "rancau",
+        "ranexp", "rangam", "range", "rank", "rannor", "ranpoi",
+        "rantbl", "rantri", "ranuni", "repeat", "resolve", "reverse",
+        "rewind", "right", "round", "saving", "scan", "sdf", "second",
+        "sign", "sin", "sinh", "skewness", "soundex", "spedis",
+        "sqrt", "std", "stderr", "stfips", "stname", "stnamel",
+        "substr", "sum", "symget", "sysget", "sysmsg", "sysprod",
+        "sysrc", "system", "tan", "tanh", "time", "timepart", "tinv",
+        "tnonct", "today", "translate", "tranwrd", "trigamma",
+        "trim", "trimn", "trunc", "uniform", "upcase", "uss", "var",
+        "varfmt", "varinfmt", "varlabel", "varlen", "varname",
+        "varnum", "varray", "varrayx", "vartype", "verify", "vformat",
+        "vformatd", "vformatdx", "vformatn", "vformatnx", "vformatw",
+        "vformatwx", "vformatx", "vinarray", "vinarrayx", "vinformat",
+        "vinformatd", "vinformatdx", "vinformatn", "vinformatnx",
+        "vinformatw", "vinformatwx", "vinformatx", "vlabel",
+        "vlabelx", "vlength", "vlengthx", "vname", "vnamex", "vtype",
+        "vtypex", "weekday", "year", "yyq", "zipfips", "zipname",
+        "zipnamel", "zipstate"
+    )
+
+    tokens = {
+        'root': [
+            include('comments'),
+            include('proc-data'),
+            include('cards-datalines'),
+            include('logs'),
+            include('general'),
+            (r'.', Text),
+        ],
+        # SAS is multi-line regardless, but * is ended by ;
+        'comments': [
+            (r'^\s*\*.*?;', Comment),
+            (r'/\*.*?\*/', Comment),
+            (r'^\s*\*(.|\n)*?;', Comment.Multiline),
+            (r'/[*](.|\n)*?[*]/', Comment.Multiline),
+        ],
+        # Special highlight for proc, data, quit, run
+        'proc-data': [
+            (r'(^|;)\s*(proc \w+|data|run|quit)[\s;]',
+             Keyword.Reserved),
+        ],
+        # Special highlight cards and datalines
+        'cards-datalines': [
+            (r'^\s*(datalines|cards)\s*;\s*$', Keyword, 'data'),
+        ],
+        'data': [
+            (r'(.|\n)*^\s*;\s*$', Other, '#pop'),
+        ],
+        # Special highlight for put NOTE|ERROR|WARNING (order matters)
+        'logs': [
+            (r'\n?^\s*%?put ', Keyword, 'log-messages'),
+        ],
+        'log-messages': [
+            (r'NOTE(:|-).*', Generic, '#pop'),
+            (r'WARNING(:|-).*', Generic.Emph, '#pop'),
+            (r'ERROR(:|-).*', Generic.Error, '#pop'),
+            include('general'),
+        ],
+        'general': [
+            include('keywords'),
+            include('vars-strings'),
+            include('special'),
+            include('numbers'),
+        ],
+        # Keywords, statements, functions, macros
+        'keywords': [
+            (words(builtins_statements,
+                   prefix = r'\b',
+                   suffix = r'\b'),
+             Keyword),
+            (words(builtins_sql,
+                   prefix = r'\b',
+                   suffix = r'\b'),
+             Keyword),
+            (words(builtins_conditionals,
+                   prefix = r'\b',
+                   suffix = r'\b'),
+             Keyword),
+            (words(builtins_macros,
+                   prefix = r'%',
+                   suffix = r'\b'),
+             Name.Builtin),
+            (words(builtins_functions,
+                   prefix = r'\b',
+                   suffix = r'\('),
+             Name.Builtin),
+        ],
+        # Strings and user-defined variables and macros (order matters)
+        'vars-strings': [
+            (r'&[a-z_]\w{0,31}\.?', Name.Variable),
+            (r'%[a-z_]\w{0,31}', Name.Function),
+            (r'\'', String, 'string_squote'),
+            (r'"', String, 'string_dquote'),
+        ],
+        'string_squote': [
+            ('\'', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),
+            # AFAIK, macro variables are not evaluated in single quotes
+            # (r'&', Name.Variable, 'validvar'),
+            (r'[^$\'\\]+', String),
+            (r'[$\'\\]', String),
+        ],
+        'string_dquote': [
+            (r'"', String, '#pop'),
+            (r'\\\\|\\"|\\\n', String.Escape),
+            (r'&', Name.Variable, 'validvar'),
+            (r'[^$&"\\]+', String),
+            (r'[$"\\]', String),
+        ],
+        'validvar': [
+            (r'[a-z_]\w{0,31}\.?', Name.Variable, '#pop'),
+        ],
+        # SAS numbers and special variables
+        'numbers': [
+            (r'\b[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+|\.)(E[+-]?[0-9]+)?i?\b',
+             Number),
+        ],
+        'special': [
+            (r'(null|missing|_all_|_automatic_|_character_|_n_|'
+             r'_infile_|_name_|_null_|_numeric_|_user_|_webout_)',
+             Keyword.Constant),
+        ],
+        # 'operators': [
+        #     (r'(-|=|<=|>=|<|>|<>|&|!=|'
+        #      r'\||\*|\+|\^|/|!|~|~=)', Operator)
+        # ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/savi.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/savi.py
new file mode 100644
index 000000000..1e443ae30
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/savi.py
@@ -0,0 +1,171 @@
+"""
+    pygments.lexers.savi
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Savi.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include
+from pygments.token import Whitespace, Keyword, Name, String, Number, \
+  Operator, Punctuation, Comment, Generic, Error
+
+__all__ = ['SaviLexer']
+
+
+# The canonical version of this file can be found in the following repository,
+# where it is kept in sync with any language changes, as well as the other
+# pygments-like lexers that are maintained for use with other tools:
+# - https://github.com/savi-lang/savi/blob/main/tooling/pygments/lexers/savi.py
+#
+# If you're changing this file in the pygments repository, please ensure that
+# any changes you make are also propagated to the official Savi repository,
+# in order to avoid accidental clobbering of your changes later when an update
+# from the Savi repository flows forward into the pygments repository.
+#
+# If you're changing this file in the Savi repository, please ensure that
+# any changes you make are also reflected in the other pygments-like lexers
+# (rouge, vscode, etc) so that all of the lexers can be kept cleanly in sync.
+
+class SaviLexer(RegexLexer):
+    """
+    For Savi source code.
+
+    .. versionadded: 2.10
+    """
+
+    name = 'Savi'
+    url = 'https://github.com/savi-lang/savi'
+    aliases = ['savi']
+    filenames = ['*.savi']
+    version_added = ''
+
+    tokens = {
+      "root": [
+        # Line Comment
+        (r'//.*?$', Comment.Single),
+
+        # Doc Comment
+        (r'::.*?$', Comment.Single),
+
+        # Capability Operator
+        (r'(\')(\w+)(?=[^\'])', bygroups(Operator, Name)),
+
+        # Double-Quote String
+        (r'\w?"', String.Double, "string.double"),
+
+        # Single-Char String
+        (r"'", String.Char, "string.char"),
+
+        # Type Name
+        (r'(_?[A-Z]\w*)', Name.Class),
+
+        # Nested Type Name
+        (r'(\.)(\s*)(_?[A-Z]\w*)', bygroups(Punctuation, Whitespace, Name.Class)),
+
+        # Declare
+        (r'^([ \t]*)(:\w+)',
+          bygroups(Whitespace, Name.Tag),
+          "decl"),
+
+        # Error-Raising Calls/Names
+        (r'((\w+|\+|\-|\*)\!)', Generic.Deleted),
+
+        # Numeric Values
+        (r'\b\d([\d_]*(\.[\d_]+)?)\b', Number),
+
+        # Hex Numeric Values
+        (r'\b0x([0-9a-fA-F_]+)\b', Number.Hex),
+
+        # Binary Numeric Values
+        (r'\b0b([01_]+)\b', Number.Bin),
+
+        # Function Call (with braces)
+        (r'\w+(?=\()', Name.Function),
+
+        # Function Call (with receiver)
+        (r'(\.)(\s*)(\w+)', bygroups(Punctuation, Whitespace, Name.Function)),
+
+        # Function Call (with self receiver)
+        (r'(@)(\w+)', bygroups(Punctuation, Name.Function)),
+
+        # Parenthesis
+        (r'\(', Punctuation, "root"),
+        (r'\)', Punctuation, "#pop"),
+
+        # Brace
+        (r'\{', Punctuation, "root"),
+        (r'\}', Punctuation, "#pop"),
+
+        # Bracket
+        (r'\[', Punctuation, "root"),
+        (r'(\])(\!)', bygroups(Punctuation, Generic.Deleted), "#pop"),
+        (r'\]', Punctuation, "#pop"),
+
+        # Punctuation
+        (r'[,;:\.@]', Punctuation),
+
+        # Piping Operators
+        (r'(\|\>)', Operator),
+
+        # Branching Operators
+        (r'(\&\&|\|\||\?\?|\&\?|\|\?|\.\?)', Operator),
+
+        # Comparison Operators
+        (r'(\<\=\>|\=\~|\=\=|\<\=|\>\=|\<|\>)', Operator),
+
+        # Arithmetic Operators
+        (r'(\+|\-|\/|\*|\%)', Operator),
+
+        # Assignment Operators
+        (r'(\=)', Operator),
+
+        # Other Operators
+        (r'(\!|\<\<|\<|\&|\|)', Operator),
+
+        # Identifiers
+        (r'\b\w+\b', Name),
+
+        # Whitespace
+        (r'[ \t\r]+\n*|\n+', Whitespace),
+      ],
+
+      # Declare (nested rules)
+      "decl": [
+        (r'\b[a-z_]\w*\b(?!\!)', Keyword.Declaration),
+        (r':', Punctuation, "#pop"),
+        (r'\n', Whitespace, "#pop"),
+        include("root"),
+      ],
+
+      # Double-Quote String (nested rules)
+      "string.double": [
+        (r'\\\(', String.Interpol, "string.interpolation"),
+        (r'\\u[0-9a-fA-F]{4}', String.Escape),
+        (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        (r'\\[bfnrt\\\']', String.Escape),
+        (r'\\"', String.Escape),
+        (r'"', String.Double, "#pop"),
+        (r'[^\\"]+', String.Double),
+        (r'.', Error),
+      ],
+
+      # Single-Char String (nested rules)
+      "string.char": [
+        (r'\\u[0-9a-fA-F]{4}', String.Escape),
+        (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        (r'\\[bfnrt\\\']', String.Escape),
+        (r"\\'", String.Escape),
+        (r"'", String.Char, "#pop"),
+        (r"[^\\']+", String.Char),
+        (r'.', Error),
+      ],
+
+      # Interpolation inside String (nested rules)
+      "string.interpolation": [
+        (r"\)", String.Interpol, "#pop"),
+        include("root"),
+      ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/scdoc.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/scdoc.py
new file mode 100644
index 000000000..8e850d02e
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/scdoc.py
@@ -0,0 +1,85 @@
+"""
+    pygments.lexers.scdoc
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for scdoc, a simple man page generator.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, using, this
+from pygments.token import Text, Comment, Keyword, String, Generic
+
+__all__ = ['ScdocLexer']
+
+
+class ScdocLexer(RegexLexer):
+    """
+    `scdoc` is a simple man page generator for POSIX systems written in C99.
+    """
+    name = 'scdoc'
+    url = 'https://git.sr.ht/~sircmpwn/scdoc'
+    aliases = ['scdoc', 'scd']
+    filenames = ['*.scd', '*.scdoc']
+    version_added = '2.5'
+    flags = re.MULTILINE
+
+    tokens = {
+        'root': [
+            # comment
+            (r'^(;.+\n)', bygroups(Comment)),
+
+            # heading with pound prefix
+            (r'^(#)([^#].+\n)', bygroups(Generic.Heading, Text)),
+            (r'^(#{2})(.+\n)', bygroups(Generic.Subheading, Text)),
+            # bulleted lists
+            (r'^(\s*)([*-])(\s)(.+\n)',
+            bygroups(Text, Keyword, Text, using(this, state='inline'))),
+            # numbered lists
+            (r'^(\s*)(\.+\.)( .+\n)',
+            bygroups(Text, Keyword, using(this, state='inline'))),
+            # quote
+            (r'^(\s*>\s)(.+\n)', bygroups(Keyword, Generic.Emph)),
+            # text block
+            (r'^(```\n)([\w\W]*?)(^```$)', bygroups(String, Text, String)),
+
+            include('inline'),
+        ],
+        'inline': [
+            # escape
+            (r'\\.', Text),
+            # underlines
+            (r'(\s)(_[^_]+_)(\W|\n)', bygroups(Text, Generic.Emph, Text)),
+            # bold
+            (r'(\s)(\*[^*]+\*)(\W|\n)', bygroups(Text, Generic.Strong, Text)),
+            # inline code
+            (r'`[^`]+`', String.Backtick),
+
+            # general text, must come last!
+            (r'[^\\\s]+', Text),
+            (r'.', Text),
+        ],
+    }
+
+    def analyse_text(text):
+        """We checks for bold and underline text with * and _. Also
+        every scdoc file must start with a strictly defined first line."""
+        result = 0
+
+        if '*' in text:
+            result += 0.01
+
+        if '_' in text:
+            result += 0.01
+
+        # name(section) ["left_footer" ["center_header"]]
+        first_line = text.partition('\n')[0]
+        scdoc_preamble_pattern = r'^.*\([1-7]\)( "[^"]+"){0,2}$'
+
+        if re.search(scdoc_preamble_pattern, first_line):
+            result += 0.5
+
+        return result
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/scripting.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/scripting.py
new file mode 100644
index 000000000..6e494c33b
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/scripting.py
@@ -0,0 +1,1616 @@
+"""
+    pygments.lexers.scripting
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for scripting and embedded languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import RegexLexer, include, bygroups, default, combined, \
+    words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Error, Whitespace, Other
+from pygments.util import get_bool_opt, get_list_opt
+
+__all__ = ['LuaLexer', 'LuauLexer', 'MoonScriptLexer', 'ChaiscriptLexer', 'LSLLexer',
+           'AppleScriptLexer', 'RexxLexer', 'MOOCodeLexer', 'HybrisLexer',
+           'EasytrieveLexer', 'JclLexer', 'MiniScriptLexer']
+
+
+def all_lua_builtins():
+    from pygments.lexers._lua_builtins import MODULES
+    return [w for values in MODULES.values() for w in values]
+
+class LuaLexer(RegexLexer):
+    """
+    For Lua source code.
+
+    Additional options accepted:
+
+    `func_name_highlighting`
+        If given and ``True``, highlight builtin function names
+        (default: ``True``).
+    `disabled_modules`
+        If given, must be a list of module names whose function names
+        should not be highlighted. By default all modules are highlighted.
+
+        To get a list of allowed modules have a look into the
+        `_lua_builtins` module:
+
+        .. sourcecode:: pycon
+
+            >>> from pygments.lexers._lua_builtins import MODULES
+            >>> MODULES.keys()
+            ['string', 'coroutine', 'modules', 'io', 'basic', ...]
+    """
+
+    name = 'Lua'
+    url = 'https://www.lua.org/'
+    aliases = ['lua']
+    filenames = ['*.lua', '*.wlua']
+    mimetypes = ['text/x-lua', 'application/x-lua']
+    version_added = ''
+
+    _comment_multiline = r'(?:--\[(?P=*)\[[\w\W]*?\](?P=level)\])'
+    _comment_single = r'(?:--.*$)'
+    _space = r'(?:\s+(?!\s))'
+    _s = rf'(?:{_comment_multiline}|{_comment_single}|{_space})'
+    _name = r'(?:[^\W\d]\w*)'
+
+    tokens = {
+        'root': [
+            # Lua allows a file to start with a shebang.
+            (r'#!.*', Comment.Preproc),
+            default('base'),
+        ],
+        'ws': [
+            (_comment_multiline, Comment.Multiline),
+            (_comment_single, Comment.Single),
+            (_space, Whitespace),
+        ],
+        'base': [
+            include('ws'),
+
+            (r'(?i)0x[\da-f]*(\.[\da-f]*)?(p[+-]?\d+)?', Number.Hex),
+            (r'(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?', Number.Float),
+            (r'(?i)\d+e[+-]?\d+', Number.Float),
+            (r'\d+', Number.Integer),
+
+            # multiline strings
+            (r'(?s)\[(=*)\[.*?\]\1\]', String),
+
+            (r'::', Punctuation, 'label'),
+            (r'\.{3}', Punctuation),
+            (r'[=<>|~&+\-*/%#^]+|\.\.', Operator),
+            (r'[\[\]{}().,:;]+', Punctuation),
+            (r'(and|or|not)\b', Operator.Word),
+
+            (words([
+                'break', 'do', 'else', 'elseif', 'end', 'for', 'if', 'in',
+                'repeat', 'return', 'then', 'until', 'while'
+            ], suffix=r'\b'), Keyword.Reserved),
+            (r'goto\b', Keyword.Reserved, 'goto'),
+            (r'(local)\b', Keyword.Declaration),
+            (r'(true|false|nil)\b', Keyword.Constant),
+
+            (r'(function)\b', Keyword.Reserved, 'funcname'),
+
+            (words(all_lua_builtins(), suffix=r"\b"), Name.Builtin),
+            (fr'[A-Za-z_]\w*(?={_s}*[.:])', Name.Variable, 'varname'),
+            (fr'[A-Za-z_]\w*(?={_s}*\()', Name.Function),
+            (r'[A-Za-z_]\w*', Name.Variable),
+
+            ("'", String.Single, combined('stringescape', 'sqs')),
+            ('"', String.Double, combined('stringescape', 'dqs'))
+        ],
+
+        'varname': [
+            include('ws'),
+            (r'\.\.', Operator, '#pop'),
+            (r'[.:]', Punctuation),
+            (rf'{_name}(?={_s}*[.:])', Name.Property),
+            (rf'{_name}(?={_s}*\()', Name.Function, '#pop'),
+            (_name, Name.Property, '#pop'),
+        ],
+
+        'funcname': [
+            include('ws'),
+            (r'[.:]', Punctuation),
+            (rf'{_name}(?={_s}*[.:])', Name.Class),
+            (_name, Name.Function, '#pop'),
+            # inline function
+            (r'\(', Punctuation, '#pop'),
+        ],
+
+        'goto': [
+            include('ws'),
+            (_name, Name.Label, '#pop'),
+        ],
+
+        'label': [
+            include('ws'),
+            (r'::', Punctuation, '#pop'),
+            (_name, Name.Label),
+        ],
+
+        'stringescape': [
+            (r'\\([abfnrtv\\"\']|[\r\n]{1,2}|z\s*|x[0-9a-fA-F]{2}|\d{1,3}|'
+             r'u\{[0-9a-fA-F]+\})', String.Escape),
+        ],
+
+        'sqs': [
+            (r"'", String.Single, '#pop'),
+            (r"[^\\']+", String.Single),
+        ],
+
+        'dqs': [
+            (r'"', String.Double, '#pop'),
+            (r'[^\\"]+', String.Double),
+        ]
+    }
+
+    def __init__(self, **options):
+        self.func_name_highlighting = get_bool_opt(
+            options, 'func_name_highlighting', True)
+        self.disabled_modules = get_list_opt(options, 'disabled_modules', [])
+
+        self._functions = set()
+        if self.func_name_highlighting:
+            from pygments.lexers._lua_builtins import MODULES
+            for mod, func in MODULES.items():
+                if mod not in self.disabled_modules:
+                    self._functions.update(func)
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name.Builtin and value not in self._functions:
+                if '.' in value:
+                    a, b = value.split('.')
+                    yield index, Name, a
+                    yield index + len(a), Punctuation, '.'
+                    yield index + len(a) + 1, Name, b
+                else:
+                    yield index, Name, value
+                continue
+            yield index, token, value
+
+def _luau_make_expression(should_pop, _s):
+    temp_list = [
+        (r'0[xX][\da-fA-F_]*', Number.Hex, '#pop'),
+        (r'0[bB][\d_]*', Number.Bin, '#pop'),
+        (r'\.?\d[\d_]*(?:\.[\d_]*)?(?:[eE][+-]?[\d_]+)?', Number.Float, '#pop'),
+
+        (words((
+            'true', 'false', 'nil'
+        ), suffix=r'\b'), Keyword.Constant, '#pop'),
+
+        (r'\[(=*)\[[.\n]*?\]\1\]', String, '#pop'),
+
+        (r'(\.)([a-zA-Z_]\w*)(?=%s*[({"\'])', bygroups(Punctuation, Name.Function), '#pop'),
+        (r'(\.)([a-zA-Z_]\w*)', bygroups(Punctuation, Name.Variable), '#pop'),
+
+        (rf'[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*(?={_s}*[({{"\'])', Name.Other, '#pop'),
+        (r'[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*', Name, '#pop'),
+    ]
+    if should_pop:
+        return temp_list
+    return [entry[:2] for entry in temp_list]
+
+def _luau_make_expression_special(should_pop):
+    temp_list = [
+        (r'\{', Punctuation, ('#pop', 'closing_brace_base', 'expression')),
+        (r'\(', Punctuation, ('#pop', 'closing_parenthesis_base', 'expression')),
+
+        (r'::?', Punctuation, ('#pop', 'type_end', 'type_start')),
+
+        (r"'", String.Single, ('#pop', 'string_single')),
+        (r'"', String.Double, ('#pop', 'string_double')),
+        (r'`', String.Backtick, ('#pop', 'string_interpolated')),
+    ]
+    if should_pop:
+        return temp_list
+    return [(entry[0], entry[1], entry[2][1:]) for entry in temp_list]
+
+class LuauLexer(RegexLexer):
+    """
+    For Luau source code.
+
+    Additional options accepted:
+
+    `include_luau_builtins`
+        If given and ``True``, automatically highlight Luau builtins
+        (default: ``True``).
+    `include_roblox_builtins`
+        If given and ``True``, automatically highlight Roblox-specific builtins
+        (default: ``False``).
+    `additional_builtins`
+        If given, must be a list of additional builtins to highlight.
+    `disabled_builtins`
+        If given, must be a list of builtins that will not be highlighted.
+    """
+
+    name = 'Luau'
+    url = 'https://luau-lang.org/'
+    aliases = ['luau']
+    filenames = ['*.luau']
+    version_added = '2.18'
+
+    _comment_multiline = r'(?:--\[(?P=*)\[[\w\W]*?\](?P=level)\])'
+    _comment_single = r'(?:--.*$)'
+    _s = r'(?:{}|{}|{})'.format(_comment_multiline, _comment_single, r'\s+')
+
+    tokens = {
+        'root': [
+            (r'#!.*', Comment.Hashbang, 'base'),
+            default('base'),
+        ],
+
+        'ws': [
+            (_comment_multiline, Comment.Multiline),
+            (_comment_single, Comment.Single),
+            (r'\s+', Whitespace),
+        ],
+
+        'base': [
+            include('ws'),
+
+            *_luau_make_expression_special(False),
+            (r'\.\.\.', Punctuation),
+
+            (rf'type\b(?={_s}+[a-zA-Z_])', Keyword.Reserved, 'type_declaration'),
+            (rf'export\b(?={_s}+[a-zA-Z_])', Keyword.Reserved),
+
+            (r'(?:\.\.|//|[+\-*\/%^<>=])=?', Operator, 'expression'),
+            (r'~=', Operator, 'expression'),
+
+            (words((
+                'and', 'or', 'not'
+            ), suffix=r'\b'), Operator.Word, 'expression'),
+
+            (words((
+                'elseif', 'for', 'if', 'in', 'repeat', 'return', 'until',
+                'while'), suffix=r'\b'), Keyword.Reserved, 'expression'),
+            (r'local\b', Keyword.Declaration, 'expression'),
+
+            (r'function\b', Keyword.Reserved, ('expression', 'func_name')),
+
+            (r'[\])};]+', Punctuation),
+
+            include('expression_static'),
+            *_luau_make_expression(False, _s),
+
+            (r'[\[.,]', Punctuation, 'expression'),
+        ],
+        'expression_static': [
+            (words((
+                'break', 'continue', 'do', 'else', 'elseif', 'end', 'for',
+                'if', 'in', 'repeat', 'return', 'then', 'until', 'while'),
+                suffix=r'\b'), Keyword.Reserved),
+        ],
+        'expression': [
+            include('ws'),
+
+            (r'if\b', Keyword.Reserved, ('ternary', 'expression')),
+
+            (r'local\b', Keyword.Declaration),
+            *_luau_make_expression_special(True),
+            (r'\.\.\.', Punctuation, '#pop'),
+
+            (r'function\b', Keyword.Reserved, 'func_name'),
+
+            include('expression_static'),
+            *_luau_make_expression(True, _s),
+
+            default('#pop'),
+        ],
+        'ternary': [
+            include('ws'),
+
+            (r'else\b', Keyword.Reserved, '#pop'),
+            (words((
+                'then', 'elseif',
+            ), suffix=r'\b'), Operator.Reserved, 'expression'),
+
+            default('#pop'),
+        ],
+
+        'closing_brace_pop': [
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'closing_parenthesis_pop': [
+            (r'\)', Punctuation, '#pop'),
+        ],
+        'closing_gt_pop': [
+            (r'>', Punctuation, '#pop'),
+        ],
+
+        'closing_parenthesis_base': [
+            include('closing_parenthesis_pop'),
+            include('base'),
+        ],
+        'closing_parenthesis_type': [
+            include('closing_parenthesis_pop'),
+            include('type'),
+        ],
+        'closing_brace_base': [
+            include('closing_brace_pop'),
+            include('base'),
+        ],
+        'closing_brace_type': [
+            include('closing_brace_pop'),
+            include('type'),
+        ],
+        'closing_gt_type': [
+            include('closing_gt_pop'),
+            include('type'),
+        ],
+
+        'string_escape': [
+            (r'\\z\s*', String.Escape),
+            (r'\\(?:[abfnrtvz\\"\'`\{\n])|[\r\n]{1,2}|x[\da-fA-F]{2}|\d{1,3}|'
+             r'u\{\}[\da-fA-F]*\}', String.Escape),
+        ],
+        'string_single': [
+            include('string_escape'),
+
+            (r"'", String.Single, "#pop"),
+            (r"[^\\']+", String.Single),
+        ],
+        'string_double': [
+            include('string_escape'),
+
+            (r'"', String.Double, "#pop"),
+            (r'[^\\"]+', String.Double),
+        ],
+        'string_interpolated': [
+            include('string_escape'),
+
+            (r'\{', Punctuation, ('closing_brace_base', 'expression')),
+
+            (r'`', String.Backtick, "#pop"),
+            (r'[^\\`\{]+', String.Backtick),
+        ],
+
+        'func_name': [
+            include('ws'),
+
+            (r'[.:]', Punctuation),
+            (rf'[a-zA-Z_]\w*(?={_s}*[.:])', Name.Class),
+            (r'[a-zA-Z_]\w*', Name.Function),
+
+            (r'<', Punctuation, 'closing_gt_type'),
+
+            (r'\(', Punctuation, '#pop'),
+        ],
+
+        'type': [
+            include('ws'),
+
+            (r'\(', Punctuation, 'closing_parenthesis_type'),
+            (r'\{', Punctuation, 'closing_brace_type'),
+            (r'<', Punctuation, 'closing_gt_type'),
+
+            (r"'", String.Single, 'string_single'),
+            (r'"', String.Double, 'string_double'),
+
+            (r'[|&\.,\[\]:=]+', Punctuation),
+            (r'->', Punctuation),
+
+            (r'typeof\(', Name.Builtin, ('closing_parenthesis_base',
+                                         'expression')),
+            (r'[a-zA-Z_]\w*', Name.Class),
+        ],
+        'type_start': [
+            include('ws'),
+
+            (r'\(', Punctuation, ('#pop', 'closing_parenthesis_type')),
+            (r'\{', Punctuation, ('#pop', 'closing_brace_type')),
+            (r'<', Punctuation, ('#pop', 'closing_gt_type')),
+
+            (r"'", String.Single, ('#pop', 'string_single')),
+            (r'"', String.Double, ('#pop', 'string_double')),
+
+            (r'typeof\(', Name.Builtin, ('#pop', 'closing_parenthesis_base',
+                                         'expression')),
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop'),
+        ],
+        'type_end': [
+            include('ws'),
+
+            (r'[|&\.]', Punctuation, 'type_start'),
+            (r'->', Punctuation, 'type_start'),
+
+            (r'<', Punctuation, 'closing_gt_type'),
+
+            default('#pop'),
+        ],
+        'type_declaration': [
+            include('ws'),
+
+            (r'[a-zA-Z_]\w*', Name.Class),
+            (r'<', Punctuation, 'closing_gt_type'),
+
+            (r'=', Punctuation, ('#pop', 'type_end', 'type_start')),
+        ],
+    }
+
+    def __init__(self, **options):
+        self.include_luau_builtins = get_bool_opt(
+            options, 'include_luau_builtins', True)
+        self.include_roblox_builtins = get_bool_opt(
+            options, 'include_roblox_builtins', False)
+        self.additional_builtins = get_list_opt(options, 'additional_builtins', [])
+        self.disabled_builtins = get_list_opt(options, 'disabled_builtins', [])
+
+        self._builtins = set(self.additional_builtins)
+        if self.include_luau_builtins:
+            from pygments.lexers._luau_builtins import LUAU_BUILTINS
+            self._builtins.update(LUAU_BUILTINS)
+        if self.include_roblox_builtins:
+            from pygments.lexers._luau_builtins import ROBLOX_BUILTINS
+            self._builtins.update(ROBLOX_BUILTINS)
+        if self.additional_builtins:
+            self._builtins.update(self.additional_builtins)
+        self._builtins.difference_update(self.disabled_builtins)
+
+        RegexLexer.__init__(self, **options)
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in \
+                RegexLexer.get_tokens_unprocessed(self, text):
+            if token is Name or token is Name.Other:
+                split_value = value.split('.')
+                complete_value = []
+                new_index = index
+                for position in range(len(split_value), 0, -1):
+                    potential_string = '.'.join(split_value[:position])
+                    if potential_string in self._builtins:
+                        yield index, Name.Builtin, potential_string
+                        new_index += len(potential_string)
+
+                        if complete_value:
+                            yield new_index, Punctuation, '.'
+                            new_index += 1
+                        break
+                    complete_value.insert(0, split_value[position - 1])
+
+                for position, substring in enumerate(complete_value):
+                    if position + 1 == len(complete_value):
+                        if token is Name:
+                            yield new_index, Name.Variable, substring
+                            continue
+                        yield new_index, Name.Function, substring
+                        continue
+                    yield new_index, Name.Variable, substring
+                    new_index += len(substring)
+                    yield new_index, Punctuation, '.'
+                    new_index += 1
+
+                continue
+            yield index, token, value
+
+class MoonScriptLexer(LuaLexer):
+    """
+    For MoonScript source code.
+    """
+
+    name = 'MoonScript'
+    url = 'http://moonscript.org'
+    aliases = ['moonscript', 'moon']
+    filenames = ['*.moon']
+    mimetypes = ['text/x-moonscript', 'application/x-moonscript']
+    version_added = '1.5'
+
+    tokens = {
+        'root': [
+            (r'#!(.*?)$', Comment.Preproc),
+            default('base'),
+        ],
+        'base': [
+            ('--.*$', Comment.Single),
+            (r'(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?', Number.Float),
+            (r'(?i)\d+e[+-]?\d+', Number.Float),
+            (r'(?i)0x[0-9a-f]*', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'\n', Whitespace),
+            (r'[^\S\n]+', Text),
+            (r'(?s)\[(=*)\[.*?\]\1\]', String),
+            (r'(->|=>)', Name.Function),
+            (r':[a-zA-Z_]\w*', Name.Variable),
+            (r'(==|!=|~=|<=|>=|\.\.\.|\.\.|[=+\-*/%^<>#!.\\:])', Operator),
+            (r'[;,]', Punctuation),
+            (r'[\[\]{}()]', Keyword.Type),
+            (r'[a-zA-Z_]\w*:', Name.Variable),
+            (words((
+                'class', 'extends', 'if', 'then', 'super', 'do', 'with',
+                'import', 'export', 'while', 'elseif', 'return', 'for', 'in',
+                'from', 'when', 'using', 'else', 'and', 'or', 'not', 'switch',
+                'break'), suffix=r'\b'),
+             Keyword),
+            (r'(true|false|nil)\b', Keyword.Constant),
+            (r'(and|or|not)\b', Operator.Word),
+            (r'(self)\b', Name.Builtin.Pseudo),
+            (r'@@?([a-zA-Z_]\w*)?', Name.Variable.Class),
+            (r'[A-Z]\w*', Name.Class),  # proper name
+            (words(all_lua_builtins(), suffix=r"\b"), Name.Builtin),
+            (r'[A-Za-z_]\w*', Name),
+            ("'", String.Single, combined('stringescape', 'sqs')),
+            ('"', String.Double, combined('stringescape', 'dqs'))
+        ],
+        'stringescape': [
+            (r'''\\([abfnrtv\\"']|\d{1,3})''', String.Escape)
+        ],
+        'sqs': [
+            ("'", String.Single, '#pop'),
+            ("[^']+", String)
+        ],
+        'dqs': [
+            ('"', String.Double, '#pop'),
+            ('[^"]+', String)
+        ]
+    }
+
+    def get_tokens_unprocessed(self, text):
+        # set . as Operator instead of Punctuation
+        for index, token, value in LuaLexer.get_tokens_unprocessed(self, text):
+            if token == Punctuation and value == ".":
+                token = Operator
+            yield index, token, value
+
+
+class ChaiscriptLexer(RegexLexer):
+    """
+    For ChaiScript source code.
+    """
+
+    name = 'ChaiScript'
+    url = 'http://chaiscript.com/'
+    aliases = ['chaiscript', 'chai']
+    filenames = ['*.chai']
+    mimetypes = ['text/x-chaiscript', 'application/x-chaiscript']
+    version_added = '2.0'
+
+    flags = re.DOTALL | re.MULTILINE
+
+    tokens = {
+        'commentsandwhitespace': [
+            (r'\s+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'^\#.*?\n', Comment.Single)
+        ],
+        'slashstartsregex': [
+            include('commentsandwhitespace'),
+            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
+             r'([gim]+\b|\B)', String.Regex, '#pop'),
+            (r'(?=/)', Text, ('#pop', 'badregex')),
+            default('#pop')
+        ],
+        'badregex': [
+            (r'\n', Text, '#pop')
+        ],
+        'root': [
+            include('commentsandwhitespace'),
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|\.\.'
+             r'(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?', Operator, 'slashstartsregex'),
+            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
+            (r'[})\].]', Punctuation),
+            (r'[=+\-*/]', Operator),
+            (r'(for|in|while|do|break|return|continue|if|else|'
+             r'throw|try|catch'
+             r')\b', Keyword, 'slashstartsregex'),
+            (r'(var)\b', Keyword.Declaration, 'slashstartsregex'),
+            (r'(attr|def|fun)\b', Keyword.Reserved),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'(eval|throw)\b', Name.Builtin),
+            (r'`\S+`', Name.Builtin),
+            (r'[$a-zA-Z_]\w*', Name.Other),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'[0-9]+', Number.Integer),
+            (r'"', String.Double, 'dqstring'),
+            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),
+        ],
+        'dqstring': [
+            (r'\$\{[^"}]+?\}', String.Interpol),
+            (r'\$', String.Double),
+            (r'\\\\', String.Double),
+            (r'\\"', String.Double),
+            (r'[^\\"$]+', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+    }
+
+
+class LSLLexer(RegexLexer):
+    """
+    For Second Life's Linden Scripting Language source code.
+    """
+
+    name = 'LSL'
+    aliases = ['lsl']
+    filenames = ['*.lsl']
+    mimetypes = ['text/x-lsl']
+    url = 'https://wiki.secondlife.com/wiki/Linden_Scripting_Language'
+    version_added = '2.0'
+
+    flags = re.MULTILINE
+
+    lsl_keywords = r'\b(?:do|else|for|if|jump|return|while)\b'
+    lsl_types = r'\b(?:float|integer|key|list|quaternion|rotation|string|vector)\b'
+    lsl_states = r'\b(?:(?:state)\s+\w+|default)\b'
+    lsl_events = r'\b(?:state_(?:entry|exit)|touch(?:_(?:start|end))?|(?:land_)?collision(?:_(?:start|end))?|timer|listen|(?:no_)?sensor|control|(?:not_)?at_(?:rot_)?target|money|email|run_time_permissions|changed|attach|dataserver|moving_(?:start|end)|link_message|(?:on|object)_rez|remote_data|http_re(?:sponse|quest)|path_update|transaction_result)\b'
+    lsl_functions_builtin = r'\b(?:ll(?:ReturnObjectsBy(?:ID|Owner)|Json(?:2List|[GS]etValue|ValueType)|Sin|Cos|Tan|Atan2|Sqrt|Pow|Abs|Fabs|Frand|Floor|Ceil|Round|Vec(?:Mag|Norm|Dist)|Rot(?:Between|2(?:Euler|Fwd|Left|Up))|(?:Euler|Axes)2Rot|Whisper|(?:Region|Owner)?Say|Shout|Listen(?:Control|Remove)?|Sensor(?:Repeat|Remove)?|Detected(?:Name|Key|Owner|Type|Pos|Vel|Grab|Rot|Group|LinkNumber)|Die|Ground|Wind|(?:[GS]et)(?:AnimationOverride|MemoryLimit|PrimMediaParams|ParcelMusicURL|Object(?:Desc|Name)|PhysicsMaterial|Status|Scale|Color|Alpha|Texture|Pos|Rot|Force|Torque)|ResetAnimationOverride|(?:Scale|Offset|Rotate)Texture|(?:Rot)?Target(?:Remove)?|(?:Stop)?MoveToTarget|Apply(?:Rotational)?Impulse|Set(?:KeyframedMotion|ContentType|RegionPos|(?:Angular)?Velocity|Buoyancy|HoverHeight|ForceAndTorque|TimerEvent|ScriptState|Damage|TextureAnim|Sound(?:Queueing|Radius)|Vehicle(?:Type|(?:Float|Vector|Rotation)Param)|(?:Touch|Sit)?Text|Camera(?:Eye|At)Offset|PrimitiveParams|ClickAction|Link(?:Alpha|Color|PrimitiveParams(?:Fast)?|Texture(?:Anim)?|Camera|Media)|RemoteScriptAccessPin|PayPrice|LocalRot)|ScaleByFactor|Get(?:(?:Max|Min)ScaleFactor|ClosestNavPoint|StaticPath|SimStats|Env|PrimitiveParams|Link(?:PrimitiveParams|Number(?:OfSides)?|Key|Name|Media)|HTTPHeader|FreeURLs|Object(?:Details|PermMask|PrimCount)|Parcel(?:MaxPrims|Details|Prim(?:Count|Owners))|Attached|(?:SPMax|Free|Used)Memory|Region(?:Name|TimeDilation|FPS|Corner|AgentCount)|Root(?:Position|Rotation)|UnixTime|(?:Parcel|Region)Flags|(?:Wall|GMT)clock|SimulatorHostname|BoundingBox|GeometricCenter|Creator|NumberOf(?:Prims|NotecardLines|Sides)|Animation(?:List)?|(?:Camera|Local)(?:Pos|Rot)|Vel|Accel|Omega|Time(?:stamp|OfDay)|(?:Object|CenterOf)?Mass|MassMKS|Energy|Owner|(?:Owner)?Key|SunDirection|Texture(?:Offset|Scale|Rot)|Inventory(?:Number|Name|Key|Type|Creator|PermMask)|Permissions(?:Key)?|StartParameter|List(?:Length|EntryType)|Date|Agent(?:Size|Info|Language|List)|LandOwnerAt|NotecardLine|Script(?:Name|State))|(?:Get|Reset|GetAndReset)Time|PlaySound(?:Slave)?|LoopSound(?:Master|Slave)?|(?:Trigger|Stop|Preload)Sound|(?:(?:Get|Delete)Sub|Insert)String|To(?:Upper|Lower)|Give(?:InventoryList|Money)|RezObject|(?:Stop)?LookAt|Sleep|CollisionFilter|(?:Take|Release)Controls|DetachFromAvatar|AttachToAvatar(?:Temp)?|InstantMessage|(?:GetNext)?Email|StopHover|MinEventDelay|RotLookAt|String(?:Length|Trim)|(?:Start|Stop)Animation|TargetOmega|RequestPermissions|(?:Create|Break)Link|BreakAllLinks|(?:Give|Remove)Inventory|Water|PassTouches|Request(?:Agent|Inventory)Data|TeleportAgent(?:Home|GlobalCoords)?|ModifyLand|CollisionSound|ResetScript|MessageLinked|PushObject|PassCollisions|AxisAngle2Rot|Rot2(?:Axis|Angle)|A(?:cos|sin)|AngleBetween|AllowInventoryDrop|SubStringIndex|List2(?:CSV|Integer|Json|Float|String|Key|Vector|Rot|List(?:Strided)?)|DeleteSubList|List(?:Statistics|Sort|Randomize|(?:Insert|Find|Replace)List)|EdgeOfWorld|AdjustSoundVolume|Key2Name|TriggerSoundLimited|EjectFromLand|(?:CSV|ParseString)2List|OverMyLand|SameGroup|UnSit|Ground(?:Slope|Normal|Contour)|GroundRepel|(?:Set|Remove)VehicleFlags|(?:AvatarOn)?(?:Link)?SitTarget|Script(?:Danger|Profiler)|Dialog|VolumeDetect|ResetOtherScript|RemoteLoadScriptPin|(?:Open|Close)RemoteDataChannel|SendRemoteData|RemoteDataReply|(?:Integer|String)ToBase64|XorBase64|Log(?:10)?|Base64To(?:String|Integer)|ParseStringKeepNulls|RezAtRoot|RequestSimulatorData|ForceMouselook|(?:Load|Release|(?:E|Une)scape)URL|ParcelMedia(?:CommandList|Query)|ModPow|MapDestination|(?:RemoveFrom|AddTo|Reset)Land(?:Pass|Ban)List|(?:Set|Clear)CameraParams|HTTP(?:Request|Response)|TextBox|DetectedTouch(?:UV|Face|Pos|(?:N|Bin)ormal|ST)|(?:MD5|SHA1|DumpList2)String|Request(?:Secure)?URL|Clear(?:Prim|Link)Media|(?:Link)?ParticleSystem|(?:Get|Request)(?:Username|DisplayName)|RegionSayTo|CastRay|GenerateKey|TransferLindenDollars|ManageEstateAccess|(?:Create|Delete)Character|ExecCharacterCmd|Evade|FleeFrom|NavigateTo|PatrolPoints|Pursue|UpdateCharacter|WanderWithin))\b'
+    lsl_constants_float = r'\b(?:DEG_TO_RAD|PI(?:_BY_TWO)?|RAD_TO_DEG|SQRT2|TWO_PI)\b'
+    lsl_constants_integer = r'\b(?:JSON_APPEND|STATUS_(?:PHYSICS|ROTATE_[XYZ]|PHANTOM|SANDBOX|BLOCK_GRAB(?:_OBJECT)?|(?:DIE|RETURN)_AT_EDGE|CAST_SHADOWS|OK|MALFORMED_PARAMS|TYPE_MISMATCH|BOUNDS_ERROR|NOT_(?:FOUND|SUPPORTED)|INTERNAL_ERROR|WHITELIST_FAILED)|AGENT(?:_(?:BY_(?:LEGACY_|USER)NAME|FLYING|ATTACHMENTS|SCRIPTED|MOUSELOOK|SITTING|ON_OBJECT|AWAY|WALKING|IN_AIR|TYPING|CROUCHING|BUSY|ALWAYS_RUN|AUTOPILOT|LIST_(?:PARCEL(?:_OWNER)?|REGION)))?|CAMERA_(?:PITCH|DISTANCE|BEHINDNESS_(?:ANGLE|LAG)|(?:FOCUS|POSITION)(?:_(?:THRESHOLD|LOCKED|LAG))?|FOCUS_OFFSET|ACTIVE)|ANIM_ON|LOOP|REVERSE|PING_PONG|SMOOTH|ROTATE|SCALE|ALL_SIDES|LINK_(?:ROOT|SET|ALL_(?:OTHERS|CHILDREN)|THIS)|ACTIVE|PASSIVE|SCRIPTED|CONTROL_(?:FWD|BACK|(?:ROT_)?(?:LEFT|RIGHT)|UP|DOWN|(?:ML_)?LBUTTON)|PERMISSION_(?:RETURN_OBJECTS|DEBIT|OVERRIDE_ANIMATIONS|SILENT_ESTATE_MANAGEMENT|TAKE_CONTROLS|TRIGGER_ANIMATION|ATTACH|CHANGE_LINKS|(?:CONTROL|TRACK)_CAMERA|TELEPORT)|INVENTORY_(?:TEXTURE|SOUND|OBJECT|SCRIPT|LANDMARK|CLOTHING|NOTECARD|BODYPART|ANIMATION|GESTURE|ALL|NONE)|CHANGED_(?:INVENTORY|COLOR|SHAPE|SCALE|TEXTURE|LINK|ALLOWED_DROP|OWNER|REGION(?:_START)?|TELEPORT|MEDIA)|OBJECT_(?:(?:PHYSICS|SERVER|STREAMING)_COST|UNKNOWN_DETAIL|CHARACTER_TIME|PHANTOM|PHYSICS|TEMP_ON_REZ|NAME|DESC|POS|PRIM_EQUIVALENCE|RETURN_(?:PARCEL(?:_OWNER)?|REGION)|ROO?T|VELOCITY|OWNER|GROUP|CREATOR|ATTACHED_POINT|RENDER_WEIGHT|PATHFINDING_TYPE|(?:RUNNING|TOTAL)_SCRIPT_COUNT|SCRIPT_(?:MEMORY|TIME))|TYPE_(?:INTEGER|FLOAT|STRING|KEY|VECTOR|ROTATION|INVALID)|(?:DEBUG|PUBLIC)_CHANNEL|ATTACH_(?:AVATAR_CENTER|CHEST|HEAD|BACK|PELVIS|MOUTH|CHIN|NECK|NOSE|BELLY|[LR](?:SHOULDER|HAND|FOOT|EAR|EYE|[UL](?:ARM|LEG)|HIP)|(?:LEFT|RIGHT)_PEC|HUD_(?:CENTER_[12]|TOP_(?:RIGHT|CENTER|LEFT)|BOTTOM(?:_(?:RIGHT|LEFT))?))|LAND_(?:LEVEL|RAISE|LOWER|SMOOTH|NOISE|REVERT)|DATA_(?:ONLINE|NAME|BORN|SIM_(?:POS|STATUS|RATING)|PAYINFO)|PAYMENT_INFO_(?:ON_FILE|USED)|REMOTE_DATA_(?:CHANNEL|REQUEST|REPLY)|PSYS_(?:PART_(?:BF_(?:ZERO|ONE(?:_MINUS_(?:DEST_COLOR|SOURCE_(ALPHA|COLOR)))?|DEST_COLOR|SOURCE_(ALPHA|COLOR))|BLEND_FUNC_(DEST|SOURCE)|FLAGS|(?:START|END)_(?:COLOR|ALPHA|SCALE|GLOW)|MAX_AGE|(?:RIBBON|WIND|INTERP_(?:COLOR|SCALE)|BOUNCE|FOLLOW_(?:SRC|VELOCITY)|TARGET_(?:POS|LINEAR)|EMISSIVE)_MASK)|SRC_(?:MAX_AGE|PATTERN|ANGLE_(?:BEGIN|END)|BURST_(?:RATE|PART_COUNT|RADIUS|SPEED_(?:MIN|MAX))|ACCEL|TEXTURE|TARGET_KEY|OMEGA|PATTERN_(?:DROP|EXPLODE|ANGLE(?:_CONE(?:_EMPTY)?)?)))|VEHICLE_(?:REFERENCE_FRAME|TYPE_(?:NONE|SLED|CAR|BOAT|AIRPLANE|BALLOON)|(?:LINEAR|ANGULAR)_(?:FRICTION_TIMESCALE|MOTOR_DIRECTION)|LINEAR_MOTOR_OFFSET|HOVER_(?:HEIGHT|EFFICIENCY|TIMESCALE)|BUOYANCY|(?:LINEAR|ANGULAR)_(?:DEFLECTION_(?:EFFICIENCY|TIMESCALE)|MOTOR_(?:DECAY_)?TIMESCALE)|VERTICAL_ATTRACTION_(?:EFFICIENCY|TIMESCALE)|BANKING_(?:EFFICIENCY|MIX|TIMESCALE)|FLAG_(?:NO_DEFLECTION_UP|LIMIT_(?:ROLL_ONLY|MOTOR_UP)|HOVER_(?:(?:WATER|TERRAIN|UP)_ONLY|GLOBAL_HEIGHT)|MOUSELOOK_(?:STEER|BANK)|CAMERA_DECOUPLED))|PRIM_(?:TYPE(?:_(?:BOX|CYLINDER|PRISM|SPHERE|TORUS|TUBE|RING|SCULPT))?|HOLE_(?:DEFAULT|CIRCLE|SQUARE|TRIANGLE)|MATERIAL(?:_(?:STONE|METAL|GLASS|WOOD|FLESH|PLASTIC|RUBBER))?|SHINY_(?:NONE|LOW|MEDIUM|HIGH)|BUMP_(?:NONE|BRIGHT|DARK|WOOD|BARK|BRICKS|CHECKER|CONCRETE|TILE|STONE|DISKS|GRAVEL|BLOBS|SIDING|LARGETILE|STUCCO|SUCTION|WEAVE)|TEXGEN_(?:DEFAULT|PLANAR)|SCULPT_(?:TYPE_(?:SPHERE|TORUS|PLANE|CYLINDER|MASK)|FLAG_(?:MIRROR|INVERT))|PHYSICS(?:_(?:SHAPE_(?:CONVEX|NONE|PRIM|TYPE)))?|(?:POS|ROT)_LOCAL|SLICE|TEXT|FLEXIBLE|POINT_LIGHT|TEMP_ON_REZ|PHANTOM|POSITION|SIZE|ROTATION|TEXTURE|NAME|OMEGA|DESC|LINK_TARGET|COLOR|BUMP_SHINY|FULLBRIGHT|TEXGEN|GLOW|MEDIA_(?:ALT_IMAGE_ENABLE|CONTROLS|(?:CURRENT|HOME)_URL|AUTO_(?:LOOP|PLAY|SCALE|ZOOM)|FIRST_CLICK_INTERACT|(?:WIDTH|HEIGHT)_PIXELS|WHITELIST(?:_ENABLE)?|PERMS_(?:INTERACT|CONTROL)|PARAM_MAX|CONTROLS_(?:STANDARD|MINI)|PERM_(?:NONE|OWNER|GROUP|ANYONE)|MAX_(?:URL_LENGTH|WHITELIST_(?:SIZE|COUNT)|(?:WIDTH|HEIGHT)_PIXELS)))|MASK_(?:BASE|OWNER|GROUP|EVERYONE|NEXT)|PERM_(?:TRANSFER|MODIFY|COPY|MOVE|ALL)|PARCEL_(?:MEDIA_COMMAND_(?:STOP|PAUSE|PLAY|LOOP|TEXTURE|URL|TIME|AGENT|UNLOAD|AUTO_ALIGN|TYPE|SIZE|DESC|LOOP_SET)|FLAG_(?:ALLOW_(?:FLY|(?:GROUP_)?SCRIPTS|LANDMARK|TERRAFORM|DAMAGE|CREATE_(?:GROUP_)?OBJECTS)|USE_(?:ACCESS_(?:GROUP|LIST)|BAN_LIST|LAND_PASS_LIST)|LOCAL_SOUND_ONLY|RESTRICT_PUSHOBJECT|ALLOW_(?:GROUP|ALL)_OBJECT_ENTRY)|COUNT_(?:TOTAL|OWNER|GROUP|OTHER|SELECTED|TEMP)|DETAILS_(?:NAME|DESC|OWNER|GROUP|AREA|ID|SEE_AVATARS))|LIST_STAT_(?:MAX|MIN|MEAN|MEDIAN|STD_DEV|SUM(?:_SQUARES)?|NUM_COUNT|GEOMETRIC_MEAN|RANGE)|PAY_(?:HIDE|DEFAULT)|REGION_FLAG_(?:ALLOW_DAMAGE|FIXED_SUN|BLOCK_TERRAFORM|SANDBOX|DISABLE_(?:COLLISIONS|PHYSICS)|BLOCK_FLY|ALLOW_DIRECT_TELEPORT|RESTRICT_PUSHOBJECT)|HTTP_(?:METHOD|MIMETYPE|BODY_(?:MAXLENGTH|TRUNCATED)|CUSTOM_HEADER|PRAGMA_NO_CACHE|VERBOSE_THROTTLE|VERIFY_CERT)|STRING_(?:TRIM(?:_(?:HEAD|TAIL))?)|CLICK_ACTION_(?:NONE|TOUCH|SIT|BUY|PAY|OPEN(?:_MEDIA)?|PLAY|ZOOM)|TOUCH_INVALID_FACE|PROFILE_(?:NONE|SCRIPT_MEMORY)|RC_(?:DATA_FLAGS|DETECT_PHANTOM|GET_(?:LINK_NUM|NORMAL|ROOT_KEY)|MAX_HITS|REJECT_(?:TYPES|AGENTS|(?:NON)?PHYSICAL|LAND))|RCERR_(?:CAST_TIME_EXCEEDED|SIM_PERF_LOW|UNKNOWN)|ESTATE_ACCESS_(?:ALLOWED_(?:AGENT|GROUP)_(?:ADD|REMOVE)|BANNED_AGENT_(?:ADD|REMOVE))|DENSITY|FRICTION|RESTITUTION|GRAVITY_MULTIPLIER|KFM_(?:COMMAND|CMD_(?:PLAY|STOP|PAUSE|SET_MODE)|MODE|FORWARD|LOOP|PING_PONG|REVERSE|DATA|ROTATION|TRANSLATION)|ERR_(?:GENERIC|PARCEL_PERMISSIONS|MALFORMED_PARAMS|RUNTIME_PERMISSIONS|THROTTLED)|CHARACTER_(?:CMD_(?:(?:SMOOTH_)?STOP|JUMP)|DESIRED_(?:TURN_)?SPEED|RADIUS|STAY_WITHIN_PARCEL|LENGTH|ORIENTATION|ACCOUNT_FOR_SKIPPED_FRAMES|AVOIDANCE_MODE|TYPE(?:_(?:[A-D]|NONE))?|MAX_(?:DECEL|TURN_RADIUS|(?:ACCEL|SPEED)))|PURSUIT_(?:OFFSET|FUZZ_FACTOR|GOAL_TOLERANCE|INTERCEPT)|REQUIRE_LINE_OF_SIGHT|FORCE_DIRECT_PATH|VERTICAL|HORIZONTAL|AVOID_(?:CHARACTERS|DYNAMIC_OBSTACLES|NONE)|PU_(?:EVADE_(?:HIDDEN|SPOTTED)|FAILURE_(?:DYNAMIC_PATHFINDING_DISABLED|INVALID_(?:GOAL|START)|NO_(?:NAVMESH|VALID_DESTINATION)|OTHER|TARGET_GONE|(?:PARCEL_)?UNREACHABLE)|(?:GOAL|SLOWDOWN_DISTANCE)_REACHED)|TRAVERSAL_TYPE(?:_(?:FAST|NONE|SLOW))?|CONTENT_TYPE_(?:ATOM|FORM|HTML|JSON|LLSD|RSS|TEXT|XHTML|XML)|GCNP_(?:RADIUS|STATIC)|(?:PATROL|WANDER)_PAUSE_AT_WAYPOINTS|OPT_(?:AVATAR|CHARACTER|EXCLUSION_VOLUME|LEGACY_LINKSET|MATERIAL_VOLUME|OTHER|STATIC_OBSTACLE|WALKABLE)|SIM_STAT_PCT_CHARS_STEPPED)\b'
+    lsl_constants_integer_boolean = r'\b(?:FALSE|TRUE)\b'
+    lsl_constants_rotation = r'\b(?:ZERO_ROTATION)\b'
+    lsl_constants_string = r'\b(?:EOF|JSON_(?:ARRAY|DELETE|FALSE|INVALID|NULL|NUMBER|OBJECT|STRING|TRUE)|NULL_KEY|TEXTURE_(?:BLANK|DEFAULT|MEDIA|PLYWOOD|TRANSPARENT)|URL_REQUEST_(?:GRANTED|DENIED))\b'
+    lsl_constants_vector = r'\b(?:TOUCH_INVALID_(?:TEXCOORD|VECTOR)|ZERO_VECTOR)\b'
+    lsl_invalid_broken = r'\b(?:LAND_(?:LARGE|MEDIUM|SMALL)_BRUSH)\b'
+    lsl_invalid_deprecated = r'\b(?:ATTACH_[LR]PEC|DATA_RATING|OBJECT_ATTACHMENT_(?:GEOMETRY_BYTES|SURFACE_AREA)|PRIM_(?:CAST_SHADOWS|MATERIAL_LIGHT|TYPE_LEGACY)|PSYS_SRC_(?:INNER|OUTER)ANGLE|VEHICLE_FLAG_NO_FLY_UP|ll(?:Cloud|Make(?:Explosion|Fountain|Smoke|Fire)|RemoteDataSetRegion|Sound(?:Preload)?|XorBase64Strings(?:Correct)?))\b'
+    lsl_invalid_illegal = r'\b(?:event)\b'
+    lsl_invalid_unimplemented = r'\b(?:CHARACTER_(?:MAX_ANGULAR_(?:ACCEL|SPEED)|TURN_SPEED_MULTIPLIER)|PERMISSION_(?:CHANGE_(?:JOINTS|PERMISSIONS)|RELEASE_OWNERSHIP|REMAP_CONTROLS)|PRIM_PHYSICS_MATERIAL|PSYS_SRC_OBJ_REL_MASK|ll(?:CollisionSprite|(?:Stop)?PointAt|(?:(?:Refresh|Set)Prim)URL|(?:Take|Release)Camera|RemoteLoadScript))\b'
+    lsl_reserved_godmode = r'\b(?:ll(?:GodLikeRezObject|Set(?:Inventory|Object)PermMask))\b'
+    lsl_reserved_log = r'\b(?:print)\b'
+    lsl_operators = r'\+\+|\-\-|<<|>>|&&?|\|\|?|\^|~|[!%<>=*+\-/]=?'
+
+    tokens = {
+        'root':
+        [
+            (r'//.*?\n',                          Comment.Single),
+            (r'/\*',                              Comment.Multiline, 'comment'),
+            (r'"',                                String.Double, 'string'),
+            (lsl_keywords,                        Keyword),
+            (lsl_types,                           Keyword.Type),
+            (lsl_states,                          Name.Class),
+            (lsl_events,                          Name.Builtin),
+            (lsl_functions_builtin,               Name.Function),
+            (lsl_constants_float,                 Keyword.Constant),
+            (lsl_constants_integer,               Keyword.Constant),
+            (lsl_constants_integer_boolean,       Keyword.Constant),
+            (lsl_constants_rotation,              Keyword.Constant),
+            (lsl_constants_string,                Keyword.Constant),
+            (lsl_constants_vector,                Keyword.Constant),
+            (lsl_invalid_broken,                  Error),
+            (lsl_invalid_deprecated,              Error),
+            (lsl_invalid_illegal,                 Error),
+            (lsl_invalid_unimplemented,           Error),
+            (lsl_reserved_godmode,                Keyword.Reserved),
+            (lsl_reserved_log,                    Keyword.Reserved),
+            (r'\b([a-zA-Z_]\w*)\b',     Name.Variable),
+            (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d*', Number.Float),
+            (r'(\d+\.\d*|\.\d+)',                 Number.Float),
+            (r'0[xX][0-9a-fA-F]+',                Number.Hex),
+            (r'\d+',                              Number.Integer),
+            (lsl_operators,                       Operator),
+            (r':=?',                              Error),
+            (r'[,;{}()\[\]]',                     Punctuation),
+            (r'\n+',                              Whitespace),
+            (r'\s+',                              Whitespace)
+        ],
+        'comment':
+        [
+            (r'[^*/]+',                           Comment.Multiline),
+            (r'/\*',                              Comment.Multiline, '#push'),
+            (r'\*/',                              Comment.Multiline, '#pop'),
+            (r'[*/]',                             Comment.Multiline)
+        ],
+        'string':
+        [
+            (r'\\([nt"\\])',                      String.Escape),
+            (r'"',                                String.Double, '#pop'),
+            (r'\\.',                              Error),
+            (r'[^"\\]+',                          String.Double),
+        ]
+    }
+
+
+class AppleScriptLexer(RegexLexer):
+    """
+    For AppleScript source code,
+    including `AppleScript Studio
+    `_.
+    Contributed by Andreas Amann .
+    """
+
+    name = 'AppleScript'
+    url = 'https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html'
+    aliases = ['applescript']
+    filenames = ['*.applescript']
+    version_added = '1.0'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    Identifiers = r'[a-zA-Z]\w*'
+
+    # XXX: use words() for all of these
+    Literals = ('AppleScript', 'current application', 'false', 'linefeed',
+                'missing value', 'pi', 'quote', 'result', 'return', 'space',
+                'tab', 'text item delimiters', 'true', 'version')
+    Classes = ('alias ', 'application ', 'boolean ', 'class ', 'constant ',
+               'date ', 'file ', 'integer ', 'list ', 'number ', 'POSIX file ',
+               'real ', 'record ', 'reference ', 'RGB color ', 'script ',
+               'text ', 'unit types', '(?:Unicode )?text', 'string')
+    BuiltIn = ('attachment', 'attribute run', 'character', 'day', 'month',
+               'paragraph', 'word', 'year')
+    HandlerParams = ('about', 'above', 'against', 'apart from', 'around',
+                     'aside from', 'at', 'below', 'beneath', 'beside',
+                     'between', 'for', 'given', 'instead of', 'on', 'onto',
+                     'out of', 'over', 'since')
+    Commands = ('ASCII (character|number)', 'activate', 'beep', 'choose URL',
+                'choose application', 'choose color', 'choose file( name)?',
+                'choose folder', 'choose from list',
+                'choose remote application', 'clipboard info',
+                'close( access)?', 'copy', 'count', 'current date', 'delay',
+                'delete', 'display (alert|dialog)', 'do shell script',
+                'duplicate', 'exists', 'get eof', 'get volume settings',
+                'info for', 'launch', 'list (disks|folder)', 'load script',
+                'log', 'make', 'mount volume', 'new', 'offset',
+                'open( (for access|location))?', 'path to', 'print', 'quit',
+                'random number', 'read', 'round', 'run( script)?',
+                'say', 'scripting components',
+                'set (eof|the clipboard to|volume)', 'store script',
+                'summarize', 'system attribute', 'system info',
+                'the clipboard', 'time to GMT', 'write', 'quoted form')
+    References = ('(in )?back of', '(in )?front of', '[0-9]+(st|nd|rd|th)',
+                  'first', 'second', 'third', 'fourth', 'fifth', 'sixth',
+                  'seventh', 'eighth', 'ninth', 'tenth', 'after', 'back',
+                  'before', 'behind', 'every', 'front', 'index', 'last',
+                  'middle', 'some', 'that', 'through', 'thru', 'where', 'whose')
+    Operators = ("and", "or", "is equal", "equals", "(is )?equal to", "is not",
+                 "isn't", "isn't equal( to)?", "is not equal( to)?",
+                 "doesn't equal", "does not equal", "(is )?greater than",
+                 "comes after", "is not less than or equal( to)?",
+                 "isn't less than or equal( to)?", "(is )?less than",
+                 "comes before", "is not greater than or equal( to)?",
+                 "isn't greater than or equal( to)?",
+                 "(is  )?greater than or equal( to)?", "is not less than",
+                 "isn't less than", "does not come before",
+                 "doesn't come before", "(is )?less than or equal( to)?",
+                 "is not greater than", "isn't greater than",
+                 "does not come after", "doesn't come after", "starts? with",
+                 "begins? with", "ends? with", "contains?", "does not contain",
+                 "doesn't contain", "is in", "is contained by", "is not in",
+                 "is not contained by", "isn't contained by", "div", "mod",
+                 "not", "(a  )?(ref( to)?|reference to)", "is", "does")
+    Control = ('considering', 'else', 'error', 'exit', 'from', 'if',
+               'ignoring', 'in', 'repeat', 'tell', 'then', 'times', 'to',
+               'try', 'until', 'using terms from', 'while', 'whith',
+               'with timeout( of)?', 'with transaction', 'by', 'continue',
+               'end', 'its?', 'me', 'my', 'return', 'of', 'as')
+    Declarations = ('global', 'local', 'prop(erty)?', 'set', 'get')
+    Reserved = ('but', 'put', 'returning', 'the')
+    StudioClasses = ('action cell', 'alert reply', 'application', 'box',
+                     'browser( cell)?', 'bundle', 'button( cell)?', 'cell',
+                     'clip view', 'color well', 'color-panel',
+                     'combo box( item)?', 'control',
+                     'data( (cell|column|item|row|source))?', 'default entry',
+                     'dialog reply', 'document', 'drag info', 'drawer',
+                     'event', 'font(-panel)?', 'formatter',
+                     'image( (cell|view))?', 'matrix', 'menu( item)?', 'item',
+                     'movie( view)?', 'open-panel', 'outline view', 'panel',
+                     'pasteboard', 'plugin', 'popup button',
+                     'progress indicator', 'responder', 'save-panel',
+                     'scroll view', 'secure text field( cell)?', 'slider',
+                     'sound', 'split view', 'stepper', 'tab view( item)?',
+                     'table( (column|header cell|header view|view))',
+                     'text( (field( cell)?|view))?', 'toolbar( item)?',
+                     'user-defaults', 'view', 'window')
+    StudioEvents = ('accept outline drop', 'accept table drop', 'action',
+                    'activated', 'alert ended', 'awake from nib', 'became key',
+                    'became main', 'begin editing', 'bounds changed',
+                    'cell value', 'cell value changed', 'change cell value',
+                    'change item value', 'changed', 'child of item',
+                    'choose menu item', 'clicked', 'clicked toolbar item',
+                    'closed', 'column clicked', 'column moved',
+                    'column resized', 'conclude drop', 'data representation',
+                    'deminiaturized', 'dialog ended', 'document nib name',
+                    'double clicked', 'drag( (entered|exited|updated))?',
+                    'drop', 'end editing', 'exposed', 'idle', 'item expandable',
+                    'item value', 'item value changed', 'items changed',
+                    'keyboard down', 'keyboard up', 'launched',
+                    'load data representation', 'miniaturized', 'mouse down',
+                    'mouse dragged', 'mouse entered', 'mouse exited',
+                    'mouse moved', 'mouse up', 'moved',
+                    'number of browser rows', 'number of items',
+                    'number of rows', 'open untitled', 'opened', 'panel ended',
+                    'parameters updated', 'plugin loaded', 'prepare drop',
+                    'prepare outline drag', 'prepare outline drop',
+                    'prepare table drag', 'prepare table drop',
+                    'read from file', 'resigned active', 'resigned key',
+                    'resigned main', 'resized( sub views)?',
+                    'right mouse down', 'right mouse dragged',
+                    'right mouse up', 'rows changed', 'scroll wheel',
+                    'selected tab view item', 'selection changed',
+                    'selection changing', 'should begin editing',
+                    'should close', 'should collapse item',
+                    'should end editing', 'should expand item',
+                    'should open( untitled)?',
+                    'should quit( after last window closed)?',
+                    'should select column', 'should select item',
+                    'should select row', 'should select tab view item',
+                    'should selection change', 'should zoom', 'shown',
+                    'update menu item', 'update parameters',
+                    'update toolbar item', 'was hidden', 'was miniaturized',
+                    'will become active', 'will close', 'will dismiss',
+                    'will display browser cell', 'will display cell',
+                    'will display item cell', 'will display outline cell',
+                    'will finish launching', 'will hide', 'will miniaturize',
+                    'will move', 'will open', 'will pop up', 'will quit',
+                    'will resign active', 'will resize( sub views)?',
+                    'will select tab view item', 'will show', 'will zoom',
+                    'write to file', 'zoomed')
+    StudioCommands = ('animate', 'append', 'call method', 'center',
+                      'close drawer', 'close panel', 'display',
+                      'display alert', 'display dialog', 'display panel', 'go',
+                      'hide', 'highlight', 'increment', 'item for',
+                      'load image', 'load movie', 'load nib', 'load panel',
+                      'load sound', 'localized string', 'lock focus', 'log',
+                      'open drawer', 'path for', 'pause', 'perform action',
+                      'play', 'register', 'resume', 'scroll', 'select( all)?',
+                      'show', 'size to fit', 'start', 'step back',
+                      'step forward', 'stop', 'synchronize', 'unlock focus',
+                      'update')
+    StudioProperties = ('accepts arrow key', 'action method', 'active',
+                        'alignment', 'allowed identifiers',
+                        'allows branch selection', 'allows column reordering',
+                        'allows column resizing', 'allows column selection',
+                        'allows customization',
+                        'allows editing text attributes',
+                        'allows empty selection', 'allows mixed state',
+                        'allows multiple selection', 'allows reordering',
+                        'allows undo', 'alpha( value)?', 'alternate image',
+                        'alternate increment value', 'alternate title',
+                        'animation delay', 'associated file name',
+                        'associated object', 'auto completes', 'auto display',
+                        'auto enables items', 'auto repeat',
+                        'auto resizes( outline column)?',
+                        'auto save expanded items', 'auto save name',
+                        'auto save table columns', 'auto saves configuration',
+                        'auto scroll', 'auto sizes all columns to fit',
+                        'auto sizes cells', 'background color', 'bezel state',
+                        'bezel style', 'bezeled', 'border rect', 'border type',
+                        'bordered', 'bounds( rotation)?', 'box type',
+                        'button returned', 'button type',
+                        'can choose directories', 'can choose files',
+                        'can draw', 'can hide',
+                        'cell( (background color|size|type))?', 'characters',
+                        'class', 'click count', 'clicked( data)? column',
+                        'clicked data item', 'clicked( data)? row',
+                        'closeable', 'collating', 'color( (mode|panel))',
+                        'command key down', 'configuration',
+                        'content(s| (size|view( margins)?))?', 'context',
+                        'continuous', 'control key down', 'control size',
+                        'control tint', 'control view',
+                        'controller visible', 'coordinate system',
+                        'copies( on scroll)?', 'corner view', 'current cell',
+                        'current column', 'current( field)?  editor',
+                        'current( menu)? item', 'current row',
+                        'current tab view item', 'data source',
+                        'default identifiers', 'delta (x|y|z)',
+                        'destination window', 'directory', 'display mode',
+                        'displayed cell', 'document( (edited|rect|view))?',
+                        'double value', 'dragged column', 'dragged distance',
+                        'dragged items', 'draws( cell)? background',
+                        'draws grid', 'dynamically scrolls', 'echos bullets',
+                        'edge', 'editable', 'edited( data)? column',
+                        'edited data item', 'edited( data)? row', 'enabled',
+                        'enclosing scroll view', 'ending page',
+                        'error handling', 'event number', 'event type',
+                        'excluded from windows menu', 'executable path',
+                        'expanded', 'fax number', 'field editor', 'file kind',
+                        'file name', 'file type', 'first responder',
+                        'first visible column', 'flipped', 'floating',
+                        'font( panel)?', 'formatter', 'frameworks path',
+                        'frontmost', 'gave up', 'grid color', 'has data items',
+                        'has horizontal ruler', 'has horizontal scroller',
+                        'has parent data item', 'has resize indicator',
+                        'has shadow', 'has sub menu', 'has vertical ruler',
+                        'has vertical scroller', 'header cell', 'header view',
+                        'hidden', 'hides when deactivated', 'highlights by',
+                        'horizontal line scroll', 'horizontal page scroll',
+                        'horizontal ruler view', 'horizontally resizable',
+                        'icon image', 'id', 'identifier',
+                        'ignores multiple clicks',
+                        'image( (alignment|dims when disabled|frame style|scaling))?',
+                        'imports graphics', 'increment value',
+                        'indentation per level', 'indeterminate', 'index',
+                        'integer value', 'intercell spacing', 'item height',
+                        'key( (code|equivalent( modifier)?|window))?',
+                        'knob thickness', 'label', 'last( visible)? column',
+                        'leading offset', 'leaf', 'level', 'line scroll',
+                        'loaded', 'localized sort', 'location', 'loop mode',
+                        'main( (bunde|menu|window))?', 'marker follows cell',
+                        'matrix mode', 'maximum( content)? size',
+                        'maximum visible columns',
+                        'menu( form representation)?', 'miniaturizable',
+                        'miniaturized', 'minimized image', 'minimized title',
+                        'minimum column width', 'minimum( content)? size',
+                        'modal', 'modified', 'mouse down state',
+                        'movie( (controller|file|rect))?', 'muted', 'name',
+                        'needs display', 'next state', 'next text',
+                        'number of tick marks', 'only tick mark values',
+                        'opaque', 'open panel', 'option key down',
+                        'outline table column', 'page scroll', 'pages across',
+                        'pages down', 'palette label', 'pane splitter',
+                        'parent data item', 'parent window', 'pasteboard',
+                        'path( (names|separator))?', 'playing',
+                        'plays every frame', 'plays selection only', 'position',
+                        'preferred edge', 'preferred type', 'pressure',
+                        'previous text', 'prompt', 'properties',
+                        'prototype cell', 'pulls down', 'rate',
+                        'released when closed', 'repeated',
+                        'requested print time', 'required file type',
+                        'resizable', 'resized column', 'resource path',
+                        'returns records', 'reuses columns', 'rich text',
+                        'roll over', 'row height', 'rulers visible',
+                        'save panel', 'scripts path', 'scrollable',
+                        'selectable( identifiers)?', 'selected cell',
+                        'selected( data)? columns?', 'selected data items?',
+                        'selected( data)? rows?', 'selected item identifier',
+                        'selection by rect', 'send action on arrow key',
+                        'sends action when done editing', 'separates columns',
+                        'separator item', 'sequence number', 'services menu',
+                        'shared frameworks path', 'shared support path',
+                        'sheet', 'shift key down', 'shows alpha',
+                        'shows state by', 'size( mode)?',
+                        'smart insert delete enabled', 'sort case sensitivity',
+                        'sort column', 'sort order', 'sort type',
+                        'sorted( data rows)?', 'sound', 'source( mask)?',
+                        'spell checking enabled', 'starting page', 'state',
+                        'string value', 'sub menu', 'super menu', 'super view',
+                        'tab key traverses cells', 'tab state', 'tab type',
+                        'tab view', 'table view', 'tag', 'target( printer)?',
+                        'text color', 'text container insert',
+                        'text container origin', 'text returned',
+                        'tick mark position', 'time stamp',
+                        'title(d| (cell|font|height|position|rect))?',
+                        'tool tip', 'toolbar', 'trailing offset', 'transparent',
+                        'treat packages as directories', 'truncated labels',
+                        'types', 'unmodified characters', 'update views',
+                        'use sort indicator', 'user defaults',
+                        'uses data source', 'uses ruler',
+                        'uses threaded animation',
+                        'uses title from previous column', 'value wraps',
+                        'version',
+                        'vertical( (line scroll|page scroll|ruler view))?',
+                        'vertically resizable', 'view',
+                        'visible( document rect)?', 'volume', 'width', 'window',
+                        'windows menu', 'wraps', 'zoomable', 'zoomed')
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'¬\n', String.Escape),
+            (r"'s\s+", Text),  # This is a possessive, consider moving
+            (r'(--|#).*?$', Comment),
+            (r'\(\*', Comment.Multiline, 'comment'),
+            (r'[(){}!,.:]', Punctuation),
+            (r'(«)([^»]+)(»)',
+             bygroups(Text, Name.Builtin, Text)),
+            (r'\b((?:considering|ignoring)\s*)'
+             r'(application responses|case|diacriticals|hyphens|'
+             r'numeric strings|punctuation|white space)',
+             bygroups(Keyword, Name.Builtin)),
+            (r'(-|\*|\+|&|≠|>=?|<=?|=|≥|≤|/|÷|\^)', Operator),
+            (r"\b({})\b".format('|'.join(Operators)), Operator.Word),
+            (r'^(\s*(?:on|end)\s+)'
+             r'({})'.format('|'.join(StudioEvents[::-1])),
+             bygroups(Keyword, Name.Function)),
+            (r'^(\s*)(in|on|script|to)(\s+)', bygroups(Text, Keyword, Text)),
+            (r'\b(as )({})\b'.format('|'.join(Classes)),
+             bygroups(Keyword, Name.Class)),
+            (r'\b({})\b'.format('|'.join(Literals)), Name.Constant),
+            (r'\b({})\b'.format('|'.join(Commands)), Name.Builtin),
+            (r'\b({})\b'.format('|'.join(Control)), Keyword),
+            (r'\b({})\b'.format('|'.join(Declarations)), Keyword),
+            (r'\b({})\b'.format('|'.join(Reserved)), Name.Builtin),
+            (r'\b({})s?\b'.format('|'.join(BuiltIn)), Name.Builtin),
+            (r'\b({})\b'.format('|'.join(HandlerParams)), Name.Builtin),
+            (r'\b({})\b'.format('|'.join(StudioProperties)), Name.Attribute),
+            (r'\b({})s?\b'.format('|'.join(StudioClasses)), Name.Builtin),
+            (r'\b({})\b'.format('|'.join(StudioCommands)), Name.Builtin),
+            (r'\b({})\b'.format('|'.join(References)), Name.Builtin),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),
+            (rf'\b({Identifiers})\b', Name.Variable),
+            (r'[-+]?(\d+\.\d*|\d*\.\d+)(E[-+][0-9]+)?', Number.Float),
+            (r'[-+]?\d+', Number.Integer),
+        ],
+        'comment': [
+            (r'\(\*', Comment.Multiline, '#push'),
+            (r'\*\)', Comment.Multiline, '#pop'),
+            ('[^*(]+', Comment.Multiline),
+            ('[*(]', Comment.Multiline),
+        ],
+    }
+
+
+class RexxLexer(RegexLexer):
+    """
+    Rexx is a scripting language available for
+    a wide range of different platforms with its roots found on mainframe
+    systems. It is popular for I/O- and data based tasks and can act as glue
+    language to bind different applications together.
+    """
+    name = 'Rexx'
+    url = 'http://www.rexxinfo.org/'
+    aliases = ['rexx', 'arexx']
+    filenames = ['*.rexx', '*.rex', '*.rx', '*.arexx']
+    mimetypes = ['text/x-rexx']
+    version_added = '2.0'
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'\s+', Whitespace),
+            (r'/\*', Comment.Multiline, 'comment'),
+            (r'"', String, 'string_double'),
+            (r"'", String, 'string_single'),
+            (r'[0-9]+(\.[0-9]+)?(e[+-]?[0-9])?', Number),
+            (r'([a-z_]\w*)(\s*)(:)(\s*)(procedure)\b',
+             bygroups(Name.Function, Whitespace, Operator, Whitespace,
+                      Keyword.Declaration)),
+            (r'([a-z_]\w*)(\s*)(:)',
+             bygroups(Name.Label, Whitespace, Operator)),
+            include('function'),
+            include('keyword'),
+            include('operator'),
+            (r'[a-z_]\w*', Text),
+        ],
+        'function': [
+            (words((
+                'abbrev', 'abs', 'address', 'arg', 'b2x', 'bitand', 'bitor', 'bitxor',
+                'c2d', 'c2x', 'center', 'charin', 'charout', 'chars', 'compare',
+                'condition', 'copies', 'd2c', 'd2x', 'datatype', 'date', 'delstr',
+                'delword', 'digits', 'errortext', 'form', 'format', 'fuzz', 'insert',
+                'lastpos', 'left', 'length', 'linein', 'lineout', 'lines', 'max',
+                'min', 'overlay', 'pos', 'queued', 'random', 'reverse', 'right', 'sign',
+                'sourceline', 'space', 'stream', 'strip', 'substr', 'subword', 'symbol',
+                'time', 'trace', 'translate', 'trunc', 'value', 'verify', 'word',
+                'wordindex', 'wordlength', 'wordpos', 'words', 'x2b', 'x2c', 'x2d',
+                'xrange'), suffix=r'(\s*)(\()'),
+             bygroups(Name.Builtin, Whitespace, Operator)),
+        ],
+        'keyword': [
+            (r'(address|arg|by|call|do|drop|else|end|exit|for|forever|if|'
+             r'interpret|iterate|leave|nop|numeric|off|on|options|parse|'
+             r'pull|push|queue|return|say|select|signal|to|then|trace|until|'
+             r'while)\b', Keyword.Reserved),
+        ],
+        'operator': [
+            (r'(-|//|/|\(|\)|\*\*|\*|\\<<|\\<|\\==|\\=|\\>>|\\>|\\|\|\||\||'
+             r'&&|&|%|\+|<<=|<<|<=|<>|<|==|=|><|>=|>>=|>>|>|¬<<|¬<|¬==|¬=|'
+             r'¬>>|¬>|¬|\.|,)', Operator),
+        ],
+        'string_double': [
+            (r'[^"\n]+', String),
+            (r'""', String),
+            (r'"', String, '#pop'),
+            (r'\n', Text, '#pop'),  # Stray linefeed also terminates strings.
+        ],
+        'string_single': [
+            (r'[^\'\n]+', String),
+            (r'\'\'', String),
+            (r'\'', String, '#pop'),
+            (r'\n', Text, '#pop'),  # Stray linefeed also terminates strings.
+        ],
+        'comment': [
+            (r'[^*]+', Comment.Multiline),
+            (r'\*/', Comment.Multiline, '#pop'),
+            (r'\*', Comment.Multiline),
+        ]
+    }
+
+    def _c(s):
+        return re.compile(s, re.MULTILINE)
+    _ADDRESS_COMMAND_PATTERN = _c(r'^\s*address\s+command\b')
+    _ADDRESS_PATTERN = _c(r'^\s*address\s+')
+    _DO_WHILE_PATTERN = _c(r'^\s*do\s+while\b')
+    _IF_THEN_DO_PATTERN = _c(r'^\s*if\b.+\bthen\s+do\s*$')
+    _PROCEDURE_PATTERN = _c(r'^\s*([a-z_]\w*)(\s*)(:)(\s*)(procedure)\b')
+    _ELSE_DO_PATTERN = _c(r'\belse\s+do\s*$')
+    _PARSE_ARG_PATTERN = _c(r'^\s*parse\s+(upper\s+)?(arg|value)\b')
+    PATTERNS_AND_WEIGHTS = (
+        (_ADDRESS_COMMAND_PATTERN, 0.2),
+        (_ADDRESS_PATTERN, 0.05),
+        (_DO_WHILE_PATTERN, 0.1),
+        (_ELSE_DO_PATTERN, 0.1),
+        (_IF_THEN_DO_PATTERN, 0.1),
+        (_PROCEDURE_PATTERN, 0.5),
+        (_PARSE_ARG_PATTERN, 0.2),
+    )
+
+    def analyse_text(text):
+        """
+        Check for initial comment and patterns that distinguish Rexx from other
+        C-like languages.
+        """
+        if re.search(r'/\*\**\s*rexx', text, re.IGNORECASE):
+            # Header matches MVS Rexx requirements, this is certainly a Rexx
+            # script.
+            return 1.0
+        elif text.startswith('/*'):
+            # Header matches general Rexx requirements; the source code might
+            # still be any language using C comments such as C++, C# or Java.
+            lowerText = text.lower()
+            result = sum(weight
+                         for (pattern, weight) in RexxLexer.PATTERNS_AND_WEIGHTS
+                         if pattern.search(lowerText)) + 0.01
+            return min(result, 1.0)
+
+
+class MOOCodeLexer(RegexLexer):
+    """
+    For MOOCode (the MOO scripting language).
+    """
+    name = 'MOOCode'
+    url = 'http://www.moo.mud.org/'
+    filenames = ['*.moo']
+    aliases = ['moocode', 'moo']
+    mimetypes = ['text/x-moocode']
+    version_added = '0.9'
+
+    tokens = {
+        'root': [
+            # Numbers
+            (r'(0|[1-9][0-9_]*)', Number.Integer),
+            # Strings
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            # exceptions
+            (r'(E_PERM|E_DIV)', Name.Exception),
+            # db-refs
+            (r'((#[-0-9]+)|(\$\w+))', Name.Entity),
+            # Keywords
+            (r'\b(if|else|elseif|endif|for|endfor|fork|endfork|while'
+             r'|endwhile|break|continue|return|try'
+             r'|except|endtry|finally|in)\b', Keyword),
+            # builtins
+            (r'(random|length)', Name.Builtin),
+            # special variables
+            (r'(player|caller|this|args)', Name.Variable.Instance),
+            # skip whitespace
+            (r'\s+', Text),
+            (r'\n', Text),
+            # other operators
+            (r'([!;=,{}&|:.\[\]@()<>?]+)', Operator),
+            # function call
+            (r'(\w+)(\()', bygroups(Name.Function, Operator)),
+            # variables
+            (r'(\w+)', Text),
+        ]
+    }
+
+
+class HybrisLexer(RegexLexer):
+    """
+    For Hybris source code.
+    """
+
+    name = 'Hybris'
+    aliases = ['hybris']
+    filenames = ['*.hyb']
+    mimetypes = ['text/x-hybris', 'application/x-hybris']
+    url = 'https://github.com/evilsocket/hybris'
+    version_added = '1.4'
+
+    flags = re.MULTILINE | re.DOTALL
+
+    tokens = {
+        'root': [
+            # method names
+            (r'^(\s*(?:function|method|operator\s+)+?)'
+             r'([a-zA-Z_]\w*)'
+             r'(\s*)(\()', bygroups(Keyword, Name.Function, Text, Operator)),
+            (r'[^\S\n]+', Text),
+            (r'//.*?\n', Comment.Single),
+            (r'/\*.*?\*/', Comment.Multiline),
+            (r'@[a-zA-Z_][\w.]*', Name.Decorator),
+            (r'(break|case|catch|next|default|do|else|finally|for|foreach|of|'
+             r'unless|if|new|return|switch|me|throw|try|while)\b', Keyword),
+            (r'(extends|private|protected|public|static|throws|function|method|'
+             r'operator)\b', Keyword.Declaration),
+            (r'(true|false|null|__FILE__|__LINE__|__VERSION__|__LIB_PATH__|'
+             r'__INC_PATH__)\b', Keyword.Constant),
+            (r'(class|struct)(\s+)',
+             bygroups(Keyword.Declaration, Text), 'class'),
+            (r'(import|include)(\s+)',
+             bygroups(Keyword.Namespace, Text), 'import'),
+            (words((
+                'gc_collect', 'gc_mm_items', 'gc_mm_usage', 'gc_collect_threshold',
+                'urlencode', 'urldecode', 'base64encode', 'base64decode', 'sha1', 'crc32',
+                'sha2', 'md5', 'md5_file', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos',
+                'cosh', 'exp', 'fabs', 'floor', 'fmod', 'log', 'log10', 'pow', 'sin',
+                'sinh', 'sqrt', 'tan', 'tanh', 'isint', 'isfloat', 'ischar', 'isstring',
+                'isarray', 'ismap', 'isalias', 'typeof', 'sizeof', 'toint', 'tostring',
+                'fromxml', 'toxml', 'binary', 'pack', 'load', 'eval', 'var_names',
+                'var_values', 'user_functions', 'dyn_functions', 'methods', 'call',
+                'call_method', 'mknod', 'mkfifo', 'mount', 'umount2', 'umount', 'ticks',
+                'usleep', 'sleep', 'time', 'strtime', 'strdate', 'dllopen', 'dlllink',
+                'dllcall', 'dllcall_argv', 'dllclose', 'env', 'exec', 'fork', 'getpid',
+                'wait', 'popen', 'pclose', 'exit', 'kill', 'pthread_create',
+                'pthread_create_argv', 'pthread_exit', 'pthread_join', 'pthread_kill',
+                'smtp_send', 'http_get', 'http_post', 'http_download', 'socket', 'bind',
+                'listen', 'accept', 'getsockname', 'getpeername', 'settimeout', 'connect',
+                'server', 'recv', 'send', 'close', 'print', 'println', 'printf', 'input',
+                'readline', 'serial_open', 'serial_fcntl', 'serial_get_attr',
+                'serial_get_ispeed', 'serial_get_ospeed', 'serial_set_attr',
+                'serial_set_ispeed', 'serial_set_ospeed', 'serial_write', 'serial_read',
+                'serial_close', 'xml_load', 'xml_parse', 'fopen', 'fseek', 'ftell',
+                'fsize', 'fread', 'fwrite', 'fgets', 'fclose', 'file', 'readdir',
+                'pcre_replace', 'size', 'pop', 'unmap', 'has', 'keys', 'values',
+                'length', 'find', 'substr', 'replace', 'split', 'trim', 'remove',
+                'contains', 'join'), suffix=r'\b'),
+             Name.Builtin),
+            (words((
+                'MethodReference', 'Runner', 'Dll', 'Thread', 'Pipe', 'Process',
+                'Runnable', 'CGI', 'ClientSocket', 'Socket', 'ServerSocket',
+                'File', 'Console', 'Directory', 'Exception'), suffix=r'\b'),
+             Keyword.Type),
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            (r"'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'", String.Char),
+            (r'(\.)([a-zA-Z_]\w*)',
+             bygroups(Operator, Name.Attribute)),
+            (r'[a-zA-Z_]\w*:', Name.Label),
+            (r'[a-zA-Z_$]\w*', Name),
+            (r'[~^*!%&\[\](){}<>|+=:;,./?\-@]+', Operator),
+            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),
+            (r'0x[0-9a-f]+', Number.Hex),
+            (r'[0-9]+L?', Number.Integer),
+            (r'\n', Text),
+        ],
+        'class': [
+            (r'[a-zA-Z_]\w*', Name.Class, '#pop')
+        ],
+        'import': [
+            (r'[\w.]+\*?', Name.Namespace, '#pop')
+        ],
+    }
+
+    def analyse_text(text):
+        """public method and private method don't seem to be quite common
+        elsewhere."""
+        result = 0
+        if re.search(r'\b(?:public|private)\s+method\b', text):
+            result += 0.01
+        return result
+
+
+
+class EasytrieveLexer(RegexLexer):
+    """
+    Easytrieve Plus is a programming language for extracting, filtering and
+    converting sequential data. Furthermore it can layout data for reports.
+    It is mainly used on mainframe platforms and can access several of the
+    mainframe's native file formats. It is somewhat comparable to awk.
+    """
+    name = 'Easytrieve'
+    aliases = ['easytrieve']
+    filenames = ['*.ezt', '*.mac']
+    mimetypes = ['text/x-easytrieve']
+    url = 'https://www.broadcom.com/products/mainframe/application-development/easytrieve-report-generator'
+    version_added = '2.1'
+    flags = 0
+
+    # Note: We cannot use r'\b' at the start and end of keywords because
+    # Easytrieve Plus delimiter characters are:
+    #
+    #   * space ( )
+    #   * apostrophe (')
+    #   * period (.)
+    #   * comma (,)
+    #   * parenthesis ( and )
+    #   * colon (:)
+    #
+    # Additionally words end once a '*' appears, indicatins a comment.
+    _DELIMITERS = r' \'.,():\n'
+    _DELIMITERS_OR_COMENT = _DELIMITERS + '*'
+    _DELIMITER_PATTERN = '[' + _DELIMITERS + ']'
+    _DELIMITER_PATTERN_CAPTURE = '(' + _DELIMITER_PATTERN + ')'
+    _NON_DELIMITER_OR_COMMENT_PATTERN = '[^' + _DELIMITERS_OR_COMENT + ']'
+    _OPERATORS_PATTERN = '[.+\\-/=\\[\\](){}<>;,&%¬]'
+    _KEYWORDS = [
+        'AFTER-BREAK', 'AFTER-LINE', 'AFTER-SCREEN', 'AIM', 'AND', 'ATTR',
+        'BEFORE', 'BEFORE-BREAK', 'BEFORE-LINE', 'BEFORE-SCREEN', 'BUSHU',
+        'BY', 'CALL', 'CASE', 'CHECKPOINT', 'CHKP', 'CHKP-STATUS', 'CLEAR',
+        'CLOSE', 'COL', 'COLOR', 'COMMIT', 'CONTROL', 'COPY', 'CURSOR', 'D',
+        'DECLARE', 'DEFAULT', 'DEFINE', 'DELETE', 'DENWA', 'DISPLAY', 'DLI',
+        'DO', 'DUPLICATE', 'E', 'ELSE', 'ELSE-IF', 'END', 'END-CASE',
+        'END-DO', 'END-IF', 'END-PROC', 'ENDPAGE', 'ENDTABLE', 'ENTER', 'EOF',
+        'EQ', 'ERROR', 'EXIT', 'EXTERNAL', 'EZLIB', 'F1', 'F10', 'F11', 'F12',
+        'F13', 'F14', 'F15', 'F16', 'F17', 'F18', 'F19', 'F2', 'F20', 'F21',
+        'F22', 'F23', 'F24', 'F25', 'F26', 'F27', 'F28', 'F29', 'F3', 'F30',
+        'F31', 'F32', 'F33', 'F34', 'F35', 'F36', 'F4', 'F5', 'F6', 'F7',
+        'F8', 'F9', 'FETCH', 'FILE-STATUS', 'FILL', 'FINAL', 'FIRST',
+        'FIRST-DUP', 'FOR', 'GE', 'GET', 'GO', 'GOTO', 'GQ', 'GR', 'GT',
+        'HEADING', 'HEX', 'HIGH-VALUES', 'IDD', 'IDMS', 'IF', 'IN', 'INSERT',
+        'JUSTIFY', 'KANJI-DATE', 'KANJI-DATE-LONG', 'KANJI-TIME', 'KEY',
+        'KEY-PRESSED', 'KOKUGO', 'KUN', 'LAST-DUP', 'LE', 'LEVEL', 'LIKE',
+        'LINE', 'LINE-COUNT', 'LINE-NUMBER', 'LINK', 'LIST', 'LOW-VALUES',
+        'LQ', 'LS', 'LT', 'MACRO', 'MASK', 'MATCHED', 'MEND', 'MESSAGE',
+        'MOVE', 'MSTART', 'NE', 'NEWPAGE', 'NOMASK', 'NOPRINT', 'NOT',
+        'NOTE', 'NOVERIFY', 'NQ', 'NULL', 'OF', 'OR', 'OTHERWISE', 'PA1',
+        'PA2', 'PA3', 'PAGE-COUNT', 'PAGE-NUMBER', 'PARM-REGISTER',
+        'PATH-ID', 'PATTERN', 'PERFORM', 'POINT', 'POS', 'PRIMARY', 'PRINT',
+        'PROCEDURE', 'PROGRAM', 'PUT', 'READ', 'RECORD', 'RECORD-COUNT',
+        'RECORD-LENGTH', 'REFRESH', 'RELEASE', 'RENUM', 'REPEAT', 'REPORT',
+        'REPORT-INPUT', 'RESHOW', 'RESTART', 'RETRIEVE', 'RETURN-CODE',
+        'ROLLBACK', 'ROW', 'S', 'SCREEN', 'SEARCH', 'SECONDARY', 'SELECT',
+        'SEQUENCE', 'SIZE', 'SKIP', 'SOKAKU', 'SORT', 'SQL', 'STOP', 'SUM',
+        'SYSDATE', 'SYSDATE-LONG', 'SYSIN', 'SYSIPT', 'SYSLST', 'SYSPRINT',
+        'SYSSNAP', 'SYSTIME', 'TALLY', 'TERM-COLUMNS', 'TERM-NAME',
+        'TERM-ROWS', 'TERMINATION', 'TITLE', 'TO', 'TRANSFER', 'TRC',
+        'UNIQUE', 'UNTIL', 'UPDATE', 'UPPERCASE', 'USER', 'USERID', 'VALUE',
+        'VERIFY', 'W', 'WHEN', 'WHILE', 'WORK', 'WRITE', 'X', 'XDM', 'XRST'
+    ]
+
+    tokens = {
+        'root': [
+            (r'\*.*\n', Comment.Single),
+            (r'\n+', Whitespace),
+            # Macro argument
+            (r'&' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+\.', Name.Variable,
+             'after_macro_argument'),
+            # Macro call
+            (r'%' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name.Variable),
+            (r'(FILE|MACRO|REPORT)(\s+)',
+             bygroups(Keyword.Declaration, Whitespace), 'after_declaration'),
+            (r'(JOB|PARM)' + r'(' + _DELIMITER_PATTERN + r')',
+             bygroups(Keyword.Declaration, Operator)),
+            (words(_KEYWORDS, suffix=_DELIMITER_PATTERN_CAPTURE),
+             bygroups(Keyword.Reserved, Operator)),
+            (_OPERATORS_PATTERN, Operator),
+            # Procedure declaration
+            (r'(' + _NON_DELIMITER_OR_COMMENT_PATTERN + r'+)(\s*)(\.?)(\s*)(PROC)(\s*\n)',
+             bygroups(Name.Function, Whitespace, Operator, Whitespace,
+                      Keyword.Declaration, Whitespace)),
+            (r'[0-9]+\.[0-9]*', Number.Float),
+            (r'[0-9]+', Number.Integer),
+            (r"'(''|[^'])*'", String),
+            (r'\s+', Whitespace),
+            # Everything else just belongs to a name
+            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name),
+         ],
+        'after_declaration': [
+            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name.Function),
+            default('#pop'),
+        ],
+        'after_macro_argument': [
+            (r'\*.*\n', Comment.Single, '#pop'),
+            (r'\s+', Whitespace, '#pop'),
+            (_OPERATORS_PATTERN, Operator, '#pop'),
+            (r"'(''|[^'])*'", String, '#pop'),
+            # Everything else just belongs to a name
+            (_NON_DELIMITER_OR_COMMENT_PATTERN + r'+', Name),
+        ],
+    }
+    _COMMENT_LINE_REGEX = re.compile(r'^\s*\*')
+    _MACRO_HEADER_REGEX = re.compile(r'^\s*MACRO')
+
+    def analyse_text(text):
+        """
+        Perform a structural analysis for basic Easytrieve constructs.
+        """
+        result = 0.0
+        lines = text.split('\n')
+        hasEndProc = False
+        hasHeaderComment = False
+        hasFile = False
+        hasJob = False
+        hasProc = False
+        hasParm = False
+        hasReport = False
+
+        def isCommentLine(line):
+            return EasytrieveLexer._COMMENT_LINE_REGEX.match(lines[0]) is not None
+
+        def isEmptyLine(line):
+            return not bool(line.strip())
+
+        # Remove possible empty lines and header comments.
+        while lines and (isEmptyLine(lines[0]) or isCommentLine(lines[0])):
+            if not isEmptyLine(lines[0]):
+                hasHeaderComment = True
+            del lines[0]
+
+        if EasytrieveLexer._MACRO_HEADER_REGEX.match(lines[0]):
+            # Looks like an Easytrieve macro.
+            result = 0.4
+            if hasHeaderComment:
+                result += 0.4
+        else:
+            # Scan the source for lines starting with indicators.
+            for line in lines:
+                words = line.split()
+                if (len(words) >= 2):
+                    firstWord = words[0]
+                    if not hasReport:
+                        if not hasJob:
+                            if not hasFile:
+                                if not hasParm:
+                                    if firstWord == 'PARM':
+                                        hasParm = True
+                                if firstWord == 'FILE':
+                                    hasFile = True
+                            if firstWord == 'JOB':
+                                hasJob = True
+                        elif firstWord == 'PROC':
+                            hasProc = True
+                        elif firstWord == 'END-PROC':
+                            hasEndProc = True
+                        elif firstWord == 'REPORT':
+                            hasReport = True
+
+            # Weight the findings.
+            if hasJob and (hasProc == hasEndProc):
+                if hasHeaderComment:
+                    result += 0.1
+                if hasParm:
+                    if hasProc:
+                        # Found PARM, JOB and PROC/END-PROC:
+                        # pretty sure this is Easytrieve.
+                        result += 0.8
+                    else:
+                        # Found PARAM and  JOB: probably this is Easytrieve
+                        result += 0.5
+                else:
+                    # Found JOB and possibly other keywords: might be Easytrieve
+                    result += 0.11
+                    if hasParm:
+                        # Note: PARAM is not a proper English word, so this is
+                        # regarded a much better indicator for Easytrieve than
+                        # the other words.
+                        result += 0.2
+                    if hasFile:
+                        result += 0.01
+                    if hasReport:
+                        result += 0.01
+        assert 0.0 <= result <= 1.0
+        return result
+
+
+class JclLexer(RegexLexer):
+    """
+    Job Control Language (JCL)
+    is a scripting language used on mainframe platforms to instruct the system
+    on how to run a batch job or start a subsystem. It is somewhat
+    comparable to MS DOS batch and Unix shell scripts.
+    """
+    name = 'JCL'
+    aliases = ['jcl']
+    filenames = ['*.jcl']
+    mimetypes = ['text/x-jcl']
+    url = 'https://en.wikipedia.org/wiki/Job_Control_Language'
+    version_added = '2.1'
+
+    flags = re.IGNORECASE
+
+    tokens = {
+        'root': [
+            (r'//\*.*\n', Comment.Single),
+            (r'//', Keyword.Pseudo, 'statement'),
+            (r'/\*', Keyword.Pseudo, 'jes2_statement'),
+            # TODO: JES3 statement
+            (r'.*\n', Other)  # Input text or inline code in any language.
+        ],
+        'statement': [
+            (r'\s*\n', Whitespace, '#pop'),
+            (r'([a-z]\w*)(\s+)(exec|job)(\s*)',
+             bygroups(Name.Label, Whitespace, Keyword.Reserved, Whitespace),
+             'option'),
+            (r'[a-z]\w*', Name.Variable, 'statement_command'),
+            (r'\s+', Whitespace, 'statement_command'),
+        ],
+        'statement_command': [
+            (r'\s+(command|cntl|dd|endctl|endif|else|include|jcllib|'
+             r'output|pend|proc|set|then|xmit)\s+', Keyword.Reserved, 'option'),
+            include('option')
+        ],
+        'jes2_statement': [
+            (r'\s*\n', Whitespace, '#pop'),
+            (r'\$', Keyword, 'option'),
+            (r'\b(jobparam|message|netacct|notify|output|priority|route|'
+             r'setup|signoff|xeq|xmit)\b', Keyword, 'option'),
+        ],
+        'option': [
+            # (r'\n', Text, 'root'),
+            (r'\*', Name.Builtin),
+            (r'[\[\](){}<>;,]', Punctuation),
+            (r'[-+*/=&%]', Operator),
+            (r'[a-z_]\w*', Name),
+            (r'\d+\.\d*', Number.Float),
+            (r'\.\d+', Number.Float),
+            (r'\d+', Number.Integer),
+            (r"'", String, 'option_string'),
+            (r'[ \t]+', Whitespace, 'option_comment'),
+            (r'\.', Punctuation),
+        ],
+        'option_string': [
+            (r"(\n)(//)", bygroups(Text, Keyword.Pseudo)),
+            (r"''", String),
+            (r"[^']", String),
+            (r"'", String, '#pop'),
+        ],
+        'option_comment': [
+            # (r'\n', Text, 'root'),
+            (r'.+', Comment.Single),
+        ]
+    }
+
+    _JOB_HEADER_PATTERN = re.compile(r'^//[a-z#$@][a-z0-9#$@]{0,7}\s+job(\s+.*)?$',
+                                     re.IGNORECASE)
+
+    def analyse_text(text):
+        """
+        Recognize JCL job by header.
+        """
+        result = 0.0
+        lines = text.split('\n')
+        if len(lines) > 0:
+            if JclLexer._JOB_HEADER_PATTERN.match(lines[0]):
+                result = 1.0
+        assert 0.0 <= result <= 1.0
+        return result
+
+
+class MiniScriptLexer(RegexLexer):
+    """
+    For MiniScript source code.
+    """
+
+    name = 'MiniScript'
+    url = 'https://miniscript.org'
+    aliases = ['miniscript', 'ms']
+    filenames = ['*.ms']
+    mimetypes = ['text/x-minicript', 'application/x-miniscript']
+    version_added = '2.6'
+
+    tokens = {
+        'root': [
+            (r'#!(.*?)$', Comment.Preproc),
+            default('base'),
+        ],
+        'base': [
+            ('//.*$', Comment.Single),
+            (r'(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?', Number),
+            (r'(?i)\d+e[+-]?\d+', Number),
+            (r'\d+', Number),
+            (r'\n', Text),
+            (r'[^\S\n]+', Text),
+            (r'"', String, 'string_double'),
+            (r'(==|!=|<=|>=|[=+\-*/%^<>.:])', Operator),
+            (r'[;,\[\]{}()]', Punctuation),
+            (words((
+                'break', 'continue', 'else', 'end', 'for', 'function', 'if',
+                'in', 'isa', 'then', 'repeat', 'return', 'while'), suffix=r'\b'),
+             Keyword),
+            (words((
+                'abs', 'acos', 'asin', 'atan', 'ceil', 'char', 'cos', 'floor',
+                'log', 'round', 'rnd', 'pi', 'sign', 'sin', 'sqrt', 'str', 'tan',
+                'hasIndex', 'indexOf', 'len', 'val', 'code', 'remove', 'lower',
+                'upper', 'replace', 'split', 'indexes', 'values', 'join', 'sum',
+                'sort', 'shuffle', 'push', 'pop', 'pull', 'range',
+                'print', 'input', 'time', 'wait', 'locals', 'globals', 'outer',
+                'yield'), suffix=r'\b'),
+             Name.Builtin),
+            (r'(true|false|null)\b', Keyword.Constant),
+            (r'(and|or|not|new)\b', Operator.Word),
+            (r'(self|super|__isa)\b', Name.Builtin.Pseudo),
+            (r'[a-zA-Z_]\w*', Name.Variable)
+        ],
+        'string_double': [
+            (r'[^"\n]+', String),
+            (r'""', String),
+            (r'"', String, '#pop'),
+            (r'\n', Text, '#pop'),  # Stray linefeed also terminates strings.
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sgf.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sgf.py
new file mode 100644
index 000000000..f0e56cba5
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sgf.py
@@ -0,0 +1,59 @@
+"""
+    pygments.lexers.sgf
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Smart Game Format (sgf) file format.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Name, Literal, String, Punctuation, Whitespace
+
+__all__ = ["SmartGameFormatLexer"]
+
+
+class SmartGameFormatLexer(RegexLexer):
+    """
+    Lexer for Smart Game Format (sgf) file format.
+
+    The format is used to store game records of board games for two players
+    (mainly Go game).
+    """
+    name = 'SmartGameFormat'
+    url = 'https://www.red-bean.com/sgf/'
+    aliases = ['sgf']
+    filenames = ['*.sgf']
+    version_added = '2.4'
+
+    tokens = {
+        'root': [
+            (r'[():;]+', Punctuation),
+            # tokens:
+            (r'(A[BW]|AE|AN|AP|AR|AS|[BW]L|BM|[BW]R|[BW]S|[BW]T|CA|CH|CP|CR|'
+             r'DD|DM|DO|DT|EL|EV|EX|FF|FG|G[BW]|GC|GM|GN|HA|HO|ID|IP|IT|IY|KM|'
+             r'KO|LB|LN|LT|L|MA|MN|M|N|OB|OM|ON|OP|OT|OV|P[BW]|PC|PL|PM|RE|RG|'
+             r'RO|RU|SO|SC|SE|SI|SL|SO|SQ|ST|SU|SZ|T[BW]|TC|TE|TM|TR|UC|US|VW|'
+             r'V|[BW]|C)',
+             Name.Builtin),
+            # number:
+            (r'(\[)([0-9.]+)(\])',
+             bygroups(Punctuation, Literal.Number, Punctuation)),
+            # date:
+            (r'(\[)([0-9]{4}-[0-9]{2}-[0-9]{2})(\])',
+             bygroups(Punctuation, Literal.Date, Punctuation)),
+            # point:
+            (r'(\[)([a-z]{2})(\])',
+             bygroups(Punctuation, String, Punctuation)),
+            # double points:
+            (r'(\[)([a-z]{2})(:)([a-z]{2})(\])',
+             bygroups(Punctuation, String, Punctuation, String, Punctuation)),
+
+            (r'(\[)([\w\s#()+,\-.:?]+)(\])',
+             bygroups(Punctuation, String, Punctuation)),
+            (r'(\[)(\s.*)(\])',
+             bygroups(Punctuation, Whitespace, Punctuation)),
+            (r'\s+', Whitespace)
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/shell.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/shell.py
new file mode 100644
index 000000000..744767a1d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/shell.py
@@ -0,0 +1,902 @@
+"""
+    pygments.lexers.shell
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various shells.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import re
+
+from pygments.lexer import Lexer, RegexLexer, do_insertions, bygroups, \
+    include, default, this, using, words, line_re
+from pygments.token import Punctuation, Whitespace, \
+    Text, Comment, Operator, Keyword, Name, String, Number, Generic
+from pygments.util import shebang_matches
+
+__all__ = ['BashLexer', 'BashSessionLexer', 'TcshLexer', 'BatchLexer',
+           'SlurmBashLexer', 'MSDOSSessionLexer', 'PowerShellLexer',
+           'PowerShellSessionLexer', 'TcshSessionLexer', 'FishShellLexer',
+           'ExeclineLexer']
+
+
+class BashLexer(RegexLexer):
+    """
+    Lexer for (ba|k|z|)sh shell scripts.
+    """
+
+    name = 'Bash'
+    aliases = ['bash', 'sh', 'ksh', 'zsh', 'shell', 'openrc']
+    filenames = ['*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass',
+                 '*.exheres-0', '*.exlib', '*.zsh',
+                 '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc',
+                 '.kshrc', 'kshrc',
+                 'PKGBUILD']
+    mimetypes = ['application/x-sh', 'application/x-shellscript', 'text/x-shellscript']
+    url = 'https://en.wikipedia.org/wiki/Unix_shell'
+    version_added = '0.6'
+
+    tokens = {
+        'root': [
+            include('basic'),
+            (r'`', String.Backtick, 'backticks'),
+            include('data'),
+            include('interp'),
+        ],
+        'interp': [
+            (r'\$\(\(', Keyword, 'math'),
+            (r'\$\(', Keyword, 'paren'),
+            (r'\$\{#?', String.Interpol, 'curly'),
+            (r'\$[a-zA-Z_]\w*', Name.Variable),  # user variable
+            (r'\$(?:\d+|[#$?!_*@-])', Name.Variable),      # builtin
+            (r'\$', Text),
+        ],
+        'basic': [
+            (r'\b(if|fi|else|while|in|do|done|for|then|return|function|case|'
+             r'select|break|continue|until|esac|elif)(\s*)\b',
+             bygroups(Keyword, Whitespace)),
+            (r'\b(alias|bg|bind|builtin|caller|cd|command|compgen|'
+             r'complete|declare|dirs|disown|echo|enable|eval|exec|exit|'
+             r'export|false|fc|fg|getopts|hash|help|history|jobs|kill|let|'
+             r'local|logout|popd|printf|pushd|pwd|read|readonly|set|shift|'
+             r'shopt|source|suspend|test|time|times|trap|true|type|typeset|'
+             r'ulimit|umask|unalias|unset|wait)(?=[\s)`])',
+             Name.Builtin),
+            (r'\A#!.+\n', Comment.Hashbang),
+            (r'#.*\n', Comment.Single),
+            (r'\\[\w\W]', String.Escape),
+            (r'(\b\w+)(\s*)(\+?=)', bygroups(Name.Variable, Whitespace, Operator)),
+            (r'[\[\]{}()=]', Operator),
+            (r'<<<', Operator),  # here-string
+            (r'<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
+            (r'&&|\|\|', Operator),
+        ],
+        'data': [
+            (r'(?s)\$?"(\\.|[^"\\$])*"', String.Double),
+            (r'"', String.Double, 'string'),
+            (r"(?s)\$'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r"(?s)'.*?'", String.Single),
+            (r';', Punctuation),
+            (r'&', Punctuation),
+            (r'\|', Punctuation),
+            (r'\s+', Whitespace),
+            (r'\d+\b', Number),
+            (r'[^=\s\[\]{}()$"\'`\\<&|;]+', Text),
+            (r'<', Text),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'(?s)(\\\\|\\[0-7]+|\\.|[^"\\$])+', String.Double),
+            include('interp'),
+        ],
+        'curly': [
+            (r'\}', String.Interpol, '#pop'),
+            (r':-', Keyword),
+            (r'\w+', Name.Variable),
+            (r'[^}:"\'`$\\]+', Punctuation),
+            (r':', Punctuation),
+            include('root'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('root'),
+        ],
+        'math': [
+            (r'\)\)', Keyword, '#pop'),
+            (r'\*\*|\|\||<<|>>|[-+*/%^|&<>]', Operator),
+            (r'\d+#[\da-zA-Z]+', Number),
+            (r'\d+#(?! )', Number),
+            (r'0[xX][\da-fA-F]+', Number),
+            (r'\d+', Number),
+            (r'[a-zA-Z_]\w*', Name.Variable),  # user variable
+            include('root'),
+        ],
+        'backticks': [
+            (r'`', String.Backtick, '#pop'),
+            include('root'),
+        ],
+    }
+
+    def analyse_text(text):
+        if shebang_matches(text, r'(ba|z|)sh'):
+            return 1
+        if text.startswith('$ '):
+            return 0.2
+
+
+class SlurmBashLexer(BashLexer):
+    """
+    Lexer for (ba|k|z|)sh Slurm scripts.
+    """
+
+    name = 'Slurm'
+    aliases = ['slurm', 'sbatch']
+    filenames = ['*.sl']
+    mimetypes = []
+    version_added = '2.4'
+    EXTRA_KEYWORDS = {'srun'}
+
+    def get_tokens_unprocessed(self, text):
+        for index, token, value in BashLexer.get_tokens_unprocessed(self, text):
+            if token is Text and value in self.EXTRA_KEYWORDS:
+                yield index, Name.Builtin, value
+            elif token is Comment.Single and 'SBATCH' in value:
+                yield index, Keyword.Pseudo, value
+            else:
+                yield index, token, value
+
+
+class ShellSessionBaseLexer(Lexer):
+    """
+    Base lexer for shell sessions.
+
+    .. versionadded:: 2.1
+    """
+
+    _bare_continuation = False
+    _venv = re.compile(r'^(\([^)]*\))(\s*)')
+
+    def get_tokens_unprocessed(self, text):
+        innerlexer = self._innerLexerCls(**self.options)
+
+        pos = 0
+        curcode = ''
+        insertions = []
+        backslash_continuation = False
+
+        for match in line_re.finditer(text):
+            line = match.group()
+
+            venv_match = self._venv.match(line)
+            if venv_match:
+                venv = venv_match.group(1)
+                venv_whitespace = venv_match.group(2)
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt.VirtualEnv, venv)]))
+                if venv_whitespace:
+                    insertions.append((len(curcode),
+                                       [(0, Text, venv_whitespace)]))
+                line = line[venv_match.end():]
+
+            m = self._ps1rgx.match(line)
+            if m:
+                # To support output lexers (say diff output), the output
+                # needs to be broken by prompts whenever the output lexer
+                # changes.
+                if not insertions:
+                    pos = match.start()
+
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt, m.group(1))]))
+                curcode += m.group(2)
+                backslash_continuation = curcode.endswith('\\\n')
+            elif backslash_continuation:
+                if line.startswith(self._ps2):
+                    insertions.append((len(curcode),
+                                       [(0, Generic.Prompt,
+                                         line[:len(self._ps2)])]))
+                    curcode += line[len(self._ps2):]
+                else:
+                    curcode += line
+                backslash_continuation = curcode.endswith('\\\n')
+            elif self._bare_continuation and line.startswith(self._ps2):
+                insertions.append((len(curcode),
+                                   [(0, Generic.Prompt,
+                                     line[:len(self._ps2)])]))
+                curcode += line[len(self._ps2):]
+            else:
+                if insertions:
+                    toks = innerlexer.get_tokens_unprocessed(curcode)
+                    for i, t, v in do_insertions(insertions, toks):
+                        yield pos+i, t, v
+                yield match.start(), Generic.Output, line
+                insertions = []
+                curcode = ''
+        if insertions:
+            for i, t, v in do_insertions(insertions,
+                                         innerlexer.get_tokens_unprocessed(curcode)):
+                yield pos+i, t, v
+
+
+class BashSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for Bash shell sessions, i.e. command lines, including a
+    prompt, interspersed with output.
+    """
+
+    name = 'Bash Session'
+    aliases = ['console', 'shell-session']
+    filenames = ['*.sh-session', '*.shell-session']
+    mimetypes = ['application/x-shell-session', 'application/x-sh-session']
+    url = 'https://en.wikipedia.org/wiki/Unix_shell'
+    version_added = '1.1'
+    _example = "console/example.sh-session"
+
+    _innerLexerCls = BashLexer
+    _ps1rgx = re.compile(
+        r'^((?:(?:\[.*?\])|(?:\(\S+\))?(?:| |sh\S*?|\w+\S+[@:]\S+(?:\s+\S+)' \
+        r'?|\[\S+[@:][^\n]+\].+))\s*[$#%]\s*)(.*\n?)')
+    _ps2 = '> '
+
+
+class BatchLexer(RegexLexer):
+    """
+    Lexer for the DOS/Windows Batch file format.
+    """
+    name = 'Batchfile'
+    aliases = ['batch', 'bat', 'dosbatch', 'winbatch']
+    filenames = ['*.bat', '*.cmd']
+    mimetypes = ['application/x-dos-batch']
+    url = 'https://en.wikipedia.org/wiki/Batch_file'
+    version_added = '0.7'
+
+    flags = re.MULTILINE | re.IGNORECASE
+
+    _nl = r'\n\x1a'
+    _punct = r'&<>|'
+    _ws = r'\t\v\f\r ,;=\xa0'
+    _nlws = r'\s\x1a\xa0,;='
+    _space = rf'(?:(?:(?:\^[{_nl}])?[{_ws}])+)'
+    _keyword_terminator = (rf'(?=(?:\^[{_nl}]?)?[{_ws}+./:[\\\]]|[{_nl}{_punct}(])')
+    _token_terminator = rf'(?=\^?[{_ws}]|[{_punct}{_nl}])'
+    _start_label = rf'((?:(?<=^[^:])|^[^:]?)[{_ws}]*)(:)'
+    _label = rf'(?:(?:[^{_nlws}{_punct}+:^]|\^[{_nl}]?[\w\W])*)'
+    _label_compound = rf'(?:(?:[^{_nlws}{_punct}+:^)]|\^[{_nl}]?[^)])*)'
+    _number = rf'(?:-?(?:0[0-7]+|0x[\da-f]+|\d+){_token_terminator})'
+    _opword = r'(?:equ|geq|gtr|leq|lss|neq)'
+    _string = rf'(?:"[^{_nl}"]*(?:"|(?=[{_nl}])))'
+    _variable = (r'(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|'
+                 rf'[^%:{_nl}]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%{_nl}^]|'
+                 rf'\^[^%{_nl}])[^={_nl}]*=(?:[^%{_nl}^]|\^[^%{_nl}])*)?)?%))|'
+                 rf'(?:\^?![^!:{_nl}]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:'
+                 rf'[^!{_nl}^]|\^[^!{_nl}])[^={_nl}]*=(?:[^!{_nl}^]|\^[^!{_nl}])*)?)?\^?!))')
+    _core_token = rf'(?:(?:(?:\^[{_nl}]?)?[^"{_nlws}{_punct}])+)'
+    _core_token_compound = rf'(?:(?:(?:\^[{_nl}]?)?[^"{_nlws}{_punct})])+)'
+    _token = rf'(?:[{_punct}]+|{_core_token})'
+    _token_compound = rf'(?:[{_punct}]+|{_core_token_compound})'
+    _stoken = (rf'(?:[{_punct}]+|(?:{_string}|{_variable}|{_core_token})+)')
+
+    def _make_begin_state(compound, _core_token=_core_token,
+                          _core_token_compound=_core_token_compound,
+                          _keyword_terminator=_keyword_terminator,
+                          _nl=_nl, _punct=_punct, _string=_string,
+                          _space=_space, _start_label=_start_label,
+                          _stoken=_stoken, _token_terminator=_token_terminator,
+                          _variable=_variable, _ws=_ws):
+        rest = '(?:{}|{}|[^"%{}{}{}])*'.format(_string, _variable, _nl, _punct,
+                                            ')' if compound else '')
+        rest_of_line = rf'(?:(?:[^{_nl}^]|\^[{_nl}]?[\w\W])*)'
+        rest_of_line_compound = rf'(?:(?:[^{_nl}^)]|\^[{_nl}]?[^)])*)'
+        set_space = rf'((?:(?:\^[{_nl}]?)?[^\S\n])*)'
+        suffix = ''
+        if compound:
+            _keyword_terminator = rf'(?:(?=\))|{_keyword_terminator})'
+            _token_terminator = rf'(?:(?=\))|{_token_terminator})'
+            suffix = '/compound'
+        return [
+            ((r'\)', Punctuation, '#pop') if compound else
+             (rf'\)((?=\()|{_token_terminator}){rest_of_line}',
+              Comment.Single)),
+            (rf'(?={_start_label})', Text, f'follow{suffix}'),
+            (_space, using(this, state='text')),
+            include(f'redirect{suffix}'),
+            (rf'[{_nl}]+', Text),
+            (r'\(', Punctuation, 'root/compound'),
+            (r'@+', Punctuation),
+            (rf'((?:for|if|rem)(?:(?=(?:\^[{_nl}]?)?/)|(?:(?!\^)|'
+             rf'(?<=m))(?:(?=\()|{_token_terminator})))({_space}?{_core_token_compound if compound else _core_token}?(?:\^[{_nl}]?)?/(?:\^[{_nl}]?)?\?)',
+             bygroups(Keyword, using(this, state='text')),
+             f'follow{suffix}'),
+            (rf'(goto{_keyword_terminator})({rest}(?:\^[{_nl}]?)?/(?:\^[{_nl}]?)?\?{rest})',
+             bygroups(Keyword, using(this, state='text')),
+             f'follow{suffix}'),
+            (words(('assoc', 'break', 'cd', 'chdir', 'cls', 'color', 'copy',
+                    'date', 'del', 'dir', 'dpath', 'echo', 'endlocal', 'erase',
+                    'exit', 'ftype', 'keys', 'md', 'mkdir', 'mklink', 'move',
+                    'path', 'pause', 'popd', 'prompt', 'pushd', 'rd', 'ren',
+                    'rename', 'rmdir', 'setlocal', 'shift', 'start', 'time',
+                    'title', 'type', 'ver', 'verify', 'vol'),
+                   suffix=_keyword_terminator), Keyword, f'follow{suffix}'),
+            (rf'(call)({_space}?)(:)',
+             bygroups(Keyword, using(this, state='text'), Punctuation),
+             f'call{suffix}'),
+            (rf'call{_keyword_terminator}', Keyword),
+            (rf'(for{_token_terminator}(?!\^))({_space})(/f{_token_terminator})',
+             bygroups(Keyword, using(this, state='text'), Keyword),
+             ('for/f', 'for')),
+            (rf'(for{_token_terminator}(?!\^))({_space})(/l{_token_terminator})',
+             bygroups(Keyword, using(this, state='text'), Keyword),
+             ('for/l', 'for')),
+            (rf'for{_token_terminator}(?!\^)', Keyword, ('for2', 'for')),
+            (rf'(goto{_keyword_terminator})({_space}?)(:?)',
+             bygroups(Keyword, using(this, state='text'), Punctuation),
+             f'label{suffix}'),
+            (rf'(if(?:(?=\()|{_token_terminator})(?!\^))({_space}?)((?:/i{_token_terminator})?)({_space}?)((?:not{_token_terminator})?)({_space}?)',
+             bygroups(Keyword, using(this, state='text'), Keyword,
+                      using(this, state='text'), Keyword,
+                      using(this, state='text')), ('(?', 'if')),
+            (rf'rem(((?=\()|{_token_terminator}){_space}?{_stoken}?.*|{_keyword_terminator}{rest_of_line_compound if compound else rest_of_line})',
+             Comment.Single, f'follow{suffix}'),
+            (rf'(set{_keyword_terminator}){set_space}(/a)',
+             bygroups(Keyword, using(this, state='text'), Keyword),
+             f'arithmetic{suffix}'),
+            (r'(set{}){}((?:/p)?){}((?:(?:(?:\^[{}]?)?[^"{}{}^={}]|'
+             r'\^[{}]?[^"=])+)?)((?:(?:\^[{}]?)?=)?)'.format(_keyword_terminator, set_space, set_space, _nl, _nl, _punct,
+              ')' if compound else '', _nl, _nl),
+             bygroups(Keyword, using(this, state='text'), Keyword,
+                      using(this, state='text'), using(this, state='variable'),
+                      Punctuation),
+             f'follow{suffix}'),
+            default(f'follow{suffix}')
+        ]
+
+    def _make_follow_state(compound, _label=_label,
+                           _label_compound=_label_compound, _nl=_nl,
+                           _space=_space, _start_label=_start_label,
+                           _token=_token, _token_compound=_token_compound,
+                           _ws=_ws):
+        suffix = '/compound' if compound else ''
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state += [
+            (rf'{_start_label}([{_ws}]*)({_label_compound if compound else _label})(.*)',
+             bygroups(Text, Punctuation, Text, Name.Label, Comment.Single)),
+            include(f'redirect{suffix}'),
+            (rf'(?=[{_nl}])', Text, '#pop'),
+            (r'\|\|?|&&?', Punctuation, '#pop'),
+            include('text')
+        ]
+        return state
+
+    def _make_arithmetic_state(compound, _nl=_nl, _punct=_punct,
+                               _string=_string, _variable=_variable,
+                               _ws=_ws, _nlws=_nlws):
+        op = r'=+\-*/!~'
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state += [
+            (r'0[0-7]+', Number.Oct),
+            (r'0x[\da-f]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'[(),]+', Punctuation),
+            (rf'([{op}]|%|\^\^)+', Operator),
+            (r'({}|{}|(\^[{}]?)?[^(){}%\^"{}{}]|\^[{}]?{})+'.format(_string, _variable, _nl, op, _nlws, _punct, _nlws,
+              r'[^)]' if compound else r'[\w\W]'),
+             using(this, state='variable')),
+            (r'(?=[\x00|&])', Text, '#pop'),
+            include('follow')
+        ]
+        return state
+
+    def _make_call_state(compound, _label=_label,
+                         _label_compound=_label_compound):
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state.append((r'(:?)(%s)' % (_label_compound if compound else _label),
+                      bygroups(Punctuation, Name.Label), '#pop'))
+        return state
+
+    def _make_label_state(compound, _label=_label,
+                          _label_compound=_label_compound, _nl=_nl,
+                          _punct=_punct, _string=_string, _variable=_variable):
+        state = []
+        if compound:
+            state.append((r'(?=\))', Text, '#pop'))
+        state.append((r'({}?)((?:{}|{}|\^[{}]?{}|[^"%^{}{}{}])*)'.format(_label_compound if compound else _label, _string,
+                       _variable, _nl, r'[^)]' if compound else r'[\w\W]', _nl,
+                       _punct, r')' if compound else ''),
+                      bygroups(Name.Label, Comment.Single), '#pop'))
+        return state
+
+    def _make_redirect_state(compound,
+                             _core_token_compound=_core_token_compound,
+                             _nl=_nl, _punct=_punct, _stoken=_stoken,
+                             _string=_string, _space=_space,
+                             _variable=_variable, _nlws=_nlws):
+        stoken_compound = (rf'(?:[{_punct}]+|(?:{_string}|{_variable}|{_core_token_compound})+)')
+        return [
+            (rf'((?:(?<=[{_nlws}])\d)?)(>>?&|<&)([{_nlws}]*)(\d)',
+             bygroups(Number.Integer, Punctuation, Text, Number.Integer)),
+            (rf'((?:(?<=[{_nlws}])(?>?|<)({_space}?{stoken_compound if compound else _stoken})',
+             bygroups(Number.Integer, Punctuation, using(this, state='text')))
+        ]
+
+    tokens = {
+        'root': _make_begin_state(False),
+        'follow': _make_follow_state(False),
+        'arithmetic': _make_arithmetic_state(False),
+        'call': _make_call_state(False),
+        'label': _make_label_state(False),
+        'redirect': _make_redirect_state(False),
+        'root/compound': _make_begin_state(True),
+        'follow/compound': _make_follow_state(True),
+        'arithmetic/compound': _make_arithmetic_state(True),
+        'call/compound': _make_call_state(True),
+        'label/compound': _make_label_state(True),
+        'redirect/compound': _make_redirect_state(True),
+        'variable-or-escape': [
+            (_variable, Name.Variable),
+            (rf'%%|\^[{_nl}]?(\^!|[\w\W])', String.Escape)
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (_variable, Name.Variable),
+            (r'\^!|%%', String.Escape),
+            (rf'[^"%^{_nl}]+|[%^]', String.Double),
+            default('#pop')
+        ],
+        'sqstring': [
+            include('variable-or-escape'),
+            (r'[^%]+|%', String.Single)
+        ],
+        'bqstring': [
+            include('variable-or-escape'),
+            (r'[^%]+|%', String.Backtick)
+        ],
+        'text': [
+            (r'"', String.Double, 'string'),
+            include('variable-or-escape'),
+            (rf'[^"%^{_nlws}{_punct}\d)]+|.', Text)
+        ],
+        'variable': [
+            (r'"', String.Double, 'string'),
+            include('variable-or-escape'),
+            (rf'[^"%^{_nl}]+|.', Name.Variable)
+        ],
+        'for': [
+            (rf'({_space})(in)({_space})(\()',
+             bygroups(using(this, state='text'), Keyword,
+                      using(this, state='text'), Punctuation), '#pop'),
+            include('follow')
+        ],
+        'for2': [
+            (r'\)', Punctuation),
+            (rf'({_space})(do{_token_terminator})',
+             bygroups(using(this, state='text'), Keyword), '#pop'),
+            (rf'[{_nl}]+', Text),
+            include('follow')
+        ],
+        'for/f': [
+            (rf'(")((?:{_variable}|[^"])*?")([{_nlws}]*)(\))',
+             bygroups(String.Double, using(this, state='string'), Text,
+                      Punctuation)),
+            (r'"', String.Double, ('#pop', 'for2', 'string')),
+            (rf"('(?:%%|{_variable}|[\w\W])*?')([{_nlws}]*)(\))",
+             bygroups(using(this, state='sqstring'), Text, Punctuation)),
+            (rf'(`(?:%%|{_variable}|[\w\W])*?`)([{_nlws}]*)(\))',
+             bygroups(using(this, state='bqstring'), Text, Punctuation)),
+            include('for2')
+        ],
+        'for/l': [
+            (r'-?\d+', Number.Integer),
+            include('for2')
+        ],
+        'if': [
+            (rf'((?:cmdextversion|errorlevel){_token_terminator})({_space})(\d+)',
+             bygroups(Keyword, using(this, state='text'),
+                      Number.Integer), '#pop'),
+            (rf'(defined{_token_terminator})({_space})({_stoken})',
+             bygroups(Keyword, using(this, state='text'),
+                      using(this, state='variable')), '#pop'),
+            (rf'(exist{_token_terminator})({_space}{_stoken})',
+             bygroups(Keyword, using(this, state='text')), '#pop'),
+            (rf'({_number}{_space})({_opword})({_space}{_number})',
+             bygroups(using(this, state='arithmetic'), Operator.Word,
+                      using(this, state='arithmetic')), '#pop'),
+            (_stoken, using(this, state='text'), ('#pop', 'if2')),
+        ],
+        'if2': [
+            (rf'({_space}?)(==)({_space}?{_stoken})',
+             bygroups(using(this, state='text'), Operator,
+                      using(this, state='text')), '#pop'),
+            (rf'({_space})({_opword})({_space}{_stoken})',
+             bygroups(using(this, state='text'), Operator.Word,
+                      using(this, state='text')), '#pop')
+        ],
+        '(?': [
+            (_space, using(this, state='text')),
+            (r'\(', Punctuation, ('#pop', 'else?', 'root/compound')),
+            default('#pop')
+        ],
+        'else?': [
+            (_space, using(this, state='text')),
+            (rf'else{_token_terminator}', Keyword, '#pop'),
+            default('#pop')
+        ]
+    }
+
+
+class MSDOSSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for MS DOS shell sessions, i.e. command lines, including a
+    prompt, interspersed with output.
+    """
+
+    name = 'MSDOS Session'
+    aliases = ['doscon']
+    filenames = []
+    mimetypes = []
+    url = 'https://en.wikipedia.org/wiki/MS-DOS'
+    version_added = '2.1'
+    _example = "doscon/session"
+
+    _innerLexerCls = BatchLexer
+    _ps1rgx = re.compile(r'^([^>]*>)(.*\n?)')
+    _ps2 = 'More? '
+
+
+class TcshLexer(RegexLexer):
+    """
+    Lexer for tcsh scripts.
+    """
+
+    name = 'Tcsh'
+    aliases = ['tcsh', 'csh']
+    filenames = ['*.tcsh', '*.csh']
+    mimetypes = ['application/x-csh']
+    url = 'https://www.tcsh.org'
+    version_added = '0.10'
+
+    tokens = {
+        'root': [
+            include('basic'),
+            (r'\$\(', Keyword, 'paren'),
+            (r'\$\{#?', Keyword, 'curly'),
+            (r'`', String.Backtick, 'backticks'),
+            include('data'),
+        ],
+        'basic': [
+            (r'\b(if|endif|else|while|then|foreach|case|default|'
+             r'break|continue|goto|breaksw|end|switch|endsw)\s*\b',
+             Keyword),
+            (r'\b(alias|alloc|bg|bindkey|builtins|bye|caller|cd|chdir|'
+             r'complete|dirs|echo|echotc|eval|exec|exit|fg|filetest|getxvers|'
+             r'glob|getspath|hashstat|history|hup|inlib|jobs|kill|'
+             r'limit|log|login|logout|ls-F|migrate|newgrp|nice|nohup|notify|'
+             r'onintr|popd|printenv|pushd|rehash|repeat|rootnode|popd|pushd|'
+             r'set|shift|sched|setenv|setpath|settc|setty|setxvers|shift|'
+             r'source|stop|suspend|source|suspend|telltc|time|'
+             r'umask|unalias|uncomplete|unhash|universe|unlimit|unset|unsetenv|'
+             r'ver|wait|warp|watchlog|where|which)\s*\b',
+             Name.Builtin),
+            (r'#.*', Comment),
+            (r'\\[\w\W]', String.Escape),
+            (r'(\b\w+)(\s*)(=)', bygroups(Name.Variable, Text, Operator)),
+            (r'[\[\]{}()=]+', Operator),
+            (r'<<\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
+            (r';', Punctuation),
+        ],
+        'data': [
+            (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double),
+            (r"(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r'\s+', Text),
+            (r'[^=\s\[\]{}()$"\'`\\;#]+', Text),
+            (r'\d+(?= |\Z)', Number),
+            (r'\$#?(\w+|.)', Name.Variable),
+        ],
+        'curly': [
+            (r'\}', Keyword, '#pop'),
+            (r':-', Keyword),
+            (r'\w+', Name.Variable),
+            (r'[^}:"\'`$]+', Punctuation),
+            (r':', Punctuation),
+            include('root'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('root'),
+        ],
+        'backticks': [
+            (r'`', String.Backtick, '#pop'),
+            include('root'),
+        ],
+    }
+
+
+class TcshSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for Tcsh sessions, i.e. command lines, including a
+    prompt, interspersed with output.
+    """
+
+    name = 'Tcsh Session'
+    aliases = ['tcshcon']
+    filenames = []
+    mimetypes = []
+    url = 'https://www.tcsh.org'
+    version_added = '2.1'
+    _example = "tcshcon/session"
+
+    _innerLexerCls = TcshLexer
+    _ps1rgx = re.compile(r'^([^>]+>)(.*\n?)')
+    _ps2 = '? '
+
+
+class PowerShellLexer(RegexLexer):
+    """
+    For Windows PowerShell code.
+    """
+    name = 'PowerShell'
+    aliases = ['powershell', 'pwsh', 'posh', 'ps1', 'psm1']
+    filenames = ['*.ps1', '*.psm1']
+    mimetypes = ['text/x-powershell']
+    url = 'https://learn.microsoft.com/en-us/powershell'
+    version_added = '1.5'
+
+    flags = re.DOTALL | re.IGNORECASE | re.MULTILINE
+
+    keywords = (
+        'while validateset validaterange validatepattern validatelength '
+        'validatecount until trap switch return ref process param parameter in '
+        'if global: local: function foreach for finally filter end elseif else '
+        'dynamicparam do default continue cmdletbinding break begin alias \\? '
+        '% #script #private #local #global mandatory parametersetname position '
+        'valuefrompipeline valuefrompipelinebypropertyname '
+        'valuefromremainingarguments helpmessage try catch throw').split()
+
+    operators = (
+        'and as band bnot bor bxor casesensitive ccontains ceq cge cgt cle '
+        'clike clt cmatch cne cnotcontains cnotlike cnotmatch contains '
+        'creplace eq exact f file ge gt icontains ieq ige igt ile ilike ilt '
+        'imatch ine inotcontains inotlike inotmatch ireplace is isnot le like '
+        'lt match ne not notcontains notlike notmatch or regex replace '
+        'wildcard').split()
+
+    verbs = (
+        'write where watch wait use update unregister unpublish unprotect '
+        'unlock uninstall undo unblock trace test tee take sync switch '
+        'suspend submit stop step start split sort skip show set send select '
+        'search scroll save revoke resume restore restart resolve resize '
+        'reset request repair rename remove register redo receive read push '
+        'publish protect pop ping out optimize open new move mount merge '
+        'measure lock limit join invoke install initialize import hide group '
+        'grant get format foreach find export expand exit enter enable edit '
+        'dismount disconnect disable deny debug cxnew copy convertto '
+        'convertfrom convert connect confirm compress complete compare close '
+        'clear checkpoint block backup assert approve aggregate add').split()
+
+    aliases_ = (
+        'ac asnp cat cd cfs chdir clc clear clhy cli clp cls clv cnsn '
+        'compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo epal '
+        'epcsv epsn erase etsn exsn fc fhx fl foreach ft fw gal gbp gc gci gcm '
+        'gcs gdr ghy gi gjb gl gm gmo gp gps gpv group gsn gsnp gsv gu gv gwmi '
+        'h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp '
+        'ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv '
+        'oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo '
+        'rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc select '
+        'set shcm si sl sleep sls sort sp spjb spps spsv start sujb sv swmi tee '
+        'trcm type wget where wjb write').split()
+
+    commenthelp = (
+        'component description example externalhelp forwardhelpcategory '
+        'forwardhelptargetname functionality inputs link '
+        'notes outputs parameter remotehelprunspace role synopsis').split()
+
+    tokens = {
+        'root': [
+            # we need to count pairs of parentheses for correct highlight
+            # of '$(...)' blocks in strings
+            (r'\(', Punctuation, 'child'),
+            (r'\s+', Text),
+            (r'^(\s*#[#\s]*)(\.(?:{}))([^\n]*$)'.format('|'.join(commenthelp)),
+             bygroups(Comment, String.Doc, Comment)),
+            (r'#[^\n]*?$', Comment),
+            (r'(<|<)#', Comment.Multiline, 'multline'),
+            (r'@"\n', String.Heredoc, 'heredoc-double'),
+            (r"@'\n.*?\n'@", String.Heredoc),
+            # escaped syntax
+            (r'`[\'"$@-]', Punctuation),
+            (r'"', String.Double, 'string'),
+            (r"'([^']|'')*'", String.Single),
+            (r'(\$|@@|@)((global|script|private|env):)?\w+',
+             Name.Variable),
+            (r'({})\b'.format('|'.join(keywords)), Keyword),
+            (r'-({})\b'.format('|'.join(operators)), Operator),
+            (r'({})-[a-z_]\w*\b'.format('|'.join(verbs)), Name.Builtin),
+            (r'({})\s'.format('|'.join(aliases_)), Name.Builtin),
+            (r'\[[a-z_\[][\w. `,\[\]]*\]', Name.Constant),  # .net [type]s
+            (r'-[a-z_]\w*', Name),
+            (r'\w+', Name),
+            (r'[.,;:@{}\[\]$()=+*/\\&%!~?^`|<>-]', Punctuation),
+        ],
+        'child': [
+            (r'\)', Punctuation, '#pop'),
+            include('root'),
+        ],
+        'multline': [
+            (r'[^#&.]+', Comment.Multiline),
+            (r'#(>|>)', Comment.Multiline, '#pop'),
+            (r'\.({})'.format('|'.join(commenthelp)), String.Doc),
+            (r'[#&.]', Comment.Multiline),
+        ],
+        'string': [
+            (r"`[0abfnrtv'\"$`]", String.Escape),
+            (r'[^$`"]+', String.Double),
+            (r'\$\(', Punctuation, 'child'),
+            (r'""', String.Double),
+            (r'[`$]', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'heredoc-double': [
+            (r'\n"@', String.Heredoc, '#pop'),
+            (r'\$\(', Punctuation, 'child'),
+            (r'[^@\n]+"]', String.Heredoc),
+            (r".", String.Heredoc),
+        ]
+    }
+
+
+class PowerShellSessionLexer(ShellSessionBaseLexer):
+    """
+    Lexer for PowerShell sessions, i.e. command lines, including a
+    prompt, interspersed with output.
+    """
+
+    name = 'PowerShell Session'
+    aliases = ['pwsh-session', 'ps1con']
+    filenames = []
+    mimetypes = []
+    url = 'https://learn.microsoft.com/en-us/powershell'
+    version_added = '2.1'
+    _example = "pwsh-session/session"
+
+    _innerLexerCls = PowerShellLexer
+    _bare_continuation = True
+    _ps1rgx = re.compile(r'^((?:\[[^]]+\]: )?PS[^>]*> ?)(.*\n?)')
+    _ps2 = '> '
+
+
+class FishShellLexer(RegexLexer):
+    """
+    Lexer for Fish shell scripts.
+    """
+
+    name = 'Fish'
+    aliases = ['fish', 'fishshell']
+    filenames = ['*.fish', '*.load']
+    mimetypes = ['application/x-fish']
+    url = 'https://fishshell.com'
+    version_added = '2.1'
+
+    tokens = {
+        'root': [
+            include('basic'),
+            include('data'),
+            include('interp'),
+        ],
+        'interp': [
+            (r'\$\(\(', Keyword, 'math'),
+            (r'\(', Keyword, 'paren'),
+            (r'\$#?(\w+|.)', Name.Variable),
+        ],
+        'basic': [
+            (r'\b(begin|end|if|else|while|break|for|in|return|function|block|'
+             r'case|continue|switch|not|and|or|set|echo|exit|pwd|true|false|'
+             r'cd|count|test)(\s*)\b',
+             bygroups(Keyword, Text)),
+            (r'\b(alias|bg|bind|breakpoint|builtin|command|commandline|'
+             r'complete|contains|dirh|dirs|emit|eval|exec|fg|fish|fish_config|'
+             r'fish_indent|fish_pager|fish_prompt|fish_right_prompt|'
+             r'fish_update_completions|fishd|funced|funcsave|functions|help|'
+             r'history|isatty|jobs|math|mimedb|nextd|open|popd|prevd|psub|'
+             r'pushd|random|read|set_color|source|status|trap|type|ulimit|'
+             r'umask|vared|fc|getopts|hash|kill|printf|time|wait)\s*\b(?!\.)',
+             Name.Builtin),
+            (r'#.*\n', Comment),
+            (r'\\[\w\W]', String.Escape),
+            (r'(\b\w+)(\s*)(=)', bygroups(Name.Variable, Whitespace, Operator)),
+            (r'[\[\]()=]', Operator),
+            (r'<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2', String),
+        ],
+        'data': [
+            (r'(?s)\$?"(\\\\|\\[0-7]+|\\.|[^"\\$])*"', String.Double),
+            (r'"', String.Double, 'string'),
+            (r"(?s)\$'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single),
+            (r"(?s)'.*?'", String.Single),
+            (r';', Punctuation),
+            (r'&|\||\^|<|>', Operator),
+            (r'\s+', Text),
+            (r'\d+(?= |\Z)', Number),
+            (r'[^=\s\[\]{}()$"\'`\\<&|;]+', Text),
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'(?s)(\\\\|\\[0-7]+|\\.|[^"\\$])+', String.Double),
+            include('interp'),
+        ],
+        'paren': [
+            (r'\)', Keyword, '#pop'),
+            include('root'),
+        ],
+        'math': [
+            (r'\)\)', Keyword, '#pop'),
+            (r'[-+*/%^|&]|\*\*|\|\|', Operator),
+            (r'\d+#\d+', Number),
+            (r'\d+#(?! )', Number),
+            (r'\d+', Number),
+            include('root'),
+        ],
+    }
+
+class ExeclineLexer(RegexLexer):
+    """
+    Lexer for Laurent Bercot's execline language.
+    """
+
+    name = 'execline'
+    aliases = ['execline']
+    filenames = ['*.exec']
+    url = 'https://skarnet.org/software/execline'
+    version_added = '2.7'
+
+    tokens = {
+        'root': [
+            include('basic'),
+            include('data'),
+            include('interp')
+        ],
+        'interp': [
+            (r'\$\{', String.Interpol, 'curly'),
+            (r'\$[\w@#]+', Name.Variable),  # user variable
+            (r'\$', Text),
+        ],
+        'basic': [
+            (r'\b(background|backtick|cd|define|dollarat|elgetopt|'
+             r'elgetpositionals|elglob|emptyenv|envfile|exec|execlineb|'
+             r'exit|export|fdblock|fdclose|fdmove|fdreserve|fdswap|'
+             r'forbacktickx|foreground|forstdin|forx|getcwd|getpid|heredoc|'
+             r'homeof|if|ifelse|ifte|ifthenelse|importas|loopwhilex|'
+             r'multidefine|multisubstitute|pipeline|piperw|posix-cd|'
+             r'redirfd|runblock|shift|trap|tryexec|umask|unexport|wait|'
+             r'withstdinas)\b', Name.Builtin),
+            (r'\A#!.+\n', Comment.Hashbang),
+            (r'#.*\n', Comment.Single),
+            (r'[{}]', Operator)
+        ],
+        'data': [
+            (r'(?s)"(\\.|[^"\\$])*"', String.Double),
+            (r'"', String.Double, 'string'),
+            (r'\s+', Text),
+            (r'[^\s{}$"\\]+', Text)
+        ],
+        'string': [
+            (r'"', String.Double, '#pop'),
+            (r'(?s)(\\\\|\\.|[^"\\$])+', String.Double),
+            include('interp'),
+        ],
+        'curly': [
+            (r'\}', String.Interpol, '#pop'),
+            (r'[\w#@]+', Name.Variable),
+            include('root')
+        ]
+
+    }
+
+    def analyse_text(text):
+        if shebang_matches(text, r'execlineb'):
+            return 1
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sieve.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sieve.py
new file mode 100644
index 000000000..fc48980c4
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sieve.py
@@ -0,0 +1,78 @@
+"""
+    pygments.lexers.sieve
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Sieve file format.
+
+    https://tools.ietf.org/html/rfc5228
+    https://tools.ietf.org/html/rfc5173
+    https://tools.ietf.org/html/rfc5229
+    https://tools.ietf.org/html/rfc5230
+    https://tools.ietf.org/html/rfc5232
+    https://tools.ietf.org/html/rfc5235
+    https://tools.ietf.org/html/rfc5429
+    https://tools.ietf.org/html/rfc8580
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Comment, Name, Literal, String, Text, Punctuation, \
+    Keyword
+
+__all__ = ["SieveLexer"]
+
+
+class SieveLexer(RegexLexer):
+    """
+    Lexer for sieve format.
+    """
+    name = 'Sieve'
+    filenames = ['*.siv', '*.sieve']
+    aliases = ['sieve']
+    url = 'https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language)'
+    version_added = '2.6'
+
+    tokens = {
+        'root': [
+            (r'\s+', Text),
+            (r'[();,{}\[\]]', Punctuation),
+            # import:
+            (r'(?i)require',
+             Keyword.Namespace),
+            # tags:
+            (r'(?i)(:)(addresses|all|contains|content|create|copy|comparator|'
+             r'count|days|detail|domain|fcc|flags|from|handle|importance|is|'
+             r'localpart|length|lowerfirst|lower|matches|message|mime|options|'
+             r'over|percent|quotewildcard|raw|regex|specialuse|subject|text|'
+             r'under|upperfirst|upper|value)',
+             bygroups(Name.Tag, Name.Tag)),
+            # tokens:
+            (r'(?i)(address|addflag|allof|anyof|body|discard|elsif|else|envelope|'
+             r'ereject|exists|false|fileinto|if|hasflag|header|keep|'
+             r'notify_method_capability|notify|not|redirect|reject|removeflag|'
+             r'setflag|size|spamtest|stop|string|true|vacation|virustest)',
+             Name.Builtin),
+            (r'(?i)set',
+             Keyword.Declaration),
+            # number:
+            (r'([0-9.]+)([kmgKMG])?',
+             bygroups(Literal.Number, Literal.Number)),
+            # comment:
+            (r'#.*$',
+             Comment.Single),
+            (r'/\*.*\*/',
+             Comment.Multiline),
+            # string:
+            (r'"[^"]*?"',
+             String),
+            # text block:
+            (r'text:',
+             Name.Tag, 'text'),
+        ],
+        'text': [
+            (r'[^.].*?\n', String),
+            (r'^\.', Punctuation, "#pop"),
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/slash.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/slash.py
new file mode 100644
index 000000000..1c439d0db
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/slash.py
@@ -0,0 +1,183 @@
+"""
+    pygments.lexers.slash
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for the Slash programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import ExtendedRegexLexer, bygroups, DelegatingLexer
+from pygments.token import Name, Number, String, Comment, Punctuation, \
+    Other, Keyword, Operator, Whitespace
+
+__all__ = ['SlashLexer']
+
+
+class SlashLanguageLexer(ExtendedRegexLexer):
+    _nkw = r'(?=[^a-zA-Z_0-9])'
+
+    def move_state(new_state):
+        return ("#pop", new_state)
+
+    def right_angle_bracket(lexer, match, ctx):
+        if len(ctx.stack) > 1 and ctx.stack[-2] == "string":
+            ctx.stack.pop()
+        yield match.start(), String.Interpol, '}'
+        ctx.pos = match.end()
+        pass
+
+    tokens = {
+        "root": [
+            (r"<%=",        Comment.Preproc,    move_state("slash")),
+            (r"<%!!",       Comment.Preproc,    move_state("slash")),
+            (r"<%#.*?%>",   Comment.Multiline),
+            (r"<%",         Comment.Preproc,    move_state("slash")),
+            (r".|\n",       Other),
+        ],
+        "string": [
+            (r"\\",         String.Escape,      move_state("string_e")),
+            (r"\"",         String,             move_state("slash")),
+            (r"#\{",        String.Interpol,    "slash"),
+            (r'.|\n',       String),
+        ],
+        "string_e": [
+            (r'n',                  String.Escape,      move_state("string")),
+            (r't',                  String.Escape,      move_state("string")),
+            (r'r',                  String.Escape,      move_state("string")),
+            (r'e',                  String.Escape,      move_state("string")),
+            (r'x[a-fA-F0-9]{2}',    String.Escape,      move_state("string")),
+            (r'.',                  String.Escape,      move_state("string")),
+        ],
+        "regexp": [
+            (r'}[a-z]*',            String.Regex,       move_state("slash")),
+            (r'\\(.|\n)',           String.Regex),
+            (r'{',                  String.Regex,       "regexp_r"),
+            (r'.|\n',               String.Regex),
+        ],
+        "regexp_r": [
+            (r'}[a-z]*',            String.Regex,       "#pop"),
+            (r'\\(.|\n)',           String.Regex),
+            (r'{',                  String.Regex,       "regexp_r"),
+        ],
+        "slash": [
+            (r"%>",                     Comment.Preproc,    move_state("root")),
+            (r"\"",                     String,             move_state("string")),
+            (r"'[a-zA-Z0-9_]+",         String),
+            (r'%r{',                    String.Regex,       move_state("regexp")),
+            (r'/\*.*?\*/',              Comment.Multiline),
+            (r"(#|//).*?\n",            Comment.Single),
+            (r'-?[0-9]+e[+-]?[0-9]+',   Number.Float),
+            (r'-?[0-9]+\.[0-9]+(e[+-]?[0-9]+)?', Number.Float),
+            (r'-?[0-9]+',               Number.Integer),
+            (r'nil'+_nkw,               Name.Builtin),
+            (r'true'+_nkw,              Name.Builtin),
+            (r'false'+_nkw,             Name.Builtin),
+            (r'self'+_nkw,              Name.Builtin),
+            (r'(class)(\s+)([A-Z][a-zA-Z0-9_\']*)',
+                bygroups(Keyword, Whitespace, Name.Class)),
+            (r'class'+_nkw,             Keyword),
+            (r'extends'+_nkw,           Keyword),
+            (r'(def)(\s+)(self)(\s*)(\.)(\s*)([a-z_][a-zA-Z0-9_\']*=?|<<|>>|==|<=>|<=|<|>=|>|\+|-(self)?|~(self)?|\*|/|%|^|&&|&|\||\[\]=?)',
+                bygroups(Keyword, Whitespace, Name.Builtin, Whitespace, Punctuation, Whitespace, Name.Function)),
+            (r'(def)(\s+)([a-z_][a-zA-Z0-9_\']*=?|<<|>>|==|<=>|<=|<|>=|>|\+|-(self)?|~(self)?|\*|/|%|^|&&|&|\||\[\]=?)',
+                bygroups(Keyword, Whitespace, Name.Function)),
+            (r'def'+_nkw,               Keyword),
+            (r'if'+_nkw,                Keyword),
+            (r'elsif'+_nkw,             Keyword),
+            (r'else'+_nkw,              Keyword),
+            (r'unless'+_nkw,            Keyword),
+            (r'for'+_nkw,               Keyword),
+            (r'in'+_nkw,                Keyword),
+            (r'while'+_nkw,             Keyword),
+            (r'until'+_nkw,             Keyword),
+            (r'and'+_nkw,               Keyword),
+            (r'or'+_nkw,                Keyword),
+            (r'not'+_nkw,               Keyword),
+            (r'lambda'+_nkw,            Keyword),
+            (r'try'+_nkw,               Keyword),
+            (r'catch'+_nkw,             Keyword),
+            (r'return'+_nkw,            Keyword),
+            (r'next'+_nkw,              Keyword),
+            (r'last'+_nkw,              Keyword),
+            (r'throw'+_nkw,             Keyword),
+            (r'use'+_nkw,               Keyword),
+            (r'switch'+_nkw,            Keyword),
+            (r'\\',                     Keyword),
+            (r'λ',                      Keyword),
+            (r'__FILE__'+_nkw,          Name.Builtin.Pseudo),
+            (r'__LINE__'+_nkw,          Name.Builtin.Pseudo),
+            (r'[A-Z][a-zA-Z0-9_\']*'+_nkw, Name.Constant),
+            (r'[a-z_][a-zA-Z0-9_\']*'+_nkw, Name),
+            (r'@[a-z_][a-zA-Z0-9_\']*'+_nkw, Name.Variable.Instance),
+            (r'@@[a-z_][a-zA-Z0-9_\']*'+_nkw, Name.Variable.Class),
+            (r'\(',                     Punctuation),
+            (r'\)',                     Punctuation),
+            (r'\[',                     Punctuation),
+            (r'\]',                     Punctuation),
+            (r'\{',                     Punctuation),
+            (r'\}',                     right_angle_bracket),
+            (r';',                      Punctuation),
+            (r',',                      Punctuation),
+            (r'<<=',                    Operator),
+            (r'>>=',                    Operator),
+            (r'<<',                     Operator),
+            (r'>>',                     Operator),
+            (r'==',                     Operator),
+            (r'!=',                     Operator),
+            (r'=>',                     Operator),
+            (r'=',                      Operator),
+            (r'<=>',                    Operator),
+            (r'<=',                     Operator),
+            (r'>=',                     Operator),
+            (r'<',                      Operator),
+            (r'>',                      Operator),
+            (r'\+\+',                   Operator),
+            (r'\+=',                    Operator),
+            (r'-=',                     Operator),
+            (r'\*\*=',                  Operator),
+            (r'\*=',                    Operator),
+            (r'\*\*',                   Operator),
+            (r'\*',                     Operator),
+            (r'/=',                     Operator),
+            (r'\+',                     Operator),
+            (r'-',                      Operator),
+            (r'/',                      Operator),
+            (r'%=',                     Operator),
+            (r'%',                      Operator),
+            (r'^=',                     Operator),
+            (r'&&=',                    Operator),
+            (r'&=',                     Operator),
+            (r'&&',                     Operator),
+            (r'&',                      Operator),
+            (r'\|\|=',                  Operator),
+            (r'\|=',                    Operator),
+            (r'\|\|',                   Operator),
+            (r'\|',                     Operator),
+            (r'!',                      Operator),
+            (r'\.\.\.',                 Operator),
+            (r'\.\.',                   Operator),
+            (r'\.',                     Operator),
+            (r'::',                     Operator),
+            (r':',                      Operator),
+            (r'(\s|\n)+',               Whitespace),
+            (r'[a-z_][a-zA-Z0-9_\']*',  Name.Variable),
+        ],
+    }
+
+
+class SlashLexer(DelegatingLexer):
+    """
+    Lexer for the Slash programming language.
+    """
+
+    name = 'Slash'
+    aliases = ['slash']
+    filenames = ['*.sla']
+    url = 'https://github.com/arturadib/Slash-A'
+    version_added = '2.4'
+
+    def __init__(self, **options):
+        from pygments.lexers.web import HtmlLexer
+        super().__init__(HtmlLexer, SlashLanguageLexer, **options)
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smalltalk.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smalltalk.py
new file mode 100644
index 000000000..674b7b4b3
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smalltalk.py
@@ -0,0 +1,194 @@
+"""
+    pygments.lexers.smalltalk
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Smalltalk and related languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, bygroups, default
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['SmalltalkLexer', 'NewspeakLexer']
+
+
+class SmalltalkLexer(RegexLexer):
+    """
+    For Smalltalk syntax.
+    Contributed by Stefan Matthias Aust.
+    Rewritten by Nils Winter.
+    """
+    name = 'Smalltalk'
+    url = 'http://www.smalltalk.org/'
+    filenames = ['*.st']
+    aliases = ['smalltalk', 'squeak', 'st']
+    mimetypes = ['text/x-smalltalk']
+    version_added = '0.10'
+
+    tokens = {
+        'root': [
+            (r'(<)(\w+:)(.*?)(>)', bygroups(Text, Keyword, Text, Text)),
+            include('squeak fileout'),
+            include('whitespaces'),
+            include('method definition'),
+            (r'(\|)([\w\s]*)(\|)', bygroups(Operator, Name.Variable, Operator)),
+            include('objects'),
+            (r'\^|\:=|\_', Operator),
+            # temporaries
+            (r'[\]({}.;!]', Text),
+        ],
+        'method definition': [
+            # Not perfect can't allow whitespaces at the beginning and the
+            # without breaking everything
+            (r'([a-zA-Z]+\w*:)(\s*)(\w+)',
+             bygroups(Name.Function, Text, Name.Variable)),
+            (r'^(\b[a-zA-Z]+\w*\b)(\s*)$', bygroups(Name.Function, Text)),
+            (r'^([-+*/\\~<>=|&!?,@%]+)(\s*)(\w+)(\s*)$',
+             bygroups(Name.Function, Text, Name.Variable, Text)),
+        ],
+        'blockvariables': [
+            include('whitespaces'),
+            (r'(:)(\s*)(\w+)',
+             bygroups(Operator, Text, Name.Variable)),
+            (r'\|', Operator, '#pop'),
+            default('#pop'),  # else pop
+        ],
+        'literals': [
+            (r"'(''|[^'])*'", String, 'afterobject'),
+            (r'\$.', String.Char, 'afterobject'),
+            (r'#\(', String.Symbol, 'parenth'),
+            (r'\)', Text, 'afterobject'),
+            (r'(\d+r)?-?\d+(\.\d+)?(e-?\d+)?', Number, 'afterobject'),
+        ],
+        '_parenth_helper': [
+            include('whitespaces'),
+            (r'(\d+r)?-?\d+(\.\d+)?(e-?\d+)?', Number),
+            (r'[-+*/\\~<>=|&#!?,@%\w:]+', String.Symbol),
+            # literals
+            (r"'(''|[^'])*'", String),
+            (r'\$.', String.Char),
+            (r'#*\(', String.Symbol, 'inner_parenth'),
+        ],
+        'parenth': [
+            # This state is a bit tricky since
+            # we can't just pop this state
+            (r'\)', String.Symbol, ('root', 'afterobject')),
+            include('_parenth_helper'),
+        ],
+        'inner_parenth': [
+            (r'\)', String.Symbol, '#pop'),
+            include('_parenth_helper'),
+        ],
+        'whitespaces': [
+            # skip whitespace and comments
+            (r'\s+', Text),
+            (r'"(""|[^"])*"', Comment),
+        ],
+        'objects': [
+            (r'\[', Text, 'blockvariables'),
+            (r'\]', Text, 'afterobject'),
+            (r'\b(self|super|true|false|nil|thisContext)\b',
+             Name.Builtin.Pseudo, 'afterobject'),
+            (r'\b[A-Z]\w*(?!:)\b', Name.Class, 'afterobject'),
+            (r'\b[a-z]\w*(?!:)\b', Name.Variable, 'afterobject'),
+            (r'#("(""|[^"])*"|[-+*/\\~<>=|&!?,@%]+|[\w:]+)',
+             String.Symbol, 'afterobject'),
+            include('literals'),
+        ],
+        'afterobject': [
+            (r'! !$', Keyword, '#pop'),  # squeak chunk delimiter
+            include('whitespaces'),
+            (r'\b(ifTrue:|ifFalse:|whileTrue:|whileFalse:|timesRepeat:)',
+             Name.Builtin, '#pop'),
+            (r'\b(new\b(?!:))', Name.Builtin),
+            (r'\:=|\_', Operator, '#pop'),
+            (r'\b[a-zA-Z]+\w*:', Name.Function, '#pop'),
+            (r'\b[a-zA-Z]+\w*', Name.Function),
+            (r'\w+:?|[-+*/\\~<>=|&!?,@%]+', Name.Function, '#pop'),
+            (r'\.', Punctuation, '#pop'),
+            (r';', Punctuation),
+            (r'[\])}]', Text),
+            (r'[\[({]', Text, '#pop'),
+        ],
+        'squeak fileout': [
+            # Squeak fileout format (optional)
+            (r'^"(""|[^"])*"!', Keyword),
+            (r"^'(''|[^'])*'!", Keyword),
+            (r'^(!)(\w+)( commentStamp: )(.*?)( prior: .*?!\n)(.*?)(!)',
+                bygroups(Keyword, Name.Class, Keyword, String, Keyword, Text, Keyword)),
+            (r"^(!)(\w+(?: class)?)( methodsFor: )('(?:''|[^'])*')(.*?!)",
+                bygroups(Keyword, Name.Class, Keyword, String, Keyword)),
+            (r'^(\w+)( subclass: )(#\w+)'
+             r'(\s+instanceVariableNames: )(.*?)'
+             r'(\s+classVariableNames: )(.*?)'
+             r'(\s+poolDictionaries: )(.*?)'
+             r'(\s+category: )(.*?)(!)',
+                bygroups(Name.Class, Keyword, String.Symbol, Keyword, String, Keyword,
+                         String, Keyword, String, Keyword, String, Keyword)),
+            (r'^(\w+(?: class)?)(\s+instanceVariableNames: )(.*?)(!)',
+                bygroups(Name.Class, Keyword, String, Keyword)),
+            (r'(!\n)(\].*)(! !)$', bygroups(Keyword, Text, Keyword)),
+            (r'! !$', Keyword),
+        ],
+    }
+
+
+class NewspeakLexer(RegexLexer):
+    """
+    For Newspeak syntax.
+    """
+    name = 'Newspeak'
+    url = 'http://newspeaklanguage.org/'
+    filenames = ['*.ns2']
+    aliases = ['newspeak', ]
+    mimetypes = ['text/x-newspeak']
+    version_added = '1.1'
+
+    tokens = {
+        'root': [
+            (r'\b(Newsqueak2)\b', Keyword.Declaration),
+            (r"'[^']*'", String),
+            (r'\b(class)(\s+)(\w+)(\s*)',
+             bygroups(Keyword.Declaration, Text, Name.Class, Text)),
+            (r'\b(mixin|self|super|private|public|protected|nil|true|false)\b',
+             Keyword),
+            (r'(\w+\:)(\s*)([a-zA-Z_]\w+)',
+             bygroups(Name.Function, Text, Name.Variable)),
+            (r'(\w+)(\s*)(=)',
+             bygroups(Name.Attribute, Text, Operator)),
+            (r'<\w+>', Comment.Special),
+            include('expressionstat'),
+            include('whitespace')
+        ],
+
+        'expressionstat': [
+            (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
+            (r'\d+', Number.Integer),
+            (r':\w+', Name.Variable),
+            (r'(\w+)(::)', bygroups(Name.Variable, Operator)),
+            (r'\w+:', Name.Function),
+            (r'\w+', Name.Variable),
+            (r'\(|\)', Punctuation),
+            (r'\[|\]', Punctuation),
+            (r'\{|\}', Punctuation),
+
+            (r'(\^|\+|\/|~|\*|<|>|=|@|%|\||&|\?|!|,|-|:)', Operator),
+            (r'\.|;', Punctuation),
+            include('whitespace'),
+            include('literals'),
+        ],
+        'literals': [
+            (r'\$.', String),
+            (r"'[^']*'", String),
+            (r"#'[^']*'", String.Symbol),
+            (r"#\w+:?", String.Symbol),
+            (r"#(\+|\/|~|\*|<|>|=|@|%|\||&|\?|!|,|-)+", String.Symbol)
+        ],
+        'whitespace': [
+            (r'\s+', Text),
+            (r'"[^"]*"', Comment)
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smithy.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smithy.py
new file mode 100644
index 000000000..bd479aec4
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smithy.py
@@ -0,0 +1,77 @@
+"""
+    pygments.lexers.smithy
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Smithy IDL.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Keyword, Name, String, \
+    Number, Whitespace, Punctuation
+
+__all__ = ['SmithyLexer']
+
+
+class SmithyLexer(RegexLexer):
+    """
+    For Smithy IDL
+    """
+    name = 'Smithy'
+    url = 'https://awslabs.github.io/smithy/'
+    filenames = ['*.smithy']
+    aliases = ['smithy']
+    version_added = '2.10'
+
+    unquoted = r'[A-Za-z0-9_\.#$-]+'
+    identifier = r"[A-Za-z0-9_\.#$-]+"
+
+    simple_shapes = (
+        'use', 'byte', 'short', 'integer', 'long', 'float', 'document',
+        'double', 'bigInteger', 'bigDecimal', 'boolean', 'blob', 'string',
+        'timestamp',
+    )
+
+    aggregate_shapes = (
+       'apply', 'list', 'map', 'set', 'structure', 'union', 'resource',
+       'operation', 'service', 'trait'
+    )
+
+    tokens = {
+        'root': [
+            (r'///.*$', Comment.Multiline),
+            (r'//.*$', Comment),
+            (r'@[0-9a-zA-Z\.#-]*', Name.Decorator),
+            (r'(=)', Name.Decorator),
+            (r'^(\$version)(:)(.+)',
+                bygroups(Keyword.Declaration, Name.Decorator, Name.Class)),
+            (r'^(namespace)(\s+' + identifier + r')\b',
+                bygroups(Keyword.Declaration, Name.Class)),
+            (words(simple_shapes,
+                   prefix=r'^', suffix=r'(\s+' + identifier + r')\b'),
+                bygroups(Keyword.Declaration, Name.Class)),
+            (words(aggregate_shapes,
+                   prefix=r'^', suffix=r'(\s+' + identifier + r')'),
+                bygroups(Keyword.Declaration, Name.Class)),
+            (r'^(metadata)(\s+)((?:\S+)|(?:\"[^"]+\"))(\s*)(=)',
+                bygroups(Keyword.Declaration, Whitespace, Name.Class,
+                         Whitespace, Name.Decorator)),
+            (r"(true|false|null)", Keyword.Constant),
+            (r"(-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?)", Number),
+            (identifier + ":", Name.Label),
+            (identifier, Name.Variable.Class),
+            (r'\[', Text, "#push"),
+            (r'\]', Text, "#pop"),
+            (r'\(', Text, "#push"),
+            (r'\)', Text, "#pop"),
+            (r'\{', Text, "#push"),
+            (r'\}', Text, "#pop"),
+            (r'"{3}(\\\\|\n|\\")*"{3}', String.Doc),
+            (r'"(\\\\|\n|\\"|[^"])*"', String.Double),
+            (r"'(\\\\|\n|\\'|[^'])*'", String.Single),
+            (r'[:,]+', Punctuation),
+            (r'\s+', Whitespace),
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smv.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smv.py
new file mode 100644
index 000000000..bf97b52a5
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/smv.py
@@ -0,0 +1,78 @@
+"""
+    pygments.lexers.smv
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the SMV languages.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, Text
+
+__all__ = ['NuSMVLexer']
+
+
+class NuSMVLexer(RegexLexer):
+    """
+    Lexer for the NuSMV language.
+    """
+
+    name = 'NuSMV'
+    aliases = ['nusmv']
+    filenames = ['*.smv']
+    mimetypes = []
+    url = 'https://nusmv.fbk.eu'
+    version_added = '2.2'
+
+    tokens = {
+        'root': [
+            # Comments
+            (r'(?s)\/\-\-.*?\-\-/', Comment),
+            (r'--.*\n', Comment),
+
+            # Reserved
+            (words(('MODULE', 'DEFINE', 'MDEFINE', 'CONSTANTS', 'VAR', 'IVAR',
+                    'FROZENVAR', 'INIT', 'TRANS', 'INVAR', 'SPEC', 'CTLSPEC',
+                    'LTLSPEC', 'PSLSPEC', 'COMPUTE', 'NAME', 'INVARSPEC',
+                    'FAIRNESS', 'JUSTICE', 'COMPASSION', 'ISA', 'ASSIGN',
+                    'CONSTRAINT', 'SIMPWFF', 'CTLWFF', 'LTLWFF', 'PSLWFF',
+                    'COMPWFF', 'IN', 'MIN', 'MAX', 'MIRROR', 'PRED',
+                    'PREDICATES'), suffix=r'(?![\w$#-])'),
+             Keyword.Declaration),
+            (r'process(?![\w$#-])', Keyword),
+            (words(('array', 'of', 'boolean', 'integer', 'real', 'word'),
+                   suffix=r'(?![\w$#-])'), Keyword.Type),
+            (words(('case', 'esac'), suffix=r'(?![\w$#-])'), Keyword),
+            (words(('word1', 'bool', 'signed', 'unsigned', 'extend', 'resize',
+                    'sizeof', 'uwconst', 'swconst', 'init', 'self', 'count',
+                    'abs', 'max', 'min'), suffix=r'(?![\w$#-])'),
+             Name.Builtin),
+            (words(('EX', 'AX', 'EF', 'AF', 'EG', 'AG', 'E', 'F', 'O', 'G',
+                    'H', 'X', 'Y', 'Z', 'A', 'U', 'S', 'V', 'T', 'BU', 'EBF',
+                    'ABF', 'EBG', 'ABG', 'next', 'mod', 'union', 'in', 'xor',
+                    'xnor'), suffix=r'(?![\w$#-])'),
+                Operator.Word),
+            (words(('TRUE', 'FALSE'), suffix=r'(?![\w$#-])'), Keyword.Constant),
+
+            # Names
+            (r'[a-zA-Z_][\w$#-]*', Name.Variable),
+
+            # Operators
+            (r':=', Operator),
+            (r'[-&|+*/<>!=]', Operator),
+
+            # Literals
+            (r'\-?\d+\b', Number.Integer),
+            (r'0[su][bB]\d*_[01_]+', Number.Bin),
+            (r'0[su][oO]\d*_[0-7_]+', Number.Oct),
+            (r'0[su][dD]\d*_[\d_]+', Number.Decimal),
+            (r'0[su][hH]\d*_[\da-fA-F_]+', Number.Hex),
+
+            # Whitespace, punctuation and the rest
+            (r'\s+', Text.Whitespace),
+            (r'[()\[\]{};?:.,]', Punctuation),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/snobol.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/snobol.py
new file mode 100644
index 000000000..bab51e9b1
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/snobol.py
@@ -0,0 +1,82 @@
+"""
+    pygments.lexers.snobol
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the SNOBOL language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation
+
+__all__ = ['SnobolLexer']
+
+
+class SnobolLexer(RegexLexer):
+    """
+    Lexer for the SNOBOL4 programming language.
+
+    Recognizes the common ASCII equivalents of the original SNOBOL4 operators.
+    Does not require spaces around binary operators.
+    """
+
+    name = "Snobol"
+    aliases = ["snobol"]
+    filenames = ['*.snobol']
+    mimetypes = ['text/x-snobol']
+    url = 'https://www.regressive.org/snobol4'
+    version_added = '1.5'
+
+    tokens = {
+        # root state, start of line
+        # comments, continuation lines, and directives start in column 1
+        # as do labels
+        'root': [
+            (r'\*.*\n', Comment),
+            (r'[+.] ', Punctuation, 'statement'),
+            (r'-.*\n', Comment),
+            (r'END\s*\n', Name.Label, 'heredoc'),
+            (r'[A-Za-z$][\w$]*', Name.Label, 'statement'),
+            (r'\s+', Text, 'statement'),
+        ],
+        # statement state, line after continuation or label
+        'statement': [
+            (r'\s*\n', Text, '#pop'),
+            (r'\s+', Text),
+            (r'(?<=[^\w.])(LT|LE|EQ|NE|GE|GT|INTEGER|IDENT|DIFFER|LGT|SIZE|'
+             r'REPLACE|TRIM|DUPL|REMDR|DATE|TIME|EVAL|APPLY|OPSYN|LOAD|UNLOAD|'
+             r'LEN|SPAN|BREAK|ANY|NOTANY|TAB|RTAB|REM|POS|RPOS|FAIL|FENCE|'
+             r'ABORT|ARB|ARBNO|BAL|SUCCEED|INPUT|OUTPUT|TERMINAL)(?=[^\w.])',
+             Name.Builtin),
+            (r'[A-Za-z][\w.]*', Name),
+            # ASCII equivalents of original operators
+            # | for the EBCDIC equivalent, ! likewise
+            # \ for EBCDIC negation
+            (r'\*\*|[?$.!%*/#+\-@|&\\=]', Operator),
+            (r'"[^"]*"', String),
+            (r"'[^']*'", String),
+            # Accept SPITBOL syntax for real numbers
+            # as well as Macro SNOBOL4
+            (r'[0-9]+(?=[^.EeDd])', Number.Integer),
+            (r'[0-9]+(\.[0-9]*)?([EDed][-+]?[0-9]+)?', Number.Float),
+            # Goto
+            (r':', Punctuation, 'goto'),
+            (r'[()<>,;]', Punctuation),
+        ],
+        # Goto block
+        'goto': [
+            (r'\s*\n', Text, "#pop:2"),
+            (r'\s+', Text),
+            (r'F|S', Keyword),
+            (r'(\()([A-Za-z][\w.]*)(\))',
+             bygroups(Punctuation, Name.Label, Punctuation))
+        ],
+        # everything after the END statement is basically one
+        # big heredoc.
+        'heredoc': [
+            (r'.*\n', String.Heredoc)
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/solidity.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/solidity.py
new file mode 100644
index 000000000..3182a148a
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/solidity.py
@@ -0,0 +1,87 @@
+"""
+    pygments.lexers.solidity
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Solidity.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['SolidityLexer']
+
+
+class SolidityLexer(RegexLexer):
+    """
+    For Solidity source code.
+    """
+
+    name = 'Solidity'
+    aliases = ['solidity']
+    filenames = ['*.sol']
+    mimetypes = []
+    url = 'https://soliditylang.org'
+    version_added = '2.5'
+
+    datatype = (
+        r'\b(address|bool|(?:(?:bytes|hash|int|string|uint)(?:8|16|24|32|40|48|56|64'
+        r'|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208'
+        r'|216|224|232|240|248|256)?))\b'
+    )
+
+    tokens = {
+        'root': [
+            include('whitespace'),
+            include('comments'),
+            (r'\bpragma\s+solidity\b', Keyword, 'pragma'),
+            (r'\b(contract)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword, Whitespace, Name.Entity)),
+            (datatype + r'(\s+)((?:external|public|internal|private)\s+)?' +
+             r'([a-zA-Z_]\w*)',
+             bygroups(Keyword.Type, Whitespace, Keyword, Name.Variable)),
+            (r'\b(enum|event|function|struct)(\s+)([a-zA-Z_]\w*)',
+             bygroups(Keyword.Type, Whitespace, Name.Variable)),
+            (r'\b(msg|block|tx)\.([A-Za-z_][a-zA-Z0-9_]*)\b', Keyword),
+            (words((
+                'block', 'break', 'constant', 'constructor', 'continue',
+                'contract', 'do', 'else', 'external', 'false', 'for',
+                'function', 'if', 'import', 'inherited', 'internal', 'is',
+                'library', 'mapping', 'memory', 'modifier', 'msg', 'new',
+                'payable', 'private', 'public', 'require', 'return',
+                'returns', 'struct', 'suicide', 'throw', 'this', 'true',
+                'tx', 'var', 'while'), prefix=r'\b', suffix=r'\b'),
+             Keyword.Type),
+            (words(('keccak256',), prefix=r'\b', suffix=r'\b'), Name.Builtin),
+            (datatype, Keyword.Type),
+            include('constants'),
+            (r'[a-zA-Z_]\w*', Text),
+            (r'[~!%^&*+=|?:<>/-]', Operator),
+            (r'[.;{}(),\[\]]', Punctuation)
+        ],
+        'comments': [
+            (r'//(\n|[\w\W]*?[^\\]\n)', Comment.Single),
+            (r'/(\\\n)?[*][\w\W]*?[*](\\\n)?/', Comment.Multiline),
+            (r'/(\\\n)?[*][\w\W]*', Comment.Multiline)
+        ],
+        'constants': [
+            (r'("(\\"|.)*?")', String.Double),
+            (r"('(\\'|.)*?')", String.Single),
+            (r'\b0[xX][0-9a-fA-F]+\b', Number.Hex),
+            (r'\b\d+\b', Number.Decimal),
+        ],
+        'pragma': [
+            include('whitespace'),
+            include('comments'),
+            (r'(\^|>=|<)(\s*)(\d+\.\d+\.\d+)',
+             bygroups(Operator, Whitespace, Keyword)),
+            (r';', Punctuation, '#pop')
+        ],
+        'whitespace': [
+            (r'\s+', Whitespace),
+            (r'\n', Whitespace)
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/soong.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/soong.py
new file mode 100644
index 000000000..bbf204dd2
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/soong.py
@@ -0,0 +1,78 @@
+"""
+    pygments.lexers.soong
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for Soong (Android.bp Blueprint) files.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, include
+from pygments.token import Comment, Name, Number, Operator, Punctuation, \
+        String, Whitespace
+
+__all__ = ['SoongLexer']
+
+class SoongLexer(RegexLexer):
+    name = 'Soong'
+    version_added = '2.18'
+    url = 'https://source.android.com/docs/setup/reference/androidbp'
+    aliases = ['androidbp', 'bp', 'soong']
+    filenames = ['Android.bp']
+
+    tokens = {
+        'root': [
+            # A variable assignment
+            (r'(\w*)(\s*)(\+?=)(\s*)',
+             bygroups(Name.Variable, Whitespace, Operator, Whitespace),
+             'assign-rhs'),
+
+            # A top-level module
+            (r'(\w*)(\s*)(\{)',
+             bygroups(Name.Function, Whitespace, Punctuation),
+             'in-rule'),
+
+            # Everything else
+            include('comments'),
+            (r'\s+', Whitespace),  # newlines okay
+        ],
+        'assign-rhs': [
+            include('expr'),
+            (r'\n', Whitespace, '#pop'),
+        ],
+        'in-list': [
+            include('expr'),
+            include('comments'),
+            (r'\s+', Whitespace),  # newlines okay in a list
+            (r',', Punctuation),
+            (r'\]', Punctuation, '#pop'),
+        ],
+        'in-map': [
+            # A map key
+            (r'(\w+)(:)(\s*)', bygroups(Name, Punctuation, Whitespace)),
+
+            include('expr'),
+            include('comments'),
+            (r'\s+', Whitespace),  # newlines okay in a map
+            (r',', Punctuation),
+            (r'\}', Punctuation, '#pop'),
+        ],
+        'in-rule': [
+            # Just re-use map syntax
+            include('in-map'),
+        ],
+        'comments': [
+            (r'//.*', Comment.Single),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+        ],
+        'expr': [
+            (r'(true|false)\b', Name.Builtin),
+            (r'0x[0-9a-fA-F]+', Number.Hex),
+            (r'\d+', Number.Integer),
+            (r'".*?"', String),
+            (r'\{', Punctuation, 'in-map'),
+            (r'\[', Punctuation, 'in-list'),
+            (r'\w+', Name),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sophia.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sophia.py
new file mode 100644
index 000000000..37fcec5c3
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sophia.py
@@ -0,0 +1,102 @@
+"""
+    pygments.lexers.sophia
+    ~~~~~~~~~~~~~~~~~~~~~~
+
+    Lexer for Sophia.
+
+    Derived from pygments/lexers/reason.py.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, include, default, words
+from pygments.token import Comment, Keyword, Name, Number, Operator, \
+    Punctuation, String, Text
+
+__all__ = ['SophiaLexer']
+
+class SophiaLexer(RegexLexer):
+    """
+    A Sophia lexer.
+    """
+
+    name = 'Sophia'
+    aliases = ['sophia']
+    filenames = ['*.aes']
+    mimetypes = []
+    url = 'https://docs.aeternity.com/aesophia'
+    version_added = '2.11'
+
+    keywords = (
+        'contract', 'include', 'let', 'switch', 'type', 'record', 'datatype',
+        'if', 'elif', 'else', 'function', 'stateful', 'payable', 'public',
+        'entrypoint', 'private', 'indexed', 'namespace', 'interface', 'main',
+        'using', 'as', 'for', 'hiding',
+    )
+
+    builtins = ('state', 'put', 'abort', 'require')
+
+    word_operators = ('mod', 'band', 'bor', 'bxor', 'bnot')
+
+    primitive_types = ('int', 'address', 'bool', 'bits', 'bytes', 'string',
+                       'list', 'option', 'char', 'unit', 'map', 'event',
+                       'hash', 'signature', 'oracle', 'oracle_query')
+
+    tokens = {
+        'escape-sequence': [
+            (r'\\[\\"\'ntbr]', String.Escape),
+            (r'\\[0-9]{3}', String.Escape),
+            (r'\\x[0-9a-fA-F]{2}', String.Escape),
+        ],
+        'root': [
+            (r'\s+', Text.Whitespace),
+            (r'(true|false)\b', Keyword.Constant),
+            (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Class, 'dotted'),
+            (r'\b([A-Z][\w\']*)', Name.Function),
+            (r'//.*?\n', Comment.Single),
+            (r'\/\*(?!/)', Comment.Multiline, 'comment'),
+
+            (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex),
+            (r'#[\da-fA-F][\da-fA-F_]*', Name.Label),
+            (r'\d[\d_]*', Number.Integer),
+
+            (words(keywords, suffix=r'\b'), Keyword),
+            (words(builtins, suffix=r'\b'), Name.Builtin),
+            (words(word_operators, prefix=r'\b', suffix=r'\b'), Operator.Word),
+            (words(primitive_types, prefix=r'\b', suffix=r'\b'), Keyword.Type),
+
+            (r'[=!<>+\\*/:&|?~@^-]', Operator.Word),
+            (r'[.;:{}(),\[\]]', Punctuation),
+
+            (r"(ak_|ok_|oq_|ct_)[\w']*", Name.Label),
+            (r"[^\W\d][\w']*", Name),
+
+            (r"'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'",
+             String.Char),
+            (r"'.'", String.Char),
+            (r"'[a-z][\w]*", Name.Variable),
+
+            (r'"', String.Double, 'string')
+        ],
+        'comment': [
+            (r'[^/*]+', Comment.Multiline),
+            (r'\/\*', Comment.Multiline, '#push'),
+            (r'\*\/', Comment.Multiline, '#pop'),
+            (r'\*', Comment.Multiline),
+        ],
+        'string': [
+            (r'[^\\"]+', String.Double),
+            include('escape-sequence'),
+            (r'\\\n', String.Double),
+            (r'"', String.Double, '#pop'),
+        ],
+        'dotted': [
+            (r'\s+', Text),
+            (r'\.', Punctuation),
+            (r'[A-Z][\w\']*(?=\s*\.)', Name.Function),
+            (r'[A-Z][\w\']*', Name.Function, '#pop'),
+            (r'[a-z_][\w\']*', Name, '#pop'),
+            default('#pop'),
+        ],
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/special.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/special.py
new file mode 100644
index 000000000..524946fc3
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/special.py
@@ -0,0 +1,122 @@
+"""
+    pygments.lexers.special
+    ~~~~~~~~~~~~~~~~~~~~~~~
+
+    Special lexers.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+import ast
+
+from pygments.lexer import Lexer, line_re
+from pygments.token import Token, Error, Text, Generic
+from pygments.util import get_choice_opt
+
+
+__all__ = ['TextLexer', 'OutputLexer', 'RawTokenLexer']
+
+
+class TextLexer(Lexer):
+    """
+    "Null" lexer, doesn't highlight anything.
+    """
+    name = 'Text only'
+    aliases = ['text']
+    filenames = ['*.txt']
+    mimetypes = ['text/plain']
+    url = ""
+    version_added = ''
+
+    priority = 0.01
+
+    def get_tokens_unprocessed(self, text):
+        yield 0, Text, text
+
+    def analyse_text(text):
+        return TextLexer.priority
+
+
+class OutputLexer(Lexer):
+    """
+    Simple lexer that highlights everything as ``Token.Generic.Output``.
+    """
+    name = 'Text output'
+    aliases = ['output']
+    url = ""
+    version_added = '2.10'
+    _example = "output/output"
+
+    def get_tokens_unprocessed(self, text):
+        yield 0, Generic.Output, text
+
+
+_ttype_cache = {}
+
+
+class RawTokenLexer(Lexer):
+    """
+    Recreate a token stream formatted with the `RawTokenFormatter`.
+
+    Additional options accepted:
+
+    `compress`
+        If set to ``"gz"`` or ``"bz2"``, decompress the token stream with
+        the given compression algorithm before lexing (default: ``""``).
+    """
+    name = 'Raw token data'
+    aliases = []
+    filenames = []
+    mimetypes = ['application/x-pygments-tokens']
+    url = 'https://pygments.org/docs/formatters/#RawTokenFormatter'
+    version_added = ''
+
+    def __init__(self, **options):
+        self.compress = get_choice_opt(options, 'compress',
+                                       ['', 'none', 'gz', 'bz2'], '')
+        Lexer.__init__(self, **options)
+
+    def get_tokens(self, text):
+        if self.compress:
+            if isinstance(text, str):
+                text = text.encode('latin1')
+            try:
+                if self.compress == 'gz':
+                    import gzip
+                    text = gzip.decompress(text)
+                elif self.compress == 'bz2':
+                    import bz2
+                    text = bz2.decompress(text)
+            except OSError:
+                yield Error, text.decode('latin1')
+        if isinstance(text, bytes):
+            text = text.decode('latin1')
+
+        # do not call Lexer.get_tokens() because stripping is not optional.
+        text = text.strip('\n') + '\n'
+        for i, t, v in self.get_tokens_unprocessed(text):
+            yield t, v
+
+    def get_tokens_unprocessed(self, text):
+        length = 0
+        for match in line_re.finditer(text):
+            try:
+                ttypestr, val = match.group().rstrip().split('\t', 1)
+                ttype = _ttype_cache.get(ttypestr)
+                if not ttype:
+                    ttype = Token
+                    ttypes = ttypestr.split('.')[1:]
+                    for ttype_ in ttypes:
+                        if not ttype_ or not ttype_[0].isupper():
+                            raise ValueError('malformed token name')
+                        ttype = getattr(ttype, ttype_)
+                    _ttype_cache[ttypestr] = ttype
+                val = ast.literal_eval(val)
+                if not isinstance(val, str):
+                    raise ValueError('expected str')
+            except (SyntaxError, ValueError):
+                val = match.group()
+                ttype = Error
+            yield length, ttype, val
+            length += len(val)
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/spice.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/spice.py
new file mode 100644
index 000000000..9d2b1a1a8
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/spice.py
@@ -0,0 +1,70 @@
+"""
+    pygments.lexers.spice
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Lexers for the Spice programming language.
+
+    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+"""
+
+from pygments.lexer import RegexLexer, bygroups, words
+from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
+    Number, Punctuation, Whitespace
+
+__all__ = ['SpiceLexer']
+
+
+class SpiceLexer(RegexLexer):
+    """
+    For Spice source.
+    """
+    name = 'Spice'
+    url = 'https://www.spicelang.com'
+    filenames = ['*.spice']
+    aliases = ['spice', 'spicelang']
+    mimetypes = ['text/x-spice']
+    version_added = '2.11'
+
+    tokens = {
+        'root': [
+            (r'\n', Whitespace),
+            (r'\s+', Whitespace),
+            (r'\\\n', Text),
+            # comments
+            (r'//(.*?)\n', Comment.Single),
+            (r'/(\\\n)?[*]{2}(.|\n)*?[*](\\\n)?/', String.Doc),
+            (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
+            # keywords
+            (r'(import|as)\b', Keyword.Namespace),
+            (r'(f|p|type|struct|interface|enum|alias|operator)\b', Keyword.Declaration),
+            (words(('if', 'else', 'switch', 'case', 'default', 'for', 'foreach', 'do',
+                    'while', 'break', 'continue', 'fallthrough', 'return', 'assert',
+                    'unsafe', 'ext'), suffix=r'\b'), Keyword),
+            (words(('const', 'signed', 'unsigned', 'inline', 'public', 'heap', 'compose'),
+                   suffix=r'\b'), Keyword.Pseudo),
+            (words(('new', 'yield', 'stash', 'pick', 'sync', 'class'), suffix=r'\b'),
+                   Keyword.Reserved),
+            (r'(true|false|nil)\b', Keyword.Constant),
+            (words(('double', 'int', 'short', 'long', 'byte', 'char', 'string',
+                    'bool', 'dyn'), suffix=r'\b'), Keyword.Type),
+            (words(('printf', 'sizeof', 'alignof', 'len', 'panic'), suffix=r'\b(\()'),
+             bygroups(Name.Builtin, Punctuation)),
+            # numeric literals
+            (r'[-]?[0-9]*[.][0-9]+([eE][+-]?[0-9]+)?', Number.Double),
+            (r'0[bB][01]+[slu]?', Number.Bin),
+            (r'0[oO][0-7]+[slu]?', Number.Oct),
+            (r'0[xXhH][0-9a-fA-F]+[slu]?', Number.Hex),
+            (r'(0[dD])?[0-9]+[slu]?', Number.Integer),
+            # string literal
+            (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
+            # char literal
+            (r'\'(\\\\|\\[^\\]|[^\'\\])\'', String.Char),
+            # tokens
+            (r'<<=|>>=|<<|>>|<=|>=|\+=|-=|\*=|/=|\%=|\|=|&=|\^=|&&|\|\||&|\||'
+             r'\+\+|--|\%|\^|\~|==|!=|->|::|[.]{3}|#!|#|[+\-*/&]', Operator),
+            (r'[|<>=!()\[\]{}.,;:\?]', Punctuation),
+            # identifiers
+            (r'[^\W\d]\w*', Name.Other),
+        ]
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sql.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sql.py
new file mode 100644
index 000000000..d3e6f17f3
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/pygments/lexers/sql.py
@@ -0,0 +1,1109 @@
+"""
+    pygments.lexers.sql
+    ~~~~~~~~~~~~~~~~~~~
+
+    Lexers for various SQL dialects and related interactive sessions.
+
+    Postgres specific lexers:
+
+    `PostgresLexer`
+        A SQL lexer for the PostgreSQL dialect. Differences w.r.t. the SQL
+        lexer are:
+
+        - keywords and data types list parsed from the PG docs (run the
+          `_postgres_builtins` module to update them);
+        - Content of $-strings parsed using a specific lexer, e.g. the content
+          of a PL/Python function is parsed using the Python lexer;
+        - parse PG specific constructs: E-strings, $-strings, U&-strings,
+          different operators and punctuation.
+
+    `PlPgsqlLexer`
+        A lexer for the PL/pgSQL language. Adds a few specific construct on
+        top of the PG SQL lexer (such as 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
L_AgX7>EC|?RNBcj

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/tamil_stemmer.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/__pycache__/tamil_stemmer.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ad24e02683eec53f4a189c1e15ecffccea1c36dd
GIT binary patch
literal 35916
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

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/among.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/among.py
new file mode 100644
index 000000000..bf822e44d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/among.py
@@ -0,0 +1,13 @@
+
+class Among(object):
+    def __init__(self, s, substring_i, result, method=None):
+        """
+        @ivar s search string
+        @ivar substring index to longest matching substring
+        @ivar result of the lookup
+        @ivar method method to use if substring matches
+        """
+        self.s = s
+        self.substring_i = substring_i
+        self.result = result
+        self.method = method
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/arabic_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/arabic_stemmer.py
new file mode 100644
index 000000000..194df111a
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/arabic_stemmer.py
@@ -0,0 +1,1200 @@
+#-*- coding: utf-8 -*-
+# Generated from arabic.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class ArabicStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from arabic.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    B_is_defined = False
+    B_is_verb = False
+    B_is_noun = False
+
+    def __r_Normalize_pre(self):
+        v_1 = self.cursor
+        try:
+            while True:
+                v_2 = self.cursor
+                try:
+                    try:
+                        v_3 = self.cursor
+                        try:
+                            self.bra = self.cursor
+                            among_var = self.find_among(ArabicStemmer.a_0)
+                            if among_var == 0:
+                                raise lab3()
+                            self.ket = self.cursor
+                            if among_var == 1:
+                                if not self.slice_del():
+                                    return False
+
+                            elif among_var == 2:
+                                if not self.slice_from(u"0"):
+                                    return False
+                            elif among_var == 3:
+                                if not self.slice_from(u"1"):
+                                    return False
+                            elif among_var == 4:
+                                if not self.slice_from(u"2"):
+                                    return False
+                            elif among_var == 5:
+                                if not self.slice_from(u"3"):
+                                    return False
+                            elif among_var == 6:
+                                if not self.slice_from(u"4"):
+                                    return False
+                            elif among_var == 7:
+                                if not self.slice_from(u"5"):
+                                    return False
+                            elif among_var == 8:
+                                if not self.slice_from(u"6"):
+                                    return False
+                            elif among_var == 9:
+                                if not self.slice_from(u"7"):
+                                    return False
+                            elif among_var == 10:
+                                if not self.slice_from(u"8"):
+                                    return False
+                            elif among_var == 11:
+                                if not self.slice_from(u"9"):
+                                    return False
+                            elif among_var == 12:
+                                if not self.slice_from(u"\u0621"):
+                                    return False
+                            elif among_var == 13:
+                                if not self.slice_from(u"\u0623"):
+                                    return False
+                            elif among_var == 14:
+                                if not self.slice_from(u"\u0625"):
+                                    return False
+                            elif among_var == 15:
+                                if not self.slice_from(u"\u0626"):
+                                    return False
+                            elif among_var == 16:
+                                if not self.slice_from(u"\u0622"):
+                                    return False
+                            elif among_var == 17:
+                                if not self.slice_from(u"\u0624"):
+                                    return False
+                            elif among_var == 18:
+                                if not self.slice_from(u"\u0627"):
+                                    return False
+                            elif among_var == 19:
+                                if not self.slice_from(u"\u0628"):
+                                    return False
+                            elif among_var == 20:
+                                if not self.slice_from(u"\u0629"):
+                                    return False
+                            elif among_var == 21:
+                                if not self.slice_from(u"\u062A"):
+                                    return False
+                            elif among_var == 22:
+                                if not self.slice_from(u"\u062B"):
+                                    return False
+                            elif among_var == 23:
+                                if not self.slice_from(u"\u062C"):
+                                    return False
+                            elif among_var == 24:
+                                if not self.slice_from(u"\u062D"):
+                                    return False
+                            elif among_var == 25:
+                                if not self.slice_from(u"\u062E"):
+                                    return False
+                            elif among_var == 26:
+                                if not self.slice_from(u"\u062F"):
+                                    return False
+                            elif among_var == 27:
+                                if not self.slice_from(u"\u0630"):
+                                    return False
+                            elif among_var == 28:
+                                if not self.slice_from(u"\u0631"):
+                                    return False
+                            elif among_var == 29:
+                                if not self.slice_from(u"\u0632"):
+                                    return False
+                            elif among_var == 30:
+                                if not self.slice_from(u"\u0633"):
+                                    return False
+                            elif among_var == 31:
+                                if not self.slice_from(u"\u0634"):
+                                    return False
+                            elif among_var == 32:
+                                if not self.slice_from(u"\u0635"):
+                                    return False
+                            elif among_var == 33:
+                                if not self.slice_from(u"\u0636"):
+                                    return False
+                            elif among_var == 34:
+                                if not self.slice_from(u"\u0637"):
+                                    return False
+                            elif among_var == 35:
+                                if not self.slice_from(u"\u0638"):
+                                    return False
+                            elif among_var == 36:
+                                if not self.slice_from(u"\u0639"):
+                                    return False
+                            elif among_var == 37:
+                                if not self.slice_from(u"\u063A"):
+                                    return False
+                            elif among_var == 38:
+                                if not self.slice_from(u"\u0641"):
+                                    return False
+                            elif among_var == 39:
+                                if not self.slice_from(u"\u0642"):
+                                    return False
+                            elif among_var == 40:
+                                if not self.slice_from(u"\u0643"):
+                                    return False
+                            elif among_var == 41:
+                                if not self.slice_from(u"\u0644"):
+                                    return False
+                            elif among_var == 42:
+                                if not self.slice_from(u"\u0645"):
+                                    return False
+                            elif among_var == 43:
+                                if not self.slice_from(u"\u0646"):
+                                    return False
+                            elif among_var == 44:
+                                if not self.slice_from(u"\u0647"):
+                                    return False
+                            elif among_var == 45:
+                                if not self.slice_from(u"\u0648"):
+                                    return False
+                            elif among_var == 46:
+                                if not self.slice_from(u"\u0649"):
+                                    return False
+                            elif among_var == 47:
+                                if not self.slice_from(u"\u064A"):
+                                    return False
+                            elif among_var == 48:
+                                if not self.slice_from(u"\u0644\u0627"):
+                                    return False
+                            elif among_var == 49:
+                                if not self.slice_from(u"\u0644\u0623"):
+                                    return False
+                            elif among_var == 50:
+                                if not self.slice_from(u"\u0644\u0625"):
+                                    return False
+                            else:
+                                if not self.slice_from(u"\u0644\u0622"):
+                                    return False
+                            raise lab2()
+                        except lab3: pass
+                        self.cursor = v_3
+                        if self.cursor >= self.limit:
+                            raise lab1()
+                        self.cursor += 1
+                    except lab2: pass
+                    continue
+                except lab1: pass
+                self.cursor = v_2
+                break
+        except lab0: pass
+        self.cursor = v_1
+        return True
+
+    def __r_Normalize_post(self):
+        v_1 = self.cursor
+        try:
+            self.limit_backward = self.cursor
+            self.cursor = self.limit
+            self.ket = self.cursor
+            if self.find_among_b(ArabicStemmer.a_1) == 0:
+                raise lab0()
+            self.bra = self.cursor
+            if not self.slice_from(u"\u0621"):
+                return False
+            self.cursor = self.limit_backward
+        except lab0: pass
+        self.cursor = v_1
+        v_2 = self.cursor
+        try:
+            while True:
+                v_3 = self.cursor
+                try:
+                    try:
+                        v_4 = self.cursor
+                        try:
+                            self.bra = self.cursor
+                            among_var = self.find_among(ArabicStemmer.a_2)
+                            if among_var == 0:
+                                raise lab4()
+                            self.ket = self.cursor
+                            if among_var == 1:
+                                if not self.slice_from(u"\u0627"):
+                                    return False
+                            elif among_var == 2:
+                                if not self.slice_from(u"\u0648"):
+                                    return False
+                            else:
+                                if not self.slice_from(u"\u064A"):
+                                    return False
+                            raise lab3()
+                        except lab4: pass
+                        self.cursor = v_4
+                        if self.cursor >= self.limit:
+                            raise lab2()
+                        self.cursor += 1
+                    except lab3: pass
+                    continue
+                except lab2: pass
+                self.cursor = v_3
+                break
+        except lab1: pass
+        self.cursor = v_2
+        return True
+
+    def __r_Checks1(self):
+        self.bra = self.cursor
+        among_var = self.find_among(ArabicStemmer.a_3)
+        if among_var == 0:
+            return False
+        self.ket = self.cursor
+        if among_var == 1:
+            if len(self.current) <= 4:
+                return False
+            self.B_is_noun = True
+            self.B_is_verb = False
+            self.B_is_defined = True
+        else:
+            if len(self.current) <= 3:
+                return False
+            self.B_is_noun = True
+            self.B_is_verb = False
+            self.B_is_defined = True
+        return True
+
+    def __r_Prefix_Step1(self):
+        self.bra = self.cursor
+        among_var = self.find_among(ArabicStemmer.a_4)
+        if among_var == 0:
+            return False
+        self.ket = self.cursor
+        if among_var == 1:
+            if len(self.current) <= 3:
+                return False
+            if not self.slice_from(u"\u0623"):
+                return False
+        elif among_var == 2:
+            if len(self.current) <= 3:
+                return False
+            if not self.slice_from(u"\u0622"):
+                return False
+        elif among_var == 3:
+            if len(self.current) <= 3:
+                return False
+            if not self.slice_from(u"\u0627"):
+                return False
+        else:
+            if len(self.current) <= 3:
+                return False
+            if not self.slice_from(u"\u0625"):
+                return False
+        return True
+
+    def __r_Prefix_Step2(self):
+        self.bra = self.cursor
+        if self.find_among(ArabicStemmer.a_5) == 0:
+            return False
+        self.ket = self.cursor
+        if len(self.current) <= 3:
+            return False
+        v_1 = self.cursor
+        try:
+            if not self.eq_s(u"\u0627"):
+                raise lab0()
+            return False
+        except lab0: pass
+        self.cursor = v_1
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_Prefix_Step3a_Noun(self):
+        self.bra = self.cursor
+        among_var = self.find_among(ArabicStemmer.a_6)
+        if among_var == 0:
+            return False
+        self.ket = self.cursor
+        if among_var == 1:
+            if len(self.current) <= 5:
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if len(self.current) <= 4:
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Prefix_Step3b_Noun(self):
+        self.bra = self.cursor
+        among_var = self.find_among(ArabicStemmer.a_7)
+        if among_var == 0:
+            return False
+        self.ket = self.cursor
+        if among_var == 1:
+            if len(self.current) <= 3:
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if len(self.current) <= 3:
+                return False
+            if not self.slice_from(u"\u0628"):
+                return False
+        elif among_var == 3:
+            if len(self.current) <= 3:
+                return False
+            if not self.slice_from(u"\u0643"):
+                return False
+        return True
+
+    def __r_Prefix_Step3_Verb(self):
+        self.bra = self.cursor
+        among_var = self.find_among(ArabicStemmer.a_8)
+        if among_var == 0:
+            return False
+        self.ket = self.cursor
+        if among_var == 1:
+            if len(self.current) <= 4:
+                return False
+            if not self.slice_from(u"\u064A"):
+                return False
+        elif among_var == 2:
+            if len(self.current) <= 4:
+                return False
+            if not self.slice_from(u"\u062A"):
+                return False
+        elif among_var == 3:
+            if len(self.current) <= 4:
+                return False
+            if not self.slice_from(u"\u0646"):
+                return False
+        else:
+            if len(self.current) <= 4:
+                return False
+            if not self.slice_from(u"\u0623"):
+                return False
+        return True
+
+    def __r_Prefix_Step4_Verb(self):
+        self.bra = self.cursor
+        if self.find_among(ArabicStemmer.a_9) == 0:
+            return False
+        self.ket = self.cursor
+        if len(self.current) <= 4:
+            return False
+        self.B_is_verb = True
+        self.B_is_noun = False
+        if not self.slice_from(u"\u0627\u0633\u062A"):
+            return False
+        return True
+
+    def __r_Suffix_Noun_Step1a(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(ArabicStemmer.a_10)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if len(self.current) < 4:
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if len(self.current) < 5:
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if len(self.current) < 6:
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Suffix_Noun_Step1b(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArabicStemmer.a_11) == 0:
+            return False
+        self.bra = self.cursor
+        if len(self.current) <= 5:
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_Suffix_Noun_Step2a(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArabicStemmer.a_12) == 0:
+            return False
+        self.bra = self.cursor
+        if len(self.current) <= 4:
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_Suffix_Noun_Step2b(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArabicStemmer.a_13) == 0:
+            return False
+        self.bra = self.cursor
+        if len(self.current) < 5:
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_Suffix_Noun_Step2c1(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArabicStemmer.a_14) == 0:
+            return False
+        self.bra = self.cursor
+        if len(self.current) < 4:
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_Suffix_Noun_Step2c2(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArabicStemmer.a_15) == 0:
+            return False
+        self.bra = self.cursor
+        if len(self.current) < 4:
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_Suffix_Noun_Step3(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArabicStemmer.a_16) == 0:
+            return False
+        self.bra = self.cursor
+        if len(self.current) < 3:
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_Suffix_Verb_Step1(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(ArabicStemmer.a_17)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if len(self.current) < 4:
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if len(self.current) < 5:
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if len(self.current) < 6:
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Suffix_Verb_Step2a(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(ArabicStemmer.a_18)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if len(self.current) < 4:
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if len(self.current) < 5:
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 3:
+            if len(self.current) <= 5:
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if len(self.current) < 6:
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Suffix_Verb_Step2b(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArabicStemmer.a_19) == 0:
+            return False
+        self.bra = self.cursor
+        if len(self.current) < 5:
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_Suffix_Verb_Step2c(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(ArabicStemmer.a_20)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if len(self.current) < 4:
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if len(self.current) < 6:
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Suffix_All_alef_maqsura(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArabicStemmer.a_21) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_from(u"\u064A"):
+            return False
+        return True
+
+    def _stem(self):
+        self.B_is_noun = True
+        self.B_is_verb = True
+        self.B_is_defined = False
+        v_1 = self.cursor
+        self.__r_Checks1()
+        self.cursor = v_1
+        self.__r_Normalize_pre()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_3 = self.limit - self.cursor
+        try:
+            try:
+                v_4 = self.limit - self.cursor
+                try:
+                    if not self.B_is_verb:
+                        raise lab2()
+                    try:
+                        v_5 = self.limit - self.cursor
+                        try:
+                            v_6 = 1
+                            while True:
+                                v_7 = self.limit - self.cursor
+                                try:
+                                    if not self.__r_Suffix_Verb_Step1():
+                                        raise lab5()
+                                    v_6 -= 1
+                                    continue
+                                except lab5: pass
+                                self.cursor = self.limit - v_7
+                                break
+                            if v_6 > 0:
+                                raise lab4()
+                            try:
+                                v_8 = self.limit - self.cursor
+                                try:
+                                    if not self.__r_Suffix_Verb_Step2a():
+                                        raise lab7()
+                                    raise lab6()
+                                except lab7: pass
+                                self.cursor = self.limit - v_8
+                                try:
+                                    if not self.__r_Suffix_Verb_Step2c():
+                                        raise lab8()
+                                    raise lab6()
+                                except lab8: pass
+                                self.cursor = self.limit - v_8
+                                if self.cursor <= self.limit_backward:
+                                    raise lab4()
+                                self.cursor -= 1
+                            except lab6: pass
+                            raise lab3()
+                        except lab4: pass
+                        self.cursor = self.limit - v_5
+                        try:
+                            if not self.__r_Suffix_Verb_Step2b():
+                                raise lab9()
+                            raise lab3()
+                        except lab9: pass
+                        self.cursor = self.limit - v_5
+                        if not self.__r_Suffix_Verb_Step2a():
+                            raise lab2()
+                    except lab3: pass
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_4
+                try:
+                    if not self.B_is_noun:
+                        raise lab10()
+                    v_9 = self.limit - self.cursor
+                    try:
+                        try:
+                            v_10 = self.limit - self.cursor
+                            try:
+                                if not self.__r_Suffix_Noun_Step2c2():
+                                    raise lab13()
+                                raise lab12()
+                            except lab13: pass
+                            self.cursor = self.limit - v_10
+                            try:
+                                try:
+                                    if not self.B_is_defined:
+                                        raise lab15()
+                                    raise lab14()
+                                except lab15: pass
+                                if not self.__r_Suffix_Noun_Step1a():
+                                    raise lab14()
+                                try:
+                                    v_12 = self.limit - self.cursor
+                                    try:
+                                        if not self.__r_Suffix_Noun_Step2a():
+                                            raise lab17()
+                                        raise lab16()
+                                    except lab17: pass
+                                    self.cursor = self.limit - v_12
+                                    try:
+                                        if not self.__r_Suffix_Noun_Step2b():
+                                            raise lab18()
+                                        raise lab16()
+                                    except lab18: pass
+                                    self.cursor = self.limit - v_12
+                                    try:
+                                        if not self.__r_Suffix_Noun_Step2c1():
+                                            raise lab19()
+                                        raise lab16()
+                                    except lab19: pass
+                                    self.cursor = self.limit - v_12
+                                    if self.cursor <= self.limit_backward:
+                                        raise lab14()
+                                    self.cursor -= 1
+                                except lab16: pass
+                                raise lab12()
+                            except lab14: pass
+                            self.cursor = self.limit - v_10
+                            try:
+                                if not self.__r_Suffix_Noun_Step1b():
+                                    raise lab20()
+                                try:
+                                    v_13 = self.limit - self.cursor
+                                    try:
+                                        if not self.__r_Suffix_Noun_Step2a():
+                                            raise lab22()
+                                        raise lab21()
+                                    except lab22: pass
+                                    self.cursor = self.limit - v_13
+                                    try:
+                                        if not self.__r_Suffix_Noun_Step2b():
+                                            raise lab23()
+                                        raise lab21()
+                                    except lab23: pass
+                                    self.cursor = self.limit - v_13
+                                    if not self.__r_Suffix_Noun_Step2c1():
+                                        raise lab20()
+                                except lab21: pass
+                                raise lab12()
+                            except lab20: pass
+                            self.cursor = self.limit - v_10
+                            try:
+                                try:
+                                    if not self.B_is_defined:
+                                        raise lab25()
+                                    raise lab24()
+                                except lab25: pass
+                                if not self.__r_Suffix_Noun_Step2a():
+                                    raise lab24()
+                                raise lab12()
+                            except lab24: pass
+                            self.cursor = self.limit - v_10
+                            if not self.__r_Suffix_Noun_Step2b():
+                                self.cursor = self.limit - v_9
+                                raise lab11()
+                        except lab12: pass
+                    except lab11: pass
+                    if not self.__r_Suffix_Noun_Step3():
+                        raise lab10()
+                    raise lab1()
+                except lab10: pass
+                self.cursor = self.limit - v_4
+                if not self.__r_Suffix_All_alef_maqsura():
+                    raise lab0()
+            except lab1: pass
+        except lab0: pass
+        self.cursor = self.limit - v_3
+        self.cursor = self.limit_backward
+        v_15 = self.cursor
+        try:
+            v_16 = self.cursor
+            try:
+                if not self.__r_Prefix_Step1():
+                    self.cursor = v_16
+                    raise lab27()
+            except lab27: pass
+            v_17 = self.cursor
+            try:
+                if not self.__r_Prefix_Step2():
+                    self.cursor = v_17
+                    raise lab28()
+            except lab28: pass
+            try:
+                v_18 = self.cursor
+                try:
+                    if not self.__r_Prefix_Step3a_Noun():
+                        raise lab30()
+                    raise lab29()
+                except lab30: pass
+                self.cursor = v_18
+                try:
+                    if not self.B_is_noun:
+                        raise lab31()
+                    if not self.__r_Prefix_Step3b_Noun():
+                        raise lab31()
+                    raise lab29()
+                except lab31: pass
+                self.cursor = v_18
+                if not self.B_is_verb:
+                    raise lab26()
+                v_19 = self.cursor
+                try:
+                    if not self.__r_Prefix_Step3_Verb():
+                        self.cursor = v_19
+                        raise lab32()
+                except lab32: pass
+                if not self.__r_Prefix_Step4_Verb():
+                    raise lab26()
+            except lab29: pass
+        except lab26: pass
+        self.cursor = v_15
+        self.__r_Normalize_post()
+        return True
+
+    a_0 = [
+        Among(u"\u0640", -1, 1),
+        Among(u"\u064B", -1, 1),
+        Among(u"\u064C", -1, 1),
+        Among(u"\u064D", -1, 1),
+        Among(u"\u064E", -1, 1),
+        Among(u"\u064F", -1, 1),
+        Among(u"\u0650", -1, 1),
+        Among(u"\u0651", -1, 1),
+        Among(u"\u0652", -1, 1),
+        Among(u"\u0660", -1, 2),
+        Among(u"\u0661", -1, 3),
+        Among(u"\u0662", -1, 4),
+        Among(u"\u0663", -1, 5),
+        Among(u"\u0664", -1, 6),
+        Among(u"\u0665", -1, 7),
+        Among(u"\u0666", -1, 8),
+        Among(u"\u0667", -1, 9),
+        Among(u"\u0668", -1, 10),
+        Among(u"\u0669", -1, 11),
+        Among(u"\uFE80", -1, 12),
+        Among(u"\uFE81", -1, 16),
+        Among(u"\uFE82", -1, 16),
+        Among(u"\uFE83", -1, 13),
+        Among(u"\uFE84", -1, 13),
+        Among(u"\uFE85", -1, 17),
+        Among(u"\uFE86", -1, 17),
+        Among(u"\uFE87", -1, 14),
+        Among(u"\uFE88", -1, 14),
+        Among(u"\uFE89", -1, 15),
+        Among(u"\uFE8A", -1, 15),
+        Among(u"\uFE8B", -1, 15),
+        Among(u"\uFE8C", -1, 15),
+        Among(u"\uFE8D", -1, 18),
+        Among(u"\uFE8E", -1, 18),
+        Among(u"\uFE8F", -1, 19),
+        Among(u"\uFE90", -1, 19),
+        Among(u"\uFE91", -1, 19),
+        Among(u"\uFE92", -1, 19),
+        Among(u"\uFE93", -1, 20),
+        Among(u"\uFE94", -1, 20),
+        Among(u"\uFE95", -1, 21),
+        Among(u"\uFE96", -1, 21),
+        Among(u"\uFE97", -1, 21),
+        Among(u"\uFE98", -1, 21),
+        Among(u"\uFE99", -1, 22),
+        Among(u"\uFE9A", -1, 22),
+        Among(u"\uFE9B", -1, 22),
+        Among(u"\uFE9C", -1, 22),
+        Among(u"\uFE9D", -1, 23),
+        Among(u"\uFE9E", -1, 23),
+        Among(u"\uFE9F", -1, 23),
+        Among(u"\uFEA0", -1, 23),
+        Among(u"\uFEA1", -1, 24),
+        Among(u"\uFEA2", -1, 24),
+        Among(u"\uFEA3", -1, 24),
+        Among(u"\uFEA4", -1, 24),
+        Among(u"\uFEA5", -1, 25),
+        Among(u"\uFEA6", -1, 25),
+        Among(u"\uFEA7", -1, 25),
+        Among(u"\uFEA8", -1, 25),
+        Among(u"\uFEA9", -1, 26),
+        Among(u"\uFEAA", -1, 26),
+        Among(u"\uFEAB", -1, 27),
+        Among(u"\uFEAC", -1, 27),
+        Among(u"\uFEAD", -1, 28),
+        Among(u"\uFEAE", -1, 28),
+        Among(u"\uFEAF", -1, 29),
+        Among(u"\uFEB0", -1, 29),
+        Among(u"\uFEB1", -1, 30),
+        Among(u"\uFEB2", -1, 30),
+        Among(u"\uFEB3", -1, 30),
+        Among(u"\uFEB4", -1, 30),
+        Among(u"\uFEB5", -1, 31),
+        Among(u"\uFEB6", -1, 31),
+        Among(u"\uFEB7", -1, 31),
+        Among(u"\uFEB8", -1, 31),
+        Among(u"\uFEB9", -1, 32),
+        Among(u"\uFEBA", -1, 32),
+        Among(u"\uFEBB", -1, 32),
+        Among(u"\uFEBC", -1, 32),
+        Among(u"\uFEBD", -1, 33),
+        Among(u"\uFEBE", -1, 33),
+        Among(u"\uFEBF", -1, 33),
+        Among(u"\uFEC0", -1, 33),
+        Among(u"\uFEC1", -1, 34),
+        Among(u"\uFEC2", -1, 34),
+        Among(u"\uFEC3", -1, 34),
+        Among(u"\uFEC4", -1, 34),
+        Among(u"\uFEC5", -1, 35),
+        Among(u"\uFEC6", -1, 35),
+        Among(u"\uFEC7", -1, 35),
+        Among(u"\uFEC8", -1, 35),
+        Among(u"\uFEC9", -1, 36),
+        Among(u"\uFECA", -1, 36),
+        Among(u"\uFECB", -1, 36),
+        Among(u"\uFECC", -1, 36),
+        Among(u"\uFECD", -1, 37),
+        Among(u"\uFECE", -1, 37),
+        Among(u"\uFECF", -1, 37),
+        Among(u"\uFED0", -1, 37),
+        Among(u"\uFED1", -1, 38),
+        Among(u"\uFED2", -1, 38),
+        Among(u"\uFED3", -1, 38),
+        Among(u"\uFED4", -1, 38),
+        Among(u"\uFED5", -1, 39),
+        Among(u"\uFED6", -1, 39),
+        Among(u"\uFED7", -1, 39),
+        Among(u"\uFED8", -1, 39),
+        Among(u"\uFED9", -1, 40),
+        Among(u"\uFEDA", -1, 40),
+        Among(u"\uFEDB", -1, 40),
+        Among(u"\uFEDC", -1, 40),
+        Among(u"\uFEDD", -1, 41),
+        Among(u"\uFEDE", -1, 41),
+        Among(u"\uFEDF", -1, 41),
+        Among(u"\uFEE0", -1, 41),
+        Among(u"\uFEE1", -1, 42),
+        Among(u"\uFEE2", -1, 42),
+        Among(u"\uFEE3", -1, 42),
+        Among(u"\uFEE4", -1, 42),
+        Among(u"\uFEE5", -1, 43),
+        Among(u"\uFEE6", -1, 43),
+        Among(u"\uFEE7", -1, 43),
+        Among(u"\uFEE8", -1, 43),
+        Among(u"\uFEE9", -1, 44),
+        Among(u"\uFEEA", -1, 44),
+        Among(u"\uFEEB", -1, 44),
+        Among(u"\uFEEC", -1, 44),
+        Among(u"\uFEED", -1, 45),
+        Among(u"\uFEEE", -1, 45),
+        Among(u"\uFEEF", -1, 46),
+        Among(u"\uFEF0", -1, 46),
+        Among(u"\uFEF1", -1, 47),
+        Among(u"\uFEF2", -1, 47),
+        Among(u"\uFEF3", -1, 47),
+        Among(u"\uFEF4", -1, 47),
+        Among(u"\uFEF5", -1, 51),
+        Among(u"\uFEF6", -1, 51),
+        Among(u"\uFEF7", -1, 49),
+        Among(u"\uFEF8", -1, 49),
+        Among(u"\uFEF9", -1, 50),
+        Among(u"\uFEFA", -1, 50),
+        Among(u"\uFEFB", -1, 48),
+        Among(u"\uFEFC", -1, 48)
+    ]
+
+    a_1 = [
+        Among(u"\u0622", -1, 1),
+        Among(u"\u0623", -1, 1),
+        Among(u"\u0624", -1, 1),
+        Among(u"\u0625", -1, 1),
+        Among(u"\u0626", -1, 1)
+    ]
+
+    a_2 = [
+        Among(u"\u0622", -1, 1),
+        Among(u"\u0623", -1, 1),
+        Among(u"\u0624", -1, 2),
+        Among(u"\u0625", -1, 1),
+        Among(u"\u0626", -1, 3)
+    ]
+
+    a_3 = [
+        Among(u"\u0627\u0644", -1, 2),
+        Among(u"\u0628\u0627\u0644", -1, 1),
+        Among(u"\u0643\u0627\u0644", -1, 1),
+        Among(u"\u0644\u0644", -1, 2)
+    ]
+
+    a_4 = [
+        Among(u"\u0623\u0622", -1, 2),
+        Among(u"\u0623\u0623", -1, 1),
+        Among(u"\u0623\u0624", -1, 1),
+        Among(u"\u0623\u0625", -1, 4),
+        Among(u"\u0623\u0627", -1, 3)
+    ]
+
+    a_5 = [
+        Among(u"\u0641", -1, 1),
+        Among(u"\u0648", -1, 1)
+    ]
+
+    a_6 = [
+        Among(u"\u0627\u0644", -1, 2),
+        Among(u"\u0628\u0627\u0644", -1, 1),
+        Among(u"\u0643\u0627\u0644", -1, 1),
+        Among(u"\u0644\u0644", -1, 2)
+    ]
+
+    a_7 = [
+        Among(u"\u0628", -1, 1),
+        Among(u"\u0628\u0627", 0, -1),
+        Among(u"\u0628\u0628", 0, 2),
+        Among(u"\u0643\u0643", -1, 3)
+    ]
+
+    a_8 = [
+        Among(u"\u0633\u0623", -1, 4),
+        Among(u"\u0633\u062A", -1, 2),
+        Among(u"\u0633\u0646", -1, 3),
+        Among(u"\u0633\u064A", -1, 1)
+    ]
+
+    a_9 = [
+        Among(u"\u062A\u0633\u062A", -1, 1),
+        Among(u"\u0646\u0633\u062A", -1, 1),
+        Among(u"\u064A\u0633\u062A", -1, 1)
+    ]
+
+    a_10 = [
+        Among(u"\u0643\u0645\u0627", -1, 3),
+        Among(u"\u0647\u0645\u0627", -1, 3),
+        Among(u"\u0646\u0627", -1, 2),
+        Among(u"\u0647\u0627", -1, 2),
+        Among(u"\u0643", -1, 1),
+        Among(u"\u0643\u0645", -1, 2),
+        Among(u"\u0647\u0645", -1, 2),
+        Among(u"\u0647\u0646", -1, 2),
+        Among(u"\u0647", -1, 1),
+        Among(u"\u064A", -1, 1)
+    ]
+
+    a_11 = [
+        Among(u"\u0646", -1, 1)
+    ]
+
+    a_12 = [
+        Among(u"\u0627", -1, 1),
+        Among(u"\u0648", -1, 1),
+        Among(u"\u064A", -1, 1)
+    ]
+
+    a_13 = [
+        Among(u"\u0627\u062A", -1, 1)
+    ]
+
+    a_14 = [
+        Among(u"\u062A", -1, 1)
+    ]
+
+    a_15 = [
+        Among(u"\u0629", -1, 1)
+    ]
+
+    a_16 = [
+        Among(u"\u064A", -1, 1)
+    ]
+
+    a_17 = [
+        Among(u"\u0643\u0645\u0627", -1, 3),
+        Among(u"\u0647\u0645\u0627", -1, 3),
+        Among(u"\u0646\u0627", -1, 2),
+        Among(u"\u0647\u0627", -1, 2),
+        Among(u"\u0643", -1, 1),
+        Among(u"\u0643\u0645", -1, 2),
+        Among(u"\u0647\u0645", -1, 2),
+        Among(u"\u0643\u0646", -1, 2),
+        Among(u"\u0647\u0646", -1, 2),
+        Among(u"\u0647", -1, 1),
+        Among(u"\u0643\u0645\u0648", -1, 3),
+        Among(u"\u0646\u064A", -1, 2)
+    ]
+
+    a_18 = [
+        Among(u"\u0627", -1, 1),
+        Among(u"\u062A\u0627", 0, 2),
+        Among(u"\u062A\u0645\u0627", 0, 4),
+        Among(u"\u0646\u0627", 0, 2),
+        Among(u"\u062A", -1, 1),
+        Among(u"\u0646", -1, 1),
+        Among(u"\u0627\u0646", 5, 3),
+        Among(u"\u062A\u0646", 5, 2),
+        Among(u"\u0648\u0646", 5, 3),
+        Among(u"\u064A\u0646", 5, 3),
+        Among(u"\u064A", -1, 1)
+    ]
+
+    a_19 = [
+        Among(u"\u0648\u0627", -1, 1),
+        Among(u"\u062A\u0645", -1, 1)
+    ]
+
+    a_20 = [
+        Among(u"\u0648", -1, 1),
+        Among(u"\u062A\u0645\u0648", 0, 2)
+    ]
+
+    a_21 = [
+        Among(u"\u0649", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
+
+
+class lab9(BaseException): pass
+
+
+class lab10(BaseException): pass
+
+
+class lab11(BaseException): pass
+
+
+class lab12(BaseException): pass
+
+
+class lab13(BaseException): pass
+
+
+class lab14(BaseException): pass
+
+
+class lab15(BaseException): pass
+
+
+class lab16(BaseException): pass
+
+
+class lab17(BaseException): pass
+
+
+class lab18(BaseException): pass
+
+
+class lab19(BaseException): pass
+
+
+class lab20(BaseException): pass
+
+
+class lab21(BaseException): pass
+
+
+class lab22(BaseException): pass
+
+
+class lab23(BaseException): pass
+
+
+class lab24(BaseException): pass
+
+
+class lab25(BaseException): pass
+
+
+class lab26(BaseException): pass
+
+
+class lab27(BaseException): pass
+
+
+class lab28(BaseException): pass
+
+
+class lab29(BaseException): pass
+
+
+class lab30(BaseException): pass
+
+
+class lab31(BaseException): pass
+
+
+class lab32(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/armenian_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/armenian_stemmer.py
new file mode 100644
index 000000000..2c34619d2
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/armenian_stemmer.py
@@ -0,0 +1,315 @@
+#-*- coding: utf-8 -*-
+# Generated from armenian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class ArmenianStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from armenian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"ա", u"է", u"ի", u"օ", u"ւ", u"ե", u"ո", u"ը"}
+
+    I_p2 = 0
+    I_pV = 0
+
+    def __r_mark_regions(self):
+        self.I_pV = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            if not self.go_out_grouping(ArmenianStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            self.I_pV = self.cursor
+            if not self.go_in_grouping(ArmenianStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            if not self.go_out_grouping(ArmenianStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            if not self.go_in_grouping(ArmenianStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        return True
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_adjective(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArmenianStemmer.a_0) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_verb(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArmenianStemmer.a_1) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_noun(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArmenianStemmer.a_2) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_ending(self):
+        self.ket = self.cursor
+        if self.find_among_b(ArmenianStemmer.a_3) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R2():
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def _stem(self):
+        self.__r_mark_regions()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        if self.cursor < self.I_pV:
+            return False
+        v_3 = self.limit_backward
+        self.limit_backward = self.I_pV
+        v_4 = self.limit - self.cursor
+        self.__r_ending()
+        self.cursor = self.limit - v_4
+        v_5 = self.limit - self.cursor
+        self.__r_verb()
+        self.cursor = self.limit - v_5
+        v_6 = self.limit - self.cursor
+        self.__r_adjective()
+        self.cursor = self.limit - v_6
+        v_7 = self.limit - self.cursor
+        self.__r_noun()
+        self.cursor = self.limit - v_7
+        self.limit_backward = v_3
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"րորդ", -1, 1),
+        Among(u"երորդ", 0, 1),
+        Among(u"ալի", -1, 1),
+        Among(u"ակի", -1, 1),
+        Among(u"որակ", -1, 1),
+        Among(u"եղ", -1, 1),
+        Among(u"ական", -1, 1),
+        Among(u"արան", -1, 1),
+        Among(u"են", -1, 1),
+        Among(u"եկեն", 8, 1),
+        Among(u"երեն", 8, 1),
+        Among(u"որէն", -1, 1),
+        Among(u"ին", -1, 1),
+        Among(u"գին", 12, 1),
+        Among(u"ովին", 12, 1),
+        Among(u"լայն", -1, 1),
+        Among(u"վուն", -1, 1),
+        Among(u"պես", -1, 1),
+        Among(u"իվ", -1, 1),
+        Among(u"ատ", -1, 1),
+        Among(u"ավետ", -1, 1),
+        Among(u"կոտ", -1, 1),
+        Among(u"բար", -1, 1)
+    ]
+
+    a_1 = [
+        Among(u"ա", -1, 1),
+        Among(u"ացա", 0, 1),
+        Among(u"եցա", 0, 1),
+        Among(u"վե", -1, 1),
+        Among(u"ացրի", -1, 1),
+        Among(u"ացի", -1, 1),
+        Among(u"եցի", -1, 1),
+        Among(u"վեցի", 6, 1),
+        Among(u"ալ", -1, 1),
+        Among(u"ըալ", 8, 1),
+        Among(u"անալ", 8, 1),
+        Among(u"ենալ", 8, 1),
+        Among(u"ացնալ", 8, 1),
+        Among(u"ել", -1, 1),
+        Among(u"ըել", 13, 1),
+        Among(u"նել", 13, 1),
+        Among(u"ցնել", 15, 1),
+        Among(u"եցնել", 16, 1),
+        Among(u"չել", 13, 1),
+        Among(u"վել", 13, 1),
+        Among(u"ացվել", 19, 1),
+        Among(u"եցվել", 19, 1),
+        Among(u"տել", 13, 1),
+        Among(u"ատել", 22, 1),
+        Among(u"ոտել", 22, 1),
+        Among(u"կոտել", 24, 1),
+        Among(u"ված", -1, 1),
+        Among(u"ում", -1, 1),
+        Among(u"վում", 27, 1),
+        Among(u"ան", -1, 1),
+        Among(u"ցան", 29, 1),
+        Among(u"ացան", 30, 1),
+        Among(u"ացրին", -1, 1),
+        Among(u"ացին", -1, 1),
+        Among(u"եցին", -1, 1),
+        Among(u"վեցին", 34, 1),
+        Among(u"ալիս", -1, 1),
+        Among(u"ելիս", -1, 1),
+        Among(u"ավ", -1, 1),
+        Among(u"ացավ", 38, 1),
+        Among(u"եցավ", 38, 1),
+        Among(u"ալով", -1, 1),
+        Among(u"ելով", -1, 1),
+        Among(u"ար", -1, 1),
+        Among(u"ացար", 43, 1),
+        Among(u"եցար", 43, 1),
+        Among(u"ացրիր", -1, 1),
+        Among(u"ացիր", -1, 1),
+        Among(u"եցիր", -1, 1),
+        Among(u"վեցիր", 48, 1),
+        Among(u"աց", -1, 1),
+        Among(u"եց", -1, 1),
+        Among(u"ացրեց", 51, 1),
+        Among(u"ալուց", -1, 1),
+        Among(u"ելուց", -1, 1),
+        Among(u"ալու", -1, 1),
+        Among(u"ելու", -1, 1),
+        Among(u"աք", -1, 1),
+        Among(u"ցաք", 57, 1),
+        Among(u"ացաք", 58, 1),
+        Among(u"ացրիք", -1, 1),
+        Among(u"ացիք", -1, 1),
+        Among(u"եցիք", -1, 1),
+        Among(u"վեցիք", 62, 1),
+        Among(u"անք", -1, 1),
+        Among(u"ցանք", 64, 1),
+        Among(u"ացանք", 65, 1),
+        Among(u"ացրինք", -1, 1),
+        Among(u"ացինք", -1, 1),
+        Among(u"եցինք", -1, 1),
+        Among(u"վեցինք", 69, 1)
+    ]
+
+    a_2 = [
+        Among(u"որդ", -1, 1),
+        Among(u"ույթ", -1, 1),
+        Among(u"ուհի", -1, 1),
+        Among(u"ցի", -1, 1),
+        Among(u"իլ", -1, 1),
+        Among(u"ակ", -1, 1),
+        Among(u"յակ", 5, 1),
+        Among(u"անակ", 5, 1),
+        Among(u"իկ", -1, 1),
+        Among(u"ուկ", -1, 1),
+        Among(u"ան", -1, 1),
+        Among(u"պան", 10, 1),
+        Among(u"ստան", 10, 1),
+        Among(u"արան", 10, 1),
+        Among(u"եղէն", -1, 1),
+        Among(u"յուն", -1, 1),
+        Among(u"ություն", 15, 1),
+        Among(u"ածո", -1, 1),
+        Among(u"իչ", -1, 1),
+        Among(u"ուս", -1, 1),
+        Among(u"ուստ", -1, 1),
+        Among(u"գար", -1, 1),
+        Among(u"վոր", -1, 1),
+        Among(u"ավոր", 22, 1),
+        Among(u"ոց", -1, 1),
+        Among(u"անօց", -1, 1),
+        Among(u"ու", -1, 1),
+        Among(u"ք", -1, 1),
+        Among(u"չեք", 27, 1),
+        Among(u"իք", 27, 1),
+        Among(u"ալիք", 29, 1),
+        Among(u"անիք", 29, 1),
+        Among(u"վածք", 27, 1),
+        Among(u"ույք", 27, 1),
+        Among(u"ենք", 27, 1),
+        Among(u"ոնք", 27, 1),
+        Among(u"ունք", 27, 1),
+        Among(u"մունք", 36, 1),
+        Among(u"իչք", 27, 1),
+        Among(u"արք", 27, 1)
+    ]
+
+    a_3 = [
+        Among(u"սա", -1, 1),
+        Among(u"վա", -1, 1),
+        Among(u"ամբ", -1, 1),
+        Among(u"դ", -1, 1),
+        Among(u"անդ", 3, 1),
+        Among(u"ությանդ", 4, 1),
+        Among(u"վանդ", 4, 1),
+        Among(u"ոջդ", 3, 1),
+        Among(u"երդ", 3, 1),
+        Among(u"ներդ", 8, 1),
+        Among(u"ուդ", 3, 1),
+        Among(u"ը", -1, 1),
+        Among(u"անը", 11, 1),
+        Among(u"ությանը", 12, 1),
+        Among(u"վանը", 12, 1),
+        Among(u"ոջը", 11, 1),
+        Among(u"երը", 11, 1),
+        Among(u"ները", 16, 1),
+        Among(u"ի", -1, 1),
+        Among(u"վի", 18, 1),
+        Among(u"երի", 18, 1),
+        Among(u"ների", 20, 1),
+        Among(u"անում", -1, 1),
+        Among(u"երում", -1, 1),
+        Among(u"ներում", 23, 1),
+        Among(u"ն", -1, 1),
+        Among(u"ան", 25, 1),
+        Among(u"ության", 26, 1),
+        Among(u"վան", 26, 1),
+        Among(u"ին", 25, 1),
+        Among(u"երին", 29, 1),
+        Among(u"ներին", 30, 1),
+        Among(u"ությանն", 25, 1),
+        Among(u"երն", 25, 1),
+        Among(u"ներն", 33, 1),
+        Among(u"ուն", 25, 1),
+        Among(u"ոջ", -1, 1),
+        Among(u"ությանս", -1, 1),
+        Among(u"վանս", -1, 1),
+        Among(u"ոջս", -1, 1),
+        Among(u"ով", -1, 1),
+        Among(u"անով", 40, 1),
+        Among(u"վով", 40, 1),
+        Among(u"երով", 40, 1),
+        Among(u"ներով", 43, 1),
+        Among(u"եր", -1, 1),
+        Among(u"ներ", 45, 1),
+        Among(u"ց", -1, 1),
+        Among(u"ից", 47, 1),
+        Among(u"վանից", 48, 1),
+        Among(u"ոջից", 48, 1),
+        Among(u"վից", 48, 1),
+        Among(u"երից", 48, 1),
+        Among(u"ներից", 52, 1),
+        Among(u"ցից", 48, 1),
+        Among(u"ոց", 47, 1),
+        Among(u"ուց", 47, 1)
+    ]
+
+
+class lab0(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/basestemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/basestemmer.py
new file mode 100644
index 000000000..3b8b833c0
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/basestemmer.py
@@ -0,0 +1,289 @@
+class BaseStemmer(object):
+    def __init__(self):
+        self.set_current("")
+
+    def set_current(self, value):
+        '''
+        Set the self.current string.
+        '''
+        self.current = value
+        self.cursor = 0
+        self.limit = len(self.current)
+        self.limit_backward = 0
+        self.bra = self.cursor
+        self.ket = self.limit
+
+    def get_current(self):
+        '''
+        Get the self.current string.
+        '''
+        return self.current
+
+    def copy_from(self, other):
+        self.current          = other.current
+        self.cursor           = other.cursor
+        self.limit            = other.limit
+        self.limit_backward   = other.limit_backward
+        self.bra              = other.bra
+        self.ket              = other.ket
+
+    def in_grouping(self, s):
+        if self.cursor >= self.limit:
+            return False
+        if self.current[self.cursor] not in s:
+            return False
+        self.cursor += 1
+        return True
+
+    def go_in_grouping(self, s):
+        while self.cursor < self.limit:
+            if self.current[self.cursor] not in s:
+                return True
+            self.cursor += 1
+        return False
+
+    def in_grouping_b(self, s):
+        if self.cursor <= self.limit_backward:
+            return False
+        if self.current[self.cursor - 1] not in s:
+            return False
+        self.cursor -= 1
+        return True
+
+    def go_in_grouping_b(self, s):
+        while self.cursor > self.limit_backward:
+            if self.current[self.cursor - 1] not in s:
+                return True
+            self.cursor -= 1
+        return False
+
+    def out_grouping(self, s):
+        if self.cursor >= self.limit:
+            return False
+        if self.current[self.cursor] not in s:
+            self.cursor += 1
+            return True
+        return False
+
+    def go_out_grouping(self, s):
+        while self.cursor < self.limit:
+            if self.current[self.cursor] in s:
+                return True
+            self.cursor += 1
+        return False
+
+    def out_grouping_b(self, s):
+        if self.cursor <= self.limit_backward:
+            return False
+        if self.current[self.cursor - 1] not in s:
+            self.cursor -= 1
+            return True
+        return False
+
+    def go_out_grouping_b(self, s):
+        while self.cursor > self.limit_backward:
+            if self.current[self.cursor - 1] in s:
+                return True
+            self.cursor -= 1
+        return False
+
+    def eq_s(self, s):
+        if self.limit - self.cursor < len(s):
+            return False
+        if self.current[self.cursor:self.cursor + len(s)] != s:
+            return False
+        self.cursor += len(s)
+        return True
+
+    def eq_s_b(self, s):
+        if self.cursor - self.limit_backward < len(s):
+            return False
+        if self.current[self.cursor - len(s):self.cursor] != s:
+            return False
+        self.cursor -= len(s)
+        return True
+
+    def find_among(self, v):
+        i = 0
+        j = len(v)
+
+        c = self.cursor
+        l = self.limit
+
+        common_i = 0
+        common_j = 0
+
+        first_key_inspected = False
+
+        while True:
+            k = i + ((j - i) >> 1)
+            diff = 0
+            common = min(common_i, common_j) # smaller
+            w = v[k]
+            for i2 in range(common, len(w.s)):
+                if c + common == l:
+                    diff = -1
+                    break
+                diff = ord(self.current[c + common]) - ord(w.s[i2])
+                if diff != 0:
+                    break
+                common += 1
+            if diff < 0:
+                j = k
+                common_j = common
+            else:
+                i = k
+                common_i = common
+            if j - i <= 1:
+                if i > 0:
+                    break # v->s has been inspected
+                if j == i:
+                    break # only one item in v
+                # - but now we need to go round once more to get
+                # v->s inspected. This looks messy, but is actually
+                # the optimal approach.
+                if first_key_inspected:
+                    break
+                first_key_inspected = True
+        while True:
+            w = v[i]
+            if common_i >= len(w.s):
+                self.cursor = c + len(w.s)
+                if w.method is None:
+                    return w.result
+                res = w.method(self)
+                self.cursor = c + len(w.s)
+                if res:
+                    return w.result
+            i = w.substring_i
+            if i < 0:
+                return 0
+        return -1 # not reachable
+
+    def find_among_b(self, v):
+        '''
+        find_among_b is for backwards processing. Same comments apply
+        '''
+        i = 0
+        j = len(v)
+
+        c = self.cursor
+        lb = self.limit_backward
+
+        common_i = 0
+        common_j = 0
+
+        first_key_inspected = False
+
+        while True:
+            k = i + ((j - i) >> 1)
+            diff = 0
+            common = min(common_i, common_j)
+            w = v[k]
+            for i2 in range(len(w.s) - 1 - common, -1, -1):
+                if c - common == lb:
+                    diff = -1
+                    break
+                diff = ord(self.current[c - 1 - common]) - ord(w.s[i2])
+                if diff != 0:
+                    break
+                common += 1
+            if diff < 0:
+                j = k
+                common_j = common
+            else:
+                i = k
+                common_i = common
+            if j - i <= 1:
+                if i > 0:
+                    break
+                if j == i:
+                    break
+                if first_key_inspected:
+                    break
+                first_key_inspected = True
+        while True:
+            w = v[i]
+            if common_i >= len(w.s):
+                self.cursor = c - len(w.s)
+                if w.method is None:
+                    return w.result
+                res = w.method(self)
+                self.cursor = c - len(w.s)
+                if res:
+                    return w.result
+            i = w.substring_i
+            if i < 0:
+                return 0
+        return -1 # not reachable
+
+    def replace_s(self, c_bra, c_ket, s):
+        '''
+        to replace chars between c_bra and c_ket in self.current by the
+        chars in s.
+
+        @type c_bra int
+        @type c_ket int
+        @type s: string
+        '''
+        adjustment = len(s) - (c_ket - c_bra)
+        self.current = self.current[0:c_bra] + s + self.current[c_ket:]
+        self.limit += adjustment
+        if self.cursor >= c_ket:
+            self.cursor += adjustment
+        elif self.cursor > c_bra:
+            self.cursor = c_bra
+        return adjustment
+
+    def slice_check(self):
+        if self.bra < 0 or self.bra > self.ket or self.ket > self.limit or self.limit > len(self.current):
+            return False
+        return True
+
+    def slice_from(self, s):
+        '''
+        @type s string
+        '''
+        result = False
+        if self.slice_check():
+            self.replace_s(self.bra, self.ket, s)
+            result = True
+        return result
+
+    def slice_del(self):
+        return self.slice_from("")
+
+    def insert(self, c_bra, c_ket, s):
+        '''
+        @type c_bra int
+        @type c_ket int
+        @type s: string
+        '''
+        adjustment = self.replace_s(c_bra, c_ket, s)
+        if c_bra <= self.bra:
+            self.bra += adjustment
+        if c_bra <= self.ket:
+            self.ket += adjustment
+
+    def slice_to(self):
+        '''
+        Return the slice as a string.
+        '''
+        result = ''
+        if self.slice_check():
+            result = self.current[self.bra:self.ket]
+        return result
+
+    def assign_to(self):
+        '''
+        Return the current string up to the limit.
+        '''
+        return self.current[0:self.limit]
+
+    def stemWord(self, word):
+        self.set_current(word)
+        self._stem()
+        return self.get_current()
+
+    def stemWords(self, words):
+        return [self.stemWord(word) for word in words]
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/basque_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/basque_stemmer.py
new file mode 100644
index 000000000..ac66da468
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/basque_stemmer.py
@@ -0,0 +1,657 @@
+#-*- coding: utf-8 -*-
+# Generated from basque.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class BasqueStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from basque.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u"}
+
+    I_p2 = 0
+    I_p1 = 0
+    I_pV = 0
+
+    def __r_mark_regions(self):
+        self.I_pV = self.limit
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            try:
+                v_2 = self.cursor
+                try:
+                    if not self.in_grouping(BasqueStemmer.g_v):
+                        raise lab2()
+                    try:
+                        v_3 = self.cursor
+                        try:
+                            if not self.out_grouping(BasqueStemmer.g_v):
+                                raise lab4()
+                            if not self.go_out_grouping(BasqueStemmer.g_v):
+                                raise lab4()
+                            self.cursor += 1
+                            raise lab3()
+                        except lab4: pass
+                        self.cursor = v_3
+                        if not self.in_grouping(BasqueStemmer.g_v):
+                            raise lab2()
+                        if not self.go_in_grouping(BasqueStemmer.g_v):
+                            raise lab2()
+                        self.cursor += 1
+                    except lab3: pass
+                    raise lab1()
+                except lab2: pass
+                self.cursor = v_2
+                if not self.out_grouping(BasqueStemmer.g_v):
+                    raise lab0()
+                try:
+                    v_4 = self.cursor
+                    try:
+                        if not self.out_grouping(BasqueStemmer.g_v):
+                            raise lab6()
+                        if not self.go_out_grouping(BasqueStemmer.g_v):
+                            raise lab6()
+                        self.cursor += 1
+                        raise lab5()
+                    except lab6: pass
+                    self.cursor = v_4
+                    if not self.in_grouping(BasqueStemmer.g_v):
+                        raise lab0()
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                except lab5: pass
+            except lab1: pass
+            self.I_pV = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        v_5 = self.cursor
+        try:
+            if not self.go_out_grouping(BasqueStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            if not self.go_in_grouping(BasqueStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+            if not self.go_out_grouping(BasqueStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            if not self.go_in_grouping(BasqueStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab7: pass
+        self.cursor = v_5
+        return True
+
+    def __r_RV(self):
+        return self.I_pV <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_aditzak(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(BasqueStemmer.a_0)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_RV():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_izenak(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(BasqueStemmer.a_1)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_RV():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 3:
+            if not self.slice_from(u"jok"):
+                return False
+        elif among_var == 4:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 5:
+            if not self.slice_from(u"tra"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"minutu"):
+                return False
+        return True
+
+    def __r_adjetiboak(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(BasqueStemmer.a_2)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_RV():
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.slice_from(u"z"):
+                return False
+        return True
+
+    def _stem(self):
+        self.__r_mark_regions()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        while True:
+            v_2 = self.limit - self.cursor
+            try:
+                if not self.__r_aditzak():
+                    raise lab0()
+                continue
+            except lab0: pass
+            self.cursor = self.limit - v_2
+            break
+        while True:
+            v_3 = self.limit - self.cursor
+            try:
+                if not self.__r_izenak():
+                    raise lab1()
+                continue
+            except lab1: pass
+            self.cursor = self.limit - v_3
+            break
+        v_4 = self.limit - self.cursor
+        self.__r_adjetiboak()
+        self.cursor = self.limit - v_4
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"idea", -1, 1),
+        Among(u"bidea", 0, 1),
+        Among(u"kidea", 0, 1),
+        Among(u"pidea", 0, 1),
+        Among(u"kundea", -1, 1),
+        Among(u"galea", -1, 1),
+        Among(u"tailea", -1, 1),
+        Among(u"tzailea", -1, 1),
+        Among(u"gunea", -1, 1),
+        Among(u"kunea", -1, 1),
+        Among(u"tzaga", -1, 1),
+        Among(u"gaia", -1, 1),
+        Among(u"aldia", -1, 1),
+        Among(u"taldia", 12, 1),
+        Among(u"karia", -1, 1),
+        Among(u"garria", -1, 2),
+        Among(u"karria", -1, 1),
+        Among(u"ka", -1, 1),
+        Among(u"tzaka", 17, 1),
+        Among(u"la", -1, 1),
+        Among(u"mena", -1, 1),
+        Among(u"pena", -1, 1),
+        Among(u"kina", -1, 1),
+        Among(u"ezina", -1, 1),
+        Among(u"tezina", 23, 1),
+        Among(u"kuna", -1, 1),
+        Among(u"tuna", -1, 1),
+        Among(u"kizuna", -1, 1),
+        Among(u"era", -1, 1),
+        Among(u"bera", 28, 1),
+        Among(u"arabera", 29, -1),
+        Among(u"kera", 28, 1),
+        Among(u"pera", 28, 1),
+        Among(u"orra", -1, 1),
+        Among(u"korra", 33, 1),
+        Among(u"dura", -1, 1),
+        Among(u"gura", -1, 1),
+        Among(u"kura", -1, 1),
+        Among(u"tura", -1, 1),
+        Among(u"eta", -1, 1),
+        Among(u"keta", 39, 1),
+        Among(u"gailua", -1, 1),
+        Among(u"eza", -1, 1),
+        Among(u"erreza", 42, 1),
+        Among(u"tza", -1, 2),
+        Among(u"gaitza", 44, 1),
+        Among(u"kaitza", 44, 1),
+        Among(u"kuntza", 44, 1),
+        Among(u"ide", -1, 1),
+        Among(u"bide", 48, 1),
+        Among(u"kide", 48, 1),
+        Among(u"pide", 48, 1),
+        Among(u"kunde", -1, 1),
+        Among(u"tzake", -1, 1),
+        Among(u"tzeke", -1, 1),
+        Among(u"le", -1, 1),
+        Among(u"gale", 55, 1),
+        Among(u"taile", 55, 1),
+        Among(u"tzaile", 55, 1),
+        Among(u"gune", -1, 1),
+        Among(u"kune", -1, 1),
+        Among(u"tze", -1, 1),
+        Among(u"atze", 61, 1),
+        Among(u"gai", -1, 1),
+        Among(u"aldi", -1, 1),
+        Among(u"taldi", 64, 1),
+        Among(u"ki", -1, 1),
+        Among(u"ari", -1, 1),
+        Among(u"kari", 67, 1),
+        Among(u"lari", 67, 1),
+        Among(u"tari", 67, 1),
+        Among(u"etari", 70, 1),
+        Among(u"garri", -1, 2),
+        Among(u"karri", -1, 1),
+        Among(u"arazi", -1, 1),
+        Among(u"tarazi", 74, 1),
+        Among(u"an", -1, 1),
+        Among(u"ean", 76, 1),
+        Among(u"rean", 77, 1),
+        Among(u"kan", 76, 1),
+        Among(u"etan", 76, 1),
+        Among(u"atseden", -1, -1),
+        Among(u"men", -1, 1),
+        Among(u"pen", -1, 1),
+        Among(u"kin", -1, 1),
+        Among(u"rekin", 84, 1),
+        Among(u"ezin", -1, 1),
+        Among(u"tezin", 86, 1),
+        Among(u"tun", -1, 1),
+        Among(u"kizun", -1, 1),
+        Among(u"go", -1, 1),
+        Among(u"ago", 90, 1),
+        Among(u"tio", -1, 1),
+        Among(u"dako", -1, 1),
+        Among(u"or", -1, 1),
+        Among(u"kor", 94, 1),
+        Among(u"tzat", -1, 1),
+        Among(u"du", -1, 1),
+        Among(u"gailu", -1, 1),
+        Among(u"tu", -1, 1),
+        Among(u"atu", 99, 1),
+        Among(u"aldatu", 100, 1),
+        Among(u"tatu", 100, 1),
+        Among(u"baditu", 99, -1),
+        Among(u"ez", -1, 1),
+        Among(u"errez", 104, 1),
+        Among(u"tzez", 104, 1),
+        Among(u"gaitz", -1, 1),
+        Among(u"kaitz", -1, 1)
+    ]
+
+    a_1 = [
+        Among(u"ada", -1, 1),
+        Among(u"kada", 0, 1),
+        Among(u"anda", -1, 1),
+        Among(u"denda", -1, 1),
+        Among(u"gabea", -1, 1),
+        Among(u"kabea", -1, 1),
+        Among(u"aldea", -1, 1),
+        Among(u"kaldea", 6, 1),
+        Among(u"taldea", 6, 1),
+        Among(u"ordea", -1, 1),
+        Among(u"zalea", -1, 1),
+        Among(u"tzalea", 10, 1),
+        Among(u"gilea", -1, 1),
+        Among(u"emea", -1, 1),
+        Among(u"kumea", -1, 1),
+        Among(u"nea", -1, 1),
+        Among(u"enea", 15, 1),
+        Among(u"zionea", 15, 1),
+        Among(u"unea", 15, 1),
+        Among(u"gunea", 18, 1),
+        Among(u"pea", -1, 1),
+        Among(u"aurrea", -1, 1),
+        Among(u"tea", -1, 1),
+        Among(u"kotea", 22, 1),
+        Among(u"artea", 22, 1),
+        Among(u"ostea", 22, 1),
+        Among(u"etxea", -1, 1),
+        Among(u"ga", -1, 1),
+        Among(u"anga", 27, 1),
+        Among(u"gaia", -1, 1),
+        Among(u"aldia", -1, 1),
+        Among(u"taldia", 30, 1),
+        Among(u"handia", -1, 1),
+        Among(u"mendia", -1, 1),
+        Among(u"geia", -1, 1),
+        Among(u"egia", -1, 1),
+        Among(u"degia", 35, 1),
+        Among(u"tegia", 35, 1),
+        Among(u"nahia", -1, 1),
+        Among(u"ohia", -1, 1),
+        Among(u"kia", -1, 1),
+        Among(u"tokia", 40, 1),
+        Among(u"oia", -1, 1),
+        Among(u"koia", 42, 1),
+        Among(u"aria", -1, 1),
+        Among(u"karia", 44, 1),
+        Among(u"laria", 44, 1),
+        Among(u"taria", 44, 1),
+        Among(u"eria", -1, 1),
+        Among(u"keria", 48, 1),
+        Among(u"teria", 48, 1),
+        Among(u"garria", -1, 2),
+        Among(u"larria", -1, 1),
+        Among(u"kirria", -1, 1),
+        Among(u"duria", -1, 1),
+        Among(u"asia", -1, 1),
+        Among(u"tia", -1, 1),
+        Among(u"ezia", -1, 1),
+        Among(u"bizia", -1, 1),
+        Among(u"ontzia", -1, 1),
+        Among(u"ka", -1, 1),
+        Among(u"joka", 60, 3),
+        Among(u"aurka", 60, -1),
+        Among(u"ska", 60, 1),
+        Among(u"xka", 60, 1),
+        Among(u"zka", 60, 1),
+        Among(u"gibela", -1, 1),
+        Among(u"gela", -1, 1),
+        Among(u"kaila", -1, 1),
+        Among(u"skila", -1, 1),
+        Among(u"tila", -1, 1),
+        Among(u"ola", -1, 1),
+        Among(u"na", -1, 1),
+        Among(u"kana", 72, 1),
+        Among(u"ena", 72, 1),
+        Among(u"garrena", 74, 1),
+        Among(u"gerrena", 74, 1),
+        Among(u"urrena", 74, 1),
+        Among(u"zaina", 72, 1),
+        Among(u"tzaina", 78, 1),
+        Among(u"kina", 72, 1),
+        Among(u"mina", 72, 1),
+        Among(u"garna", 72, 1),
+        Among(u"una", 72, 1),
+        Among(u"duna", 83, 1),
+        Among(u"asuna", 83, 1),
+        Among(u"tasuna", 85, 1),
+        Among(u"ondoa", -1, 1),
+        Among(u"kondoa", 87, 1),
+        Among(u"ngoa", -1, 1),
+        Among(u"zioa", -1, 1),
+        Among(u"koa", -1, 1),
+        Among(u"takoa", 91, 1),
+        Among(u"zkoa", 91, 1),
+        Among(u"noa", -1, 1),
+        Among(u"zinoa", 94, 1),
+        Among(u"aroa", -1, 1),
+        Among(u"taroa", 96, 1),
+        Among(u"zaroa", 96, 1),
+        Among(u"eroa", -1, 1),
+        Among(u"oroa", -1, 1),
+        Among(u"osoa", -1, 1),
+        Among(u"toa", -1, 1),
+        Among(u"ttoa", 102, 1),
+        Among(u"ztoa", 102, 1),
+        Among(u"txoa", -1, 1),
+        Among(u"tzoa", -1, 1),
+        Among(u"ñoa", -1, 1),
+        Among(u"ra", -1, 1),
+        Among(u"ara", 108, 1),
+        Among(u"dara", 109, 1),
+        Among(u"liara", 109, 1),
+        Among(u"tiara", 109, 1),
+        Among(u"tara", 109, 1),
+        Among(u"etara", 113, 1),
+        Among(u"tzara", 109, 1),
+        Among(u"bera", 108, 1),
+        Among(u"kera", 108, 1),
+        Among(u"pera", 108, 1),
+        Among(u"ora", 108, 2),
+        Among(u"tzarra", 108, 1),
+        Among(u"korra", 108, 1),
+        Among(u"tra", 108, 1),
+        Among(u"sa", -1, 1),
+        Among(u"osa", 123, 1),
+        Among(u"ta", -1, 1),
+        Among(u"eta", 125, 1),
+        Among(u"keta", 126, 1),
+        Among(u"sta", 125, 1),
+        Among(u"dua", -1, 1),
+        Among(u"mendua", 129, 1),
+        Among(u"ordua", 129, 1),
+        Among(u"lekua", -1, 1),
+        Among(u"burua", -1, 1),
+        Among(u"durua", -1, 1),
+        Among(u"tsua", -1, 1),
+        Among(u"tua", -1, 1),
+        Among(u"mentua", 136, 1),
+        Among(u"estua", 136, 1),
+        Among(u"txua", -1, 1),
+        Among(u"zua", -1, 1),
+        Among(u"tzua", 140, 1),
+        Among(u"za", -1, 1),
+        Among(u"eza", 142, 1),
+        Among(u"eroza", 142, 1),
+        Among(u"tza", 142, 2),
+        Among(u"koitza", 145, 1),
+        Among(u"antza", 145, 1),
+        Among(u"gintza", 145, 1),
+        Among(u"kintza", 145, 1),
+        Among(u"kuntza", 145, 1),
+        Among(u"gabe", -1, 1),
+        Among(u"kabe", -1, 1),
+        Among(u"kide", -1, 1),
+        Among(u"alde", -1, 1),
+        Among(u"kalde", 154, 1),
+        Among(u"talde", 154, 1),
+        Among(u"orde", -1, 1),
+        Among(u"ge", -1, 1),
+        Among(u"zale", -1, 1),
+        Among(u"tzale", 159, 1),
+        Among(u"gile", -1, 1),
+        Among(u"eme", -1, 1),
+        Among(u"kume", -1, 1),
+        Among(u"ne", -1, 1),
+        Among(u"zione", 164, 1),
+        Among(u"une", 164, 1),
+        Among(u"gune", 166, 1),
+        Among(u"pe", -1, 1),
+        Among(u"aurre", -1, 1),
+        Among(u"te", -1, 1),
+        Among(u"kote", 170, 1),
+        Among(u"arte", 170, 1),
+        Among(u"oste", 170, 1),
+        Among(u"etxe", -1, 1),
+        Among(u"gai", -1, 1),
+        Among(u"di", -1, 1),
+        Among(u"aldi", 176, 1),
+        Among(u"taldi", 177, 1),
+        Among(u"geldi", 176, -1),
+        Among(u"handi", 176, 1),
+        Among(u"mendi", 176, 1),
+        Among(u"gei", -1, 1),
+        Among(u"egi", -1, 1),
+        Among(u"degi", 183, 1),
+        Among(u"tegi", 183, 1),
+        Among(u"nahi", -1, 1),
+        Among(u"ohi", -1, 1),
+        Among(u"ki", -1, 1),
+        Among(u"toki", 188, 1),
+        Among(u"oi", -1, 1),
+        Among(u"goi", 190, 1),
+        Among(u"koi", 190, 1),
+        Among(u"ari", -1, 1),
+        Among(u"kari", 193, 1),
+        Among(u"lari", 193, 1),
+        Among(u"tari", 193, 1),
+        Among(u"garri", -1, 2),
+        Among(u"larri", -1, 1),
+        Among(u"kirri", -1, 1),
+        Among(u"duri", -1, 1),
+        Among(u"asi", -1, 1),
+        Among(u"ti", -1, 1),
+        Among(u"ontzi", -1, 1),
+        Among(u"ñi", -1, 1),
+        Among(u"ak", -1, 1),
+        Among(u"ek", -1, 1),
+        Among(u"tarik", -1, 1),
+        Among(u"gibel", -1, 1),
+        Among(u"ail", -1, 1),
+        Among(u"kail", 209, 1),
+        Among(u"kan", -1, 1),
+        Among(u"tan", -1, 1),
+        Among(u"etan", 212, 1),
+        Among(u"en", -1, 4),
+        Among(u"ren", 214, 2),
+        Among(u"garren", 215, 1),
+        Among(u"gerren", 215, 1),
+        Among(u"urren", 215, 1),
+        Among(u"ten", 214, 4),
+        Among(u"tzen", 214, 4),
+        Among(u"zain", -1, 1),
+        Among(u"tzain", 221, 1),
+        Among(u"kin", -1, 1),
+        Among(u"min", -1, 1),
+        Among(u"dun", -1, 1),
+        Among(u"asun", -1, 1),
+        Among(u"tasun", 226, 1),
+        Among(u"aizun", -1, 1),
+        Among(u"ondo", -1, 1),
+        Among(u"kondo", 229, 1),
+        Among(u"go", -1, 1),
+        Among(u"ngo", 231, 1),
+        Among(u"zio", -1, 1),
+        Among(u"ko", -1, 1),
+        Among(u"trako", 234, 5),
+        Among(u"tako", 234, 1),
+        Among(u"etako", 236, 1),
+        Among(u"eko", 234, 1),
+        Among(u"tariko", 234, 1),
+        Among(u"sko", 234, 1),
+        Among(u"tuko", 234, 1),
+        Among(u"minutuko", 241, 6),
+        Among(u"zko", 234, 1),
+        Among(u"no", -1, 1),
+        Among(u"zino", 244, 1),
+        Among(u"ro", -1, 1),
+        Among(u"aro", 246, 1),
+        Among(u"igaro", 247, -1),
+        Among(u"taro", 247, 1),
+        Among(u"zaro", 247, 1),
+        Among(u"ero", 246, 1),
+        Among(u"giro", 246, 1),
+        Among(u"oro", 246, 1),
+        Among(u"oso", -1, 1),
+        Among(u"to", -1, 1),
+        Among(u"tto", 255, 1),
+        Among(u"zto", 255, 1),
+        Among(u"txo", -1, 1),
+        Among(u"tzo", -1, 1),
+        Among(u"gintzo", 259, 1),
+        Among(u"ño", -1, 1),
+        Among(u"zp", -1, 1),
+        Among(u"ar", -1, 1),
+        Among(u"dar", 263, 1),
+        Among(u"behar", 263, 1),
+        Among(u"zehar", 263, -1),
+        Among(u"liar", 263, 1),
+        Among(u"tiar", 263, 1),
+        Among(u"tar", 263, 1),
+        Among(u"tzar", 263, 1),
+        Among(u"or", -1, 2),
+        Among(u"kor", 271, 1),
+        Among(u"os", -1, 1),
+        Among(u"ket", -1, 1),
+        Among(u"du", -1, 1),
+        Among(u"mendu", 275, 1),
+        Among(u"ordu", 275, 1),
+        Among(u"leku", -1, 1),
+        Among(u"buru", -1, 2),
+        Among(u"duru", -1, 1),
+        Among(u"tsu", -1, 1),
+        Among(u"tu", -1, 1),
+        Among(u"tatu", 282, 4),
+        Among(u"mentu", 282, 1),
+        Among(u"estu", 282, 1),
+        Among(u"txu", -1, 1),
+        Among(u"zu", -1, 1),
+        Among(u"tzu", 287, 1),
+        Among(u"gintzu", 288, 1),
+        Among(u"z", -1, 1),
+        Among(u"ez", 290, 1),
+        Among(u"eroz", 290, 1),
+        Among(u"tz", 290, 1),
+        Among(u"koitz", 293, 1)
+    ]
+
+    a_2 = [
+        Among(u"zlea", -1, 2),
+        Among(u"keria", -1, 1),
+        Among(u"la", -1, 1),
+        Among(u"era", -1, 1),
+        Among(u"dade", -1, 1),
+        Among(u"tade", -1, 1),
+        Among(u"date", -1, 1),
+        Among(u"tate", -1, 1),
+        Among(u"gi", -1, 1),
+        Among(u"ki", -1, 1),
+        Among(u"ik", -1, 1),
+        Among(u"lanik", 10, 1),
+        Among(u"rik", 10, 1),
+        Among(u"larik", 12, 1),
+        Among(u"ztik", 10, 1),
+        Among(u"go", -1, 1),
+        Among(u"ro", -1, 1),
+        Among(u"ero", 16, 1),
+        Among(u"to", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/catalan_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/catalan_stemmer.py
new file mode 100644
index 000000000..4b597360d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/catalan_stemmer.py
@@ -0,0 +1,779 @@
+#-*- coding: utf-8 -*-
+# Generated from catalan.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class CatalanStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from catalan.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"á", u"à", u"é", u"è", u"í", u"ï", u"ó", u"ò", u"ú", u"ü"}
+
+    I_p2 = 0
+    I_p1 = 0
+
+    def __r_mark_regions(self):
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            if not self.go_out_grouping(CatalanStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            if not self.go_in_grouping(CatalanStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+            if not self.go_out_grouping(CatalanStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            if not self.go_in_grouping(CatalanStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        return True
+
+    def __r_cleaning(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(CatalanStemmer.a_0)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"a"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"e"):
+                        return False
+                elif among_var == 3:
+                    if not self.slice_from(u"i"):
+                        return False
+                elif among_var == 4:
+                    if not self.slice_from(u"o"):
+                        return False
+                elif among_var == 5:
+                    if not self.slice_from(u"u"):
+                        return False
+                elif among_var == 6:
+                    if not self.slice_from(u"."):
+                        return False
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_attached_pronoun(self):
+        self.ket = self.cursor
+        if self.find_among_b(CatalanStemmer.a_1) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_standard_suffix(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(CatalanStemmer.a_2)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 3:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"log"):
+                return False
+        elif among_var == 4:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"ic"):
+                return False
+        else:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"c"):
+                return False
+        return True
+
+    def __r_verb_suffix(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(CatalanStemmer.a_3)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_residual_suffix(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(CatalanStemmer.a_4)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"ic"):
+                return False
+        return True
+
+    def _stem(self):
+        self.__r_mark_regions()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_2 = self.limit - self.cursor
+        self.__r_attached_pronoun()
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        try:
+            try:
+                v_4 = self.limit - self.cursor
+                try:
+                    if not self.__r_standard_suffix():
+                        raise lab2()
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_4
+                if not self.__r_verb_suffix():
+                    raise lab0()
+            except lab1: pass
+        except lab0: pass
+        self.cursor = self.limit - v_3
+        v_5 = self.limit - self.cursor
+        self.__r_residual_suffix()
+        self.cursor = self.limit - v_5
+        self.cursor = self.limit_backward
+        v_6 = self.cursor
+        self.__r_cleaning()
+        self.cursor = v_6
+        return True
+
+    a_0 = [
+        Among(u"", -1, 7),
+        Among(u"·", 0, 6),
+        Among(u"à", 0, 1),
+        Among(u"á", 0, 1),
+        Among(u"è", 0, 2),
+        Among(u"é", 0, 2),
+        Among(u"ì", 0, 3),
+        Among(u"í", 0, 3),
+        Among(u"ï", 0, 3),
+        Among(u"ò", 0, 4),
+        Among(u"ó", 0, 4),
+        Among(u"ú", 0, 5),
+        Among(u"ü", 0, 5)
+    ]
+
+    a_1 = [
+        Among(u"la", -1, 1),
+        Among(u"-la", 0, 1),
+        Among(u"sela", 0, 1),
+        Among(u"le", -1, 1),
+        Among(u"me", -1, 1),
+        Among(u"-me", 4, 1),
+        Among(u"se", -1, 1),
+        Among(u"-te", -1, 1),
+        Among(u"hi", -1, 1),
+        Among(u"'hi", 8, 1),
+        Among(u"li", -1, 1),
+        Among(u"-li", 10, 1),
+        Among(u"'l", -1, 1),
+        Among(u"'m", -1, 1),
+        Among(u"-m", -1, 1),
+        Among(u"'n", -1, 1),
+        Among(u"-n", -1, 1),
+        Among(u"ho", -1, 1),
+        Among(u"'ho", 17, 1),
+        Among(u"lo", -1, 1),
+        Among(u"selo", 19, 1),
+        Among(u"'s", -1, 1),
+        Among(u"las", -1, 1),
+        Among(u"selas", 22, 1),
+        Among(u"les", -1, 1),
+        Among(u"-les", 24, 1),
+        Among(u"'ls", -1, 1),
+        Among(u"-ls", -1, 1),
+        Among(u"'ns", -1, 1),
+        Among(u"-ns", -1, 1),
+        Among(u"ens", -1, 1),
+        Among(u"los", -1, 1),
+        Among(u"selos", 31, 1),
+        Among(u"nos", -1, 1),
+        Among(u"-nos", 33, 1),
+        Among(u"vos", -1, 1),
+        Among(u"us", -1, 1),
+        Among(u"-us", 36, 1),
+        Among(u"'t", -1, 1)
+    ]
+
+    a_2 = [
+        Among(u"ica", -1, 4),
+        Among(u"lógica", 0, 3),
+        Among(u"enca", -1, 1),
+        Among(u"ada", -1, 2),
+        Among(u"ancia", -1, 1),
+        Among(u"encia", -1, 1),
+        Among(u"ència", -1, 1),
+        Among(u"ícia", -1, 1),
+        Among(u"logia", -1, 3),
+        Among(u"inia", -1, 1),
+        Among(u"íinia", 9, 1),
+        Among(u"eria", -1, 1),
+        Among(u"ària", -1, 1),
+        Among(u"atòria", -1, 1),
+        Among(u"alla", -1, 1),
+        Among(u"ella", -1, 1),
+        Among(u"ívola", -1, 1),
+        Among(u"ima", -1, 1),
+        Among(u"íssima", 17, 1),
+        Among(u"quíssima", 18, 5),
+        Among(u"ana", -1, 1),
+        Among(u"ina", -1, 1),
+        Among(u"era", -1, 1),
+        Among(u"sfera", 22, 1),
+        Among(u"ora", -1, 1),
+        Among(u"dora", 24, 1),
+        Among(u"adora", 25, 1),
+        Among(u"adura", -1, 1),
+        Among(u"esa", -1, 1),
+        Among(u"osa", -1, 1),
+        Among(u"assa", -1, 1),
+        Among(u"essa", -1, 1),
+        Among(u"issa", -1, 1),
+        Among(u"eta", -1, 1),
+        Among(u"ita", -1, 1),
+        Among(u"ota", -1, 1),
+        Among(u"ista", -1, 1),
+        Among(u"ialista", 36, 1),
+        Among(u"ionista", 36, 1),
+        Among(u"iva", -1, 1),
+        Among(u"ativa", 39, 1),
+        Among(u"nça", -1, 1),
+        Among(u"logía", -1, 3),
+        Among(u"ic", -1, 4),
+        Among(u"ístic", 43, 1),
+        Among(u"enc", -1, 1),
+        Among(u"esc", -1, 1),
+        Among(u"ud", -1, 1),
+        Among(u"atge", -1, 1),
+        Among(u"ble", -1, 1),
+        Among(u"able", 49, 1),
+        Among(u"ible", 49, 1),
+        Among(u"isme", -1, 1),
+        Among(u"ialisme", 52, 1),
+        Among(u"ionisme", 52, 1),
+        Among(u"ivisme", 52, 1),
+        Among(u"aire", -1, 1),
+        Among(u"icte", -1, 1),
+        Among(u"iste", -1, 1),
+        Among(u"ici", -1, 1),
+        Among(u"íci", -1, 1),
+        Among(u"logi", -1, 3),
+        Among(u"ari", -1, 1),
+        Among(u"tori", -1, 1),
+        Among(u"al", -1, 1),
+        Among(u"il", -1, 1),
+        Among(u"all", -1, 1),
+        Among(u"ell", -1, 1),
+        Among(u"ívol", -1, 1),
+        Among(u"isam", -1, 1),
+        Among(u"issem", -1, 1),
+        Among(u"ìssem", -1, 1),
+        Among(u"íssem", -1, 1),
+        Among(u"íssim", -1, 1),
+        Among(u"quíssim", 73, 5),
+        Among(u"amen", -1, 1),
+        Among(u"ìssin", -1, 1),
+        Among(u"ar", -1, 1),
+        Among(u"ificar", 77, 1),
+        Among(u"egar", 77, 1),
+        Among(u"ejar", 77, 1),
+        Among(u"itar", 77, 1),
+        Among(u"itzar", 77, 1),
+        Among(u"fer", -1, 1),
+        Among(u"or", -1, 1),
+        Among(u"dor", 84, 1),
+        Among(u"dur", -1, 1),
+        Among(u"doras", -1, 1),
+        Among(u"ics", -1, 4),
+        Among(u"lógics", 88, 3),
+        Among(u"uds", -1, 1),
+        Among(u"nces", -1, 1),
+        Among(u"ades", -1, 2),
+        Among(u"ancies", -1, 1),
+        Among(u"encies", -1, 1),
+        Among(u"ències", -1, 1),
+        Among(u"ícies", -1, 1),
+        Among(u"logies", -1, 3),
+        Among(u"inies", -1, 1),
+        Among(u"ínies", -1, 1),
+        Among(u"eries", -1, 1),
+        Among(u"àries", -1, 1),
+        Among(u"atòries", -1, 1),
+        Among(u"bles", -1, 1),
+        Among(u"ables", 103, 1),
+        Among(u"ibles", 103, 1),
+        Among(u"imes", -1, 1),
+        Among(u"íssimes", 106, 1),
+        Among(u"quíssimes", 107, 5),
+        Among(u"formes", -1, 1),
+        Among(u"ismes", -1, 1),
+        Among(u"ialismes", 110, 1),
+        Among(u"ines", -1, 1),
+        Among(u"eres", -1, 1),
+        Among(u"ores", -1, 1),
+        Among(u"dores", 114, 1),
+        Among(u"idores", 115, 1),
+        Among(u"dures", -1, 1),
+        Among(u"eses", -1, 1),
+        Among(u"oses", -1, 1),
+        Among(u"asses", -1, 1),
+        Among(u"ictes", -1, 1),
+        Among(u"ites", -1, 1),
+        Among(u"otes", -1, 1),
+        Among(u"istes", -1, 1),
+        Among(u"ialistes", 124, 1),
+        Among(u"ionistes", 124, 1),
+        Among(u"iques", -1, 4),
+        Among(u"lógiques", 127, 3),
+        Among(u"ives", -1, 1),
+        Among(u"atives", 129, 1),
+        Among(u"logíes", -1, 3),
+        Among(u"allengües", -1, 1),
+        Among(u"icis", -1, 1),
+        Among(u"ícis", -1, 1),
+        Among(u"logis", -1, 3),
+        Among(u"aris", -1, 1),
+        Among(u"toris", -1, 1),
+        Among(u"ls", -1, 1),
+        Among(u"als", 138, 1),
+        Among(u"ells", 138, 1),
+        Among(u"ims", -1, 1),
+        Among(u"íssims", 141, 1),
+        Among(u"quíssims", 142, 5),
+        Among(u"ions", -1, 1),
+        Among(u"cions", 144, 1),
+        Among(u"acions", 145, 2),
+        Among(u"esos", -1, 1),
+        Among(u"osos", -1, 1),
+        Among(u"assos", -1, 1),
+        Among(u"issos", -1, 1),
+        Among(u"ers", -1, 1),
+        Among(u"ors", -1, 1),
+        Among(u"dors", 152, 1),
+        Among(u"adors", 153, 1),
+        Among(u"idors", 153, 1),
+        Among(u"ats", -1, 1),
+        Among(u"itats", 156, 1),
+        Among(u"bilitats", 157, 1),
+        Among(u"ivitats", 157, 1),
+        Among(u"ativitats", 159, 1),
+        Among(u"ïtats", 156, 1),
+        Among(u"ets", -1, 1),
+        Among(u"ants", -1, 1),
+        Among(u"ents", -1, 1),
+        Among(u"ments", 164, 1),
+        Among(u"aments", 165, 1),
+        Among(u"ots", -1, 1),
+        Among(u"uts", -1, 1),
+        Among(u"ius", -1, 1),
+        Among(u"trius", 169, 1),
+        Among(u"atius", 169, 1),
+        Among(u"ès", -1, 1),
+        Among(u"és", -1, 1),
+        Among(u"ís", -1, 1),
+        Among(u"dís", 174, 1),
+        Among(u"ós", -1, 1),
+        Among(u"itat", -1, 1),
+        Among(u"bilitat", 177, 1),
+        Among(u"ivitat", 177, 1),
+        Among(u"ativitat", 179, 1),
+        Among(u"ïtat", -1, 1),
+        Among(u"et", -1, 1),
+        Among(u"ant", -1, 1),
+        Among(u"ent", -1, 1),
+        Among(u"ient", 184, 1),
+        Among(u"ment", 184, 1),
+        Among(u"ament", 186, 1),
+        Among(u"isament", 187, 1),
+        Among(u"ot", -1, 1),
+        Among(u"isseu", -1, 1),
+        Among(u"ìsseu", -1, 1),
+        Among(u"ísseu", -1, 1),
+        Among(u"triu", -1, 1),
+        Among(u"íssiu", -1, 1),
+        Among(u"atiu", -1, 1),
+        Among(u"ó", -1, 1),
+        Among(u"ió", 196, 1),
+        Among(u"ció", 197, 1),
+        Among(u"ació", 198, 1)
+    ]
+
+    a_3 = [
+        Among(u"aba", -1, 1),
+        Among(u"esca", -1, 1),
+        Among(u"isca", -1, 1),
+        Among(u"ïsca", -1, 1),
+        Among(u"ada", -1, 1),
+        Among(u"ida", -1, 1),
+        Among(u"uda", -1, 1),
+        Among(u"ïda", -1, 1),
+        Among(u"ia", -1, 1),
+        Among(u"aria", 8, 1),
+        Among(u"iria", 8, 1),
+        Among(u"ara", -1, 1),
+        Among(u"iera", -1, 1),
+        Among(u"ira", -1, 1),
+        Among(u"adora", -1, 1),
+        Among(u"ïra", -1, 1),
+        Among(u"ava", -1, 1),
+        Among(u"ixa", -1, 1),
+        Among(u"itza", -1, 1),
+        Among(u"ía", -1, 1),
+        Among(u"aría", 19, 1),
+        Among(u"ería", 19, 1),
+        Among(u"iría", 19, 1),
+        Among(u"ïa", -1, 1),
+        Among(u"isc", -1, 1),
+        Among(u"ïsc", -1, 1),
+        Among(u"ad", -1, 1),
+        Among(u"ed", -1, 1),
+        Among(u"id", -1, 1),
+        Among(u"ie", -1, 1),
+        Among(u"re", -1, 1),
+        Among(u"dre", 30, 1),
+        Among(u"ase", -1, 1),
+        Among(u"iese", -1, 1),
+        Among(u"aste", -1, 1),
+        Among(u"iste", -1, 1),
+        Among(u"ii", -1, 1),
+        Among(u"ini", -1, 1),
+        Among(u"esqui", -1, 1),
+        Among(u"eixi", -1, 1),
+        Among(u"itzi", -1, 1),
+        Among(u"am", -1, 1),
+        Among(u"em", -1, 1),
+        Among(u"arem", 42, 1),
+        Among(u"irem", 42, 1),
+        Among(u"àrem", 42, 1),
+        Among(u"írem", 42, 1),
+        Among(u"àssem", 42, 1),
+        Among(u"éssem", 42, 1),
+        Among(u"iguem", 42, 1),
+        Among(u"ïguem", 42, 1),
+        Among(u"avem", 42, 1),
+        Among(u"àvem", 42, 1),
+        Among(u"ávem", 42, 1),
+        Among(u"irìem", 42, 1),
+        Among(u"íem", 42, 1),
+        Among(u"aríem", 55, 1),
+        Among(u"iríem", 55, 1),
+        Among(u"assim", -1, 1),
+        Among(u"essim", -1, 1),
+        Among(u"issim", -1, 1),
+        Among(u"àssim", -1, 1),
+        Among(u"èssim", -1, 1),
+        Among(u"éssim", -1, 1),
+        Among(u"íssim", -1, 1),
+        Among(u"ïm", -1, 1),
+        Among(u"an", -1, 1),
+        Among(u"aban", 66, 1),
+        Among(u"arian", 66, 1),
+        Among(u"aran", 66, 1),
+        Among(u"ieran", 66, 1),
+        Among(u"iran", 66, 1),
+        Among(u"ían", 66, 1),
+        Among(u"arían", 72, 1),
+        Among(u"erían", 72, 1),
+        Among(u"irían", 72, 1),
+        Among(u"en", -1, 1),
+        Among(u"ien", 76, 1),
+        Among(u"arien", 77, 1),
+        Among(u"irien", 77, 1),
+        Among(u"aren", 76, 1),
+        Among(u"eren", 76, 1),
+        Among(u"iren", 76, 1),
+        Among(u"àren", 76, 1),
+        Among(u"ïren", 76, 1),
+        Among(u"asen", 76, 1),
+        Among(u"iesen", 76, 1),
+        Among(u"assen", 76, 1),
+        Among(u"essen", 76, 1),
+        Among(u"issen", 76, 1),
+        Among(u"éssen", 76, 1),
+        Among(u"ïssen", 76, 1),
+        Among(u"esquen", 76, 1),
+        Among(u"isquen", 76, 1),
+        Among(u"ïsquen", 76, 1),
+        Among(u"aven", 76, 1),
+        Among(u"ixen", 76, 1),
+        Among(u"eixen", 96, 1),
+        Among(u"ïxen", 76, 1),
+        Among(u"ïen", 76, 1),
+        Among(u"in", -1, 1),
+        Among(u"inin", 100, 1),
+        Among(u"sin", 100, 1),
+        Among(u"isin", 102, 1),
+        Among(u"assin", 102, 1),
+        Among(u"essin", 102, 1),
+        Among(u"issin", 102, 1),
+        Among(u"ïssin", 102, 1),
+        Among(u"esquin", 100, 1),
+        Among(u"eixin", 100, 1),
+        Among(u"aron", -1, 1),
+        Among(u"ieron", -1, 1),
+        Among(u"arán", -1, 1),
+        Among(u"erán", -1, 1),
+        Among(u"irán", -1, 1),
+        Among(u"iïn", -1, 1),
+        Among(u"ado", -1, 1),
+        Among(u"ido", -1, 1),
+        Among(u"ando", -1, 2),
+        Among(u"iendo", -1, 1),
+        Among(u"io", -1, 1),
+        Among(u"ixo", -1, 1),
+        Among(u"eixo", 121, 1),
+        Among(u"ïxo", -1, 1),
+        Among(u"itzo", -1, 1),
+        Among(u"ar", -1, 1),
+        Among(u"tzar", 125, 1),
+        Among(u"er", -1, 1),
+        Among(u"eixer", 127, 1),
+        Among(u"ir", -1, 1),
+        Among(u"ador", -1, 1),
+        Among(u"as", -1, 1),
+        Among(u"abas", 131, 1),
+        Among(u"adas", 131, 1),
+        Among(u"idas", 131, 1),
+        Among(u"aras", 131, 1),
+        Among(u"ieras", 131, 1),
+        Among(u"ías", 131, 1),
+        Among(u"arías", 137, 1),
+        Among(u"erías", 137, 1),
+        Among(u"irías", 137, 1),
+        Among(u"ids", -1, 1),
+        Among(u"es", -1, 1),
+        Among(u"ades", 142, 1),
+        Among(u"ides", 142, 1),
+        Among(u"udes", 142, 1),
+        Among(u"ïdes", 142, 1),
+        Among(u"atges", 142, 1),
+        Among(u"ies", 142, 1),
+        Among(u"aries", 148, 1),
+        Among(u"iries", 148, 1),
+        Among(u"ares", 142, 1),
+        Among(u"ires", 142, 1),
+        Among(u"adores", 142, 1),
+        Among(u"ïres", 142, 1),
+        Among(u"ases", 142, 1),
+        Among(u"ieses", 142, 1),
+        Among(u"asses", 142, 1),
+        Among(u"esses", 142, 1),
+        Among(u"isses", 142, 1),
+        Among(u"ïsses", 142, 1),
+        Among(u"ques", 142, 1),
+        Among(u"esques", 161, 1),
+        Among(u"ïsques", 161, 1),
+        Among(u"aves", 142, 1),
+        Among(u"ixes", 142, 1),
+        Among(u"eixes", 165, 1),
+        Among(u"ïxes", 142, 1),
+        Among(u"ïes", 142, 1),
+        Among(u"abais", -1, 1),
+        Among(u"arais", -1, 1),
+        Among(u"ierais", -1, 1),
+        Among(u"íais", -1, 1),
+        Among(u"aríais", 172, 1),
+        Among(u"eríais", 172, 1),
+        Among(u"iríais", 172, 1),
+        Among(u"aseis", -1, 1),
+        Among(u"ieseis", -1, 1),
+        Among(u"asteis", -1, 1),
+        Among(u"isteis", -1, 1),
+        Among(u"inis", -1, 1),
+        Among(u"sis", -1, 1),
+        Among(u"isis", 181, 1),
+        Among(u"assis", 181, 1),
+        Among(u"essis", 181, 1),
+        Among(u"issis", 181, 1),
+        Among(u"ïssis", 181, 1),
+        Among(u"esquis", -1, 1),
+        Among(u"eixis", -1, 1),
+        Among(u"itzis", -1, 1),
+        Among(u"áis", -1, 1),
+        Among(u"aréis", -1, 1),
+        Among(u"eréis", -1, 1),
+        Among(u"iréis", -1, 1),
+        Among(u"ams", -1, 1),
+        Among(u"ados", -1, 1),
+        Among(u"idos", -1, 1),
+        Among(u"amos", -1, 1),
+        Among(u"ábamos", 197, 1),
+        Among(u"áramos", 197, 1),
+        Among(u"iéramos", 197, 1),
+        Among(u"íamos", 197, 1),
+        Among(u"aríamos", 201, 1),
+        Among(u"eríamos", 201, 1),
+        Among(u"iríamos", 201, 1),
+        Among(u"aremos", -1, 1),
+        Among(u"eremos", -1, 1),
+        Among(u"iremos", -1, 1),
+        Among(u"ásemos", -1, 1),
+        Among(u"iésemos", -1, 1),
+        Among(u"imos", -1, 1),
+        Among(u"adors", -1, 1),
+        Among(u"ass", -1, 1),
+        Among(u"erass", 212, 1),
+        Among(u"ess", -1, 1),
+        Among(u"ats", -1, 1),
+        Among(u"its", -1, 1),
+        Among(u"ents", -1, 1),
+        Among(u"às", -1, 1),
+        Among(u"aràs", 218, 1),
+        Among(u"iràs", 218, 1),
+        Among(u"arás", -1, 1),
+        Among(u"erás", -1, 1),
+        Among(u"irás", -1, 1),
+        Among(u"és", -1, 1),
+        Among(u"arés", 224, 1),
+        Among(u"ís", -1, 1),
+        Among(u"iïs", -1, 1),
+        Among(u"at", -1, 1),
+        Among(u"it", -1, 1),
+        Among(u"ant", -1, 1),
+        Among(u"ent", -1, 1),
+        Among(u"int", -1, 1),
+        Among(u"ut", -1, 1),
+        Among(u"ït", -1, 1),
+        Among(u"au", -1, 1),
+        Among(u"erau", 235, 1),
+        Among(u"ieu", -1, 1),
+        Among(u"ineu", -1, 1),
+        Among(u"areu", -1, 1),
+        Among(u"ireu", -1, 1),
+        Among(u"àreu", -1, 1),
+        Among(u"íreu", -1, 1),
+        Among(u"asseu", -1, 1),
+        Among(u"esseu", -1, 1),
+        Among(u"eresseu", 244, 1),
+        Among(u"àsseu", -1, 1),
+        Among(u"ésseu", -1, 1),
+        Among(u"igueu", -1, 1),
+        Among(u"ïgueu", -1, 1),
+        Among(u"àveu", -1, 1),
+        Among(u"áveu", -1, 1),
+        Among(u"itzeu", -1, 1),
+        Among(u"ìeu", -1, 1),
+        Among(u"irìeu", 253, 1),
+        Among(u"íeu", -1, 1),
+        Among(u"aríeu", 255, 1),
+        Among(u"iríeu", 255, 1),
+        Among(u"assiu", -1, 1),
+        Among(u"issiu", -1, 1),
+        Among(u"àssiu", -1, 1),
+        Among(u"èssiu", -1, 1),
+        Among(u"éssiu", -1, 1),
+        Among(u"íssiu", -1, 1),
+        Among(u"ïu", -1, 1),
+        Among(u"ix", -1, 1),
+        Among(u"eix", 265, 1),
+        Among(u"ïx", -1, 1),
+        Among(u"itz", -1, 1),
+        Among(u"ià", -1, 1),
+        Among(u"arà", -1, 1),
+        Among(u"irà", -1, 1),
+        Among(u"itzà", -1, 1),
+        Among(u"ará", -1, 1),
+        Among(u"erá", -1, 1),
+        Among(u"irá", -1, 1),
+        Among(u"irè", -1, 1),
+        Among(u"aré", -1, 1),
+        Among(u"eré", -1, 1),
+        Among(u"iré", -1, 1),
+        Among(u"í", -1, 1),
+        Among(u"iï", -1, 1),
+        Among(u"ió", -1, 1)
+    ]
+
+    a_4 = [
+        Among(u"a", -1, 1),
+        Among(u"e", -1, 1),
+        Among(u"i", -1, 1),
+        Among(u"ïn", -1, 1),
+        Among(u"o", -1, 1),
+        Among(u"ir", -1, 1),
+        Among(u"s", -1, 1),
+        Among(u"is", 6, 1),
+        Among(u"os", 6, 1),
+        Among(u"ïs", 6, 1),
+        Among(u"it", -1, 1),
+        Among(u"eu", -1, 1),
+        Among(u"iu", -1, 1),
+        Among(u"iqu", -1, 2),
+        Among(u"itz", -1, 1),
+        Among(u"à", -1, 1),
+        Among(u"á", -1, 1),
+        Among(u"é", -1, 1),
+        Among(u"ì", -1, 1),
+        Among(u"í", -1, 1),
+        Among(u"ï", -1, 1),
+        Among(u"ó", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/danish_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/danish_stemmer.py
new file mode 100644
index 000000000..8fbf1dd62
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/danish_stemmer.py
@@ -0,0 +1,223 @@
+#-*- coding: utf-8 -*-
+# Generated from danish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class DanishStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from danish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_c = {u"b", u"c", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"m", u"n", u"p", u"q", u"r", u"s", u"t", u"v", u"w", u"x", u"z"}
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"y", u"æ", u"å", u"ø"}
+
+    g_s_ending = {u"a", u"b", u"c", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"m", u"n", u"o", u"p", u"r", u"t", u"v", u"y", u"z", u"å"}
+
+    I_x = 0
+    I_p1 = 0
+    S_ch = ""
+
+    def __r_mark_regions(self):
+        self.I_p1 = self.limit
+        v_1 = self.cursor
+        c = self.cursor + 3
+        if c > self.limit:
+            return False
+        self.cursor = c
+        self.I_x = self.cursor
+        self.cursor = v_1
+        if not self.go_out_grouping(DanishStemmer.g_v):
+            return False
+        self.cursor += 1
+        if not self.go_in_grouping(DanishStemmer.g_v):
+            return False
+        self.cursor += 1
+        self.I_p1 = self.cursor
+        try:
+            if self.I_p1 >= self.I_x:
+                raise lab0()
+            self.I_p1 = self.I_x
+        except lab0: pass
+        return True
+
+    def __r_main_suffix(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(DanishStemmer.a_0)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.in_grouping_b(DanishStemmer.g_s_ending):
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_consonant_pair(self):
+        v_1 = self.limit - self.cursor
+        if self.cursor < self.I_p1:
+            return False
+        v_3 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        if self.find_among_b(DanishStemmer.a_1) == 0:
+            self.limit_backward = v_3
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_3
+        self.cursor = self.limit - v_1
+        if self.cursor <= self.limit_backward:
+            return False
+        self.cursor -= 1
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_other_suffix(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.eq_s_b(u"st"):
+                raise lab0()
+            self.bra = self.cursor
+            if not self.eq_s_b(u"ig"):
+                raise lab0()
+            if not self.slice_del():
+                return False
+
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        if self.cursor < self.I_p1:
+            return False
+        v_3 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(DanishStemmer.a_2)
+        if among_var == 0:
+            self.limit_backward = v_3
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_3
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+            v_4 = self.limit - self.cursor
+            self.__r_consonant_pair()
+            self.cursor = self.limit - v_4
+        else:
+            if not self.slice_from(u"løs"):
+                return False
+        return True
+
+    def __r_undouble(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        if not self.in_grouping_b(DanishStemmer.g_c):
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.S_ch = self.slice_to()
+        if self.S_ch == '':
+            return False
+        self.limit_backward = v_2
+        if not self.eq_s_b(self.S_ch):
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        self.__r_mark_regions()
+        self.cursor = v_1
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_2 = self.limit - self.cursor
+        self.__r_main_suffix()
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        self.__r_consonant_pair()
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        self.__r_other_suffix()
+        self.cursor = self.limit - v_4
+        v_5 = self.limit - self.cursor
+        self.__r_undouble()
+        self.cursor = self.limit - v_5
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"hed", -1, 1),
+        Among(u"ethed", 0, 1),
+        Among(u"ered", -1, 1),
+        Among(u"e", -1, 1),
+        Among(u"erede", 3, 1),
+        Among(u"ende", 3, 1),
+        Among(u"erende", 5, 1),
+        Among(u"ene", 3, 1),
+        Among(u"erne", 3, 1),
+        Among(u"ere", 3, 1),
+        Among(u"en", -1, 1),
+        Among(u"heden", 10, 1),
+        Among(u"eren", 10, 1),
+        Among(u"er", -1, 1),
+        Among(u"heder", 13, 1),
+        Among(u"erer", 13, 1),
+        Among(u"s", -1, 2),
+        Among(u"heds", 16, 1),
+        Among(u"es", 16, 1),
+        Among(u"endes", 18, 1),
+        Among(u"erendes", 19, 1),
+        Among(u"enes", 18, 1),
+        Among(u"ernes", 18, 1),
+        Among(u"eres", 18, 1),
+        Among(u"ens", 16, 1),
+        Among(u"hedens", 24, 1),
+        Among(u"erens", 24, 1),
+        Among(u"ers", 16, 1),
+        Among(u"ets", 16, 1),
+        Among(u"erets", 28, 1),
+        Among(u"et", -1, 1),
+        Among(u"eret", 30, 1)
+    ]
+
+    a_1 = [
+        Among(u"gd", -1, -1),
+        Among(u"dt", -1, -1),
+        Among(u"gt", -1, -1),
+        Among(u"kt", -1, -1)
+    ]
+
+    a_2 = [
+        Among(u"ig", -1, 1),
+        Among(u"lig", 0, 1),
+        Among(u"elig", 1, 1),
+        Among(u"els", -1, 1),
+        Among(u"løst", -1, 2)
+    ]
+
+
+class lab0(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/dutch_porter_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/dutch_porter_stemmer.py
new file mode 100644
index 000000000..d91987ea5
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/dutch_porter_stemmer.py
@@ -0,0 +1,466 @@
+#-*- coding: utf-8 -*-
+# Generated from dutch_porter.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class DutchPorterStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from dutch_porter.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"y", u"è"}
+
+    g_v_I = {u"a", u"e", u"i", u"o", u"u", u"y", u"è", u"I"}
+
+    g_v_j = {u"a", u"e", u"i", u"o", u"u", u"y", u"è", u"j"}
+
+    I_x = 0
+    I_p2 = 0
+    I_p1 = 0
+    B_e_found = False
+
+    def __r_prelude(self):
+        v_1 = self.cursor
+        while True:
+            v_2 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(DutchPorterStemmer.a_0)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"a"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"e"):
+                        return False
+                elif among_var == 3:
+                    if not self.slice_from(u"i"):
+                        return False
+                elif among_var == 4:
+                    if not self.slice_from(u"o"):
+                        return False
+                elif among_var == 5:
+                    if not self.slice_from(u"u"):
+                        return False
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_2
+            break
+        self.cursor = v_1
+        v_3 = self.cursor
+        try:
+            self.bra = self.cursor
+            if not self.eq_s(u"y"):
+                self.cursor = v_3
+                raise lab1()
+            self.ket = self.cursor
+            if not self.slice_from(u"Y"):
+                return False
+        except lab1: pass
+        while True:
+            v_4 = self.cursor
+            try:
+                if not self.go_out_grouping(DutchPorterStemmer.g_v):
+                    raise lab2()
+                self.cursor += 1
+                v_5 = self.cursor
+                try:
+                    self.bra = self.cursor
+                    try:
+                        v_6 = self.cursor
+                        try:
+                            if not self.eq_s(u"i"):
+                                raise lab5()
+                            self.ket = self.cursor
+                            v_7 = self.cursor
+                            try:
+                                if not self.in_grouping(DutchPorterStemmer.g_v):
+                                    raise lab6()
+                                if not self.slice_from(u"I"):
+                                    return False
+                            except lab6: pass
+                            self.cursor = v_7
+                            raise lab4()
+                        except lab5: pass
+                        self.cursor = v_6
+                        if not self.eq_s(u"y"):
+                            self.cursor = v_5
+                            raise lab3()
+                        self.ket = self.cursor
+                        if not self.slice_from(u"Y"):
+                            return False
+                    except lab4: pass
+                except lab3: pass
+                continue
+            except lab2: pass
+            self.cursor = v_4
+            break
+        return True
+
+    def __r_mark_regions(self):
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        c = self.cursor + 3
+        if c > self.limit:
+            return False
+        self.cursor = c
+        self.I_x = self.cursor
+        self.cursor = v_1
+        if not self.go_out_grouping(DutchPorterStemmer.g_v):
+            return False
+        self.cursor += 1
+        if not self.go_in_grouping(DutchPorterStemmer.g_v):
+            return False
+        self.cursor += 1
+        self.I_p1 = self.cursor
+        try:
+            if self.I_p1 >= self.I_x:
+                raise lab0()
+            self.I_p1 = self.I_x
+        except lab0: pass
+        if not self.go_out_grouping(DutchPorterStemmer.g_v):
+            return False
+        self.cursor += 1
+        if not self.go_in_grouping(DutchPorterStemmer.g_v):
+            return False
+        self.cursor += 1
+        self.I_p2 = self.cursor
+        return True
+
+    def __r_postlude(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(DutchPorterStemmer.a_1)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"y"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"i"):
+                        return False
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_undouble(self):
+        v_1 = self.limit - self.cursor
+        if self.find_among_b(DutchPorterStemmer.a_2) == 0:
+            return False
+        self.cursor = self.limit - v_1
+        self.ket = self.cursor
+        if self.cursor <= self.limit_backward:
+            return False
+        self.cursor -= 1
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_e_ending(self):
+        self.B_e_found = False
+        self.ket = self.cursor
+        if not self.eq_s_b(u"e"):
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        v_1 = self.limit - self.cursor
+        if not self.out_grouping_b(DutchPorterStemmer.g_v):
+            return False
+        self.cursor = self.limit - v_1
+        if not self.slice_del():
+            return False
+
+        self.B_e_found = True
+        if not self.__r_undouble():
+            return False
+        return True
+
+    def __r_en_ending(self):
+        if not self.__r_R1():
+            return False
+        v_1 = self.limit - self.cursor
+        if not self.out_grouping_b(DutchPorterStemmer.g_v):
+            return False
+        self.cursor = self.limit - v_1
+        v_2 = self.limit - self.cursor
+        try:
+            if not self.eq_s_b(u"gem"):
+                raise lab0()
+            return False
+        except lab0: pass
+        self.cursor = self.limit - v_2
+        if not self.slice_del():
+            return False
+
+        if not self.__r_undouble():
+            return False
+        return True
+
+    def __r_standard_suffix(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            among_var = self.find_among_b(DutchPorterStemmer.a_3)
+            if among_var == 0:
+                raise lab0()
+            self.bra = self.cursor
+            if among_var == 1:
+                if not self.__r_R1():
+                    raise lab0()
+                if not self.slice_from(u"heid"):
+                    return False
+            elif among_var == 2:
+                if not self.__r_en_ending():
+                    raise lab0()
+            else:
+                if not self.__r_R1():
+                    raise lab0()
+                if not self.out_grouping_b(DutchPorterStemmer.g_v_j):
+                    raise lab0()
+                if not self.slice_del():
+                    return False
+
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        v_2 = self.limit - self.cursor
+        self.__r_e_ending()
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.eq_s_b(u"heid"):
+                raise lab1()
+            self.bra = self.cursor
+            if not self.__r_R2():
+                raise lab1()
+            v_4 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"c"):
+                    raise lab2()
+                raise lab1()
+            except lab2: pass
+            self.cursor = self.limit - v_4
+            if not self.slice_del():
+                return False
+
+            self.ket = self.cursor
+            if not self.eq_s_b(u"en"):
+                raise lab1()
+            self.bra = self.cursor
+            if not self.__r_en_ending():
+                raise lab1()
+        except lab1: pass
+        self.cursor = self.limit - v_3
+        v_5 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            among_var = self.find_among_b(DutchPorterStemmer.a_4)
+            if among_var == 0:
+                raise lab3()
+            self.bra = self.cursor
+            if among_var == 1:
+                if not self.__r_R2():
+                    raise lab3()
+                if not self.slice_del():
+                    return False
+
+                try:
+                    v_6 = self.limit - self.cursor
+                    try:
+                        self.ket = self.cursor
+                        if not self.eq_s_b(u"ig"):
+                            raise lab5()
+                        self.bra = self.cursor
+                        if not self.__r_R2():
+                            raise lab5()
+                        v_7 = self.limit - self.cursor
+                        try:
+                            if not self.eq_s_b(u"e"):
+                                raise lab6()
+                            raise lab5()
+                        except lab6: pass
+                        self.cursor = self.limit - v_7
+                        if not self.slice_del():
+                            return False
+
+                        raise lab4()
+                    except lab5: pass
+                    self.cursor = self.limit - v_6
+                    if not self.__r_undouble():
+                        raise lab3()
+                except lab4: pass
+            elif among_var == 2:
+                if not self.__r_R2():
+                    raise lab3()
+                v_8 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"e"):
+                        raise lab7()
+                    raise lab3()
+                except lab7: pass
+                self.cursor = self.limit - v_8
+                if not self.slice_del():
+                    return False
+
+            elif among_var == 3:
+                if not self.__r_R2():
+                    raise lab3()
+                if not self.slice_del():
+                    return False
+
+                if not self.__r_e_ending():
+                    raise lab3()
+            elif among_var == 4:
+                if not self.__r_R2():
+                    raise lab3()
+                if not self.slice_del():
+                    return False
+
+            else:
+                if not self.__r_R2():
+                    raise lab3()
+                if not self.B_e_found:
+                    raise lab3()
+                if not self.slice_del():
+                    return False
+
+        except lab3: pass
+        self.cursor = self.limit - v_5
+        v_9 = self.limit - self.cursor
+        try:
+            if not self.out_grouping_b(DutchPorterStemmer.g_v_I):
+                raise lab8()
+            v_10 = self.limit - self.cursor
+            if self.find_among_b(DutchPorterStemmer.a_5) == 0:
+                raise lab8()
+            if not self.out_grouping_b(DutchPorterStemmer.g_v):
+                raise lab8()
+            self.cursor = self.limit - v_10
+            self.ket = self.cursor
+            if self.cursor <= self.limit_backward:
+                raise lab8()
+            self.cursor -= 1
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+        except lab8: pass
+        self.cursor = self.limit - v_9
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        self.__r_prelude()
+        self.cursor = v_1
+        v_2 = self.cursor
+        self.__r_mark_regions()
+        self.cursor = v_2
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        self.__r_standard_suffix()
+        self.cursor = self.limit_backward
+        v_4 = self.cursor
+        self.__r_postlude()
+        self.cursor = v_4
+        return True
+
+    a_0 = [
+        Among(u"", -1, 6),
+        Among(u"á", 0, 1),
+        Among(u"ä", 0, 1),
+        Among(u"é", 0, 2),
+        Among(u"ë", 0, 2),
+        Among(u"í", 0, 3),
+        Among(u"ï", 0, 3),
+        Among(u"ó", 0, 4),
+        Among(u"ö", 0, 4),
+        Among(u"ú", 0, 5),
+        Among(u"ü", 0, 5)
+    ]
+
+    a_1 = [
+        Among(u"", -1, 3),
+        Among(u"I", 0, 2),
+        Among(u"Y", 0, 1)
+    ]
+
+    a_2 = [
+        Among(u"dd", -1, -1),
+        Among(u"kk", -1, -1),
+        Among(u"tt", -1, -1)
+    ]
+
+    a_3 = [
+        Among(u"ene", -1, 2),
+        Among(u"se", -1, 3),
+        Among(u"en", -1, 2),
+        Among(u"heden", 2, 1),
+        Among(u"s", -1, 3)
+    ]
+
+    a_4 = [
+        Among(u"end", -1, 1),
+        Among(u"ig", -1, 2),
+        Among(u"ing", -1, 1),
+        Among(u"lijk", -1, 3),
+        Among(u"baar", -1, 4),
+        Among(u"bar", -1, 5)
+    ]
+
+    a_5 = [
+        Among(u"aa", -1, -1),
+        Among(u"ee", -1, -1),
+        Among(u"oo", -1, -1),
+        Among(u"uu", -1, -1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/dutch_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/dutch_stemmer.py
new file mode 100644
index 000000000..060de29ec
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/dutch_stemmer.py
@@ -0,0 +1,1342 @@
+#-*- coding: utf-8 -*-
+# Generated from dutch.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class DutchStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from dutch.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_E = {u"e", u"ë", u"é", u"è", u"ê"}
+
+    g_AIOU = {u"a", u"ä", u"á", u"à", u"â", u"i", u"ï", u"í", u"ì", u"î", u"o", u"ö", u"ó", u"ò", u"ô", u"u", u"ü", u"ú", u"ù", u"û"}
+
+    g_AEIOU = {u"a", u"ä", u"á", u"à", u"â", u"e", u"ë", u"é", u"è", u"ê", u"i", u"ï", u"í", u"ì", u"î", u"o", u"ö", u"ó", u"ò", u"ô", u"u", u"ü", u"ú", u"ù", u"û"}
+
+    g_v = {u"a", u"ä", u"á", u"à", u"â", u"e", u"ë", u"é", u"è", u"ê", u"i", u"ï", u"í", u"ì", u"î", u"o", u"ö", u"ó", u"ò", u"ô", u"u", u"ü", u"ú", u"ù", u"û", u"y"}
+
+    g_v_WX = {u"a", u"ä", u"á", u"à", u"â", u"e", u"ë", u"é", u"è", u"ê", u"i", u"ï", u"í", u"ì", u"î", u"o", u"ö", u"ó", u"ò", u"ô", u"u", u"ü", u"ú", u"ù", u"û", u"y", u"w", u"x"}
+
+    B_GE_removed = False
+    B_stemmed = False
+    I_p2 = 0
+    I_p1 = 0
+    S_ch = ""
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_V(self):
+        v_1 = self.limit - self.cursor
+        try:
+            v_2 = self.limit - self.cursor
+            try:
+                if not self.in_grouping_b(DutchStemmer.g_v):
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_2
+            if not self.eq_s_b(u"ij"):
+                return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        return True
+
+    def __r_VX(self):
+        v_1 = self.limit - self.cursor
+        if self.cursor <= self.limit_backward:
+            return False
+        self.cursor -= 1
+        try:
+            v_2 = self.limit - self.cursor
+            try:
+                if not self.in_grouping_b(DutchStemmer.g_v):
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_2
+            if not self.eq_s_b(u"ij"):
+                return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        return True
+
+    def __r_C(self):
+        v_1 = self.limit - self.cursor
+        v_2 = self.limit - self.cursor
+        try:
+            if not self.eq_s_b(u"ij"):
+                raise lab0()
+            return False
+        except lab0: pass
+        self.cursor = self.limit - v_2
+        if not self.out_grouping_b(DutchStemmer.g_v):
+            return False
+        self.cursor = self.limit - v_1
+        return True
+
+    def __r_lengthen_V(self):
+        v_1 = self.limit - self.cursor
+        try:
+            if not self.out_grouping_b(DutchStemmer.g_v_WX):
+                raise lab0()
+            self.ket = self.cursor
+            among_var = self.find_among_b(DutchStemmer.a_0)
+            if among_var == 0:
+                raise lab0()
+            self.bra = self.cursor
+            if among_var == 1:
+                v_2 = self.limit - self.cursor
+                try:
+                    v_3 = self.limit - self.cursor
+                    try:
+                        if not self.out_grouping_b(DutchStemmer.g_AEIOU):
+                            raise lab2()
+                        raise lab1()
+                    except lab2: pass
+                    self.cursor = self.limit - v_3
+                    if self.cursor > self.limit_backward:
+                        raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_2
+                self.S_ch = self.slice_to()
+                if self.S_ch == '':
+                    return False
+                c = self.cursor
+                self.insert(self.cursor, self.cursor, self.S_ch)
+                self.cursor = c
+            elif among_var == 2:
+                v_4 = self.limit - self.cursor
+                try:
+                    v_5 = self.limit - self.cursor
+                    try:
+                        if not self.out_grouping_b(DutchStemmer.g_AEIOU):
+                            raise lab4()
+                        raise lab3()
+                    except lab4: pass
+                    self.cursor = self.limit - v_5
+                    if self.cursor > self.limit_backward:
+                        raise lab0()
+                except lab3: pass
+                v_6 = self.limit - self.cursor
+                try:
+                    try:
+                        v_7 = self.limit - self.cursor
+                        try:
+                            if not self.in_grouping_b(DutchStemmer.g_AIOU):
+                                raise lab7()
+                            raise lab6()
+                        except lab7: pass
+                        self.cursor = self.limit - v_7
+                        if not self.in_grouping_b(DutchStemmer.g_E):
+                            raise lab5()
+                        if self.cursor > self.limit_backward:
+                            raise lab5()
+                    except lab6: pass
+                    raise lab0()
+                except lab5: pass
+                self.cursor = self.limit - v_6
+                v_8 = self.limit - self.cursor
+                try:
+                    if self.cursor <= self.limit_backward:
+                        raise lab8()
+                    self.cursor -= 1
+                    if not self.in_grouping_b(DutchStemmer.g_AIOU):
+                        raise lab8()
+                    if not self.out_grouping_b(DutchStemmer.g_AEIOU):
+                        raise lab8()
+                    raise lab0()
+                except lab8: pass
+                self.cursor = self.limit - v_8
+                self.cursor = self.limit - v_4
+                self.S_ch = self.slice_to()
+                if self.S_ch == '':
+                    return False
+                c = self.cursor
+                self.insert(self.cursor, self.cursor, self.S_ch)
+                self.cursor = c
+            elif among_var == 3:
+                if not self.slice_from(u"eëe"):
+                    return False
+            else:
+                if not self.slice_from(u"iee"):
+                    return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        return True
+
+    def __r_Step_1(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(DutchStemmer.a_1)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.__r_R1():
+                return False
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"t"):
+                    raise lab0()
+                if not self.__r_R1():
+                    raise lab0()
+                return False
+            except lab0: pass
+            self.cursor = self.limit - v_1
+            if not self.__r_C():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 3:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"ie"):
+                return False
+        elif among_var == 4:
+            try:
+                v_2 = self.limit - self.cursor
+                try:
+                    v_3 = self.limit - self.cursor
+                    if not self.eq_s_b(u"ar"):
+                        raise lab2()
+                    if not self.__r_R1():
+                        raise lab2()
+                    if not self.__r_C():
+                        raise lab2()
+                    self.cursor = self.limit - v_3
+                    if not self.slice_del():
+                        return False
+
+                    self.__r_lengthen_V()
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_2
+                try:
+                    v_4 = self.limit - self.cursor
+                    if not self.eq_s_b(u"er"):
+                        raise lab3()
+                    if not self.__r_R1():
+                        raise lab3()
+                    if not self.__r_C():
+                        raise lab3()
+                    self.cursor = self.limit - v_4
+                    if not self.slice_del():
+                        return False
+
+                    raise lab1()
+                except lab3: pass
+                self.cursor = self.limit - v_2
+                if not self.__r_R1():
+                    return False
+                if not self.__r_C():
+                    return False
+                if not self.slice_from(u"e"):
+                    return False
+            except lab1: pass
+        elif among_var == 5:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"é"):
+                return False
+        elif among_var == 6:
+            if not self.__r_R1():
+                return False
+            if not self.__r_V():
+                return False
+            if not self.slice_from(u"au"):
+                return False
+        elif among_var == 7:
+            try:
+                v_5 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"hed"):
+                        raise lab5()
+                    if not self.__r_R1():
+                        raise lab5()
+                    self.bra = self.cursor
+                    if not self.slice_from(u"heid"):
+                        return False
+                    raise lab4()
+                except lab5: pass
+                self.cursor = self.limit - v_5
+                try:
+                    if not self.eq_s_b(u"nd"):
+                        raise lab6()
+                    if not self.slice_del():
+                        return False
+
+                    raise lab4()
+                except lab6: pass
+                self.cursor = self.limit - v_5
+                try:
+                    if not self.eq_s_b(u"d"):
+                        raise lab7()
+                    if not self.__r_R1():
+                        raise lab7()
+                    if not self.__r_C():
+                        raise lab7()
+                    self.bra = self.cursor
+                    if not self.slice_del():
+                        return False
+
+                    raise lab4()
+                except lab7: pass
+                self.cursor = self.limit - v_5
+                try:
+                    try:
+                        v_6 = self.limit - self.cursor
+                        try:
+                            if not self.eq_s_b(u"i"):
+                                raise lab10()
+                            raise lab9()
+                        except lab10: pass
+                        self.cursor = self.limit - v_6
+                        if not self.eq_s_b(u"j"):
+                            raise lab8()
+                    except lab9: pass
+                    if not self.__r_V():
+                        raise lab8()
+                    if not self.slice_del():
+                        return False
+
+                    raise lab4()
+                except lab8: pass
+                self.cursor = self.limit - v_5
+                if not self.__r_R1():
+                    return False
+                if not self.__r_C():
+                    return False
+                if not self.slice_del():
+                    return False
+
+                self.__r_lengthen_V()
+            except lab4: pass
+        else:
+            if not self.slice_from(u"nd"):
+                return False
+        return True
+
+    def __r_Step_2(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(DutchStemmer.a_2)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            try:
+                v_1 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"'t"):
+                        raise lab1()
+                    self.bra = self.cursor
+                    if not self.slice_del():
+                        return False
+
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_1
+                try:
+                    if not self.eq_s_b(u"et"):
+                        raise lab2()
+                    self.bra = self.cursor
+                    if not self.__r_R1():
+                        raise lab2()
+                    if not self.__r_C():
+                        raise lab2()
+                    if not self.slice_del():
+                        return False
+
+                    raise lab0()
+                except lab2: pass
+                self.cursor = self.limit - v_1
+                try:
+                    if not self.eq_s_b(u"rnt"):
+                        raise lab3()
+                    self.bra = self.cursor
+                    if not self.slice_from(u"rn"):
+                        return False
+                    raise lab0()
+                except lab3: pass
+                self.cursor = self.limit - v_1
+                try:
+                    if not self.eq_s_b(u"t"):
+                        raise lab4()
+                    self.bra = self.cursor
+                    if not self.__r_R1():
+                        raise lab4()
+                    if not self.__r_VX():
+                        raise lab4()
+                    if not self.slice_del():
+                        return False
+
+                    raise lab0()
+                except lab4: pass
+                self.cursor = self.limit - v_1
+                try:
+                    if not self.eq_s_b(u"ink"):
+                        raise lab5()
+                    self.bra = self.cursor
+                    if not self.slice_from(u"ing"):
+                        return False
+                    raise lab0()
+                except lab5: pass
+                self.cursor = self.limit - v_1
+                try:
+                    if not self.eq_s_b(u"mp"):
+                        raise lab6()
+                    self.bra = self.cursor
+                    if not self.slice_from(u"m"):
+                        return False
+                    raise lab0()
+                except lab6: pass
+                self.cursor = self.limit - v_1
+                try:
+                    if not self.eq_s_b(u"'"):
+                        raise lab7()
+                    self.bra = self.cursor
+                    if not self.__r_R1():
+                        raise lab7()
+                    if not self.slice_del():
+                        return False
+
+                    raise lab0()
+                except lab7: pass
+                self.cursor = self.limit - v_1
+                self.bra = self.cursor
+                if not self.__r_R1():
+                    return False
+                if not self.__r_C():
+                    return False
+                if not self.slice_del():
+                    return False
+
+            except lab0: pass
+        elif among_var == 2:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"g"):
+                return False
+        elif among_var == 3:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"lijk"):
+                return False
+        elif among_var == 4:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"isch"):
+                return False
+        elif among_var == 5:
+            if not self.__r_R1():
+                return False
+            if not self.__r_C():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 6:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"t"):
+                return False
+        elif among_var == 7:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"s"):
+                return False
+        elif among_var == 8:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"r"):
+                return False
+        elif among_var == 9:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+            self.insert(self.cursor, self.cursor, u"l")
+            self.__r_lengthen_V()
+        elif among_var == 10:
+            if not self.__r_R1():
+                return False
+            if not self.__r_C():
+                return False
+            if not self.slice_del():
+                return False
+
+            self.insert(self.cursor, self.cursor, u"en")
+            self.__r_lengthen_V()
+        else:
+            if not self.__r_R1():
+                return False
+            if not self.__r_C():
+                return False
+            if not self.slice_from(u"ief"):
+                return False
+        return True
+
+    def __r_Step_3(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(DutchStemmer.a_3)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"eer"):
+                return False
+        elif among_var == 2:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+            self.__r_lengthen_V()
+        elif among_var == 3:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 4:
+            if not self.slice_from(u"r"):
+                return False
+        elif among_var == 5:
+            try:
+                v_1 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"ild"):
+                        raise lab1()
+                    if not self.slice_from(u"er"):
+                        return False
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_1
+                if not self.__r_R1():
+                    return False
+                if not self.slice_del():
+                    return False
+
+                self.__r_lengthen_V()
+            except lab0: pass
+        elif among_var == 6:
+            if not self.__r_R1():
+                return False
+            if not self.__r_C():
+                return False
+            if not self.slice_from(u"aar"):
+                return False
+        elif among_var == 7:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            self.insert(self.cursor, self.cursor, u"f")
+            self.__r_lengthen_V()
+        elif among_var == 8:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            self.insert(self.cursor, self.cursor, u"g")
+            self.__r_lengthen_V()
+        elif among_var == 9:
+            if not self.__r_R1():
+                return False
+            if not self.__r_C():
+                return False
+            if not self.slice_from(u"t"):
+                return False
+        else:
+            if not self.__r_R1():
+                return False
+            if not self.__r_C():
+                return False
+            if not self.slice_from(u"d"):
+                return False
+        return True
+
+    def __r_Step_4(self):
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                among_var = self.find_among_b(DutchStemmer.a_4)
+                if among_var == 0:
+                    raise lab1()
+                self.bra = self.cursor
+                if among_var == 1:
+                    if not self.__r_R1():
+                        raise lab1()
+                    if not self.slice_from(u"ie"):
+                        return False
+                elif among_var == 2:
+                    if not self.__r_R1():
+                        raise lab1()
+                    if not self.slice_from(u"eer"):
+                        return False
+                elif among_var == 3:
+                    if not self.__r_R1():
+                        raise lab1()
+                    if not self.slice_del():
+                        return False
+
+                elif among_var == 4:
+                    if not self.__r_R1():
+                        raise lab1()
+                    if not self.__r_V():
+                        raise lab1()
+                    if not self.slice_from(u"n"):
+                        return False
+                elif among_var == 5:
+                    if not self.__r_R1():
+                        raise lab1()
+                    if not self.__r_V():
+                        raise lab1()
+                    if not self.slice_from(u"l"):
+                        return False
+                elif among_var == 6:
+                    if not self.__r_R1():
+                        raise lab1()
+                    if not self.__r_V():
+                        raise lab1()
+                    if not self.slice_from(u"r"):
+                        return False
+                elif among_var == 7:
+                    if not self.__r_R1():
+                        raise lab1()
+                    if not self.slice_from(u"teer"):
+                        return False
+                elif among_var == 8:
+                    if not self.__r_R1():
+                        raise lab1()
+                    if not self.slice_from(u"lijk"):
+                        return False
+                else:
+                    if not self.__r_R1():
+                        raise lab1()
+                    if not self.__r_C():
+                        raise lab1()
+                    if not self.slice_del():
+                        return False
+
+                    self.__r_lengthen_V()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            self.ket = self.cursor
+            if self.find_among_b(DutchStemmer.a_5) == 0:
+                return False
+            self.bra = self.cursor
+            if not self.__r_R1():
+                return False
+            v_2 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"inn"):
+                    raise lab2()
+                if self.cursor > self.limit_backward:
+                    raise lab2()
+                return False
+            except lab2: pass
+            self.cursor = self.limit - v_2
+            if not self.__r_C():
+                return False
+            if not self.slice_del():
+                return False
+
+            self.__r_lengthen_V()
+        except lab0: pass
+        return True
+
+    def __r_Step_7(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(DutchStemmer.a_6)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"k"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"f"):
+                return False
+        else:
+            if not self.slice_from(u"p"):
+                return False
+        return True
+
+    def __r_Step_6(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(DutchStemmer.a_7)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"b"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"c"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"d"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"f"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"g"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"h"):
+                return False
+        elif among_var == 7:
+            if not self.slice_from(u"j"):
+                return False
+        elif among_var == 8:
+            if not self.slice_from(u"k"):
+                return False
+        elif among_var == 9:
+            if not self.slice_from(u"l"):
+                return False
+        elif among_var == 10:
+            if not self.slice_from(u"m"):
+                return False
+        elif among_var == 11:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"i"):
+                    raise lab0()
+                if self.cursor > self.limit_backward:
+                    raise lab0()
+                return False
+            except lab0: pass
+            self.cursor = self.limit - v_1
+            if not self.slice_from(u"n"):
+                return False
+        elif among_var == 12:
+            if not self.slice_from(u"p"):
+                return False
+        elif among_var == 13:
+            if not self.slice_from(u"q"):
+                return False
+        elif among_var == 14:
+            if not self.slice_from(u"r"):
+                return False
+        elif among_var == 15:
+            if not self.slice_from(u"s"):
+                return False
+        elif among_var == 16:
+            if not self.slice_from(u"t"):
+                return False
+        elif among_var == 17:
+            if not self.slice_from(u"v"):
+                return False
+        elif among_var == 18:
+            if not self.slice_from(u"w"):
+                return False
+        elif among_var == 19:
+            if not self.slice_from(u"x"):
+                return False
+        else:
+            if not self.slice_from(u"z"):
+                return False
+        return True
+
+    def __r_Step_1c(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(DutchStemmer.a_8)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if not self.__r_C():
+            return False
+        if among_var == 1:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"n"):
+                    raise lab0()
+                if not self.__r_R1():
+                    raise lab0()
+                return False
+            except lab0: pass
+            self.cursor = self.limit - v_1
+            try:
+                v_2 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"in"):
+                        raise lab2()
+                    if self.cursor > self.limit_backward:
+                        raise lab2()
+                    if not self.slice_from(u"n"):
+                        return False
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_2
+                if not self.slice_del():
+                    return False
+
+            except lab1: pass
+        else:
+            v_3 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"h"):
+                    raise lab3()
+                if not self.__r_R1():
+                    raise lab3()
+                return False
+            except lab3: pass
+            self.cursor = self.limit - v_3
+            v_4 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"en"):
+                    raise lab4()
+                if self.cursor > self.limit_backward:
+                    raise lab4()
+                return False
+            except lab4: pass
+            self.cursor = self.limit - v_4
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Lose_prefix(self):
+        self.bra = self.cursor
+        if not self.eq_s(u"ge"):
+            return False
+        self.ket = self.cursor
+        v_1 = self.cursor
+        c = self.cursor + 3
+        if c > self.limit:
+            return False
+        self.cursor = c
+        self.cursor = v_1
+        v_2 = self.cursor
+        try:
+            while True:
+                v_3 = self.cursor
+                try:
+                    try:
+                        v_4 = self.cursor
+                        try:
+                            if not self.eq_s(u"ij"):
+                                raise lab3()
+                            raise lab2()
+                        except lab3: pass
+                        self.cursor = v_4
+                        if not self.in_grouping(DutchStemmer.g_v):
+                            raise lab1()
+                    except lab2: pass
+                    raise lab0()
+                except lab1: pass
+                self.cursor = v_3
+                if self.cursor >= self.limit:
+                    return False
+                self.cursor += 1
+        except lab0: pass
+        while True:
+            v_5 = self.cursor
+            try:
+                try:
+                    v_6 = self.cursor
+                    try:
+                        if not self.eq_s(u"ij"):
+                            raise lab6()
+                        raise lab5()
+                    except lab6: pass
+                    self.cursor = v_6
+                    if not self.in_grouping(DutchStemmer.g_v):
+                        raise lab4()
+                except lab5: pass
+                continue
+            except lab4: pass
+            self.cursor = v_5
+            break
+        try:
+            if self.cursor < self.limit:
+                raise lab7()
+            return False
+        except lab7: pass
+        self.cursor = v_2
+        among_var = self.find_among(DutchStemmer.a_9)
+        if among_var == 1:
+            return False
+        self.B_GE_removed = True
+        if not self.slice_del():
+            return False
+
+        v_8 = self.cursor
+        try:
+            self.bra = self.cursor
+            among_var = self.find_among(DutchStemmer.a_10)
+            if among_var == 0:
+                raise lab8()
+            self.ket = self.cursor
+            if among_var == 1:
+                if not self.slice_from(u"e"):
+                    return False
+            else:
+                if not self.slice_from(u"i"):
+                    return False
+        except lab8: pass
+        self.cursor = v_8
+        return True
+
+    def __r_Lose_infix(self):
+        if self.cursor >= self.limit:
+            return False
+        self.cursor += 1
+        try:
+            while True:
+                try:
+                    self.bra = self.cursor
+                    if not self.eq_s(u"ge"):
+                        raise lab1()
+                    self.ket = self.cursor
+                    raise lab0()
+                except lab1: pass
+                if self.cursor >= self.limit:
+                    return False
+                self.cursor += 1
+        except lab0: pass
+        v_2 = self.cursor
+        c = self.cursor + 3
+        if c > self.limit:
+            return False
+        self.cursor = c
+        self.cursor = v_2
+        v_3 = self.cursor
+        try:
+            while True:
+                v_4 = self.cursor
+                try:
+                    try:
+                        v_5 = self.cursor
+                        try:
+                            if not self.eq_s(u"ij"):
+                                raise lab5()
+                            raise lab4()
+                        except lab5: pass
+                        self.cursor = v_5
+                        if not self.in_grouping(DutchStemmer.g_v):
+                            raise lab3()
+                    except lab4: pass
+                    raise lab2()
+                except lab3: pass
+                self.cursor = v_4
+                if self.cursor >= self.limit:
+                    return False
+                self.cursor += 1
+        except lab2: pass
+        while True:
+            v_6 = self.cursor
+            try:
+                try:
+                    v_7 = self.cursor
+                    try:
+                        if not self.eq_s(u"ij"):
+                            raise lab8()
+                        raise lab7()
+                    except lab8: pass
+                    self.cursor = v_7
+                    if not self.in_grouping(DutchStemmer.g_v):
+                        raise lab6()
+                except lab7: pass
+                continue
+            except lab6: pass
+            self.cursor = v_6
+            break
+        try:
+            if self.cursor < self.limit:
+                raise lab9()
+            return False
+        except lab9: pass
+        self.cursor = v_3
+        self.B_GE_removed = True
+        if not self.slice_del():
+            return False
+
+        v_9 = self.cursor
+        try:
+            self.bra = self.cursor
+            among_var = self.find_among(DutchStemmer.a_11)
+            if among_var == 0:
+                raise lab10()
+            self.ket = self.cursor
+            if among_var == 1:
+                if not self.slice_from(u"e"):
+                    return False
+            else:
+                if not self.slice_from(u"i"):
+                    return False
+        except lab10: pass
+        self.cursor = v_9
+        return True
+
+    def __r_measure(self):
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            while True:
+                try:
+                    if not self.out_grouping(DutchStemmer.g_v):
+                        raise lab1()
+                    continue
+                except lab1: pass
+                break
+            v_3 = 1
+            while True:
+                v_4 = self.cursor
+                try:
+                    try:
+                        v_5 = self.cursor
+                        try:
+                            if not self.eq_s(u"ij"):
+                                raise lab4()
+                            raise lab3()
+                        except lab4: pass
+                        self.cursor = v_5
+                        if not self.in_grouping(DutchStemmer.g_v):
+                            raise lab2()
+                    except lab3: pass
+                    v_3 -= 1
+                    continue
+                except lab2: pass
+                self.cursor = v_4
+                break
+            if v_3 > 0:
+                raise lab0()
+            if not self.out_grouping(DutchStemmer.g_v):
+                raise lab0()
+            self.I_p1 = self.cursor
+            while True:
+                try:
+                    if not self.out_grouping(DutchStemmer.g_v):
+                        raise lab5()
+                    continue
+                except lab5: pass
+                break
+            v_7 = 1
+            while True:
+                v_8 = self.cursor
+                try:
+                    try:
+                        v_9 = self.cursor
+                        try:
+                            if not self.eq_s(u"ij"):
+                                raise lab8()
+                            raise lab7()
+                        except lab8: pass
+                        self.cursor = v_9
+                        if not self.in_grouping(DutchStemmer.g_v):
+                            raise lab6()
+                    except lab7: pass
+                    v_7 -= 1
+                    continue
+                except lab6: pass
+                self.cursor = v_8
+                break
+            if v_7 > 0:
+                raise lab0()
+            if not self.out_grouping(DutchStemmer.g_v):
+                raise lab0()
+            self.I_p2 = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        return True
+
+    def _stem(self):
+        self.B_stemmed = False
+        self.__r_measure()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_1 = self.limit - self.cursor
+        try:
+            if not self.__r_Step_1():
+                raise lab0()
+            self.B_stemmed = True
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        v_2 = self.limit - self.cursor
+        try:
+            if not self.__r_Step_2():
+                raise lab1()
+            self.B_stemmed = True
+        except lab1: pass
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        try:
+            if not self.__r_Step_3():
+                raise lab2()
+            self.B_stemmed = True
+        except lab2: pass
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        try:
+            if not self.__r_Step_4():
+                raise lab3()
+            self.B_stemmed = True
+        except lab3: pass
+        self.cursor = self.limit - v_4
+        self.cursor = self.limit_backward
+        self.B_GE_removed = False
+        v_5 = self.cursor
+        try:
+            v_6 = self.cursor
+            if not self.__r_Lose_prefix():
+                raise lab4()
+            self.cursor = v_6
+            self.__r_measure()
+        except lab4: pass
+        self.cursor = v_5
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_7 = self.limit - self.cursor
+        try:
+            if not self.B_GE_removed:
+                raise lab5()
+            self.B_stemmed = True
+            if not self.__r_Step_1c():
+                raise lab5()
+        except lab5: pass
+        self.cursor = self.limit - v_7
+        self.cursor = self.limit_backward
+        self.B_GE_removed = False
+        v_8 = self.cursor
+        try:
+            v_9 = self.cursor
+            if not self.__r_Lose_infix():
+                raise lab6()
+            self.cursor = v_9
+            self.__r_measure()
+        except lab6: pass
+        self.cursor = v_8
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_10 = self.limit - self.cursor
+        try:
+            if not self.B_GE_removed:
+                raise lab7()
+            self.B_stemmed = True
+            if not self.__r_Step_1c():
+                raise lab7()
+        except lab7: pass
+        self.cursor = self.limit - v_10
+        self.cursor = self.limit_backward
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_11 = self.limit - self.cursor
+        try:
+            if not self.__r_Step_7():
+                raise lab8()
+            self.B_stemmed = True
+        except lab8: pass
+        self.cursor = self.limit - v_11
+        v_12 = self.limit - self.cursor
+        try:
+            if not self.B_stemmed:
+                raise lab9()
+            if not self.__r_Step_6():
+                raise lab9()
+        except lab9: pass
+        self.cursor = self.limit - v_12
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"a", -1, 1),
+        Among(u"e", -1, 2),
+        Among(u"o", -1, 1),
+        Among(u"u", -1, 1),
+        Among(u"à", -1, 1),
+        Among(u"á", -1, 1),
+        Among(u"â", -1, 1),
+        Among(u"ä", -1, 1),
+        Among(u"è", -1, 2),
+        Among(u"é", -1, 2),
+        Among(u"ê", -1, 2),
+        Among(u"eë", -1, 3),
+        Among(u"ië", -1, 4),
+        Among(u"ò", -1, 1),
+        Among(u"ó", -1, 1),
+        Among(u"ô", -1, 1),
+        Among(u"ö", -1, 1),
+        Among(u"ù", -1, 1),
+        Among(u"ú", -1, 1),
+        Among(u"û", -1, 1),
+        Among(u"ü", -1, 1)
+    ]
+
+    a_1 = [
+        Among(u"nde", -1, 8),
+        Among(u"en", -1, 7),
+        Among(u"s", -1, 2),
+        Among(u"'s", 2, 1),
+        Among(u"es", 2, 4),
+        Among(u"ies", 4, 3),
+        Among(u"aus", 2, 6),
+        Among(u"és", 2, 5)
+    ]
+
+    a_2 = [
+        Among(u"de", -1, 5),
+        Among(u"ge", -1, 2),
+        Among(u"ische", -1, 4),
+        Among(u"je", -1, 1),
+        Among(u"lijke", -1, 3),
+        Among(u"le", -1, 9),
+        Among(u"ene", -1, 10),
+        Among(u"re", -1, 8),
+        Among(u"se", -1, 7),
+        Among(u"te", -1, 6),
+        Among(u"ieve", -1, 11)
+    ]
+
+    a_3 = [
+        Among(u"heid", -1, 3),
+        Among(u"fie", -1, 7),
+        Among(u"gie", -1, 8),
+        Among(u"atie", -1, 1),
+        Among(u"isme", -1, 5),
+        Among(u"ing", -1, 5),
+        Among(u"arij", -1, 6),
+        Among(u"erij", -1, 5),
+        Among(u"sel", -1, 3),
+        Among(u"rder", -1, 4),
+        Among(u"ster", -1, 3),
+        Among(u"iteit", -1, 2),
+        Among(u"dst", -1, 10),
+        Among(u"tst", -1, 9)
+    ]
+
+    a_4 = [
+        Among(u"end", -1, 9),
+        Among(u"atief", -1, 2),
+        Among(u"erig", -1, 9),
+        Among(u"achtig", -1, 3),
+        Among(u"ioneel", -1, 1),
+        Among(u"baar", -1, 3),
+        Among(u"laar", -1, 5),
+        Among(u"naar", -1, 4),
+        Among(u"raar", -1, 6),
+        Among(u"eriger", -1, 9),
+        Among(u"achtiger", -1, 3),
+        Among(u"lijker", -1, 8),
+        Among(u"tant", -1, 7),
+        Among(u"erigst", -1, 9),
+        Among(u"achtigst", -1, 3),
+        Among(u"lijkst", -1, 8)
+    ]
+
+    a_5 = [
+        Among(u"ig", -1, 1),
+        Among(u"iger", -1, 1),
+        Among(u"igst", -1, 1)
+    ]
+
+    a_6 = [
+        Among(u"ft", -1, 2),
+        Among(u"kt", -1, 1),
+        Among(u"pt", -1, 3)
+    ]
+
+    a_7 = [
+        Among(u"bb", -1, 1),
+        Among(u"cc", -1, 2),
+        Among(u"dd", -1, 3),
+        Among(u"ff", -1, 4),
+        Among(u"gg", -1, 5),
+        Among(u"hh", -1, 6),
+        Among(u"jj", -1, 7),
+        Among(u"kk", -1, 8),
+        Among(u"ll", -1, 9),
+        Among(u"mm", -1, 10),
+        Among(u"nn", -1, 11),
+        Among(u"pp", -1, 12),
+        Among(u"qq", -1, 13),
+        Among(u"rr", -1, 14),
+        Among(u"ss", -1, 15),
+        Among(u"tt", -1, 16),
+        Among(u"v", -1, 4),
+        Among(u"vv", 16, 17),
+        Among(u"ww", -1, 18),
+        Among(u"xx", -1, 19),
+        Among(u"z", -1, 15),
+        Among(u"zz", 20, 20)
+    ]
+
+    a_8 = [
+        Among(u"d", -1, 1),
+        Among(u"t", -1, 2)
+    ]
+
+    a_9 = [
+        Among(u"", -1, -1),
+        Among(u"eft", 0, 1),
+        Among(u"vaa", 0, 1),
+        Among(u"val", 0, 1),
+        Among(u"vali", 3, -1),
+        Among(u"vare", 0, 1)
+    ]
+
+    a_10 = [
+        Among(u"ë", -1, 1),
+        Among(u"ï", -1, 2)
+    ]
+
+    a_11 = [
+        Among(u"ë", -1, 1),
+        Among(u"ï", -1, 2)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
+
+
+class lab9(BaseException): pass
+
+
+class lab10(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/english_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/english_stemmer.py
new file mode 100644
index 000000000..fa8570d71
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/english_stemmer.py
@@ -0,0 +1,762 @@
+#-*- coding: utf-8 -*-
+# Generated from english.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class EnglishStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from english.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_aeo = {u"a", u"e", u"o"}
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"y"}
+
+    g_v_WXY = {u"a", u"e", u"i", u"o", u"u", u"y", u"w", u"x", u"Y"}
+
+    g_valid_LI = {u"c", u"d", u"e", u"g", u"h", u"k", u"m", u"n", u"r", u"t"}
+
+    B_Y_found = False
+    I_p2 = 0
+    I_p1 = 0
+
+    def __r_prelude(self):
+        self.B_Y_found = False
+        v_1 = self.cursor
+        try:
+            self.bra = self.cursor
+            if not self.eq_s(u"'"):
+                raise lab0()
+            self.ket = self.cursor
+            if not self.slice_del():
+                return False
+
+        except lab0: pass
+        self.cursor = v_1
+        v_2 = self.cursor
+        try:
+            self.bra = self.cursor
+            if not self.eq_s(u"y"):
+                raise lab1()
+            self.ket = self.cursor
+            if not self.slice_from(u"Y"):
+                return False
+            self.B_Y_found = True
+        except lab1: pass
+        self.cursor = v_2
+        v_3 = self.cursor
+        try:
+            while True:
+                v_4 = self.cursor
+                try:
+                    try:
+                        while True:
+                            v_5 = self.cursor
+                            try:
+                                if not self.in_grouping(EnglishStemmer.g_v):
+                                    raise lab5()
+                                self.bra = self.cursor
+                                if not self.eq_s(u"y"):
+                                    raise lab5()
+                                self.ket = self.cursor
+                                self.cursor = v_5
+                                raise lab4()
+                            except lab5: pass
+                            self.cursor = v_5
+                            if self.cursor >= self.limit:
+                                raise lab3()
+                            self.cursor += 1
+                    except lab4: pass
+                    if not self.slice_from(u"Y"):
+                        return False
+                    self.B_Y_found = True
+                    continue
+                except lab3: pass
+                self.cursor = v_4
+                break
+        except lab2: pass
+        self.cursor = v_3
+        return True
+
+    def __r_mark_regions(self):
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            try:
+                v_2 = self.cursor
+                try:
+                    if self.find_among(EnglishStemmer.a_0) == 0:
+                        raise lab2()
+                    raise lab1()
+                except lab2: pass
+                self.cursor = v_2
+                if not self.go_out_grouping(EnglishStemmer.g_v):
+                    raise lab0()
+                self.cursor += 1
+                if not self.go_in_grouping(EnglishStemmer.g_v):
+                    raise lab0()
+                self.cursor += 1
+            except lab1: pass
+            self.I_p1 = self.cursor
+            if not self.go_out_grouping(EnglishStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            if not self.go_in_grouping(EnglishStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        return True
+
+    def __r_shortv(self):
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.out_grouping_b(EnglishStemmer.g_v_WXY):
+                    raise lab1()
+                if not self.in_grouping_b(EnglishStemmer.g_v):
+                    raise lab1()
+                if not self.out_grouping_b(EnglishStemmer.g_v):
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            try:
+                if not self.out_grouping_b(EnglishStemmer.g_v):
+                    raise lab2()
+                if not self.in_grouping_b(EnglishStemmer.g_v):
+                    raise lab2()
+                if self.cursor > self.limit_backward:
+                    raise lab2()
+                raise lab0()
+            except lab2: pass
+            self.cursor = self.limit - v_1
+            if not self.eq_s_b(u"past"):
+                return False
+        except lab0: pass
+        return True
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_Step_1a(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if self.find_among_b(EnglishStemmer.a_1) == 0:
+                self.cursor = self.limit - v_1
+                raise lab0()
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+        except lab0: pass
+        self.ket = self.cursor
+        among_var = self.find_among_b(EnglishStemmer.a_2)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"ss"):
+                return False
+        elif among_var == 2:
+            try:
+                v_2 = self.limit - self.cursor
+                try:
+                    c = self.cursor - 2
+                    if c < self.limit_backward:
+                        raise lab2()
+                    self.cursor = c
+                    if not self.slice_from(u"i"):
+                        return False
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_2
+                if not self.slice_from(u"ie"):
+                    return False
+            except lab1: pass
+        elif among_var == 3:
+            if self.cursor <= self.limit_backward:
+                return False
+            self.cursor -= 1
+            if not self.go_out_grouping_b(EnglishStemmer.g_v):
+                return False
+            self.cursor -= 1
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Step_1b(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(EnglishStemmer.a_5)
+        self.bra = self.cursor
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if among_var == 1:
+                    v_2 = self.limit - self.cursor
+                    try:
+                        try:
+                            v_3 = self.limit - self.cursor
+                            try:
+                                if self.find_among_b(EnglishStemmer.a_3) == 0:
+                                    raise lab4()
+                                if self.cursor > self.limit_backward:
+                                    raise lab4()
+                                raise lab3()
+                            except lab4: pass
+                            self.cursor = self.limit - v_3
+                            if not self.__r_R1():
+                                raise lab2()
+                            if not self.slice_from(u"ee"):
+                                return False
+                        except lab3: pass
+                    except lab2: pass
+                    self.cursor = self.limit - v_2
+                elif among_var == 2:
+                    raise lab1()
+                elif among_var == 3:
+                    among_var = self.find_among_b(EnglishStemmer.a_4)
+                    if among_var == 0:
+                        raise lab1()
+                    if among_var == 1:
+                        v_4 = self.limit - self.cursor
+                        if not self.out_grouping_b(EnglishStemmer.g_v):
+                            raise lab1()
+                        if self.cursor > self.limit_backward:
+                            raise lab1()
+                        self.cursor = self.limit - v_4
+                        self.bra = self.cursor
+                        if not self.slice_from(u"ie"):
+                            return False
+                    else:
+                        if self.cursor > self.limit_backward:
+                            raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            v_5 = self.limit - self.cursor
+            if not self.go_out_grouping_b(EnglishStemmer.g_v):
+                return False
+            self.cursor -= 1
+            self.cursor = self.limit - v_5
+            if not self.slice_del():
+                return False
+
+            self.ket = self.cursor
+            self.bra = self.cursor
+            v_6 = self.limit - self.cursor
+            among_var = self.find_among_b(EnglishStemmer.a_6)
+            if among_var == 1:
+                if not self.slice_from(u"e"):
+                    return False
+                return False
+            elif among_var == 2:
+                v_7 = self.limit - self.cursor
+                try:
+                    if not self.in_grouping_b(EnglishStemmer.g_aeo):
+                        raise lab5()
+                    if self.cursor > self.limit_backward:
+                        raise lab5()
+                    return False
+                except lab5: pass
+                self.cursor = self.limit - v_7
+            else:
+                if self.cursor != self.I_p1:
+                    return False
+                v_8 = self.limit - self.cursor
+                if not self.__r_shortv():
+                    return False
+                self.cursor = self.limit - v_8
+                if not self.slice_from(u"e"):
+                    return False
+                return False
+            self.cursor = self.limit - v_6
+            self.ket = self.cursor
+            if self.cursor <= self.limit_backward:
+                return False
+            self.cursor -= 1
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+        except lab0: pass
+        return True
+
+    def __r_Step_1c(self):
+        self.ket = self.cursor
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"y"):
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            if not self.eq_s_b(u"Y"):
+                return False
+        except lab0: pass
+        self.bra = self.cursor
+        if not self.out_grouping_b(EnglishStemmer.g_v):
+            return False
+        try:
+            if self.cursor > self.limit_backward:
+                raise lab2()
+            return False
+        except lab2: pass
+        if not self.slice_from(u"i"):
+            return False
+        return True
+
+    def __r_Step_2(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(EnglishStemmer.a_7)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"tion"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"ence"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"ance"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"able"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"ent"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"ize"):
+                return False
+        elif among_var == 7:
+            if not self.slice_from(u"ate"):
+                return False
+        elif among_var == 8:
+            if not self.slice_from(u"al"):
+                return False
+        elif among_var == 9:
+            if not self.slice_from(u"ful"):
+                return False
+        elif among_var == 10:
+            if not self.slice_from(u"ous"):
+                return False
+        elif among_var == 11:
+            if not self.slice_from(u"ive"):
+                return False
+        elif among_var == 12:
+            if not self.slice_from(u"ble"):
+                return False
+        elif among_var == 13:
+            if not self.slice_from(u"og"):
+                return False
+        elif among_var == 14:
+            if not self.eq_s_b(u"l"):
+                return False
+            if not self.slice_from(u"og"):
+                return False
+        elif among_var == 15:
+            if not self.slice_from(u"less"):
+                return False
+        else:
+            if not self.in_grouping_b(EnglishStemmer.g_valid_LI):
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Step_3(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(EnglishStemmer.a_8)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"tion"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"ate"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"al"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"ic"):
+                return False
+        elif among_var == 5:
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Step_4(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(EnglishStemmer.a_9)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R2():
+            return False
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        else:
+            try:
+                v_1 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"s"):
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_1
+                if not self.eq_s_b(u"t"):
+                    return False
+            except lab0: pass
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Step_5(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(EnglishStemmer.a_10)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            try:
+                try:
+                    if not self.__r_R2():
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                if not self.__r_R1():
+                    return False
+                v_2 = self.limit - self.cursor
+                try:
+                    if not self.__r_shortv():
+                        raise lab2()
+                    return False
+                except lab2: pass
+                self.cursor = self.limit - v_2
+            except lab0: pass
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.__r_R2():
+                return False
+            if not self.eq_s_b(u"l"):
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_exception1(self):
+        self.bra = self.cursor
+        among_var = self.find_among(EnglishStemmer.a_11)
+        if among_var == 0:
+            return False
+        self.ket = self.cursor
+        if self.cursor < self.limit:
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"sky"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"idl"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"gentl"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"ugli"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"earli"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"onli"):
+                return False
+        elif among_var == 7:
+            if not self.slice_from(u"singl"):
+                return False
+        return True
+
+    def __r_postlude(self):
+        if not self.B_Y_found:
+            return False
+        while True:
+            v_1 = self.cursor
+            try:
+                try:
+                    while True:
+                        v_2 = self.cursor
+                        try:
+                            self.bra = self.cursor
+                            if not self.eq_s(u"Y"):
+                                raise lab2()
+                            self.ket = self.cursor
+                            self.cursor = v_2
+                            raise lab1()
+                        except lab2: pass
+                        self.cursor = v_2
+                        if self.cursor >= self.limit:
+                            raise lab0()
+                        self.cursor += 1
+                except lab1: pass
+                if not self.slice_from(u"y"):
+                    return False
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def _stem(self):
+        try:
+            v_1 = self.cursor
+            try:
+                if not self.__r_exception1():
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = v_1
+            try:
+                v_2 = self.cursor
+                try:
+                    c = self.cursor + 3
+                    if c > self.limit:
+                        raise lab3()
+                    self.cursor = c
+                    raise lab2()
+                except lab3: pass
+                self.cursor = v_2
+                raise lab0()
+            except lab2: pass
+            self.cursor = v_1
+            self.__r_prelude()
+            self.__r_mark_regions()
+            self.limit_backward = self.cursor
+            self.cursor = self.limit
+            v_5 = self.limit - self.cursor
+            self.__r_Step_1a()
+            self.cursor = self.limit - v_5
+            v_6 = self.limit - self.cursor
+            self.__r_Step_1b()
+            self.cursor = self.limit - v_6
+            v_7 = self.limit - self.cursor
+            self.__r_Step_1c()
+            self.cursor = self.limit - v_7
+            v_8 = self.limit - self.cursor
+            self.__r_Step_2()
+            self.cursor = self.limit - v_8
+            v_9 = self.limit - self.cursor
+            self.__r_Step_3()
+            self.cursor = self.limit - v_9
+            v_10 = self.limit - self.cursor
+            self.__r_Step_4()
+            self.cursor = self.limit - v_10
+            v_11 = self.limit - self.cursor
+            self.__r_Step_5()
+            self.cursor = self.limit - v_11
+            self.cursor = self.limit_backward
+            v_12 = self.cursor
+            self.__r_postlude()
+            self.cursor = v_12
+        except lab0: pass
+        return True
+
+    a_0 = [
+        Among(u"arsen", -1, -1),
+        Among(u"commun", -1, -1),
+        Among(u"emerg", -1, -1),
+        Among(u"gener", -1, -1),
+        Among(u"later", -1, -1),
+        Among(u"organ", -1, -1),
+        Among(u"past", -1, -1),
+        Among(u"univers", -1, -1)
+    ]
+
+    a_1 = [
+        Among(u"'", -1, 1),
+        Among(u"'s'", 0, 1),
+        Among(u"'s", -1, 1)
+    ]
+
+    a_2 = [
+        Among(u"ied", -1, 2),
+        Among(u"s", -1, 3),
+        Among(u"ies", 1, 2),
+        Among(u"sses", 1, 1),
+        Among(u"ss", 1, -1),
+        Among(u"us", 1, -1)
+    ]
+
+    a_3 = [
+        Among(u"succ", -1, 1),
+        Among(u"proc", -1, 1),
+        Among(u"exc", -1, 1)
+    ]
+
+    a_4 = [
+        Among(u"even", -1, 2),
+        Among(u"cann", -1, 2),
+        Among(u"inn", -1, 2),
+        Among(u"earr", -1, 2),
+        Among(u"herr", -1, 2),
+        Among(u"out", -1, 2),
+        Among(u"y", -1, 1)
+    ]
+
+    a_5 = [
+        Among(u"", -1, -1),
+        Among(u"ed", 0, 2),
+        Among(u"eed", 1, 1),
+        Among(u"ing", 0, 3),
+        Among(u"edly", 0, 2),
+        Among(u"eedly", 4, 1),
+        Among(u"ingly", 0, 2)
+    ]
+
+    a_6 = [
+        Among(u"", -1, 3),
+        Among(u"bb", 0, 2),
+        Among(u"dd", 0, 2),
+        Among(u"ff", 0, 2),
+        Among(u"gg", 0, 2),
+        Among(u"bl", 0, 1),
+        Among(u"mm", 0, 2),
+        Among(u"nn", 0, 2),
+        Among(u"pp", 0, 2),
+        Among(u"rr", 0, 2),
+        Among(u"at", 0, 1),
+        Among(u"tt", 0, 2),
+        Among(u"iz", 0, 1)
+    ]
+
+    a_7 = [
+        Among(u"anci", -1, 3),
+        Among(u"enci", -1, 2),
+        Among(u"ogi", -1, 14),
+        Among(u"li", -1, 16),
+        Among(u"bli", 3, 12),
+        Among(u"abli", 4, 4),
+        Among(u"alli", 3, 8),
+        Among(u"fulli", 3, 9),
+        Among(u"lessli", 3, 15),
+        Among(u"ousli", 3, 10),
+        Among(u"entli", 3, 5),
+        Among(u"aliti", -1, 8),
+        Among(u"biliti", -1, 12),
+        Among(u"iviti", -1, 11),
+        Among(u"tional", -1, 1),
+        Among(u"ational", 14, 7),
+        Among(u"alism", -1, 8),
+        Among(u"ation", -1, 7),
+        Among(u"ization", 17, 6),
+        Among(u"izer", -1, 6),
+        Among(u"ator", -1, 7),
+        Among(u"iveness", -1, 11),
+        Among(u"fulness", -1, 9),
+        Among(u"ousness", -1, 10),
+        Among(u"ogist", -1, 13)
+    ]
+
+    a_8 = [
+        Among(u"icate", -1, 4),
+        Among(u"ative", -1, 6),
+        Among(u"alize", -1, 3),
+        Among(u"iciti", -1, 4),
+        Among(u"ical", -1, 4),
+        Among(u"tional", -1, 1),
+        Among(u"ational", 5, 2),
+        Among(u"ful", -1, 5),
+        Among(u"ness", -1, 5)
+    ]
+
+    a_9 = [
+        Among(u"ic", -1, 1),
+        Among(u"ance", -1, 1),
+        Among(u"ence", -1, 1),
+        Among(u"able", -1, 1),
+        Among(u"ible", -1, 1),
+        Among(u"ate", -1, 1),
+        Among(u"ive", -1, 1),
+        Among(u"ize", -1, 1),
+        Among(u"iti", -1, 1),
+        Among(u"al", -1, 1),
+        Among(u"ism", -1, 1),
+        Among(u"ion", -1, 2),
+        Among(u"er", -1, 1),
+        Among(u"ous", -1, 1),
+        Among(u"ant", -1, 1),
+        Among(u"ent", -1, 1),
+        Among(u"ment", 15, 1),
+        Among(u"ement", 16, 1)
+    ]
+
+    a_10 = [
+        Among(u"e", -1, 1),
+        Among(u"l", -1, 2)
+    ]
+
+    a_11 = [
+        Among(u"andes", -1, -1),
+        Among(u"atlas", -1, -1),
+        Among(u"bias", -1, -1),
+        Among(u"cosmos", -1, -1),
+        Among(u"early", -1, 5),
+        Among(u"gently", -1, 3),
+        Among(u"howe", -1, -1),
+        Among(u"idly", -1, 2),
+        Among(u"news", -1, -1),
+        Among(u"only", -1, 6),
+        Among(u"singly", -1, 7),
+        Among(u"skies", -1, 1),
+        Among(u"sky", -1, -1),
+        Among(u"ugly", -1, 4)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/esperanto_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/esperanto_stemmer.py
new file mode 100644
index 000000000..124c8fad9
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/esperanto_stemmer.py
@@ -0,0 +1,588 @@
+#-*- coding: utf-8 -*-
+# Generated from esperanto.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class EsperantoStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from esperanto.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_vowel = {u"a", u"e", u"i", u"o", u"u"}
+
+    g_aou = {u"a", u"o", u"u"}
+
+    g_digit = {u"0", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9"}
+
+    B_foreign = False
+
+    def __r_canonical_form(self):
+        self.B_foreign = False
+        while True:
+            v_1 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(EsperantoStemmer.a_0)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"ĉ"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"ĝ"):
+                        return False
+                elif among_var == 3:
+                    if not self.slice_from(u"ĥ"):
+                        return False
+                elif among_var == 4:
+                    if not self.slice_from(u"ĵ"):
+                        return False
+                elif among_var == 5:
+                    if not self.slice_from(u"ŝ"):
+                        return False
+                elif among_var == 6:
+                    if not self.slice_from(u"ŭ"):
+                        return False
+                elif among_var == 7:
+                    if not self.slice_from(u"a"):
+                        return False
+                    self.B_foreign = True
+                elif among_var == 8:
+                    if not self.slice_from(u"e"):
+                        return False
+                    self.B_foreign = True
+                elif among_var == 9:
+                    if not self.slice_from(u"i"):
+                        return False
+                    self.B_foreign = True
+                elif among_var == 10:
+                    if not self.slice_from(u"o"):
+                        return False
+                    self.B_foreign = True
+                elif among_var == 11:
+                    if not self.slice_from(u"u"):
+                        return False
+                    self.B_foreign = True
+                elif among_var == 12:
+                    self.B_foreign = True
+                elif among_var == 13:
+                    self.B_foreign = False
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        try:
+            if not self.B_foreign:
+                raise lab1()
+            return False
+        except lab1: pass
+        return True
+
+    def __r_initial_apostrophe(self):
+        self.bra = self.cursor
+        if not self.eq_s(u"'"):
+            return False
+        self.ket = self.cursor
+        if not self.eq_s(u"st"):
+            return False
+        if self.find_among(EsperantoStemmer.a_1) == 0:
+            return False
+        if self.cursor < self.limit:
+            return False
+        if not self.slice_from(u"e"):
+            return False
+        return True
+
+    def __r_pronoun(self):
+        self.ket = self.cursor
+        v_1 = self.limit - self.cursor
+        try:
+            if not self.eq_s_b(u"n"):
+                self.cursor = self.limit - v_1
+                raise lab0()
+        except lab0: pass
+        self.bra = self.cursor
+        if self.find_among_b(EsperantoStemmer.a_2) == 0:
+            return False
+        try:
+            v_2 = self.limit - self.cursor
+            try:
+                if self.cursor > self.limit_backward:
+                    raise lab2()
+                raise lab1()
+            except lab2: pass
+            self.cursor = self.limit - v_2
+            if not self.eq_s_b(u"-"):
+                return False
+        except lab1: pass
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_final_apostrophe(self):
+        self.ket = self.cursor
+        if not self.eq_s_b(u"'"):
+            return False
+        self.bra = self.cursor
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"l"):
+                    raise lab1()
+                if self.cursor > self.limit_backward:
+                    raise lab1()
+                if not self.slice_from(u"a"):
+                    return False
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            try:
+                if not self.eq_s_b(u"un"):
+                    raise lab2()
+                if self.cursor > self.limit_backward:
+                    raise lab2()
+                if not self.slice_from(u"u"):
+                    return False
+                raise lab0()
+            except lab2: pass
+            self.cursor = self.limit - v_1
+            try:
+                if self.find_among_b(EsperantoStemmer.a_3) == 0:
+                    raise lab3()
+                try:
+                    v_2 = self.limit - self.cursor
+                    try:
+                        if self.cursor > self.limit_backward:
+                            raise lab5()
+                        raise lab4()
+                    except lab5: pass
+                    self.cursor = self.limit - v_2
+                    if not self.eq_s_b(u"-"):
+                        raise lab3()
+                except lab4: pass
+                if not self.slice_from(u"aŭ"):
+                    return False
+                raise lab0()
+            except lab3: pass
+            self.cursor = self.limit - v_1
+            if not self.slice_from(u"o"):
+                return False
+        except lab0: pass
+        return True
+
+    def __r_ujn_suffix(self):
+        self.ket = self.cursor
+        v_1 = self.limit - self.cursor
+        try:
+            if not self.eq_s_b(u"n"):
+                self.cursor = self.limit - v_1
+                raise lab0()
+        except lab0: pass
+        v_2 = self.limit - self.cursor
+        try:
+            if not self.eq_s_b(u"j"):
+                self.cursor = self.limit - v_2
+                raise lab1()
+        except lab1: pass
+        self.bra = self.cursor
+        if self.find_among_b(EsperantoStemmer.a_4) == 0:
+            return False
+        try:
+            v_3 = self.limit - self.cursor
+            try:
+                if self.cursor > self.limit_backward:
+                    raise lab3()
+                raise lab2()
+            except lab3: pass
+            self.cursor = self.limit - v_3
+            if not self.eq_s_b(u"-"):
+                return False
+        except lab2: pass
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_uninflected(self):
+        if self.find_among_b(EsperantoStemmer.a_5) == 0:
+            return False
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if self.cursor > self.limit_backward:
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            if not self.eq_s_b(u"-"):
+                return False
+        except lab0: pass
+        return True
+
+    def __r_merged_numeral(self):
+        if self.find_among_b(EsperantoStemmer.a_6) == 0:
+            return False
+        if self.find_among_b(EsperantoStemmer.a_7) == 0:
+            return False
+        return True
+
+    def __r_correlative(self):
+        self.ket = self.cursor
+        self.bra = self.cursor
+        v_1 = self.limit - self.cursor
+        try:
+            v_2 = self.limit - self.cursor
+            try:
+                v_3 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"n"):
+                        self.cursor = self.limit - v_3
+                        raise lab2()
+                except lab2: pass
+                self.bra = self.cursor
+                if not self.eq_s_b(u"e"):
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_2
+            v_4 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"n"):
+                    self.cursor = self.limit - v_4
+                    raise lab3()
+            except lab3: pass
+            v_5 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"j"):
+                    self.cursor = self.limit - v_5
+                    raise lab4()
+            except lab4: pass
+            self.bra = self.cursor
+            if not self.in_grouping_b(EsperantoStemmer.g_aou):
+                return False
+        except lab0: pass
+        if not self.eq_s_b(u"i"):
+            return False
+        v_6 = self.limit - self.cursor
+        try:
+            if self.find_among_b(EsperantoStemmer.a_8) == 0:
+                self.cursor = self.limit - v_6
+                raise lab5()
+        except lab5: pass
+        try:
+            v_7 = self.limit - self.cursor
+            try:
+                if self.cursor > self.limit_backward:
+                    raise lab7()
+                raise lab6()
+            except lab7: pass
+            self.cursor = self.limit - v_7
+            if not self.eq_s_b(u"-"):
+                return False
+        except lab6: pass
+        self.cursor = self.limit - v_1
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_long_word(self):
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                for v_2 in 0, 0:
+
+                    if not self.go_out_grouping_b(EsperantoStemmer.g_vowel):
+                        raise lab1()
+                    self.cursor -= 1
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            try:
+                try:
+                    while True:
+                        try:
+                            if not self.eq_s_b(u"-"):
+                                raise lab4()
+                            raise lab3()
+                        except lab4: pass
+                        if self.cursor <= self.limit_backward:
+                            raise lab2()
+                        self.cursor -= 1
+                except lab3: pass
+                if self.cursor <= self.limit_backward:
+                    raise lab2()
+                self.cursor -= 1
+                raise lab0()
+            except lab2: pass
+            self.cursor = self.limit - v_1
+            if not self.go_out_grouping_b(EsperantoStemmer.g_digit):
+                return False
+            self.cursor -= 1
+        except lab0: pass
+        return True
+
+    def __r_not_after_letter(self):
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"-"):
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            if not self.in_grouping_b(EsperantoStemmer.g_digit):
+                return False
+        except lab0: pass
+        return True
+
+    def __r_standard_suffix(self):
+        self.ket = self.cursor
+        if self.find_among_b(EsperantoStemmer.a_9) == 0:
+            return False
+        v_1 = self.limit - self.cursor
+        try:
+            if not self.eq_s_b(u"-"):
+                self.cursor = self.limit - v_1
+                raise lab0()
+        except lab0: pass
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        if not self.__r_canonical_form():
+            return False
+        self.cursor = v_1
+        v_2 = self.cursor
+        self.__r_initial_apostrophe()
+        self.cursor = v_2
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_3 = self.limit - self.cursor
+        try:
+            if not self.__r_pronoun():
+                raise lab0()
+            return False
+        except lab0: pass
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        self.__r_final_apostrophe()
+        self.cursor = self.limit - v_4
+        v_5 = self.limit - self.cursor
+        try:
+            if not self.__r_correlative():
+                raise lab1()
+            return False
+        except lab1: pass
+        self.cursor = self.limit - v_5
+        v_6 = self.limit - self.cursor
+        try:
+            if not self.__r_uninflected():
+                raise lab2()
+            return False
+        except lab2: pass
+        self.cursor = self.limit - v_6
+        v_7 = self.limit - self.cursor
+        try:
+            if not self.__r_merged_numeral():
+                raise lab3()
+            return False
+        except lab3: pass
+        self.cursor = self.limit - v_7
+        v_8 = self.limit - self.cursor
+        try:
+            if not self.__r_ujn_suffix():
+                raise lab4()
+            return False
+        except lab4: pass
+        self.cursor = self.limit - v_8
+        v_9 = self.limit - self.cursor
+        if not self.__r_long_word():
+            return False
+        self.cursor = self.limit - v_9
+        if not self.__r_standard_suffix():
+            return False
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"", -1, 14),
+        Among(u"-", 0, 13),
+        Among(u"cx", 0, 1),
+        Among(u"gx", 0, 2),
+        Among(u"hx", 0, 3),
+        Among(u"jx", 0, 4),
+        Among(u"q", 0, 12),
+        Among(u"sx", 0, 5),
+        Among(u"ux", 0, 6),
+        Among(u"w", 0, 12),
+        Among(u"x", 0, 12),
+        Among(u"y", 0, 12),
+        Among(u"á", 0, 7),
+        Among(u"é", 0, 8),
+        Among(u"í", 0, 9),
+        Among(u"ó", 0, 10),
+        Among(u"ú", 0, 11)
+    ]
+
+    a_1 = [
+        Among(u"as", -1, -1),
+        Among(u"i", -1, -1),
+        Among(u"is", 1, -1),
+        Among(u"os", -1, -1),
+        Among(u"u", -1, -1),
+        Among(u"us", 4, -1)
+    ]
+
+    a_2 = [
+        Among(u"ci", -1, -1),
+        Among(u"gi", -1, -1),
+        Among(u"hi", -1, -1),
+        Among(u"li", -1, -1),
+        Among(u"ili", 3, -1),
+        Among(u"ŝli", 3, -1),
+        Among(u"mi", -1, -1),
+        Among(u"ni", -1, -1),
+        Among(u"oni", 7, -1),
+        Among(u"ri", -1, -1),
+        Among(u"si", -1, -1),
+        Among(u"vi", -1, -1),
+        Among(u"ivi", 11, -1),
+        Among(u"ĝi", -1, -1),
+        Among(u"ŝi", -1, -1),
+        Among(u"iŝi", 14, -1),
+        Among(u"malŝi", 14, -1)
+    ]
+
+    a_3 = [
+        Among(u"amb", -1, -1),
+        Among(u"bald", -1, -1),
+        Among(u"malbald", 1, -1),
+        Among(u"morg", -1, -1),
+        Among(u"postmorg", 3, -1),
+        Among(u"adi", -1, -1),
+        Among(u"hodi", -1, -1),
+        Among(u"ank", -1, -1),
+        Among(u"ĉirk", -1, -1),
+        Among(u"tutĉirk", 8, -1),
+        Among(u"presk", -1, -1),
+        Among(u"almen", -1, -1),
+        Among(u"apen", -1, -1),
+        Among(u"hier", -1, -1),
+        Among(u"antaŭhier", 13, -1),
+        Among(u"malgr", -1, -1),
+        Among(u"ankor", -1, -1),
+        Among(u"kontr", -1, -1),
+        Among(u"anstat", -1, -1),
+        Among(u"kvaz", -1, -1)
+    ]
+
+    a_4 = [
+        Among(u"aliu", -1, -1),
+        Among(u"unu", -1, -1)
+    ]
+
+    a_5 = [
+        Among(u"aha", -1, -1),
+        Among(u"haha", 0, -1),
+        Among(u"haleluja", -1, -1),
+        Among(u"hola", -1, -1),
+        Among(u"hosana", -1, -1),
+        Among(u"maltra", -1, -1),
+        Among(u"hura", -1, -1),
+        Among(u"ĥaĥa", -1, -1),
+        Among(u"ekde", -1, -1),
+        Among(u"elde", -1, -1),
+        Among(u"disde", -1, -1),
+        Among(u"ehe", -1, -1),
+        Among(u"maltre", -1, -1),
+        Among(u"dirlididi", -1, -1),
+        Among(u"malpli", -1, -1),
+        Among(u"malĉi", -1, -1),
+        Among(u"malkaj", -1, -1),
+        Among(u"amen", -1, -1),
+        Among(u"tamen", 17, -1),
+        Among(u"oho", -1, -1),
+        Among(u"maltro", -1, -1),
+        Among(u"minus", -1, -1),
+        Among(u"uhu", -1, -1),
+        Among(u"muu", -1, -1)
+    ]
+
+    a_6 = [
+        Among(u"tri", -1, -1),
+        Among(u"du", -1, -1),
+        Among(u"unu", -1, -1)
+    ]
+
+    a_7 = [
+        Among(u"dek", -1, -1),
+        Among(u"cent", -1, -1)
+    ]
+
+    a_8 = [
+        Among(u"k", -1, -1),
+        Among(u"kelk", 0, -1),
+        Among(u"nen", -1, -1),
+        Among(u"t", -1, -1),
+        Among(u"mult", 3, -1),
+        Among(u"samt", 3, -1),
+        Among(u"ĉ", -1, -1)
+    ]
+
+    a_9 = [
+        Among(u"a", -1, -1),
+        Among(u"e", -1, -1),
+        Among(u"i", -1, -1),
+        Among(u"j", -1, -1, __r_not_after_letter),
+        Among(u"aj", 3, -1),
+        Among(u"oj", 3, -1),
+        Among(u"n", -1, -1, __r_not_after_letter),
+        Among(u"an", 6, -1),
+        Among(u"en", 6, -1),
+        Among(u"jn", 6, -1, __r_not_after_letter),
+        Among(u"ajn", 9, -1),
+        Among(u"ojn", 9, -1),
+        Among(u"on", 6, -1),
+        Among(u"o", -1, -1),
+        Among(u"as", -1, -1),
+        Among(u"is", -1, -1),
+        Among(u"os", -1, -1),
+        Among(u"us", -1, -1),
+        Among(u"u", -1, -1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/estonian_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/estonian_stemmer.py
new file mode 100644
index 000000000..392eecaa5
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/estonian_stemmer.py
@@ -0,0 +1,850 @@
+#-*- coding: utf-8 -*-
+# Generated from estonian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class EstonianStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from estonian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_V1 = {u"a", u"e", u"i", u"o", u"u", u"õ", u"ä", u"ö", u"ü"}
+
+    g_RV = {u"a", u"e", u"i", u"u", u"o"}
+
+    g_KI = {u"k", u"p", u"t", u"g", u"b", u"d", u"s", u"h", u"f", u"š", u"z", u"ž"}
+
+    g_GI = {u"c", u"j", u"l", u"m", u"n", u"q", u"r", u"v", u"w", u"x", u"a", u"e", u"i", u"o", u"u", u"õ", u"ä", u"ö", u"ü"}
+
+    I_p1 = 0
+
+    def __r_mark_regions(self):
+        self.I_p1 = self.limit
+        if not self.go_out_grouping(EstonianStemmer.g_V1):
+            return False
+        self.cursor += 1
+        if not self.go_in_grouping(EstonianStemmer.g_V1):
+            return False
+        self.cursor += 1
+        self.I_p1 = self.cursor
+        return True
+
+    def __r_emphasis(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(EstonianStemmer.a_0)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        v_3 = self.limit - self.cursor
+        c = self.cursor - 4
+        if c < self.limit_backward:
+            return False
+        self.cursor = c
+        self.cursor = self.limit - v_3
+        if among_var == 1:
+            v_4 = self.limit - self.cursor
+            if not self.in_grouping_b(EstonianStemmer.g_GI):
+                return False
+            self.cursor = self.limit - v_4
+            v_5 = self.limit - self.cursor
+            try:
+                if not self.__r_LONGV():
+                    raise lab0()
+                return False
+            except lab0: pass
+            self.cursor = self.limit - v_5
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.in_grouping_b(EstonianStemmer.g_KI):
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_verb(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(EstonianStemmer.a_1)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.slice_from(u"a"):
+                return False
+        else:
+            if not self.in_grouping_b(EstonianStemmer.g_V1):
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_LONGV(self):
+        if self.find_among_b(EstonianStemmer.a_2) == 0:
+            return False
+        return True
+
+    def __r_i_plural(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        if self.find_among_b(EstonianStemmer.a_3) == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if not self.in_grouping_b(EstonianStemmer.g_RV):
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_special_noun_endings(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(EstonianStemmer.a_4)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            if not self.slice_from(u"lase"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"mise"):
+                return False
+        else:
+            if not self.slice_from(u"lise"):
+                return False
+        return True
+
+    def __r_case_ending(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(EstonianStemmer.a_5)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            try:
+                v_3 = self.limit - self.cursor
+                try:
+                    if not self.in_grouping_b(EstonianStemmer.g_RV):
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_3
+                if not self.__r_LONGV():
+                    return False
+            except lab0: pass
+        else:
+            v_4 = self.limit - self.cursor
+            c = self.cursor - 4
+            if c < self.limit_backward:
+                return False
+            self.cursor = c
+            self.cursor = self.limit - v_4
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_plural_three_first_cases(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(EstonianStemmer.a_7)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            if not self.slice_from(u"iku"):
+                return False
+        elif among_var == 2:
+            v_3 = self.limit - self.cursor
+            try:
+                if not self.__r_LONGV():
+                    raise lab0()
+                return False
+            except lab0: pass
+            self.cursor = self.limit - v_3
+            if not self.slice_del():
+                return False
+
+        elif among_var == 3:
+            try:
+                v_4 = self.limit - self.cursor
+                try:
+                    v_5 = self.limit - self.cursor
+                    c = self.cursor - 4
+                    if c < self.limit_backward:
+                        raise lab2()
+                    self.cursor = c
+                    self.cursor = self.limit - v_5
+                    among_var = self.find_among_b(EstonianStemmer.a_6)
+                    if among_var == 1:
+                        if not self.slice_from(u"e"):
+                            return False
+                    elif among_var == 2:
+                        if not self.slice_del():
+                            return False
+
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_4
+                if not self.slice_from(u"t"):
+                    return False
+            except lab1: pass
+        else:
+            try:
+                v_6 = self.limit - self.cursor
+                try:
+                    if not self.in_grouping_b(EstonianStemmer.g_RV):
+                        raise lab4()
+                    raise lab3()
+                except lab4: pass
+                self.cursor = self.limit - v_6
+                if not self.__r_LONGV():
+                    return False
+            except lab3: pass
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_nu(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        if self.find_among_b(EstonianStemmer.a_8) == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_undouble_kpt(self):
+        if not self.in_grouping_b(EstonianStemmer.g_V1):
+            return False
+        if self.I_p1 > self.cursor:
+            return False
+        self.ket = self.cursor
+        among_var = self.find_among_b(EstonianStemmer.a_9)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"k"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"p"):
+                return False
+        else:
+            if not self.slice_from(u"t"):
+                return False
+        return True
+
+    def __r_degrees(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(EstonianStemmer.a_10)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            if not self.in_grouping_b(EstonianStemmer.g_RV):
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_substantive(self):
+        v_1 = self.limit - self.cursor
+        self.__r_special_noun_endings()
+        self.cursor = self.limit - v_1
+        v_2 = self.limit - self.cursor
+        self.__r_case_ending()
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        self.__r_plural_three_first_cases()
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        self.__r_degrees()
+        self.cursor = self.limit - v_4
+        v_5 = self.limit - self.cursor
+        self.__r_i_plural()
+        self.cursor = self.limit - v_5
+        v_6 = self.limit - self.cursor
+        self.__r_nu()
+        self.cursor = self.limit - v_6
+        return True
+
+    def __r_verb_exceptions(self):
+        self.bra = self.cursor
+        among_var = self.find_among(EstonianStemmer.a_11)
+        if among_var == 0:
+            return False
+        self.ket = self.cursor
+        if self.cursor < self.limit:
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"joo"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"saa"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"viima"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"keesi"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"löö"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"lõi"):
+                return False
+        elif among_var == 7:
+            if not self.slice_from(u"loo"):
+                return False
+        elif among_var == 8:
+            if not self.slice_from(u"käisi"):
+                return False
+        elif among_var == 9:
+            if not self.slice_from(u"söö"):
+                return False
+        elif among_var == 10:
+            if not self.slice_from(u"too"):
+                return False
+        elif among_var == 11:
+            if not self.slice_from(u"võisi"):
+                return False
+        elif among_var == 12:
+            if not self.slice_from(u"jääma"):
+                return False
+        elif among_var == 13:
+            if not self.slice_from(u"müüsi"):
+                return False
+        elif among_var == 14:
+            if not self.slice_from(u"luge"):
+                return False
+        elif among_var == 15:
+            if not self.slice_from(u"põde"):
+                return False
+        elif among_var == 16:
+            if not self.slice_from(u"ladu"):
+                return False
+        elif among_var == 17:
+            if not self.slice_from(u"tegi"):
+                return False
+        else:
+            if not self.slice_from(u"nägi"):
+                return False
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        try:
+            if not self.__r_verb_exceptions():
+                raise lab0()
+            return False
+        except lab0: pass
+        self.cursor = v_1
+        v_2 = self.cursor
+        self.__r_mark_regions()
+        self.cursor = v_2
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_3 = self.limit - self.cursor
+        self.__r_emphasis()
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        try:
+            try:
+                v_5 = self.limit - self.cursor
+                try:
+                    if not self.__r_verb():
+                        raise lab3()
+                    raise lab2()
+                except lab3: pass
+                self.cursor = self.limit - v_5
+                self.__r_substantive()
+            except lab2: pass
+        except lab1: pass
+        self.cursor = self.limit - v_4
+        v_6 = self.limit - self.cursor
+        self.__r_undouble_kpt()
+        self.cursor = self.limit - v_6
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"gi", -1, 1),
+        Among(u"ki", -1, 2)
+    ]
+
+    a_1 = [
+        Among(u"da", -1, 3),
+        Among(u"mata", -1, 1),
+        Among(u"b", -1, 3),
+        Among(u"ksid", -1, 1),
+        Among(u"nuksid", 3, 1),
+        Among(u"me", -1, 3),
+        Among(u"sime", 5, 1),
+        Among(u"ksime", 6, 1),
+        Among(u"nuksime", 7, 1),
+        Among(u"akse", -1, 2),
+        Among(u"dakse", 9, 1),
+        Among(u"takse", 9, 1),
+        Among(u"site", -1, 1),
+        Among(u"ksite", 12, 1),
+        Among(u"nuksite", 13, 1),
+        Among(u"n", -1, 3),
+        Among(u"sin", 15, 1),
+        Among(u"ksin", 16, 1),
+        Among(u"nuksin", 17, 1),
+        Among(u"daks", -1, 1),
+        Among(u"taks", -1, 1)
+    ]
+
+    a_2 = [
+        Among(u"aa", -1, -1),
+        Among(u"ee", -1, -1),
+        Among(u"ii", -1, -1),
+        Among(u"oo", -1, -1),
+        Among(u"uu", -1, -1),
+        Among(u"ää", -1, -1),
+        Among(u"õõ", -1, -1),
+        Among(u"öö", -1, -1),
+        Among(u"üü", -1, -1)
+    ]
+
+    a_3 = [
+        Among(u"i", -1, 1)
+    ]
+
+    a_4 = [
+        Among(u"lane", -1, 1),
+        Among(u"line", -1, 3),
+        Among(u"mine", -1, 2),
+        Among(u"lasse", -1, 1),
+        Among(u"lisse", -1, 3),
+        Among(u"misse", -1, 2),
+        Among(u"lasi", -1, 1),
+        Among(u"lisi", -1, 3),
+        Among(u"misi", -1, 2),
+        Among(u"last", -1, 1),
+        Among(u"list", -1, 3),
+        Among(u"mist", -1, 2)
+    ]
+
+    a_5 = [
+        Among(u"ga", -1, 1),
+        Among(u"ta", -1, 1),
+        Among(u"le", -1, 1),
+        Among(u"sse", -1, 1),
+        Among(u"l", -1, 1),
+        Among(u"s", -1, 1),
+        Among(u"ks", 5, 1),
+        Among(u"t", -1, 2),
+        Among(u"lt", 7, 1),
+        Among(u"st", 7, 1)
+    ]
+
+    a_6 = [
+        Among(u"", -1, 2),
+        Among(u"las", 0, 1),
+        Among(u"lis", 0, 1),
+        Among(u"mis", 0, 1),
+        Among(u"t", 0, -1)
+    ]
+
+    a_7 = [
+        Among(u"d", -1, 4),
+        Among(u"sid", 0, 2),
+        Among(u"de", -1, 4),
+        Among(u"ikkude", 2, 1),
+        Among(u"ike", -1, 1),
+        Among(u"ikke", -1, 1),
+        Among(u"te", -1, 3)
+    ]
+
+    a_8 = [
+        Among(u"va", -1, -1),
+        Among(u"du", -1, -1),
+        Among(u"nu", -1, -1),
+        Among(u"tu", -1, -1)
+    ]
+
+    a_9 = [
+        Among(u"kk", -1, 1),
+        Among(u"pp", -1, 2),
+        Among(u"tt", -1, 3)
+    ]
+
+    a_10 = [
+        Among(u"ma", -1, 2),
+        Among(u"mai", -1, 1),
+        Among(u"m", -1, 1)
+    ]
+
+    a_11 = [
+        Among(u"joob", -1, 1),
+        Among(u"jood", -1, 1),
+        Among(u"joodakse", 1, 1),
+        Among(u"jooma", -1, 1),
+        Among(u"joomata", 3, 1),
+        Among(u"joome", -1, 1),
+        Among(u"joon", -1, 1),
+        Among(u"joote", -1, 1),
+        Among(u"joovad", -1, 1),
+        Among(u"juua", -1, 1),
+        Among(u"juuakse", 9, 1),
+        Among(u"jäi", -1, 12),
+        Among(u"jäid", 11, 12),
+        Among(u"jäime", 11, 12),
+        Among(u"jäin", 11, 12),
+        Among(u"jäite", 11, 12),
+        Among(u"jääb", -1, 12),
+        Among(u"jääd", -1, 12),
+        Among(u"jääda", 17, 12),
+        Among(u"jäädakse", 18, 12),
+        Among(u"jäädi", 17, 12),
+        Among(u"jääks", -1, 12),
+        Among(u"jääksid", 21, 12),
+        Among(u"jääksime", 21, 12),
+        Among(u"jääksin", 21, 12),
+        Among(u"jääksite", 21, 12),
+        Among(u"jääma", -1, 12),
+        Among(u"jäämata", 26, 12),
+        Among(u"jääme", -1, 12),
+        Among(u"jään", -1, 12),
+        Among(u"jääte", -1, 12),
+        Among(u"jäävad", -1, 12),
+        Among(u"jõi", -1, 1),
+        Among(u"jõid", 32, 1),
+        Among(u"jõime", 32, 1),
+        Among(u"jõin", 32, 1),
+        Among(u"jõite", 32, 1),
+        Among(u"keeb", -1, 4),
+        Among(u"keed", -1, 4),
+        Among(u"keedakse", 38, 4),
+        Among(u"keeks", -1, 4),
+        Among(u"keeksid", 40, 4),
+        Among(u"keeksime", 40, 4),
+        Among(u"keeksin", 40, 4),
+        Among(u"keeksite", 40, 4),
+        Among(u"keema", -1, 4),
+        Among(u"keemata", 45, 4),
+        Among(u"keeme", -1, 4),
+        Among(u"keen", -1, 4),
+        Among(u"kees", -1, 4),
+        Among(u"keeta", -1, 4),
+        Among(u"keete", -1, 4),
+        Among(u"keevad", -1, 4),
+        Among(u"käia", -1, 8),
+        Among(u"käiakse", 53, 8),
+        Among(u"käib", -1, 8),
+        Among(u"käid", -1, 8),
+        Among(u"käidi", 56, 8),
+        Among(u"käiks", -1, 8),
+        Among(u"käiksid", 58, 8),
+        Among(u"käiksime", 58, 8),
+        Among(u"käiksin", 58, 8),
+        Among(u"käiksite", 58, 8),
+        Among(u"käima", -1, 8),
+        Among(u"käimata", 63, 8),
+        Among(u"käime", -1, 8),
+        Among(u"käin", -1, 8),
+        Among(u"käis", -1, 8),
+        Among(u"käite", -1, 8),
+        Among(u"käivad", -1, 8),
+        Among(u"laob", -1, 16),
+        Among(u"laod", -1, 16),
+        Among(u"laoks", -1, 16),
+        Among(u"laoksid", 72, 16),
+        Among(u"laoksime", 72, 16),
+        Among(u"laoksin", 72, 16),
+        Among(u"laoksite", 72, 16),
+        Among(u"laome", -1, 16),
+        Among(u"laon", -1, 16),
+        Among(u"laote", -1, 16),
+        Among(u"laovad", -1, 16),
+        Among(u"loeb", -1, 14),
+        Among(u"loed", -1, 14),
+        Among(u"loeks", -1, 14),
+        Among(u"loeksid", 83, 14),
+        Among(u"loeksime", 83, 14),
+        Among(u"loeksin", 83, 14),
+        Among(u"loeksite", 83, 14),
+        Among(u"loeme", -1, 14),
+        Among(u"loen", -1, 14),
+        Among(u"loete", -1, 14),
+        Among(u"loevad", -1, 14),
+        Among(u"loob", -1, 7),
+        Among(u"lood", -1, 7),
+        Among(u"loodi", 93, 7),
+        Among(u"looks", -1, 7),
+        Among(u"looksid", 95, 7),
+        Among(u"looksime", 95, 7),
+        Among(u"looksin", 95, 7),
+        Among(u"looksite", 95, 7),
+        Among(u"looma", -1, 7),
+        Among(u"loomata", 100, 7),
+        Among(u"loome", -1, 7),
+        Among(u"loon", -1, 7),
+        Among(u"loote", -1, 7),
+        Among(u"loovad", -1, 7),
+        Among(u"luua", -1, 7),
+        Among(u"luuakse", 106, 7),
+        Among(u"lõi", -1, 6),
+        Among(u"lõid", 108, 6),
+        Among(u"lõime", 108, 6),
+        Among(u"lõin", 108, 6),
+        Among(u"lõite", 108, 6),
+        Among(u"lööb", -1, 5),
+        Among(u"lööd", -1, 5),
+        Among(u"löödakse", 114, 5),
+        Among(u"löödi", 114, 5),
+        Among(u"lööks", -1, 5),
+        Among(u"lööksid", 117, 5),
+        Among(u"lööksime", 117, 5),
+        Among(u"lööksin", 117, 5),
+        Among(u"lööksite", 117, 5),
+        Among(u"lööma", -1, 5),
+        Among(u"löömata", 122, 5),
+        Among(u"lööme", -1, 5),
+        Among(u"löön", -1, 5),
+        Among(u"lööte", -1, 5),
+        Among(u"löövad", -1, 5),
+        Among(u"lüüa", -1, 5),
+        Among(u"lüüakse", 128, 5),
+        Among(u"müüa", -1, 13),
+        Among(u"müüakse", 130, 13),
+        Among(u"müüb", -1, 13),
+        Among(u"müüd", -1, 13),
+        Among(u"müüdi", 133, 13),
+        Among(u"müüks", -1, 13),
+        Among(u"müüksid", 135, 13),
+        Among(u"müüksime", 135, 13),
+        Among(u"müüksin", 135, 13),
+        Among(u"müüksite", 135, 13),
+        Among(u"müüma", -1, 13),
+        Among(u"müümata", 140, 13),
+        Among(u"müüme", -1, 13),
+        Among(u"müün", -1, 13),
+        Among(u"müüs", -1, 13),
+        Among(u"müüte", -1, 13),
+        Among(u"müüvad", -1, 13),
+        Among(u"näeb", -1, 18),
+        Among(u"näed", -1, 18),
+        Among(u"näeks", -1, 18),
+        Among(u"näeksid", 149, 18),
+        Among(u"näeksime", 149, 18),
+        Among(u"näeksin", 149, 18),
+        Among(u"näeksite", 149, 18),
+        Among(u"näeme", -1, 18),
+        Among(u"näen", -1, 18),
+        Among(u"näete", -1, 18),
+        Among(u"näevad", -1, 18),
+        Among(u"nägema", -1, 18),
+        Among(u"nägemata", 158, 18),
+        Among(u"näha", -1, 18),
+        Among(u"nähakse", 160, 18),
+        Among(u"nähti", -1, 18),
+        Among(u"põeb", -1, 15),
+        Among(u"põed", -1, 15),
+        Among(u"põeks", -1, 15),
+        Among(u"põeksid", 165, 15),
+        Among(u"põeksime", 165, 15),
+        Among(u"põeksin", 165, 15),
+        Among(u"põeksite", 165, 15),
+        Among(u"põeme", -1, 15),
+        Among(u"põen", -1, 15),
+        Among(u"põete", -1, 15),
+        Among(u"põevad", -1, 15),
+        Among(u"saab", -1, 2),
+        Among(u"saad", -1, 2),
+        Among(u"saada", 175, 2),
+        Among(u"saadakse", 176, 2),
+        Among(u"saadi", 175, 2),
+        Among(u"saaks", -1, 2),
+        Among(u"saaksid", 179, 2),
+        Among(u"saaksime", 179, 2),
+        Among(u"saaksin", 179, 2),
+        Among(u"saaksite", 179, 2),
+        Among(u"saama", -1, 2),
+        Among(u"saamata", 184, 2),
+        Among(u"saame", -1, 2),
+        Among(u"saan", -1, 2),
+        Among(u"saate", -1, 2),
+        Among(u"saavad", -1, 2),
+        Among(u"sai", -1, 2),
+        Among(u"said", 190, 2),
+        Among(u"saime", 190, 2),
+        Among(u"sain", 190, 2),
+        Among(u"saite", 190, 2),
+        Among(u"sõi", -1, 9),
+        Among(u"sõid", 195, 9),
+        Among(u"sõime", 195, 9),
+        Among(u"sõin", 195, 9),
+        Among(u"sõite", 195, 9),
+        Among(u"sööb", -1, 9),
+        Among(u"sööd", -1, 9),
+        Among(u"söödakse", 201, 9),
+        Among(u"söödi", 201, 9),
+        Among(u"sööks", -1, 9),
+        Among(u"sööksid", 204, 9),
+        Among(u"sööksime", 204, 9),
+        Among(u"sööksin", 204, 9),
+        Among(u"sööksite", 204, 9),
+        Among(u"sööma", -1, 9),
+        Among(u"söömata", 209, 9),
+        Among(u"sööme", -1, 9),
+        Among(u"söön", -1, 9),
+        Among(u"sööte", -1, 9),
+        Among(u"söövad", -1, 9),
+        Among(u"süüa", -1, 9),
+        Among(u"süüakse", 215, 9),
+        Among(u"teeb", -1, 17),
+        Among(u"teed", -1, 17),
+        Among(u"teeks", -1, 17),
+        Among(u"teeksid", 219, 17),
+        Among(u"teeksime", 219, 17),
+        Among(u"teeksin", 219, 17),
+        Among(u"teeksite", 219, 17),
+        Among(u"teeme", -1, 17),
+        Among(u"teen", -1, 17),
+        Among(u"teete", -1, 17),
+        Among(u"teevad", -1, 17),
+        Among(u"tegema", -1, 17),
+        Among(u"tegemata", 228, 17),
+        Among(u"teha", -1, 17),
+        Among(u"tehakse", 230, 17),
+        Among(u"tehti", -1, 17),
+        Among(u"toob", -1, 10),
+        Among(u"tood", -1, 10),
+        Among(u"toodi", 234, 10),
+        Among(u"tooks", -1, 10),
+        Among(u"tooksid", 236, 10),
+        Among(u"tooksime", 236, 10),
+        Among(u"tooksin", 236, 10),
+        Among(u"tooksite", 236, 10),
+        Among(u"tooma", -1, 10),
+        Among(u"toomata", 241, 10),
+        Among(u"toome", -1, 10),
+        Among(u"toon", -1, 10),
+        Among(u"toote", -1, 10),
+        Among(u"toovad", -1, 10),
+        Among(u"tuua", -1, 10),
+        Among(u"tuuakse", 247, 10),
+        Among(u"tõi", -1, 10),
+        Among(u"tõid", 249, 10),
+        Among(u"tõime", 249, 10),
+        Among(u"tõin", 249, 10),
+        Among(u"tõite", 249, 10),
+        Among(u"viia", -1, 3),
+        Among(u"viiakse", 254, 3),
+        Among(u"viib", -1, 3),
+        Among(u"viid", -1, 3),
+        Among(u"viidi", 257, 3),
+        Among(u"viiks", -1, 3),
+        Among(u"viiksid", 259, 3),
+        Among(u"viiksime", 259, 3),
+        Among(u"viiksin", 259, 3),
+        Among(u"viiksite", 259, 3),
+        Among(u"viima", -1, 3),
+        Among(u"viimata", 264, 3),
+        Among(u"viime", -1, 3),
+        Among(u"viin", -1, 3),
+        Among(u"viisime", -1, 3),
+        Among(u"viisin", -1, 3),
+        Among(u"viisite", -1, 3),
+        Among(u"viite", -1, 3),
+        Among(u"viivad", -1, 3),
+        Among(u"võib", -1, 11),
+        Among(u"võid", -1, 11),
+        Among(u"võida", 274, 11),
+        Among(u"võidakse", 275, 11),
+        Among(u"võidi", 274, 11),
+        Among(u"võiks", -1, 11),
+        Among(u"võiksid", 278, 11),
+        Among(u"võiksime", 278, 11),
+        Among(u"võiksin", 278, 11),
+        Among(u"võiksite", 278, 11),
+        Among(u"võima", -1, 11),
+        Among(u"võimata", 283, 11),
+        Among(u"võime", -1, 11),
+        Among(u"võin", -1, 11),
+        Among(u"võis", -1, 11),
+        Among(u"võite", -1, 11),
+        Among(u"võivad", -1, 11)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/finnish_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/finnish_stemmer.py
new file mode 100644
index 000000000..7aea611e5
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/finnish_stemmer.py
@@ -0,0 +1,549 @@
+#-*- coding: utf-8 -*-
+# Generated from finnish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class FinnishStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from finnish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_AEI = {u"a", u"ä", u"e", u"i"}
+
+    g_C = {u"b", u"c", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"m", u"n", u"p", u"q", u"r", u"s", u"t", u"v", u"w", u"x", u"z"}
+
+    g_V1 = {u"a", u"e", u"i", u"o", u"u", u"y", u"ä", u"ö"}
+
+    g_V2 = {u"a", u"e", u"i", u"o", u"u", u"ä", u"ö"}
+
+    g_particle_end = {u"a", u"e", u"i", u"o", u"u", u"y", u"ä", u"ö", u"n", u"t"}
+
+    B_ending_removed = False
+    S_x = ""
+    I_p2 = 0
+    I_p1 = 0
+
+    def __r_mark_regions(self):
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        if not self.go_out_grouping(FinnishStemmer.g_V1):
+            return False
+        self.cursor += 1
+        if not self.go_in_grouping(FinnishStemmer.g_V1):
+            return False
+        self.cursor += 1
+        self.I_p1 = self.cursor
+        if not self.go_out_grouping(FinnishStemmer.g_V1):
+            return False
+        self.cursor += 1
+        if not self.go_in_grouping(FinnishStemmer.g_V1):
+            return False
+        self.cursor += 1
+        self.I_p2 = self.cursor
+        return True
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_particle_etc(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(FinnishStemmer.a_0)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            if not self.in_grouping_b(FinnishStemmer.g_particle_end):
+                return False
+        else:
+            if not self.__r_R2():
+                return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_possessive(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(FinnishStemmer.a_4)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            v_3 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"k"):
+                    raise lab0()
+                return False
+            except lab0: pass
+            self.cursor = self.limit - v_3
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.slice_del():
+                return False
+
+            self.ket = self.cursor
+            if not self.eq_s_b(u"kse"):
+                return False
+            self.bra = self.cursor
+            if not self.slice_from(u"ksi"):
+                return False
+        elif among_var == 3:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 4:
+            if self.find_among_b(FinnishStemmer.a_1) == 0:
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 5:
+            if self.find_among_b(FinnishStemmer.a_2) == 0:
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if self.find_among_b(FinnishStemmer.a_3) == 0:
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_LONG(self):
+        if self.find_among_b(FinnishStemmer.a_5) == 0:
+            return False
+        return True
+
+    def __r_VI(self):
+        if not self.eq_s_b(u"i"):
+            return False
+        if not self.in_grouping_b(FinnishStemmer.g_V2):
+            return False
+        return True
+
+    def __r_case_ending(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(FinnishStemmer.a_6)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            if not self.eq_s_b(u"a"):
+                return False
+        elif among_var == 2:
+            if not self.eq_s_b(u"e"):
+                return False
+        elif among_var == 3:
+            if not self.eq_s_b(u"i"):
+                return False
+        elif among_var == 4:
+            if not self.eq_s_b(u"o"):
+                return False
+        elif among_var == 5:
+            if not self.eq_s_b(u"ä"):
+                return False
+        elif among_var == 6:
+            if not self.eq_s_b(u"ö"):
+                return False
+        elif among_var == 7:
+            v_3 = self.limit - self.cursor
+            try:
+                v_4 = self.limit - self.cursor
+                try:
+                    v_5 = self.limit - self.cursor
+                    try:
+                        if not self.__r_LONG():
+                            raise lab2()
+                        raise lab1()
+                    except lab2: pass
+                    self.cursor = self.limit - v_5
+                    if not self.eq_s_b(u"ie"):
+                        self.cursor = self.limit - v_3
+                        raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_4
+                if self.cursor <= self.limit_backward:
+                    self.cursor = self.limit - v_3
+                    raise lab0()
+                self.cursor -= 1
+                self.bra = self.cursor
+            except lab0: pass
+        elif among_var == 8:
+            if not self.in_grouping_b(FinnishStemmer.g_V1):
+                return False
+            if not self.in_grouping_b(FinnishStemmer.g_C):
+                return False
+        if not self.slice_del():
+            return False
+
+        self.B_ending_removed = True
+        return True
+
+    def __r_other_endings(self):
+        if self.cursor < self.I_p2:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p2
+        self.ket = self.cursor
+        among_var = self.find_among_b(FinnishStemmer.a_7)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            v_3 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"po"):
+                    raise lab0()
+                return False
+            except lab0: pass
+            self.cursor = self.limit - v_3
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_i_plural(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        if self.find_among_b(FinnishStemmer.a_8) == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_t_plural(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        if not self.eq_s_b(u"t"):
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        v_3 = self.limit - self.cursor
+        if not self.in_grouping_b(FinnishStemmer.g_V1):
+            self.limit_backward = v_2
+            return False
+        self.cursor = self.limit - v_3
+        if not self.slice_del():
+            return False
+
+        self.limit_backward = v_2
+        if self.cursor < self.I_p2:
+            return False
+        v_5 = self.limit_backward
+        self.limit_backward = self.I_p2
+        self.ket = self.cursor
+        among_var = self.find_among_b(FinnishStemmer.a_9)
+        if among_var == 0:
+            self.limit_backward = v_5
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_5
+        if among_var == 1:
+            v_6 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"po"):
+                    raise lab0()
+                return False
+            except lab0: pass
+            self.cursor = self.limit - v_6
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_tidy(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        v_3 = self.limit - self.cursor
+        try:
+            v_4 = self.limit - self.cursor
+            if not self.__r_LONG():
+                raise lab0()
+            self.cursor = self.limit - v_4
+            self.ket = self.cursor
+            if self.cursor <= self.limit_backward:
+                raise lab0()
+            self.cursor -= 1
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+        except lab0: pass
+        self.cursor = self.limit - v_3
+        v_5 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.in_grouping_b(FinnishStemmer.g_AEI):
+                raise lab1()
+            self.bra = self.cursor
+            if not self.in_grouping_b(FinnishStemmer.g_C):
+                raise lab1()
+            if not self.slice_del():
+                return False
+
+        except lab1: pass
+        self.cursor = self.limit - v_5
+        v_6 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.eq_s_b(u"j"):
+                raise lab2()
+            self.bra = self.cursor
+            try:
+                v_7 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"o"):
+                        raise lab4()
+                    raise lab3()
+                except lab4: pass
+                self.cursor = self.limit - v_7
+                if not self.eq_s_b(u"u"):
+                    raise lab2()
+            except lab3: pass
+            if not self.slice_del():
+                return False
+
+        except lab2: pass
+        self.cursor = self.limit - v_6
+        v_8 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.eq_s_b(u"o"):
+                raise lab5()
+            self.bra = self.cursor
+            if not self.eq_s_b(u"j"):
+                raise lab5()
+            if not self.slice_del():
+                return False
+
+        except lab5: pass
+        self.cursor = self.limit - v_8
+        self.limit_backward = v_2
+        if not self.go_in_grouping_b(FinnishStemmer.g_V1):
+            return False
+        self.ket = self.cursor
+        if not self.in_grouping_b(FinnishStemmer.g_C):
+            return False
+        self.bra = self.cursor
+        self.S_x = self.slice_to()
+        if self.S_x == '':
+            return False
+        if not self.eq_s_b(self.S_x):
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        self.__r_mark_regions()
+        self.cursor = v_1
+        self.B_ending_removed = False
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_2 = self.limit - self.cursor
+        self.__r_particle_etc()
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        self.__r_possessive()
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        self.__r_case_ending()
+        self.cursor = self.limit - v_4
+        v_5 = self.limit - self.cursor
+        self.__r_other_endings()
+        self.cursor = self.limit - v_5
+        try:
+            try:
+                if not self.B_ending_removed:
+                    raise lab1()
+                v_7 = self.limit - self.cursor
+                self.__r_i_plural()
+                self.cursor = self.limit - v_7
+                raise lab0()
+            except lab1: pass
+            v_8 = self.limit - self.cursor
+            self.__r_t_plural()
+            self.cursor = self.limit - v_8
+        except lab0: pass
+        v_9 = self.limit - self.cursor
+        self.__r_tidy()
+        self.cursor = self.limit - v_9
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"pa", -1, 1),
+        Among(u"sti", -1, 2),
+        Among(u"kaan", -1, 1),
+        Among(u"han", -1, 1),
+        Among(u"kin", -1, 1),
+        Among(u"hän", -1, 1),
+        Among(u"kään", -1, 1),
+        Among(u"ko", -1, 1),
+        Among(u"pä", -1, 1),
+        Among(u"kö", -1, 1)
+    ]
+
+    a_1 = [
+        Among(u"lla", -1, -1),
+        Among(u"na", -1, -1),
+        Among(u"ssa", -1, -1),
+        Among(u"ta", -1, -1),
+        Among(u"lta", 3, -1),
+        Among(u"sta", 3, -1)
+    ]
+
+    a_2 = [
+        Among(u"llä", -1, -1),
+        Among(u"nä", -1, -1),
+        Among(u"ssä", -1, -1),
+        Among(u"tä", -1, -1),
+        Among(u"ltä", 3, -1),
+        Among(u"stä", 3, -1)
+    ]
+
+    a_3 = [
+        Among(u"lle", -1, -1),
+        Among(u"ine", -1, -1)
+    ]
+
+    a_4 = [
+        Among(u"nsa", -1, 3),
+        Among(u"mme", -1, 3),
+        Among(u"nne", -1, 3),
+        Among(u"ni", -1, 2),
+        Among(u"si", -1, 1),
+        Among(u"an", -1, 4),
+        Among(u"en", -1, 6),
+        Among(u"än", -1, 5),
+        Among(u"nsä", -1, 3)
+    ]
+
+    a_5 = [
+        Among(u"aa", -1, -1),
+        Among(u"ee", -1, -1),
+        Among(u"ii", -1, -1),
+        Among(u"oo", -1, -1),
+        Among(u"uu", -1, -1),
+        Among(u"ää", -1, -1),
+        Among(u"öö", -1, -1)
+    ]
+
+    a_6 = [
+        Among(u"a", -1, 8),
+        Among(u"lla", 0, -1),
+        Among(u"na", 0, -1),
+        Among(u"ssa", 0, -1),
+        Among(u"ta", 0, -1),
+        Among(u"lta", 4, -1),
+        Among(u"sta", 4, -1),
+        Among(u"tta", 4, 2),
+        Among(u"lle", -1, -1),
+        Among(u"ine", -1, -1),
+        Among(u"ksi", -1, -1),
+        Among(u"n", -1, 7),
+        Among(u"han", 11, 1),
+        Among(u"den", 11, -1, __r_VI),
+        Among(u"seen", 11, -1, __r_LONG),
+        Among(u"hen", 11, 2),
+        Among(u"tten", 11, -1, __r_VI),
+        Among(u"hin", 11, 3),
+        Among(u"siin", 11, -1, __r_VI),
+        Among(u"hon", 11, 4),
+        Among(u"hän", 11, 5),
+        Among(u"hön", 11, 6),
+        Among(u"ä", -1, 8),
+        Among(u"llä", 22, -1),
+        Among(u"nä", 22, -1),
+        Among(u"ssä", 22, -1),
+        Among(u"tä", 22, -1),
+        Among(u"ltä", 26, -1),
+        Among(u"stä", 26, -1),
+        Among(u"ttä", 26, 2)
+    ]
+
+    a_7 = [
+        Among(u"eja", -1, -1),
+        Among(u"mma", -1, 1),
+        Among(u"imma", 1, -1),
+        Among(u"mpa", -1, 1),
+        Among(u"impa", 3, -1),
+        Among(u"mmi", -1, 1),
+        Among(u"immi", 5, -1),
+        Among(u"mpi", -1, 1),
+        Among(u"impi", 7, -1),
+        Among(u"ejä", -1, -1),
+        Among(u"mmä", -1, 1),
+        Among(u"immä", 10, -1),
+        Among(u"mpä", -1, 1),
+        Among(u"impä", 12, -1)
+    ]
+
+    a_8 = [
+        Among(u"i", -1, -1),
+        Among(u"j", -1, -1)
+    ]
+
+    a_9 = [
+        Among(u"mma", -1, 1),
+        Among(u"imma", 0, -1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/french_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/french_stemmer.py
new file mode 100644
index 000000000..edcec4980
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/french_stemmer.py
@@ -0,0 +1,1029 @@
+#-*- coding: utf-8 -*-
+# Generated from french.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class FrenchStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from french.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"y", u"â", u"à", u"ë", u"é", u"ê", u"è", u"ï", u"î", u"ô", u"û", u"ù"}
+
+    g_oux_ending = {u"b", u"h", u"j", u"l", u"n", u"p"}
+
+    g_elision_char = {u"c", u"d", u"j", u"l", u"m", u"n", u"s", u"t"}
+
+    g_keep_with_s = {u"a", u"i", u"o", u"u", u"è", u"s"}
+
+    I_p2 = 0
+    I_p1 = 0
+    I_pV = 0
+
+    def __r_elisions(self):
+        self.bra = self.cursor
+        try:
+            v_1 = self.cursor
+            try:
+                if not self.in_grouping(FrenchStemmer.g_elision_char):
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = v_1
+            if not self.eq_s(u"qu"):
+                return False
+        except lab0: pass
+        if not self.eq_s(u"'"):
+            return False
+        self.ket = self.cursor
+        try:
+            if self.cursor < self.limit:
+                raise lab2()
+            return False
+        except lab2: pass
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_prelude(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                try:
+                    while True:
+                        v_2 = self.cursor
+                        try:
+                            try:
+                                v_3 = self.cursor
+                                try:
+                                    if not self.in_grouping(FrenchStemmer.g_v):
+                                        raise lab4()
+                                    self.bra = self.cursor
+                                    try:
+                                        v_4 = self.cursor
+                                        try:
+                                            if not self.eq_s(u"u"):
+                                                raise lab6()
+                                            self.ket = self.cursor
+                                            if not self.in_grouping(FrenchStemmer.g_v):
+                                                raise lab6()
+                                            if not self.slice_from(u"U"):
+                                                return False
+                                            raise lab5()
+                                        except lab6: pass
+                                        self.cursor = v_4
+                                        try:
+                                            if not self.eq_s(u"i"):
+                                                raise lab7()
+                                            self.ket = self.cursor
+                                            if not self.in_grouping(FrenchStemmer.g_v):
+                                                raise lab7()
+                                            if not self.slice_from(u"I"):
+                                                return False
+                                            raise lab5()
+                                        except lab7: pass
+                                        self.cursor = v_4
+                                        if not self.eq_s(u"y"):
+                                            raise lab4()
+                                        self.ket = self.cursor
+                                        if not self.slice_from(u"Y"):
+                                            return False
+                                    except lab5: pass
+                                    raise lab3()
+                                except lab4: pass
+                                self.cursor = v_3
+                                try:
+                                    self.bra = self.cursor
+                                    if not self.eq_s(u"ë"):
+                                        raise lab8()
+                                    self.ket = self.cursor
+                                    if not self.slice_from(u"He"):
+                                        return False
+                                    raise lab3()
+                                except lab8: pass
+                                self.cursor = v_3
+                                try:
+                                    self.bra = self.cursor
+                                    if not self.eq_s(u"ï"):
+                                        raise lab9()
+                                    self.ket = self.cursor
+                                    if not self.slice_from(u"Hi"):
+                                        return False
+                                    raise lab3()
+                                except lab9: pass
+                                self.cursor = v_3
+                                try:
+                                    self.bra = self.cursor
+                                    if not self.eq_s(u"y"):
+                                        raise lab10()
+                                    self.ket = self.cursor
+                                    if not self.in_grouping(FrenchStemmer.g_v):
+                                        raise lab10()
+                                    if not self.slice_from(u"Y"):
+                                        return False
+                                    raise lab3()
+                                except lab10: pass
+                                self.cursor = v_3
+                                if not self.eq_s(u"q"):
+                                    raise lab2()
+                                self.bra = self.cursor
+                                if not self.eq_s(u"u"):
+                                    raise lab2()
+                                self.ket = self.cursor
+                                if not self.slice_from(u"U"):
+                                    return False
+                            except lab3: pass
+                            self.cursor = v_2
+                            raise lab1()
+                        except lab2: pass
+                        self.cursor = v_2
+                        if self.cursor >= self.limit:
+                            raise lab0()
+                        self.cursor += 1
+                except lab1: pass
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_mark_regions(self):
+        self.I_pV = self.limit
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            try:
+                v_2 = self.cursor
+                try:
+                    if not self.in_grouping(FrenchStemmer.g_v):
+                        raise lab2()
+                    if not self.in_grouping(FrenchStemmer.g_v):
+                        raise lab2()
+                    if self.cursor >= self.limit:
+                        raise lab2()
+                    self.cursor += 1
+                    raise lab1()
+                except lab2: pass
+                self.cursor = v_2
+                try:
+                    among_var = self.find_among(FrenchStemmer.a_0)
+                    if among_var == 0:
+                        raise lab3()
+                    if among_var == 1:
+                        if not self.in_grouping(FrenchStemmer.g_v):
+                            raise lab3()
+                    raise lab1()
+                except lab3: pass
+                self.cursor = v_2
+                if self.cursor >= self.limit:
+                    raise lab0()
+                self.cursor += 1
+                if not self.go_out_grouping(FrenchStemmer.g_v):
+                    raise lab0()
+                self.cursor += 1
+            except lab1: pass
+            self.I_pV = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        v_3 = self.cursor
+        try:
+            if not self.go_out_grouping(FrenchStemmer.g_v):
+                raise lab4()
+            self.cursor += 1
+            if not self.go_in_grouping(FrenchStemmer.g_v):
+                raise lab4()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+            if not self.go_out_grouping(FrenchStemmer.g_v):
+                raise lab4()
+            self.cursor += 1
+            if not self.go_in_grouping(FrenchStemmer.g_v):
+                raise lab4()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab4: pass
+        self.cursor = v_3
+        return True
+
+    def __r_postlude(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(FrenchStemmer.a_1)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"i"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"u"):
+                        return False
+                elif among_var == 3:
+                    if not self.slice_from(u"y"):
+                        return False
+                elif among_var == 4:
+                    if not self.slice_from(u"ë"):
+                        return False
+                elif among_var == 5:
+                    if not self.slice_from(u"ï"):
+                        return False
+                elif among_var == 6:
+                    if not self.slice_del():
+                        return False
+
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_RV(self):
+        return self.I_pV <= self.cursor
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_standard_suffix(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(FrenchStemmer.a_4)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if not self.eq_s_b(u"ic"):
+                    self.cursor = self.limit - v_1
+                    raise lab0()
+                self.bra = self.cursor
+                try:
+                    v_2 = self.limit - self.cursor
+                    try:
+                        if not self.__r_R2():
+                            raise lab2()
+                        if not self.slice_del():
+                            return False
+
+                        raise lab1()
+                    except lab2: pass
+                    self.cursor = self.limit - v_2
+                    if not self.slice_from(u"iqU"):
+                        return False
+                except lab1: pass
+            except lab0: pass
+        elif among_var == 3:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"log"):
+                return False
+        elif among_var == 4:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"u"):
+                return False
+        elif among_var == 5:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"ent"):
+                return False
+        elif among_var == 6:
+            if not self.__r_RV():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_3 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                among_var = self.find_among_b(FrenchStemmer.a_2)
+                if among_var == 0:
+                    self.cursor = self.limit - v_3
+                    raise lab3()
+                self.bra = self.cursor
+                if among_var == 1:
+                    if not self.__r_R2():
+                        self.cursor = self.limit - v_3
+                        raise lab3()
+                    if not self.slice_del():
+                        return False
+
+                    self.ket = self.cursor
+                    if not self.eq_s_b(u"at"):
+                        self.cursor = self.limit - v_3
+                        raise lab3()
+                    self.bra = self.cursor
+                    if not self.__r_R2():
+                        self.cursor = self.limit - v_3
+                        raise lab3()
+                    if not self.slice_del():
+                        return False
+
+                elif among_var == 2:
+                    try:
+                        v_4 = self.limit - self.cursor
+                        try:
+                            if not self.__r_R2():
+                                raise lab5()
+                            if not self.slice_del():
+                                return False
+
+                            raise lab4()
+                        except lab5: pass
+                        self.cursor = self.limit - v_4
+                        if not self.__r_R1():
+                            self.cursor = self.limit - v_3
+                            raise lab3()
+                        if not self.slice_from(u"eux"):
+                            return False
+                    except lab4: pass
+                elif among_var == 3:
+                    if not self.__r_R2():
+                        self.cursor = self.limit - v_3
+                        raise lab3()
+                    if not self.slice_del():
+                        return False
+
+                else:
+                    if not self.__r_RV():
+                        self.cursor = self.limit - v_3
+                        raise lab3()
+                    if not self.slice_from(u"i"):
+                        return False
+            except lab3: pass
+        elif among_var == 7:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_5 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                among_var = self.find_among_b(FrenchStemmer.a_3)
+                if among_var == 0:
+                    self.cursor = self.limit - v_5
+                    raise lab6()
+                self.bra = self.cursor
+                if among_var == 1:
+                    try:
+                        v_6 = self.limit - self.cursor
+                        try:
+                            if not self.__r_R2():
+                                raise lab8()
+                            if not self.slice_del():
+                                return False
+
+                            raise lab7()
+                        except lab8: pass
+                        self.cursor = self.limit - v_6
+                        if not self.slice_from(u"abl"):
+                            return False
+                    except lab7: pass
+                elif among_var == 2:
+                    try:
+                        v_7 = self.limit - self.cursor
+                        try:
+                            if not self.__r_R2():
+                                raise lab10()
+                            if not self.slice_del():
+                                return False
+
+                            raise lab9()
+                        except lab10: pass
+                        self.cursor = self.limit - v_7
+                        if not self.slice_from(u"iqU"):
+                            return False
+                    except lab9: pass
+                else:
+                    if not self.__r_R2():
+                        self.cursor = self.limit - v_5
+                        raise lab6()
+                    if not self.slice_del():
+                        return False
+
+            except lab6: pass
+        elif among_var == 8:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_8 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if not self.eq_s_b(u"at"):
+                    self.cursor = self.limit - v_8
+                    raise lab11()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_8
+                    raise lab11()
+                if not self.slice_del():
+                    return False
+
+                self.ket = self.cursor
+                if not self.eq_s_b(u"ic"):
+                    self.cursor = self.limit - v_8
+                    raise lab11()
+                self.bra = self.cursor
+                try:
+                    v_9 = self.limit - self.cursor
+                    try:
+                        if not self.__r_R2():
+                            raise lab13()
+                        if not self.slice_del():
+                            return False
+
+                        raise lab12()
+                    except lab13: pass
+                    self.cursor = self.limit - v_9
+                    if not self.slice_from(u"iqU"):
+                        return False
+                except lab12: pass
+            except lab11: pass
+        elif among_var == 9:
+            if not self.slice_from(u"eau"):
+                return False
+        elif among_var == 10:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"al"):
+                return False
+        elif among_var == 11:
+            if not self.in_grouping_b(FrenchStemmer.g_oux_ending):
+                return False
+            if not self.slice_from(u"ou"):
+                return False
+        elif among_var == 12:
+            try:
+                v_10 = self.limit - self.cursor
+                try:
+                    if not self.__r_R2():
+                        raise lab15()
+                    if not self.slice_del():
+                        return False
+
+                    raise lab14()
+                except lab15: pass
+                self.cursor = self.limit - v_10
+                if not self.__r_R1():
+                    return False
+                if not self.slice_from(u"eux"):
+                    return False
+            except lab14: pass
+        elif among_var == 13:
+            if not self.__r_R1():
+                return False
+            if not self.out_grouping_b(FrenchStemmer.g_v):
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 14:
+            if not self.__r_RV():
+                return False
+            if not self.slice_from(u"ant"):
+                return False
+            return False
+        elif among_var == 15:
+            if not self.__r_RV():
+                return False
+            if not self.slice_from(u"ent"):
+                return False
+            return False
+        else:
+            v_11 = self.limit - self.cursor
+            if not self.in_grouping_b(FrenchStemmer.g_v):
+                return False
+            if not self.__r_RV():
+                return False
+            self.cursor = self.limit - v_11
+            if not self.slice_del():
+                return False
+
+            return False
+        return True
+
+    def __r_i_verb_suffix(self):
+        if self.cursor < self.I_pV:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_pV
+        self.ket = self.cursor
+        if self.find_among_b(FrenchStemmer.a_5) == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        v_3 = self.limit - self.cursor
+        try:
+            if not self.eq_s_b(u"H"):
+                raise lab0()
+            self.limit_backward = v_2
+            return False
+        except lab0: pass
+        self.cursor = self.limit - v_3
+        if not self.out_grouping_b(FrenchStemmer.g_v):
+            self.limit_backward = v_2
+            return False
+        if not self.slice_del():
+            return False
+
+        self.limit_backward = v_2
+        return True
+
+    def __r_verb_suffix(self):
+        if self.cursor < self.I_pV:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_pV
+        self.ket = self.cursor
+        among_var = self.find_among_b(FrenchStemmer.a_7)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 3:
+            v_3 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"e"):
+                    self.cursor = self.limit - v_3
+                    raise lab0()
+                if not self.__r_RV():
+                    self.cursor = self.limit - v_3
+                    raise lab0()
+                self.bra = self.cursor
+            except lab0: pass
+            if not self.slice_del():
+                return False
+
+        else:
+            v_4 = self.limit - self.cursor
+            try:
+                among_var = self.find_among_b(FrenchStemmer.a_6)
+                if among_var == 0:
+                    raise lab1()
+                if among_var == 1:
+                    if self.cursor <= self.limit_backward:
+                        raise lab1()
+                    self.cursor -= 1
+                    if self.cursor > self.limit_backward:
+                        raise lab1()
+                return False
+            except lab1: pass
+            self.cursor = self.limit - v_4
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_residual_suffix(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.eq_s_b(u"s"):
+                self.cursor = self.limit - v_1
+                raise lab0()
+            self.bra = self.cursor
+            v_2 = self.limit - self.cursor
+            try:
+                v_3 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"Hi"):
+                        raise lab2()
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_3
+                if not self.out_grouping_b(FrenchStemmer.g_keep_with_s):
+                    self.cursor = self.limit - v_1
+                    raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_2
+            if not self.slice_del():
+                return False
+
+        except lab0: pass
+        if self.cursor < self.I_pV:
+            return False
+        v_5 = self.limit_backward
+        self.limit_backward = self.I_pV
+        self.ket = self.cursor
+        among_var = self.find_among_b(FrenchStemmer.a_8)
+        if among_var == 0:
+            self.limit_backward = v_5
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R2():
+                self.limit_backward = v_5
+                return False
+            try:
+                v_6 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"s"):
+                        raise lab4()
+                    raise lab3()
+                except lab4: pass
+                self.cursor = self.limit - v_6
+                if not self.eq_s_b(u"t"):
+                    self.limit_backward = v_5
+                    return False
+            except lab3: pass
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.slice_from(u"i"):
+                return False
+        else:
+            if not self.slice_del():
+                return False
+
+        self.limit_backward = v_5
+        return True
+
+    def __r_un_double(self):
+        v_1 = self.limit - self.cursor
+        if self.find_among_b(FrenchStemmer.a_9) == 0:
+            return False
+        self.cursor = self.limit - v_1
+        self.ket = self.cursor
+        if self.cursor <= self.limit_backward:
+            return False
+        self.cursor -= 1
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_un_accent(self):
+        v_1 = 1
+        while True:
+            try:
+                if not self.out_grouping_b(FrenchStemmer.g_v):
+                    raise lab0()
+                v_1 -= 1
+                continue
+            except lab0: pass
+            break
+        if v_1 > 0:
+            return False
+        self.ket = self.cursor
+        try:
+            v_3 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"é"):
+                    raise lab2()
+                raise lab1()
+            except lab2: pass
+            self.cursor = self.limit - v_3
+            if not self.eq_s_b(u"è"):
+                return False
+        except lab1: pass
+        self.bra = self.cursor
+        if not self.slice_from(u"e"):
+            return False
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        self.__r_elisions()
+        self.cursor = v_1
+        v_2 = self.cursor
+        self.__r_prelude()
+        self.cursor = v_2
+        self.__r_mark_regions()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_4 = self.limit - self.cursor
+        try:
+            try:
+                v_5 = self.limit - self.cursor
+                try:
+                    v_6 = self.limit - self.cursor
+                    try:
+                        v_7 = self.limit - self.cursor
+                        try:
+                            if not self.__r_standard_suffix():
+                                raise lab4()
+                            raise lab3()
+                        except lab4: pass
+                        self.cursor = self.limit - v_7
+                        try:
+                            if not self.__r_i_verb_suffix():
+                                raise lab5()
+                            raise lab3()
+                        except lab5: pass
+                        self.cursor = self.limit - v_7
+                        if not self.__r_verb_suffix():
+                            raise lab2()
+                    except lab3: pass
+                    self.cursor = self.limit - v_6
+                    v_8 = self.limit - self.cursor
+                    try:
+                        self.ket = self.cursor
+                        try:
+                            v_9 = self.limit - self.cursor
+                            try:
+                                if not self.eq_s_b(u"Y"):
+                                    raise lab8()
+                                self.bra = self.cursor
+                                if not self.slice_from(u"i"):
+                                    return False
+                                raise lab7()
+                            except lab8: pass
+                            self.cursor = self.limit - v_9
+                            if not self.eq_s_b(u"ç"):
+                                self.cursor = self.limit - v_8
+                                raise lab6()
+                            self.bra = self.cursor
+                            if not self.slice_from(u"c"):
+                                return False
+                        except lab7: pass
+                    except lab6: pass
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_5
+                if not self.__r_residual_suffix():
+                    raise lab0()
+            except lab1: pass
+        except lab0: pass
+        self.cursor = self.limit - v_4
+        v_10 = self.limit - self.cursor
+        self.__r_un_double()
+        self.cursor = self.limit - v_10
+        v_11 = self.limit - self.cursor
+        self.__r_un_accent()
+        self.cursor = self.limit - v_11
+        self.cursor = self.limit_backward
+        v_12 = self.cursor
+        self.__r_postlude()
+        self.cursor = v_12
+        return True
+
+    a_0 = [
+        Among(u"col", -1, -1),
+        Among(u"ni", -1, 1),
+        Among(u"par", -1, -1),
+        Among(u"tap", -1, -1)
+    ]
+
+    a_1 = [
+        Among(u"", -1, 7),
+        Among(u"H", 0, 6),
+        Among(u"He", 1, 4),
+        Among(u"Hi", 1, 5),
+        Among(u"I", 0, 1),
+        Among(u"U", 0, 2),
+        Among(u"Y", 0, 3)
+    ]
+
+    a_2 = [
+        Among(u"iqU", -1, 3),
+        Among(u"abl", -1, 3),
+        Among(u"Ièr", -1, 4),
+        Among(u"ièr", -1, 4),
+        Among(u"eus", -1, 2),
+        Among(u"iv", -1, 1)
+    ]
+
+    a_3 = [
+        Among(u"ic", -1, 2),
+        Among(u"abil", -1, 1),
+        Among(u"iv", -1, 3)
+    ]
+
+    a_4 = [
+        Among(u"iqUe", -1, 1),
+        Among(u"atrice", -1, 2),
+        Among(u"ance", -1, 1),
+        Among(u"ence", -1, 5),
+        Among(u"logie", -1, 3),
+        Among(u"able", -1, 1),
+        Among(u"isme", -1, 1),
+        Among(u"euse", -1, 12),
+        Among(u"iste", -1, 1),
+        Among(u"ive", -1, 8),
+        Among(u"if", -1, 8),
+        Among(u"usion", -1, 4),
+        Among(u"ation", -1, 2),
+        Among(u"ution", -1, 4),
+        Among(u"ateur", -1, 2),
+        Among(u"iqUes", -1, 1),
+        Among(u"atrices", -1, 2),
+        Among(u"ances", -1, 1),
+        Among(u"ences", -1, 5),
+        Among(u"logies", -1, 3),
+        Among(u"ables", -1, 1),
+        Among(u"ismes", -1, 1),
+        Among(u"euses", -1, 12),
+        Among(u"istes", -1, 1),
+        Among(u"ives", -1, 8),
+        Among(u"ifs", -1, 8),
+        Among(u"usions", -1, 4),
+        Among(u"ations", -1, 2),
+        Among(u"utions", -1, 4),
+        Among(u"ateurs", -1, 2),
+        Among(u"ments", -1, 16),
+        Among(u"ements", 30, 6),
+        Among(u"issements", 31, 13),
+        Among(u"ités", -1, 7),
+        Among(u"ment", -1, 16),
+        Among(u"ement", 34, 6),
+        Among(u"issement", 35, 13),
+        Among(u"amment", 34, 14),
+        Among(u"emment", 34, 15),
+        Among(u"aux", -1, 10),
+        Among(u"eaux", 39, 9),
+        Among(u"eux", -1, 1),
+        Among(u"oux", -1, 11),
+        Among(u"ité", -1, 7)
+    ]
+
+    a_5 = [
+        Among(u"ira", -1, 1),
+        Among(u"ie", -1, 1),
+        Among(u"isse", -1, 1),
+        Among(u"issante", -1, 1),
+        Among(u"i", -1, 1),
+        Among(u"irai", 4, 1),
+        Among(u"ir", -1, 1),
+        Among(u"iras", -1, 1),
+        Among(u"ies", -1, 1),
+        Among(u"îmes", -1, 1),
+        Among(u"isses", -1, 1),
+        Among(u"issantes", -1, 1),
+        Among(u"îtes", -1, 1),
+        Among(u"is", -1, 1),
+        Among(u"irais", 13, 1),
+        Among(u"issais", 13, 1),
+        Among(u"irions", -1, 1),
+        Among(u"issions", -1, 1),
+        Among(u"irons", -1, 1),
+        Among(u"issons", -1, 1),
+        Among(u"issants", -1, 1),
+        Among(u"it", -1, 1),
+        Among(u"irait", 21, 1),
+        Among(u"issait", 21, 1),
+        Among(u"issant", -1, 1),
+        Among(u"iraIent", -1, 1),
+        Among(u"issaIent", -1, 1),
+        Among(u"irent", -1, 1),
+        Among(u"issent", -1, 1),
+        Among(u"iront", -1, 1),
+        Among(u"ît", -1, 1),
+        Among(u"iriez", -1, 1),
+        Among(u"issiez", -1, 1),
+        Among(u"irez", -1, 1),
+        Among(u"issez", -1, 1)
+    ]
+
+    a_6 = [
+        Among(u"al", -1, 1),
+        Among(u"épl", -1, -1),
+        Among(u"auv", -1, -1)
+    ]
+
+    a_7 = [
+        Among(u"a", -1, 3),
+        Among(u"era", 0, 2),
+        Among(u"aise", -1, 4),
+        Among(u"asse", -1, 3),
+        Among(u"ante", -1, 3),
+        Among(u"ée", -1, 2),
+        Among(u"ai", -1, 3),
+        Among(u"erai", 6, 2),
+        Among(u"er", -1, 2),
+        Among(u"as", -1, 3),
+        Among(u"eras", 9, 2),
+        Among(u"âmes", -1, 3),
+        Among(u"aises", -1, 4),
+        Among(u"asses", -1, 3),
+        Among(u"antes", -1, 3),
+        Among(u"âtes", -1, 3),
+        Among(u"ées", -1, 2),
+        Among(u"ais", -1, 4),
+        Among(u"eais", 17, 2),
+        Among(u"erais", 17, 2),
+        Among(u"ions", -1, 1),
+        Among(u"erions", 20, 2),
+        Among(u"assions", 20, 3),
+        Among(u"erons", -1, 2),
+        Among(u"ants", -1, 3),
+        Among(u"és", -1, 2),
+        Among(u"ait", -1, 3),
+        Among(u"erait", 26, 2),
+        Among(u"ant", -1, 3),
+        Among(u"aIent", -1, 3),
+        Among(u"eraIent", 29, 2),
+        Among(u"èrent", -1, 2),
+        Among(u"assent", -1, 3),
+        Among(u"eront", -1, 2),
+        Among(u"ât", -1, 3),
+        Among(u"ez", -1, 2),
+        Among(u"iez", 35, 2),
+        Among(u"eriez", 36, 2),
+        Among(u"assiez", 36, 3),
+        Among(u"erez", 35, 2),
+        Among(u"é", -1, 2)
+    ]
+
+    a_8 = [
+        Among(u"e", -1, 3),
+        Among(u"Ière", 0, 2),
+        Among(u"ière", 0, 2),
+        Among(u"ion", -1, 1),
+        Among(u"Ier", -1, 2),
+        Among(u"ier", -1, 2)
+    ]
+
+    a_9 = [
+        Among(u"ell", -1, -1),
+        Among(u"eill", -1, -1),
+        Among(u"enn", -1, -1),
+        Among(u"onn", -1, -1),
+        Among(u"ett", -1, -1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
+
+
+class lab9(BaseException): pass
+
+
+class lab10(BaseException): pass
+
+
+class lab11(BaseException): pass
+
+
+class lab12(BaseException): pass
+
+
+class lab13(BaseException): pass
+
+
+class lab14(BaseException): pass
+
+
+class lab15(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/german_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/german_stemmer.py
new file mode 100644
index 000000000..4cd2eda28
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/german_stemmer.py
@@ -0,0 +1,472 @@
+#-*- coding: utf-8 -*-
+# Generated from german.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class GermanStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from german.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"y", u"ä", u"ö", u"ü"}
+
+    g_et_ending = {u"d", u"f", u"g", u"k", u"l", u"m", u"n", u"r", u"s", u"t", u"U", u"z", u"ä"}
+
+    g_s_ending = {u"b", u"d", u"f", u"g", u"h", u"k", u"l", u"m", u"n", u"r", u"t"}
+
+    g_st_ending = {u"b", u"d", u"f", u"g", u"h", u"k", u"l", u"m", u"n", u"t"}
+
+    I_x = 0
+    I_p2 = 0
+    I_p1 = 0
+
+    def __r_prelude(self):
+        v_1 = self.cursor
+        while True:
+            v_2 = self.cursor
+            try:
+                try:
+                    while True:
+                        v_3 = self.cursor
+                        try:
+                            if not self.in_grouping(GermanStemmer.g_v):
+                                raise lab2()
+                            self.bra = self.cursor
+                            try:
+                                v_4 = self.cursor
+                                try:
+                                    if not self.eq_s(u"u"):
+                                        raise lab4()
+                                    self.ket = self.cursor
+                                    if not self.in_grouping(GermanStemmer.g_v):
+                                        raise lab4()
+                                    if not self.slice_from(u"U"):
+                                        return False
+                                    raise lab3()
+                                except lab4: pass
+                                self.cursor = v_4
+                                if not self.eq_s(u"y"):
+                                    raise lab2()
+                                self.ket = self.cursor
+                                if not self.in_grouping(GermanStemmer.g_v):
+                                    raise lab2()
+                                if not self.slice_from(u"Y"):
+                                    return False
+                            except lab3: pass
+                            self.cursor = v_3
+                            raise lab1()
+                        except lab2: pass
+                        self.cursor = v_3
+                        if self.cursor >= self.limit:
+                            raise lab0()
+                        self.cursor += 1
+                except lab1: pass
+                continue
+            except lab0: pass
+            self.cursor = v_2
+            break
+        self.cursor = v_1
+        while True:
+            v_5 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(GermanStemmer.a_0)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"ss"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"ä"):
+                        return False
+                elif among_var == 3:
+                    if not self.slice_from(u"ö"):
+                        return False
+                elif among_var == 4:
+                    if not self.slice_from(u"ü"):
+                        return False
+                elif among_var == 5:
+                    if self.cursor >= self.limit:
+                        raise lab5()
+                    self.cursor += 1
+                continue
+            except lab5: pass
+            self.cursor = v_5
+            break
+        return True
+
+    def __r_mark_regions(self):
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        c = self.cursor + 3
+        if c > self.limit:
+            return False
+        self.cursor = c
+        self.I_x = self.cursor
+        self.cursor = v_1
+        if not self.go_out_grouping(GermanStemmer.g_v):
+            return False
+        self.cursor += 1
+        if not self.go_in_grouping(GermanStemmer.g_v):
+            return False
+        self.cursor += 1
+        self.I_p1 = self.cursor
+        try:
+            if self.I_p1 >= self.I_x:
+                raise lab0()
+            self.I_p1 = self.I_x
+        except lab0: pass
+        if not self.go_out_grouping(GermanStemmer.g_v):
+            return False
+        self.cursor += 1
+        if not self.go_in_grouping(GermanStemmer.g_v):
+            return False
+        self.cursor += 1
+        self.I_p2 = self.cursor
+        return True
+
+    def __r_postlude(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(GermanStemmer.a_1)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"y"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"u"):
+                        return False
+                elif among_var == 3:
+                    if not self.slice_from(u"a"):
+                        return False
+                elif among_var == 4:
+                    if not self.slice_from(u"o"):
+                        return False
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_standard_suffix(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            among_var = self.find_among_b(GermanStemmer.a_2)
+            if among_var == 0:
+                raise lab0()
+            self.bra = self.cursor
+            if not self.__r_R1():
+                raise lab0()
+            if among_var == 1:
+                v_2 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"syst"):
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_2
+                if not self.slice_del():
+                    return False
+
+            elif among_var == 2:
+                if not self.slice_del():
+                    return False
+
+            elif among_var == 3:
+                if not self.slice_del():
+                    return False
+
+                v_3 = self.limit - self.cursor
+                try:
+                    self.ket = self.cursor
+                    if not self.eq_s_b(u"s"):
+                        self.cursor = self.limit - v_3
+                        raise lab2()
+                    self.bra = self.cursor
+                    if not self.eq_s_b(u"nis"):
+                        self.cursor = self.limit - v_3
+                        raise lab2()
+                    if not self.slice_del():
+                        return False
+
+                except lab2: pass
+            elif among_var == 4:
+                if not self.in_grouping_b(GermanStemmer.g_s_ending):
+                    raise lab0()
+                if not self.slice_del():
+                    return False
+
+            else:
+                if not self.slice_from(u"l"):
+                    return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        v_4 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            among_var = self.find_among_b(GermanStemmer.a_4)
+            if among_var == 0:
+                raise lab3()
+            self.bra = self.cursor
+            if not self.__r_R1():
+                raise lab3()
+            if among_var == 1:
+                if not self.slice_del():
+                    return False
+
+            elif among_var == 2:
+                if not self.in_grouping_b(GermanStemmer.g_st_ending):
+                    raise lab3()
+                c = self.cursor - 3
+                if c < self.limit_backward:
+                    raise lab3()
+                self.cursor = c
+                if not self.slice_del():
+                    return False
+
+            else:
+                v_5 = self.limit - self.cursor
+                if not self.in_grouping_b(GermanStemmer.g_et_ending):
+                    raise lab3()
+                self.cursor = self.limit - v_5
+                v_6 = self.limit - self.cursor
+                try:
+                    if self.find_among_b(GermanStemmer.a_3) == 0:
+                        raise lab4()
+                    raise lab3()
+                except lab4: pass
+                self.cursor = self.limit - v_6
+                if not self.slice_del():
+                    return False
+
+        except lab3: pass
+        self.cursor = self.limit - v_4
+        v_7 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            among_var = self.find_among_b(GermanStemmer.a_6)
+            if among_var == 0:
+                raise lab5()
+            self.bra = self.cursor
+            if not self.__r_R2():
+                raise lab5()
+            if among_var == 1:
+                if not self.slice_del():
+                    return False
+
+                v_8 = self.limit - self.cursor
+                try:
+                    self.ket = self.cursor
+                    if not self.eq_s_b(u"ig"):
+                        self.cursor = self.limit - v_8
+                        raise lab6()
+                    self.bra = self.cursor
+                    v_9 = self.limit - self.cursor
+                    try:
+                        if not self.eq_s_b(u"e"):
+                            raise lab7()
+                        self.cursor = self.limit - v_8
+                        raise lab6()
+                    except lab7: pass
+                    self.cursor = self.limit - v_9
+                    if not self.__r_R2():
+                        self.cursor = self.limit - v_8
+                        raise lab6()
+                    if not self.slice_del():
+                        return False
+
+                except lab6: pass
+            elif among_var == 2:
+                v_10 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"e"):
+                        raise lab8()
+                    raise lab5()
+                except lab8: pass
+                self.cursor = self.limit - v_10
+                if not self.slice_del():
+                    return False
+
+            elif among_var == 3:
+                if not self.slice_del():
+                    return False
+
+                v_11 = self.limit - self.cursor
+                try:
+                    self.ket = self.cursor
+                    try:
+                        v_12 = self.limit - self.cursor
+                        try:
+                            if not self.eq_s_b(u"er"):
+                                raise lab11()
+                            raise lab10()
+                        except lab11: pass
+                        self.cursor = self.limit - v_12
+                        if not self.eq_s_b(u"en"):
+                            self.cursor = self.limit - v_11
+                            raise lab9()
+                    except lab10: pass
+                    self.bra = self.cursor
+                    if not self.__r_R1():
+                        self.cursor = self.limit - v_11
+                        raise lab9()
+                    if not self.slice_del():
+                        return False
+
+                except lab9: pass
+            else:
+                if not self.slice_del():
+                    return False
+
+                v_13 = self.limit - self.cursor
+                try:
+                    self.ket = self.cursor
+                    if self.find_among_b(GermanStemmer.a_5) == 0:
+                        self.cursor = self.limit - v_13
+                        raise lab12()
+                    self.bra = self.cursor
+                    if not self.__r_R2():
+                        self.cursor = self.limit - v_13
+                        raise lab12()
+                    if not self.slice_del():
+                        return False
+
+                except lab12: pass
+        except lab5: pass
+        self.cursor = self.limit - v_7
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        self.__r_prelude()
+        self.cursor = v_1
+        v_2 = self.cursor
+        self.__r_mark_regions()
+        self.cursor = v_2
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        self.__r_standard_suffix()
+        self.cursor = self.limit_backward
+        v_4 = self.cursor
+        self.__r_postlude()
+        self.cursor = v_4
+        return True
+
+    a_0 = [
+        Among(u"", -1, 5),
+        Among(u"ae", 0, 2),
+        Among(u"oe", 0, 3),
+        Among(u"qu", 0, -1),
+        Among(u"ue", 0, 4),
+        Among(u"ß", 0, 1)
+    ]
+
+    a_1 = [
+        Among(u"", -1, 5),
+        Among(u"U", 0, 2),
+        Among(u"Y", 0, 1),
+        Among(u"ä", 0, 3),
+        Among(u"ö", 0, 4),
+        Among(u"ü", 0, 2)
+    ]
+
+    a_2 = [
+        Among(u"e", -1, 3),
+        Among(u"em", -1, 1),
+        Among(u"en", -1, 3),
+        Among(u"erinnen", 2, 2),
+        Among(u"erin", -1, 2),
+        Among(u"ln", -1, 5),
+        Among(u"ern", -1, 2),
+        Among(u"er", -1, 2),
+        Among(u"s", -1, 4),
+        Among(u"es", 8, 3),
+        Among(u"lns", 8, 5)
+    ]
+
+    a_3 = [
+        Among(u"tick", -1, -1),
+        Among(u"plan", -1, -1),
+        Among(u"geordn", -1, -1),
+        Among(u"intern", -1, -1),
+        Among(u"tr", -1, -1)
+    ]
+
+    a_4 = [
+        Among(u"en", -1, 1),
+        Among(u"er", -1, 1),
+        Among(u"et", -1, 3),
+        Among(u"st", -1, 2),
+        Among(u"est", 3, 1)
+    ]
+
+    a_5 = [
+        Among(u"ig", -1, 1),
+        Among(u"lich", -1, 1)
+    ]
+
+    a_6 = [
+        Among(u"end", -1, 1),
+        Among(u"ig", -1, 2),
+        Among(u"ung", -1, 1),
+        Among(u"lich", -1, 3),
+        Among(u"isch", -1, 2),
+        Among(u"ik", -1, 2),
+        Among(u"heit", -1, 3),
+        Among(u"keit", -1, 4)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
+
+
+class lab9(BaseException): pass
+
+
+class lab10(BaseException): pass
+
+
+class lab11(BaseException): pass
+
+
+class lab12(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/greek_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/greek_stemmer.py
new file mode 100644
index 000000000..3ac0aa458
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/greek_stemmer.py
@@ -0,0 +1,2272 @@
+#-*- coding: utf-8 -*-
+# Generated from greek.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class GreekStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from greek.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"α", u"ε", u"η", u"ι", u"ο", u"υ", u"ω"}
+
+    g_v2 = {u"α", u"ε", u"η", u"ι", u"ο", u"ω"}
+
+    B_test1 = False
+
+    def __r_has_min_length(self):
+        return len(self.current) >= 3
+
+    def __r_tolower(self):
+        while True:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                among_var = self.find_among_b(GreekStemmer.a_0)
+                self.bra = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"α"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"β"):
+                        return False
+                elif among_var == 3:
+                    if not self.slice_from(u"γ"):
+                        return False
+                elif among_var == 4:
+                    if not self.slice_from(u"δ"):
+                        return False
+                elif among_var == 5:
+                    if not self.slice_from(u"ε"):
+                        return False
+                elif among_var == 6:
+                    if not self.slice_from(u"ζ"):
+                        return False
+                elif among_var == 7:
+                    if not self.slice_from(u"η"):
+                        return False
+                elif among_var == 8:
+                    if not self.slice_from(u"θ"):
+                        return False
+                elif among_var == 9:
+                    if not self.slice_from(u"ι"):
+                        return False
+                elif among_var == 10:
+                    if not self.slice_from(u"κ"):
+                        return False
+                elif among_var == 11:
+                    if not self.slice_from(u"λ"):
+                        return False
+                elif among_var == 12:
+                    if not self.slice_from(u"μ"):
+                        return False
+                elif among_var == 13:
+                    if not self.slice_from(u"ν"):
+                        return False
+                elif among_var == 14:
+                    if not self.slice_from(u"ξ"):
+                        return False
+                elif among_var == 15:
+                    if not self.slice_from(u"ο"):
+                        return False
+                elif among_var == 16:
+                    if not self.slice_from(u"π"):
+                        return False
+                elif among_var == 17:
+                    if not self.slice_from(u"ρ"):
+                        return False
+                elif among_var == 18:
+                    if not self.slice_from(u"σ"):
+                        return False
+                elif among_var == 19:
+                    if not self.slice_from(u"τ"):
+                        return False
+                elif among_var == 20:
+                    if not self.slice_from(u"υ"):
+                        return False
+                elif among_var == 21:
+                    if not self.slice_from(u"φ"):
+                        return False
+                elif among_var == 22:
+                    if not self.slice_from(u"χ"):
+                        return False
+                elif among_var == 23:
+                    if not self.slice_from(u"ψ"):
+                        return False
+                elif among_var == 24:
+                    if not self.slice_from(u"ω"):
+                        return False
+                else:
+                    if self.cursor <= self.limit_backward:
+                        raise lab0()
+                    self.cursor -= 1
+                continue
+            except lab0: pass
+            self.cursor = self.limit - v_1
+            break
+        return True
+
+    def __r_step_1(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(GreekStemmer.a_1)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"φα"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"σκα"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"ολο"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"σο"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"τατο"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"κρε"):
+                return False
+        elif among_var == 7:
+            if not self.slice_from(u"περ"):
+                return False
+        elif among_var == 8:
+            if not self.slice_from(u"τερ"):
+                return False
+        elif among_var == 9:
+            if not self.slice_from(u"φω"):
+                return False
+        elif among_var == 10:
+            if not self.slice_from(u"καθεστ"):
+                return False
+        else:
+            if not self.slice_from(u"γεγον"):
+                return False
+        self.B_test1 = False
+        return True
+
+    def __r_step_s1(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_3) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        among_var = self.find_among_b(GreekStemmer.a_2)
+        if among_var == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"ι"):
+                return False
+        else:
+            if not self.slice_from(u"ιζ"):
+                return False
+        return True
+
+    def __r_step_s2(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_5) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_4) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ων"):
+            return False
+        return True
+
+    def __r_step_s3(self):
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if not self.eq_s_b(u"ισα"):
+                    raise lab1()
+                self.bra = self.cursor
+                if self.cursor > self.limit_backward:
+                    raise lab1()
+                if not self.slice_from(u"ισ"):
+                    return False
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            self.ket = self.cursor
+        except lab0: pass
+        if self.find_among_b(GreekStemmer.a_7) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        among_var = self.find_among_b(GreekStemmer.a_6)
+        if among_var == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"ι"):
+                return False
+        else:
+            if not self.slice_from(u"ισ"):
+                return False
+        return True
+
+    def __r_step_s4(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_9) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_8) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ι"):
+            return False
+        return True
+
+    def __r_step_s5(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_11) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        among_var = self.find_among_b(GreekStemmer.a_10)
+        if among_var == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"ι"):
+                return False
+        else:
+            if not self.slice_from(u"ιστ"):
+                return False
+        return True
+
+    def __r_step_s6(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_14) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                self.bra = self.cursor
+                among_var = self.find_among_b(GreekStemmer.a_12)
+                if among_var == 0:
+                    raise lab1()
+                if self.cursor > self.limit_backward:
+                    raise lab1()
+                if among_var == 1:
+                    if not self.slice_from(u"ισμ"):
+                        return False
+                else:
+                    if not self.slice_from(u"ι"):
+                        return False
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            self.ket = self.cursor
+            among_var = self.find_among_b(GreekStemmer.a_13)
+            if among_var == 0:
+                return False
+            self.bra = self.cursor
+            if among_var == 1:
+                if not self.slice_from(u"αγνωστ"):
+                    return False
+            elif among_var == 2:
+                if not self.slice_from(u"ατομ"):
+                    return False
+            elif among_var == 3:
+                if not self.slice_from(u"γνωστ"):
+                    return False
+            elif among_var == 4:
+                if not self.slice_from(u"εθν"):
+                    return False
+            elif among_var == 5:
+                if not self.slice_from(u"εκλεκτ"):
+                    return False
+            elif among_var == 6:
+                if not self.slice_from(u"σκεπτ"):
+                    return False
+            elif among_var == 7:
+                if not self.slice_from(u"τοπ"):
+                    return False
+            elif among_var == 8:
+                if not self.slice_from(u"αλεξανδρ"):
+                    return False
+            elif among_var == 9:
+                if not self.slice_from(u"βυζαντ"):
+                    return False
+            else:
+                if not self.slice_from(u"θεατρ"):
+                    return False
+        except lab0: pass
+        return True
+
+    def __r_step_s7(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_16) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_15) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"αρακ"):
+            return False
+        return True
+
+    def __r_step_s8(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_18) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                self.bra = self.cursor
+                among_var = self.find_among_b(GreekStemmer.a_17)
+                if among_var == 0:
+                    raise lab1()
+                if self.cursor > self.limit_backward:
+                    raise lab1()
+                if among_var == 1:
+                    if not self.slice_from(u"ακ"):
+                        return False
+                else:
+                    if not self.slice_from(u"ιτσ"):
+                        return False
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            self.ket = self.cursor
+            self.bra = self.cursor
+            if not self.eq_s_b(u"κορ"):
+                return False
+            if not self.slice_from(u"ιτσ"):
+                return False
+        except lab0: pass
+        return True
+
+    def __r_step_s9(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_21) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                self.bra = self.cursor
+                if self.find_among_b(GreekStemmer.a_19) == 0:
+                    raise lab1()
+                if self.cursor > self.limit_backward:
+                    raise lab1()
+                if not self.slice_from(u"ιδ"):
+                    return False
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            self.ket = self.cursor
+            self.bra = self.cursor
+            if self.find_among_b(GreekStemmer.a_20) == 0:
+                return False
+            if not self.slice_from(u"ιδ"):
+                return False
+        except lab0: pass
+        return True
+
+    def __r_step_s10(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_23) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_22) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ισκ"):
+            return False
+        return True
+
+    def __r_step_2a(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_24) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        v_1 = self.limit - self.cursor
+        try:
+            if self.find_among_b(GreekStemmer.a_25) == 0:
+                raise lab0()
+            return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        c = self.cursor
+        self.insert(self.cursor, self.cursor, u"αδ")
+        self.cursor = c
+        return True
+
+    def __r_step_2b(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_26) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_27) == 0:
+            return False
+        if not self.slice_from(u"εδ"):
+            return False
+        return True
+
+    def __r_step_2c(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_28) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_29) == 0:
+            return False
+        if not self.slice_from(u"ουδ"):
+            return False
+        return True
+
+    def __r_step_2d(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_30) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_31) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ε"):
+            return False
+        return True
+
+    def __r_step_3(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_32) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if not self.in_grouping_b(GreekStemmer.g_v):
+            return False
+        if not self.slice_from(u"ι"):
+            return False
+        return True
+
+    def __r_step_4(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_33) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                self.bra = self.cursor
+                if not self.in_grouping_b(GreekStemmer.g_v):
+                    raise lab1()
+                if not self.slice_from(u"ικ"):
+                    return False
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            self.ket = self.cursor
+        except lab0: pass
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_34) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ικ"):
+            return False
+        return True
+
+    def __r_step_5a(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.eq_s_b(u"αγαμε"):
+                raise lab0()
+            self.bra = self.cursor
+            if self.cursor > self.limit_backward:
+                raise lab0()
+            if not self.slice_from(u"αγαμ"):
+                return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        v_2 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if self.find_among_b(GreekStemmer.a_35) == 0:
+                raise lab1()
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+            self.B_test1 = False
+        except lab1: pass
+        self.cursor = self.limit - v_2
+        self.ket = self.cursor
+        if not self.eq_s_b(u"αμε"):
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_36) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"αμ"):
+            return False
+        return True
+
+    def __r_step_5b(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if self.find_among_b(GreekStemmer.a_38) == 0:
+                raise lab0()
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+            self.B_test1 = False
+            self.ket = self.cursor
+            self.bra = self.cursor
+            if self.find_among_b(GreekStemmer.a_37) == 0:
+                raise lab0()
+            if self.cursor > self.limit_backward:
+                raise lab0()
+            if not self.slice_from(u"αγαν"):
+                return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        self.ket = self.cursor
+        if not self.eq_s_b(u"ανε"):
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        try:
+            v_2 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                self.bra = self.cursor
+                if not self.in_grouping_b(GreekStemmer.g_v2):
+                    raise lab2()
+                if not self.slice_from(u"αν"):
+                    return False
+                raise lab1()
+            except lab2: pass
+            self.cursor = self.limit - v_2
+            self.ket = self.cursor
+        except lab1: pass
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_39) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"αν"):
+            return False
+        return True
+
+    def __r_step_5c(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if self.find_among_b(GreekStemmer.a_40) == 0:
+                raise lab0()
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+            self.B_test1 = False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        self.ket = self.cursor
+        if not self.eq_s_b(u"ετε"):
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        try:
+            v_2 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                self.bra = self.cursor
+                if not self.in_grouping_b(GreekStemmer.g_v2):
+                    raise lab2()
+                if not self.slice_from(u"ετ"):
+                    return False
+                raise lab1()
+            except lab2: pass
+            self.cursor = self.limit - v_2
+            try:
+                self.ket = self.cursor
+                self.bra = self.cursor
+                if self.find_among_b(GreekStemmer.a_41) == 0:
+                    raise lab3()
+                if not self.slice_from(u"ετ"):
+                    return False
+                raise lab1()
+            except lab3: pass
+            self.cursor = self.limit - v_2
+            self.ket = self.cursor
+        except lab1: pass
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_42) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ετ"):
+            return False
+        return True
+
+    def __r_step_5d(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_43) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                self.bra = self.cursor
+                if not self.eq_s_b(u"αρχ"):
+                    raise lab1()
+                if self.cursor > self.limit_backward:
+                    raise lab1()
+                if not self.slice_from(u"οντ"):
+                    return False
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            self.ket = self.cursor
+            self.bra = self.cursor
+            if not self.eq_s_b(u"κρε"):
+                return False
+            if not self.slice_from(u"ωντ"):
+                return False
+        except lab0: pass
+        return True
+
+    def __r_step_5e(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_44) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if not self.eq_s_b(u"ον"):
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ομαστ"):
+            return False
+        return True
+
+    def __r_step_5f(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.eq_s_b(u"ιεστε"):
+                raise lab0()
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+            self.B_test1 = False
+            self.ket = self.cursor
+            self.bra = self.cursor
+            if self.find_among_b(GreekStemmer.a_45) == 0:
+                raise lab0()
+            if self.cursor > self.limit_backward:
+                raise lab0()
+            if not self.slice_from(u"ιεστ"):
+                return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        self.ket = self.cursor
+        if not self.eq_s_b(u"εστε"):
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_46) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ιεστ"):
+            return False
+        return True
+
+    def __r_step_5g(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if self.find_among_b(GreekStemmer.a_47) == 0:
+                raise lab0()
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+            self.B_test1 = False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_50) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        try:
+            v_2 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                self.bra = self.cursor
+                if self.find_among_b(GreekStemmer.a_48) == 0:
+                    raise lab2()
+                if not self.slice_from(u"ηκ"):
+                    return False
+                raise lab1()
+            except lab2: pass
+            self.cursor = self.limit - v_2
+            self.ket = self.cursor
+            self.bra = self.cursor
+            if self.find_among_b(GreekStemmer.a_49) == 0:
+                return False
+            if self.cursor > self.limit_backward:
+                return False
+            if not self.slice_from(u"ηκ"):
+                return False
+        except lab1: pass
+        return True
+
+    def __r_step_5h(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_53) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                self.bra = self.cursor
+                if self.find_among_b(GreekStemmer.a_51) == 0:
+                    raise lab1()
+                if not self.slice_from(u"ουσ"):
+                    return False
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            self.ket = self.cursor
+            self.bra = self.cursor
+            if self.find_among_b(GreekStemmer.a_52) == 0:
+                return False
+            if self.cursor > self.limit_backward:
+                return False
+            if not self.slice_from(u"ουσ"):
+                return False
+        except lab0: pass
+        return True
+
+    def __r_step_5i(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_56) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                self.bra = self.cursor
+                if not self.eq_s_b(u"κολλ"):
+                    raise lab1()
+                if not self.slice_from(u"αγ"):
+                    return False
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            try:
+                v_2 = self.limit - self.cursor
+                try:
+                    self.ket = self.cursor
+                    self.bra = self.cursor
+                    among_var = self.find_among_b(GreekStemmer.a_54)
+                    if among_var == 0:
+                        raise lab3()
+                    if among_var == 1:
+                        if not self.slice_from(u"αγ"):
+                            return False
+                    raise lab2()
+                except lab3: pass
+                self.cursor = self.limit - v_2
+                self.ket = self.cursor
+                self.bra = self.cursor
+                if self.find_among_b(GreekStemmer.a_55) == 0:
+                    return False
+                if self.cursor > self.limit_backward:
+                    return False
+                if not self.slice_from(u"αγ"):
+                    return False
+            except lab2: pass
+        except lab0: pass
+        return True
+
+    def __r_step_5j(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_57) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_58) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ησ"):
+            return False
+        return True
+
+    def __r_step_5k(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_59) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_60) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ηστ"):
+            return False
+        return True
+
+    def __r_step_5l(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_61) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_62) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ουν"):
+            return False
+        return True
+
+    def __r_step_5m(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_63) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.B_test1 = False
+        self.ket = self.cursor
+        self.bra = self.cursor
+        if self.find_among_b(GreekStemmer.a_64) == 0:
+            return False
+        if self.cursor > self.limit_backward:
+            return False
+        if not self.slice_from(u"ουμ"):
+            return False
+        return True
+
+    def __r_step_6(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if self.find_among_b(GreekStemmer.a_65) == 0:
+                raise lab0()
+            self.bra = self.cursor
+            if not self.slice_from(u"μα"):
+                return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        if not self.B_test1:
+            return False
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_66) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_step_7(self):
+        self.ket = self.cursor
+        if self.find_among_b(GreekStemmer.a_67) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def _stem(self):
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_1 = self.limit - self.cursor
+        self.__r_tolower()
+        self.cursor = self.limit - v_1
+        if not self.__r_has_min_length():
+            return False
+        self.B_test1 = True
+        v_2 = self.limit - self.cursor
+        self.__r_step_1()
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        self.__r_step_s1()
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        self.__r_step_s2()
+        self.cursor = self.limit - v_4
+        v_5 = self.limit - self.cursor
+        self.__r_step_s3()
+        self.cursor = self.limit - v_5
+        v_6 = self.limit - self.cursor
+        self.__r_step_s4()
+        self.cursor = self.limit - v_6
+        v_7 = self.limit - self.cursor
+        self.__r_step_s5()
+        self.cursor = self.limit - v_7
+        v_8 = self.limit - self.cursor
+        self.__r_step_s6()
+        self.cursor = self.limit - v_8
+        v_9 = self.limit - self.cursor
+        self.__r_step_s7()
+        self.cursor = self.limit - v_9
+        v_10 = self.limit - self.cursor
+        self.__r_step_s8()
+        self.cursor = self.limit - v_10
+        v_11 = self.limit - self.cursor
+        self.__r_step_s9()
+        self.cursor = self.limit - v_11
+        v_12 = self.limit - self.cursor
+        self.__r_step_s10()
+        self.cursor = self.limit - v_12
+        v_13 = self.limit - self.cursor
+        self.__r_step_2a()
+        self.cursor = self.limit - v_13
+        v_14 = self.limit - self.cursor
+        self.__r_step_2b()
+        self.cursor = self.limit - v_14
+        v_15 = self.limit - self.cursor
+        self.__r_step_2c()
+        self.cursor = self.limit - v_15
+        v_16 = self.limit - self.cursor
+        self.__r_step_2d()
+        self.cursor = self.limit - v_16
+        v_17 = self.limit - self.cursor
+        self.__r_step_3()
+        self.cursor = self.limit - v_17
+        v_18 = self.limit - self.cursor
+        self.__r_step_4()
+        self.cursor = self.limit - v_18
+        v_19 = self.limit - self.cursor
+        self.__r_step_5a()
+        self.cursor = self.limit - v_19
+        v_20 = self.limit - self.cursor
+        self.__r_step_5b()
+        self.cursor = self.limit - v_20
+        v_21 = self.limit - self.cursor
+        self.__r_step_5c()
+        self.cursor = self.limit - v_21
+        v_22 = self.limit - self.cursor
+        self.__r_step_5d()
+        self.cursor = self.limit - v_22
+        v_23 = self.limit - self.cursor
+        self.__r_step_5e()
+        self.cursor = self.limit - v_23
+        v_24 = self.limit - self.cursor
+        self.__r_step_5f()
+        self.cursor = self.limit - v_24
+        v_25 = self.limit - self.cursor
+        self.__r_step_5g()
+        self.cursor = self.limit - v_25
+        v_26 = self.limit - self.cursor
+        self.__r_step_5h()
+        self.cursor = self.limit - v_26
+        v_27 = self.limit - self.cursor
+        self.__r_step_5j()
+        self.cursor = self.limit - v_27
+        v_28 = self.limit - self.cursor
+        self.__r_step_5i()
+        self.cursor = self.limit - v_28
+        v_29 = self.limit - self.cursor
+        self.__r_step_5k()
+        self.cursor = self.limit - v_29
+        v_30 = self.limit - self.cursor
+        self.__r_step_5l()
+        self.cursor = self.limit - v_30
+        v_31 = self.limit - self.cursor
+        self.__r_step_5m()
+        self.cursor = self.limit - v_31
+        v_32 = self.limit - self.cursor
+        self.__r_step_6()
+        self.cursor = self.limit - v_32
+        v_33 = self.limit - self.cursor
+        self.__r_step_7()
+        self.cursor = self.limit - v_33
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"", -1, 25),
+        Among(u"Ά", 0, 1),
+        Among(u"Έ", 0, 5),
+        Among(u"Ή", 0, 7),
+        Among(u"Ί", 0, 9),
+        Among(u"Ό", 0, 15),
+        Among(u"Ύ", 0, 20),
+        Among(u"Ώ", 0, 24),
+        Among(u"ΐ", 0, 7),
+        Among(u"Α", 0, 1),
+        Among(u"Β", 0, 2),
+        Among(u"Γ", 0, 3),
+        Among(u"Δ", 0, 4),
+        Among(u"Ε", 0, 5),
+        Among(u"Ζ", 0, 6),
+        Among(u"Η", 0, 7),
+        Among(u"Θ", 0, 8),
+        Among(u"Ι", 0, 9),
+        Among(u"Κ", 0, 10),
+        Among(u"Λ", 0, 11),
+        Among(u"Μ", 0, 12),
+        Among(u"Ν", 0, 13),
+        Among(u"Ξ", 0, 14),
+        Among(u"Ο", 0, 15),
+        Among(u"Π", 0, 16),
+        Among(u"Ρ", 0, 17),
+        Among(u"Σ", 0, 18),
+        Among(u"Τ", 0, 19),
+        Among(u"Υ", 0, 20),
+        Among(u"Φ", 0, 21),
+        Among(u"Χ", 0, 22),
+        Among(u"Ψ", 0, 23),
+        Among(u"Ω", 0, 24),
+        Among(u"Ϊ", 0, 9),
+        Among(u"Ϋ", 0, 20),
+        Among(u"ά", 0, 1),
+        Among(u"έ", 0, 5),
+        Among(u"ή", 0, 7),
+        Among(u"ί", 0, 9),
+        Among(u"ΰ", 0, 20),
+        Among(u"ς", 0, 18),
+        Among(u"ϊ", 0, 7),
+        Among(u"ϋ", 0, 20),
+        Among(u"ό", 0, 15),
+        Among(u"ύ", 0, 20),
+        Among(u"ώ", 0, 24)
+    ]
+
+    a_1 = [
+        Among(u"σκαγια", -1, 2),
+        Among(u"φαγια", -1, 1),
+        Among(u"ολογια", -1, 3),
+        Among(u"σογια", -1, 4),
+        Among(u"τατογια", -1, 5),
+        Among(u"κρεατα", -1, 6),
+        Among(u"περατα", -1, 7),
+        Among(u"τερατα", -1, 8),
+        Among(u"γεγονοτα", -1, 11),
+        Among(u"καθεστωτα", -1, 10),
+        Among(u"φωτα", -1, 9),
+        Among(u"περατη", -1, 7),
+        Among(u"σκαγιων", -1, 2),
+        Among(u"φαγιων", -1, 1),
+        Among(u"ολογιων", -1, 3),
+        Among(u"σογιων", -1, 4),
+        Among(u"τατογιων", -1, 5),
+        Among(u"κρεατων", -1, 6),
+        Among(u"περατων", -1, 7),
+        Among(u"τερατων", -1, 8),
+        Among(u"γεγονοτων", -1, 11),
+        Among(u"καθεστωτων", -1, 10),
+        Among(u"φωτων", -1, 9),
+        Among(u"κρεασ", -1, 6),
+        Among(u"περασ", -1, 7),
+        Among(u"τερασ", -1, 8),
+        Among(u"γεγονοσ", -1, 11),
+        Among(u"κρεατοσ", -1, 6),
+        Among(u"περατοσ", -1, 7),
+        Among(u"τερατοσ", -1, 8),
+        Among(u"γεγονοτοσ", -1, 11),
+        Among(u"καθεστωτοσ", -1, 10),
+        Among(u"φωτοσ", -1, 9),
+        Among(u"καθεστωσ", -1, 10),
+        Among(u"φωσ", -1, 9),
+        Among(u"σκαγιου", -1, 2),
+        Among(u"φαγιου", -1, 1),
+        Among(u"ολογιου", -1, 3),
+        Among(u"σογιου", -1, 4),
+        Among(u"τατογιου", -1, 5)
+    ]
+
+    a_2 = [
+        Among(u"πα", -1, 1),
+        Among(u"ξαναπα", 0, 1),
+        Among(u"επα", 0, 1),
+        Among(u"περιπα", 0, 1),
+        Among(u"αναμπα", 0, 1),
+        Among(u"εμπα", 0, 1),
+        Among(u"β", -1, 2),
+        Among(u"δανε", -1, 1),
+        Among(u"βαθυρι", -1, 2),
+        Among(u"βαρκ", -1, 2),
+        Among(u"μαρκ", -1, 2),
+        Among(u"λ", -1, 2),
+        Among(u"μ", -1, 2),
+        Among(u"κορν", -1, 2),
+        Among(u"αθρο", -1, 1),
+        Among(u"συναθρο", 14, 1),
+        Among(u"π", -1, 2),
+        Among(u"ιμπ", 16, 2),
+        Among(u"ρ", -1, 2),
+        Among(u"μαρ", 18, 2),
+        Among(u"αμπαρ", 18, 2),
+        Among(u"γκρ", 18, 2),
+        Among(u"βολβορ", 18, 2),
+        Among(u"γλυκορ", 18, 2),
+        Among(u"πιπερορ", 18, 2),
+        Among(u"πρ", 18, 2),
+        Among(u"μπρ", 25, 2),
+        Among(u"αρρ", 18, 2),
+        Among(u"γλυκυρ", 18, 2),
+        Among(u"πολυρ", 18, 2),
+        Among(u"λου", -1, 2)
+    ]
+
+    a_3 = [
+        Among(u"ιζα", -1, 1),
+        Among(u"ιζε", -1, 1),
+        Among(u"ιζαμε", -1, 1),
+        Among(u"ιζουμε", -1, 1),
+        Among(u"ιζανε", -1, 1),
+        Among(u"ιζουνε", -1, 1),
+        Among(u"ιζατε", -1, 1),
+        Among(u"ιζετε", -1, 1),
+        Among(u"ιζει", -1, 1),
+        Among(u"ιζαν", -1, 1),
+        Among(u"ιζουν", -1, 1),
+        Among(u"ιζεσ", -1, 1),
+        Among(u"ιζεισ", -1, 1),
+        Among(u"ιζω", -1, 1)
+    ]
+
+    a_4 = [
+        Among(u"βι", -1, 1),
+        Among(u"λι", -1, 1),
+        Among(u"αλ", -1, 1),
+        Among(u"εν", -1, 1),
+        Among(u"σ", -1, 1),
+        Among(u"χ", -1, 1),
+        Among(u"υψ", -1, 1),
+        Among(u"ζω", -1, 1)
+    ]
+
+    a_5 = [
+        Among(u"ωθηκα", -1, 1),
+        Among(u"ωθηκε", -1, 1),
+        Among(u"ωθηκαμε", -1, 1),
+        Among(u"ωθηκανε", -1, 1),
+        Among(u"ωθηκατε", -1, 1),
+        Among(u"ωθηκαν", -1, 1),
+        Among(u"ωθηκεσ", -1, 1)
+    ]
+
+    a_6 = [
+        Among(u"ξαναπα", -1, 1),
+        Among(u"επα", -1, 1),
+        Among(u"περιπα", -1, 1),
+        Among(u"αναμπα", -1, 1),
+        Among(u"εμπα", -1, 1),
+        Among(u"χαρτοπα", -1, 1),
+        Among(u"εξαρχα", -1, 1),
+        Among(u"γε", -1, 2),
+        Among(u"γκε", -1, 2),
+        Among(u"κλε", -1, 1),
+        Among(u"εκλε", 9, 1),
+        Among(u"απεκλε", 10, 1),
+        Among(u"αποκλε", 9, 1),
+        Among(u"εσωκλε", 9, 1),
+        Among(u"δανε", -1, 1),
+        Among(u"πε", -1, 1),
+        Among(u"επε", 15, 1),
+        Among(u"μετεπε", 16, 1),
+        Among(u"εσε", -1, 1),
+        Among(u"γκ", -1, 2),
+        Among(u"μ", -1, 2),
+        Among(u"πουκαμ", 20, 2),
+        Among(u"κομ", 20, 2),
+        Among(u"αν", -1, 2),
+        Among(u"ολο", -1, 2),
+        Among(u"αθρο", -1, 1),
+        Among(u"συναθρο", 25, 1),
+        Among(u"π", -1, 2),
+        Among(u"λαρ", -1, 2),
+        Among(u"δημοκρατ", -1, 2),
+        Among(u"αφ", -1, 2),
+        Among(u"γιγαντοαφ", 30, 2)
+    ]
+
+    a_7 = [
+        Among(u"ισα", -1, 1),
+        Among(u"ισαμε", -1, 1),
+        Among(u"ισανε", -1, 1),
+        Among(u"ισε", -1, 1),
+        Among(u"ισατε", -1, 1),
+        Among(u"ισαν", -1, 1),
+        Among(u"ισεσ", -1, 1)
+    ]
+
+    a_8 = [
+        Among(u"ξαναπα", -1, 1),
+        Among(u"επα", -1, 1),
+        Among(u"περιπα", -1, 1),
+        Among(u"αναμπα", -1, 1),
+        Among(u"εμπα", -1, 1),
+        Among(u"χαρτοπα", -1, 1),
+        Among(u"εξαρχα", -1, 1),
+        Among(u"κλε", -1, 1),
+        Among(u"εκλε", 7, 1),
+        Among(u"απεκλε", 8, 1),
+        Among(u"αποκλε", 7, 1),
+        Among(u"εσωκλε", 7, 1),
+        Among(u"δανε", -1, 1),
+        Among(u"πε", -1, 1),
+        Among(u"επε", 13, 1),
+        Among(u"μετεπε", 14, 1),
+        Among(u"εσε", -1, 1),
+        Among(u"αθρο", -1, 1),
+        Among(u"συναθρο", 17, 1)
+    ]
+
+    a_9 = [
+        Among(u"ισουμε", -1, 1),
+        Among(u"ισουνε", -1, 1),
+        Among(u"ισετε", -1, 1),
+        Among(u"ισει", -1, 1),
+        Among(u"ισουν", -1, 1),
+        Among(u"ισεισ", -1, 1),
+        Among(u"ισω", -1, 1)
+    ]
+
+    a_10 = [
+        Among(u"ατα", -1, 2),
+        Among(u"φα", -1, 2),
+        Among(u"ηφα", 1, 2),
+        Among(u"μεγ", -1, 2),
+        Among(u"λυγ", -1, 2),
+        Among(u"ηδ", -1, 2),
+        Among(u"κλε", -1, 1),
+        Among(u"εσωκλε", 6, 1),
+        Among(u"πλε", -1, 1),
+        Among(u"δανε", -1, 1),
+        Among(u"σε", -1, 1),
+        Among(u"ασε", 10, 1),
+        Among(u"καθ", -1, 2),
+        Among(u"εχθ", -1, 2),
+        Among(u"κακ", -1, 2),
+        Among(u"μακ", -1, 2),
+        Among(u"σκ", -1, 2),
+        Among(u"φιλ", -1, 2),
+        Among(u"κυλ", -1, 2),
+        Among(u"μ", -1, 2),
+        Among(u"γεμ", 19, 2),
+        Among(u"αχν", -1, 2),
+        Among(u"συναθρο", -1, 1),
+        Among(u"π", -1, 2),
+        Among(u"απ", 23, 2),
+        Among(u"εμπ", 23, 2),
+        Among(u"ευπ", 23, 2),
+        Among(u"αρ", -1, 2),
+        Among(u"αορ", -1, 2),
+        Among(u"γυρ", -1, 2),
+        Among(u"χρ", -1, 2),
+        Among(u"χωρ", -1, 2),
+        Among(u"κτ", -1, 2),
+        Among(u"ακτ", 32, 2),
+        Among(u"χτ", -1, 2),
+        Among(u"αχτ", 34, 2),
+        Among(u"ταχ", -1, 2),
+        Among(u"σχ", -1, 2),
+        Among(u"ασχ", 37, 2),
+        Among(u"υψ", -1, 2)
+    ]
+
+    a_11 = [
+        Among(u"ιστα", -1, 1),
+        Among(u"ιστε", -1, 1),
+        Among(u"ιστη", -1, 1),
+        Among(u"ιστοι", -1, 1),
+        Among(u"ιστων", -1, 1),
+        Among(u"ιστο", -1, 1),
+        Among(u"ιστεσ", -1, 1),
+        Among(u"ιστησ", -1, 1),
+        Among(u"ιστοσ", -1, 1),
+        Among(u"ιστουσ", -1, 1),
+        Among(u"ιστου", -1, 1)
+    ]
+
+    a_12 = [
+        Among(u"εγκλε", -1, 1),
+        Among(u"αποκλε", -1, 1),
+        Among(u"δανε", -1, 2),
+        Among(u"αντιδανε", 2, 2),
+        Among(u"σε", -1, 1),
+        Among(u"μετασε", 4, 1),
+        Among(u"μικροσε", 4, 1)
+    ]
+
+    a_13 = [
+        Among(u"ατομικ", -1, 2),
+        Among(u"εθνικ", -1, 4),
+        Among(u"τοπικ", -1, 7),
+        Among(u"εκλεκτικ", -1, 5),
+        Among(u"σκεπτικ", -1, 6),
+        Among(u"γνωστικ", -1, 3),
+        Among(u"αγνωστικ", 5, 1),
+        Among(u"αλεξανδριν", -1, 8),
+        Among(u"θεατριν", -1, 10),
+        Among(u"βυζαντιν", -1, 9)
+    ]
+
+    a_14 = [
+        Among(u"ισμοι", -1, 1),
+        Among(u"ισμων", -1, 1),
+        Among(u"ισμο", -1, 1),
+        Among(u"ισμοσ", -1, 1),
+        Among(u"ισμουσ", -1, 1),
+        Among(u"ισμου", -1, 1)
+    ]
+
+    a_15 = [
+        Among(u"σ", -1, 1),
+        Among(u"χ", -1, 1)
+    ]
+
+    a_16 = [
+        Among(u"ουδακια", -1, 1),
+        Among(u"αρακια", -1, 1),
+        Among(u"ουδακι", -1, 1),
+        Among(u"αρακι", -1, 1)
+    ]
+
+    a_17 = [
+        Among(u"β", -1, 2),
+        Among(u"βαμβ", 0, 1),
+        Among(u"σλοβ", 0, 1),
+        Among(u"τσεχοσλοβ", 2, 1),
+        Among(u"καρδ", -1, 2),
+        Among(u"ζ", -1, 2),
+        Among(u"τζ", 5, 1),
+        Among(u"κ", -1, 1),
+        Among(u"καπακ", 7, 1),
+        Among(u"σοκ", 7, 1),
+        Among(u"σκ", 7, 1),
+        Among(u"βαλ", -1, 2),
+        Among(u"μαλ", -1, 1),
+        Among(u"γλ", -1, 2),
+        Among(u"τριπολ", -1, 2),
+        Among(u"πλ", -1, 1),
+        Among(u"λουλ", -1, 1),
+        Among(u"φυλ", -1, 1),
+        Among(u"καιμ", -1, 1),
+        Among(u"κλιμ", -1, 1),
+        Among(u"φαρμ", -1, 1),
+        Among(u"γιαν", -1, 2),
+        Among(u"σπαν", -1, 1),
+        Among(u"ηγουμεν", -1, 2),
+        Among(u"κον", -1, 1),
+        Among(u"μακρυν", -1, 2),
+        Among(u"π", -1, 2),
+        Among(u"κατραπ", 26, 1),
+        Among(u"ρ", -1, 1),
+        Among(u"βρ", 28, 1),
+        Among(u"λαβρ", 29, 1),
+        Among(u"αμβρ", 29, 1),
+        Among(u"μερ", 28, 1),
+        Among(u"πατερ", 28, 2),
+        Among(u"ανθρ", 28, 1),
+        Among(u"κορ", 28, 1),
+        Among(u"σ", -1, 1),
+        Among(u"ναγκασ", 36, 1),
+        Among(u"τοσ", 36, 2),
+        Among(u"μουστ", -1, 1),
+        Among(u"ρυ", -1, 1),
+        Among(u"φ", -1, 1),
+        Among(u"σφ", 41, 1),
+        Among(u"αλισφ", 42, 1),
+        Among(u"νυφ", 41, 2),
+        Among(u"χ", -1, 1)
+    ]
+
+    a_18 = [
+        Among(u"ακια", -1, 1),
+        Among(u"αρακια", 0, 1),
+        Among(u"ιτσα", -1, 1),
+        Among(u"ακι", -1, 1),
+        Among(u"αρακι", 3, 1),
+        Among(u"ιτσων", -1, 1),
+        Among(u"ιτσασ", -1, 1),
+        Among(u"ιτσεσ", -1, 1)
+    ]
+
+    a_19 = [
+        Among(u"ψαλ", -1, 1),
+        Among(u"αιφν", -1, 1),
+        Among(u"ολο", -1, 1),
+        Among(u"ιρ", -1, 1)
+    ]
+
+    a_20 = [
+        Among(u"ε", -1, 1),
+        Among(u"παιχν", -1, 1)
+    ]
+
+    a_21 = [
+        Among(u"ιδια", -1, 1),
+        Among(u"ιδιων", -1, 1),
+        Among(u"ιδιο", -1, 1)
+    ]
+
+    a_22 = [
+        Among(u"ιβ", -1, 1),
+        Among(u"δ", -1, 1),
+        Among(u"φραγκ", -1, 1),
+        Among(u"λυκ", -1, 1),
+        Among(u"οβελ", -1, 1),
+        Among(u"μην", -1, 1),
+        Among(u"ρ", -1, 1)
+    ]
+
+    a_23 = [
+        Among(u"ισκε", -1, 1),
+        Among(u"ισκο", -1, 1),
+        Among(u"ισκοσ", -1, 1),
+        Among(u"ισκου", -1, 1)
+    ]
+
+    a_24 = [
+        Among(u"αδων", -1, 1),
+        Among(u"αδεσ", -1, 1)
+    ]
+
+    a_25 = [
+        Among(u"γιαγι", -1, -1),
+        Among(u"θει", -1, -1),
+        Among(u"οκ", -1, -1),
+        Among(u"μαμ", -1, -1),
+        Among(u"μαν", -1, -1),
+        Among(u"μπαμπ", -1, -1),
+        Among(u"πεθερ", -1, -1),
+        Among(u"πατερ", -1, -1),
+        Among(u"κυρ", -1, -1),
+        Among(u"νταντ", -1, -1)
+    ]
+
+    a_26 = [
+        Among(u"εδων", -1, 1),
+        Among(u"εδεσ", -1, 1)
+    ]
+
+    a_27 = [
+        Among(u"μιλ", -1, 1),
+        Among(u"δαπ", -1, 1),
+        Among(u"γηπ", -1, 1),
+        Among(u"ιπ", -1, 1),
+        Among(u"εμπ", -1, 1),
+        Among(u"οπ", -1, 1),
+        Among(u"κρασπ", -1, 1),
+        Among(u"υπ", -1, 1)
+    ]
+
+    a_28 = [
+        Among(u"ουδων", -1, 1),
+        Among(u"ουδεσ", -1, 1)
+    ]
+
+    a_29 = [
+        Among(u"τραγ", -1, 1),
+        Among(u"φε", -1, 1),
+        Among(u"καλιακ", -1, 1),
+        Among(u"αρκ", -1, 1),
+        Among(u"σκ", -1, 1),
+        Among(u"πεταλ", -1, 1),
+        Among(u"βελ", -1, 1),
+        Among(u"λουλ", -1, 1),
+        Among(u"φλ", -1, 1),
+        Among(u"χν", -1, 1),
+        Among(u"πλεξ", -1, 1),
+        Among(u"σπ", -1, 1),
+        Among(u"φρ", -1, 1),
+        Among(u"σ", -1, 1),
+        Among(u"λιχ", -1, 1)
+    ]
+
+    a_30 = [
+        Among(u"εων", -1, 1),
+        Among(u"εωσ", -1, 1)
+    ]
+
+    a_31 = [
+        Among(u"δ", -1, 1),
+        Among(u"ιδ", 0, 1),
+        Among(u"θ", -1, 1),
+        Among(u"γαλ", -1, 1),
+        Among(u"ελ", -1, 1),
+        Among(u"ν", -1, 1),
+        Among(u"π", -1, 1),
+        Among(u"παρ", -1, 1)
+    ]
+
+    a_32 = [
+        Among(u"ια", -1, 1),
+        Among(u"ιων", -1, 1),
+        Among(u"ιου", -1, 1)
+    ]
+
+    a_33 = [
+        Among(u"ικα", -1, 1),
+        Among(u"ικων", -1, 1),
+        Among(u"ικο", -1, 1),
+        Among(u"ικου", -1, 1)
+    ]
+
+    a_34 = [
+        Among(u"αδ", -1, 1),
+        Among(u"συναδ", 0, 1),
+        Among(u"καταδ", 0, 1),
+        Among(u"αντιδ", -1, 1),
+        Among(u"ενδ", -1, 1),
+        Among(u"φυλοδ", -1, 1),
+        Among(u"υποδ", -1, 1),
+        Among(u"πρωτοδ", -1, 1),
+        Among(u"εξωδ", -1, 1),
+        Among(u"ηθ", -1, 1),
+        Among(u"ανηθ", 9, 1),
+        Among(u"ξικ", -1, 1),
+        Among(u"αλ", -1, 1),
+        Among(u"αμμοχαλ", 12, 1),
+        Among(u"συνομηλ", -1, 1),
+        Among(u"μπολ", -1, 1),
+        Among(u"μουλ", -1, 1),
+        Among(u"τσαμ", -1, 1),
+        Among(u"βρωμ", -1, 1),
+        Among(u"αμαν", -1, 1),
+        Among(u"μπαν", -1, 1),
+        Among(u"καλλιν", -1, 1),
+        Among(u"ποστελν", -1, 1),
+        Among(u"φιλον", -1, 1),
+        Among(u"καλπ", -1, 1),
+        Among(u"γερ", -1, 1),
+        Among(u"χασ", -1, 1),
+        Among(u"μποσ", -1, 1),
+        Among(u"πλιατσ", -1, 1),
+        Among(u"πετσ", -1, 1),
+        Among(u"πιτσ", -1, 1),
+        Among(u"φυσ", -1, 1),
+        Among(u"μπαγιατ", -1, 1),
+        Among(u"νιτ", -1, 1),
+        Among(u"πικαντ", -1, 1),
+        Among(u"σερτ", -1, 1)
+    ]
+
+    a_35 = [
+        Among(u"αγαμε", -1, 1),
+        Among(u"ηκαμε", -1, 1),
+        Among(u"ηθηκαμε", 1, 1),
+        Among(u"ησαμε", -1, 1),
+        Among(u"ουσαμε", -1, 1)
+    ]
+
+    a_36 = [
+        Among(u"βουβ", -1, 1),
+        Among(u"ξεθ", -1, 1),
+        Among(u"πεθ", -1, 1),
+        Among(u"αποθ", -1, 1),
+        Among(u"αποκ", -1, 1),
+        Among(u"ουλ", -1, 1),
+        Among(u"αναπ", -1, 1),
+        Among(u"πικρ", -1, 1),
+        Among(u"ποτ", -1, 1),
+        Among(u"αποστ", -1, 1),
+        Among(u"χ", -1, 1),
+        Among(u"σιχ", 10, 1)
+    ]
+
+    a_37 = [
+        Among(u"τρ", -1, 1),
+        Among(u"τσ", -1, 1)
+    ]
+
+    a_38 = [
+        Among(u"αγανε", -1, 1),
+        Among(u"ηκανε", -1, 1),
+        Among(u"ηθηκανε", 1, 1),
+        Among(u"ησανε", -1, 1),
+        Among(u"ουσανε", -1, 1),
+        Among(u"οντανε", -1, 1),
+        Among(u"ιοντανε", 5, 1),
+        Among(u"ουντανε", -1, 1),
+        Among(u"ιουντανε", 7, 1),
+        Among(u"οτανε", -1, 1),
+        Among(u"ιοτανε", 9, 1)
+    ]
+
+    a_39 = [
+        Among(u"ταβ", -1, 1),
+        Among(u"νταβ", 0, 1),
+        Among(u"ψηλοταβ", 0, 1),
+        Among(u"λιβ", -1, 1),
+        Among(u"κλιβ", 3, 1),
+        Among(u"ξηροκλιβ", 4, 1),
+        Among(u"γ", -1, 1),
+        Among(u"αγ", 6, 1),
+        Among(u"τραγ", 7, 1),
+        Among(u"τσαγ", 7, 1),
+        Among(u"αθιγγ", 6, 1),
+        Among(u"τσιγγ", 6, 1),
+        Among(u"ατσιγγ", 11, 1),
+        Among(u"στεγ", 6, 1),
+        Among(u"απηγ", 6, 1),
+        Among(u"σιγ", 6, 1),
+        Among(u"ανοργ", 6, 1),
+        Among(u"ενοργ", 6, 1),
+        Among(u"καλπουζ", -1, 1),
+        Among(u"θ", -1, 1),
+        Among(u"μωαμεθ", 19, 1),
+        Among(u"πιθ", 19, 1),
+        Among(u"απιθ", 21, 1),
+        Among(u"δεκ", -1, 1),
+        Among(u"πελεκ", -1, 1),
+        Among(u"ικ", -1, 1),
+        Among(u"ανικ", 25, 1),
+        Among(u"βουλκ", -1, 1),
+        Among(u"βασκ", -1, 1),
+        Among(u"βραχυκ", -1, 1),
+        Among(u"γαλ", -1, 1),
+        Among(u"καταγαλ", 30, 1),
+        Among(u"ολογαλ", 30, 1),
+        Among(u"βαθυγαλ", 30, 1),
+        Among(u"μελ", -1, 1),
+        Among(u"καστελ", -1, 1),
+        Among(u"πορτολ", -1, 1),
+        Among(u"πλ", -1, 1),
+        Among(u"διπλ", 37, 1),
+        Among(u"λαοπλ", 37, 1),
+        Among(u"ψυχοπλ", 37, 1),
+        Among(u"ουλ", -1, 1),
+        Among(u"μ", -1, 1),
+        Among(u"ολιγοδαμ", 42, 1),
+        Among(u"μουσουλμ", 42, 1),
+        Among(u"δραδουμ", 42, 1),
+        Among(u"βραχμ", 42, 1),
+        Among(u"ν", -1, 1),
+        Among(u"αμερικαν", 47, 1),
+        Among(u"π", -1, 1),
+        Among(u"αδαπ", 49, 1),
+        Among(u"χαμηλοδαπ", 49, 1),
+        Among(u"πολυδαπ", 49, 1),
+        Among(u"κοπ", 49, 1),
+        Among(u"υποκοπ", 53, 1),
+        Among(u"τσοπ", 49, 1),
+        Among(u"σπ", 49, 1),
+        Among(u"ερ", -1, 1),
+        Among(u"γερ", 57, 1),
+        Among(u"βετερ", 57, 1),
+        Among(u"λουθηρ", -1, 1),
+        Among(u"κορμορ", -1, 1),
+        Among(u"περιτρ", -1, 1),
+        Among(u"ουρ", -1, 1),
+        Among(u"σ", -1, 1),
+        Among(u"βασ", 64, 1),
+        Among(u"πολισ", 64, 1),
+        Among(u"σαρακατσ", 64, 1),
+        Among(u"θυσ", 64, 1),
+        Among(u"διατ", -1, 1),
+        Among(u"πλατ", -1, 1),
+        Among(u"τσαρλατ", -1, 1),
+        Among(u"τετ", -1, 1),
+        Among(u"πουριτ", -1, 1),
+        Among(u"σουλτ", -1, 1),
+        Among(u"μαιντ", -1, 1),
+        Among(u"ζωντ", -1, 1),
+        Among(u"καστ", -1, 1),
+        Among(u"φ", -1, 1),
+        Among(u"διαφ", 78, 1),
+        Among(u"στεφ", 78, 1),
+        Among(u"φωτοστεφ", 80, 1),
+        Among(u"περηφ", 78, 1),
+        Among(u"υπερηφ", 82, 1),
+        Among(u"κοιλαρφ", 78, 1),
+        Among(u"πενταρφ", 78, 1),
+        Among(u"ορφ", 78, 1),
+        Among(u"χ", -1, 1),
+        Among(u"αμηχ", 87, 1),
+        Among(u"βιομηχ", 87, 1),
+        Among(u"μεγλοβιομηχ", 89, 1),
+        Among(u"καπνοβιομηχ", 89, 1),
+        Among(u"μικροβιομηχ", 89, 1),
+        Among(u"πολυμηχ", 87, 1),
+        Among(u"λιχ", 87, 1)
+    ]
+
+    a_40 = [
+        Among(u"ησετε", -1, 1)
+    ]
+
+    a_41 = [
+        Among(u"ενδ", -1, 1),
+        Among(u"συνδ", -1, 1),
+        Among(u"οδ", -1, 1),
+        Among(u"διαθ", -1, 1),
+        Among(u"καθ", -1, 1),
+        Among(u"ραθ", -1, 1),
+        Among(u"ταθ", -1, 1),
+        Among(u"τιθ", -1, 1),
+        Among(u"εκθ", -1, 1),
+        Among(u"ενθ", -1, 1),
+        Among(u"συνθ", -1, 1),
+        Among(u"ροθ", -1, 1),
+        Among(u"υπερθ", -1, 1),
+        Among(u"σθ", -1, 1),
+        Among(u"ευθ", -1, 1),
+        Among(u"αρκ", -1, 1),
+        Among(u"ωφελ", -1, 1),
+        Among(u"βολ", -1, 1),
+        Among(u"αιν", -1, 1),
+        Among(u"πον", -1, 1),
+        Among(u"ρον", -1, 1),
+        Among(u"συν", -1, 1),
+        Among(u"βαρ", -1, 1),
+        Among(u"βρ", -1, 1),
+        Among(u"αιρ", -1, 1),
+        Among(u"φορ", -1, 1),
+        Among(u"ευρ", -1, 1),
+        Among(u"πυρ", -1, 1),
+        Among(u"χωρ", -1, 1),
+        Among(u"νετ", -1, 1),
+        Among(u"σχ", -1, 1)
+    ]
+
+    a_42 = [
+        Among(u"παγ", -1, 1),
+        Among(u"δ", -1, 1),
+        Among(u"αδ", 1, 1),
+        Among(u"θ", -1, 1),
+        Among(u"αθ", 3, 1),
+        Among(u"τοκ", -1, 1),
+        Among(u"σκ", -1, 1),
+        Among(u"παρακαλ", -1, 1),
+        Among(u"σκελ", -1, 1),
+        Among(u"απλ", -1, 1),
+        Among(u"εμ", -1, 1),
+        Among(u"αν", -1, 1),
+        Among(u"βεν", -1, 1),
+        Among(u"βαρον", -1, 1),
+        Among(u"κοπ", -1, 1),
+        Among(u"σερπ", -1, 1),
+        Among(u"αβαρ", -1, 1),
+        Among(u"εναρ", -1, 1),
+        Among(u"αβρ", -1, 1),
+        Among(u"μπορ", -1, 1),
+        Among(u"θαρρ", -1, 1),
+        Among(u"ντρ", -1, 1),
+        Among(u"υ", -1, 1),
+        Among(u"νιφ", -1, 1),
+        Among(u"συρφ", -1, 1)
+    ]
+
+    a_43 = [
+        Among(u"οντασ", -1, 1),
+        Among(u"ωντασ", -1, 1)
+    ]
+
+    a_44 = [
+        Among(u"ομαστε", -1, 1),
+        Among(u"ιομαστε", 0, 1)
+    ]
+
+    a_45 = [
+        Among(u"π", -1, 1),
+        Among(u"απ", 0, 1),
+        Among(u"ακαταπ", 1, 1),
+        Among(u"συμπ", 0, 1),
+        Among(u"ασυμπ", 3, 1),
+        Among(u"αμεταμφ", -1, 1)
+    ]
+
+    a_46 = [
+        Among(u"ζ", -1, 1),
+        Among(u"αλ", -1, 1),
+        Among(u"παρακαλ", 1, 1),
+        Among(u"εκτελ", -1, 1),
+        Among(u"μ", -1, 1),
+        Among(u"ξ", -1, 1),
+        Among(u"προ", -1, 1),
+        Among(u"αρ", -1, 1),
+        Among(u"νισ", -1, 1)
+    ]
+
+    a_47 = [
+        Among(u"ηθηκα", -1, 1),
+        Among(u"ηθηκε", -1, 1),
+        Among(u"ηθηκεσ", -1, 1)
+    ]
+
+    a_48 = [
+        Among(u"πιθ", -1, 1),
+        Among(u"οθ", -1, 1),
+        Among(u"ναρθ", -1, 1),
+        Among(u"σκουλ", -1, 1),
+        Among(u"σκωλ", -1, 1),
+        Among(u"σφ", -1, 1)
+    ]
+
+    a_49 = [
+        Among(u"θ", -1, 1),
+        Among(u"διαθ", 0, 1),
+        Among(u"παρακαταθ", 0, 1),
+        Among(u"συνθ", 0, 1),
+        Among(u"προσθ", 0, 1)
+    ]
+
+    a_50 = [
+        Among(u"ηκα", -1, 1),
+        Among(u"ηκε", -1, 1),
+        Among(u"ηκεσ", -1, 1)
+    ]
+
+    a_51 = [
+        Among(u"φαγ", -1, 1),
+        Among(u"ληγ", -1, 1),
+        Among(u"φρυδ", -1, 1),
+        Among(u"μαντιλ", -1, 1),
+        Among(u"μαλλ", -1, 1),
+        Among(u"ομ", -1, 1),
+        Among(u"βλεπ", -1, 1),
+        Among(u"ποδαρ", -1, 1),
+        Among(u"κυματ", -1, 1),
+        Among(u"πρωτ", -1, 1),
+        Among(u"λαχ", -1, 1),
+        Among(u"πανταχ", -1, 1)
+    ]
+
+    a_52 = [
+        Among(u"τσα", -1, 1),
+        Among(u"χαδ", -1, 1),
+        Among(u"μεδ", -1, 1),
+        Among(u"λαμπιδ", -1, 1),
+        Among(u"δε", -1, 1),
+        Among(u"πλε", -1, 1),
+        Among(u"μεσαζ", -1, 1),
+        Among(u"δεσποζ", -1, 1),
+        Among(u"αιθ", -1, 1),
+        Among(u"φαρμακ", -1, 1),
+        Among(u"αγκ", -1, 1),
+        Among(u"ανηκ", -1, 1),
+        Among(u"λ", -1, 1),
+        Among(u"μ", -1, 1),
+        Among(u"αμ", 13, 1),
+        Among(u"βρομ", 13, 1),
+        Among(u"υποτειν", -1, 1),
+        Among(u"εκλιπ", -1, 1),
+        Among(u"ρ", -1, 1),
+        Among(u"ενδιαφερ", 18, 1),
+        Among(u"αναρρ", 18, 1),
+        Among(u"πατ", -1, 1),
+        Among(u"καθαρευ", -1, 1),
+        Among(u"δευτερευ", -1, 1),
+        Among(u"λεχ", -1, 1)
+    ]
+
+    a_53 = [
+        Among(u"ουσα", -1, 1),
+        Among(u"ουσε", -1, 1),
+        Among(u"ουσεσ", -1, 1)
+    ]
+
+    a_54 = [
+        Among(u"πελ", -1, 1),
+        Among(u"λλ", -1, 1),
+        Among(u"σμην", -1, 1),
+        Among(u"ρπ", -1, 1),
+        Among(u"πρ", -1, 1),
+        Among(u"φρ", -1, 1),
+        Among(u"χορτ", -1, 1),
+        Among(u"οφ", -1, 1),
+        Among(u"ψοφ", 7, -1),
+        Among(u"σφ", -1, 1),
+        Among(u"λοχ", -1, 1),
+        Among(u"ναυλοχ", 10, -1)
+    ]
+
+    a_55 = [
+        Among(u"αμαλλι", -1, 1),
+        Among(u"λ", -1, 1),
+        Among(u"αμαλ", 1, 1),
+        Among(u"μ", -1, 1),
+        Among(u"ουλαμ", 3, 1),
+        Among(u"εν", -1, 1),
+        Among(u"δερβεν", 5, 1),
+        Among(u"π", -1, 1),
+        Among(u"αειπ", 7, 1),
+        Among(u"αρτιπ", 7, 1),
+        Among(u"συμπ", 7, 1),
+        Among(u"νεοπ", 7, 1),
+        Among(u"κροκαλοπ", 7, 1),
+        Among(u"ολοπ", 7, 1),
+        Among(u"προσωποπ", 7, 1),
+        Among(u"σιδηροπ", 7, 1),
+        Among(u"δροσοπ", 7, 1),
+        Among(u"ασπ", 7, 1),
+        Among(u"ανυπ", 7, 1),
+        Among(u"ρ", -1, 1),
+        Among(u"ασπαρ", 19, 1),
+        Among(u"χαρ", 19, 1),
+        Among(u"αχαρ", 21, 1),
+        Among(u"απερ", 19, 1),
+        Among(u"τρ", 19, 1),
+        Among(u"ουρ", 19, 1),
+        Among(u"τ", -1, 1),
+        Among(u"διατ", 26, 1),
+        Among(u"επιτ", 26, 1),
+        Among(u"συντ", 26, 1),
+        Among(u"ομοτ", 26, 1),
+        Among(u"νομοτ", 30, 1),
+        Among(u"αποτ", 26, 1),
+        Among(u"υποτ", 26, 1),
+        Among(u"αβαστ", 26, 1),
+        Among(u"αιμοστ", 26, 1),
+        Among(u"προστ", 26, 1),
+        Among(u"ανυστ", 26, 1),
+        Among(u"ναυ", -1, 1),
+        Among(u"αφ", -1, 1),
+        Among(u"ξεφ", -1, 1),
+        Among(u"αδηφ", -1, 1),
+        Among(u"παμφ", -1, 1),
+        Among(u"πολυφ", -1, 1)
+    ]
+
+    a_56 = [
+        Among(u"αγα", -1, 1),
+        Among(u"αγε", -1, 1),
+        Among(u"αγεσ", -1, 1)
+    ]
+
+    a_57 = [
+        Among(u"ησα", -1, 1),
+        Among(u"ησε", -1, 1),
+        Among(u"ησου", -1, 1)
+    ]
+
+    a_58 = [
+        Among(u"ν", -1, 1),
+        Among(u"δωδεκαν", 0, 1),
+        Among(u"επταν", 0, 1),
+        Among(u"μεγαλον", 0, 1),
+        Among(u"ερημον", 0, 1),
+        Among(u"χερσον", 0, 1)
+    ]
+
+    a_59 = [
+        Among(u"ηστε", -1, 1)
+    ]
+
+    a_60 = [
+        Among(u"σβ", -1, 1),
+        Among(u"ασβ", 0, 1),
+        Among(u"απλ", -1, 1),
+        Among(u"αειμν", -1, 1),
+        Among(u"χρ", -1, 1),
+        Among(u"αχρ", 4, 1),
+        Among(u"κοινοχρ", 4, 1),
+        Among(u"δυσχρ", 4, 1),
+        Among(u"ευχρ", 4, 1),
+        Among(u"παλιμψ", -1, 1)
+    ]
+
+    a_61 = [
+        Among(u"ουνε", -1, 1),
+        Among(u"ηθουνε", 0, 1),
+        Among(u"ησουνε", 0, 1)
+    ]
+
+    a_62 = [
+        Among(u"σπι", -1, 1),
+        Among(u"ν", -1, 1),
+        Among(u"εξων", 1, 1),
+        Among(u"ρ", -1, 1),
+        Among(u"στραβομουτσ", -1, 1),
+        Among(u"κακομουτσ", -1, 1)
+    ]
+
+    a_63 = [
+        Among(u"ουμε", -1, 1),
+        Among(u"ηθουμε", 0, 1),
+        Among(u"ησουμε", 0, 1)
+    ]
+
+    a_64 = [
+        Among(u"αζ", -1, 1),
+        Among(u"ωριοπλ", -1, 1),
+        Among(u"ασουσ", -1, 1),
+        Among(u"παρασουσ", 2, 1),
+        Among(u"αλλοσουσ", -1, 1),
+        Among(u"φ", -1, 1),
+        Among(u"χ", -1, 1)
+    ]
+
+    a_65 = [
+        Among(u"ματα", -1, 1),
+        Among(u"ματων", -1, 1),
+        Among(u"ματοσ", -1, 1)
+    ]
+
+    a_66 = [
+        Among(u"α", -1, 1),
+        Among(u"ιουμα", 0, 1),
+        Among(u"ομουνα", 0, 1),
+        Among(u"ιομουνα", 2, 1),
+        Among(u"οσουνα", 0, 1),
+        Among(u"ιοσουνα", 4, 1),
+        Among(u"ε", -1, 1),
+        Among(u"αγατε", 6, 1),
+        Among(u"ηκατε", 6, 1),
+        Among(u"ηθηκατε", 8, 1),
+        Among(u"ησατε", 6, 1),
+        Among(u"ουσατε", 6, 1),
+        Among(u"ειτε", 6, 1),
+        Among(u"ηθειτε", 12, 1),
+        Among(u"ιεμαστε", 6, 1),
+        Among(u"ουμαστε", 6, 1),
+        Among(u"ιουμαστε", 15, 1),
+        Among(u"ιεσαστε", 6, 1),
+        Among(u"οσαστε", 6, 1),
+        Among(u"ιοσαστε", 18, 1),
+        Among(u"η", -1, 1),
+        Among(u"ι", -1, 1),
+        Among(u"αμαι", 21, 1),
+        Among(u"ιεμαι", 21, 1),
+        Among(u"ομαι", 21, 1),
+        Among(u"ουμαι", 21, 1),
+        Among(u"ασαι", 21, 1),
+        Among(u"εσαι", 21, 1),
+        Among(u"ιεσαι", 27, 1),
+        Among(u"αται", 21, 1),
+        Among(u"εται", 21, 1),
+        Among(u"ιεται", 30, 1),
+        Among(u"ονται", 21, 1),
+        Among(u"ουνται", 21, 1),
+        Among(u"ιουνται", 33, 1),
+        Among(u"ει", 21, 1),
+        Among(u"αει", 35, 1),
+        Among(u"ηθει", 35, 1),
+        Among(u"ησει", 35, 1),
+        Among(u"οι", 21, 1),
+        Among(u"αν", -1, 1),
+        Among(u"αγαν", 40, 1),
+        Among(u"ηκαν", 40, 1),
+        Among(u"ηθηκαν", 42, 1),
+        Among(u"ησαν", 40, 1),
+        Among(u"ουσαν", 40, 1),
+        Among(u"οντουσαν", 45, 1),
+        Among(u"ιοντουσαν", 46, 1),
+        Among(u"ονταν", 40, 1),
+        Among(u"ιονταν", 48, 1),
+        Among(u"ουνταν", 40, 1),
+        Among(u"ιουνταν", 50, 1),
+        Among(u"οταν", 40, 1),
+        Among(u"ιοταν", 52, 1),
+        Among(u"ομασταν", 40, 1),
+        Among(u"ιομασταν", 54, 1),
+        Among(u"οσασταν", 40, 1),
+        Among(u"ιοσασταν", 56, 1),
+        Among(u"ουν", -1, 1),
+        Among(u"ηθουν", 58, 1),
+        Among(u"ομουν", 58, 1),
+        Among(u"ιομουν", 60, 1),
+        Among(u"ησουν", 58, 1),
+        Among(u"οσουν", 58, 1),
+        Among(u"ιοσουν", 63, 1),
+        Among(u"ων", -1, 1),
+        Among(u"ηδων", 65, 1),
+        Among(u"ο", -1, 1),
+        Among(u"ασ", -1, 1),
+        Among(u"εσ", -1, 1),
+        Among(u"ηδεσ", 69, 1),
+        Among(u"ησεσ", 69, 1),
+        Among(u"ησ", -1, 1),
+        Among(u"εισ", -1, 1),
+        Among(u"ηθεισ", 73, 1),
+        Among(u"οσ", -1, 1),
+        Among(u"υσ", -1, 1),
+        Among(u"ουσ", 76, 1),
+        Among(u"υ", -1, 1),
+        Among(u"ου", 78, 1),
+        Among(u"ω", -1, 1),
+        Among(u"αω", 80, 1),
+        Among(u"ηθω", 80, 1),
+        Among(u"ησω", 80, 1)
+    ]
+
+    a_67 = [
+        Among(u"οτερ", -1, 1),
+        Among(u"εστερ", -1, 1),
+        Among(u"υτερ", -1, 1),
+        Among(u"ωτερ", -1, 1),
+        Among(u"οτατ", -1, 1),
+        Among(u"εστατ", -1, 1),
+        Among(u"υτατ", -1, 1),
+        Among(u"ωτατ", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/hindi_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/hindi_stemmer.py
new file mode 100644
index 000000000..cf26a887a
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/hindi_stemmer.py
@@ -0,0 +1,174 @@
+#-*- coding: utf-8 -*-
+# Generated from hindi.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class HindiStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from hindi.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_consonant = {u"\u0915", u"\u0916", u"\u0917", u"\u0918", u"\u0919", u"\u091A", u"\u091B", u"\u091C", u"\u091D", u"\u091E", u"\u091F", u"\u0920", u"\u0921", u"\u0922", u"\u0923", u"\u0924", u"\u0925", u"\u0926", u"\u0927", u"\u0928", u"\u092A", u"\u092B", u"\u092C", u"\u092D", u"\u092E", u"\u092F", u"\u0930", u"\u0932", u"\u0935", u"\u0936", u"\u0937", u"\u0938", u"\u0939", u"\u0933", u"\u093C", u"\u0929", u"\u0931", u"\u0934", u"\u0958", u"\u0959", u"\u095A", u"\u095B", u"\u095C", u"\u095D", u"\u095E", u"\u095F"}
+
+
+    def __r_CONSONANT(self):
+        if not self.in_grouping_b(HindiStemmer.g_consonant):
+            return False
+        return True
+
+    def _stem(self):
+        if self.cursor >= self.limit:
+            return False
+        self.cursor += 1
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        self.ket = self.cursor
+        if self.find_among_b(HindiStemmer.a_0) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"\u0906\u0901", -1, -1),
+        Among(u"\u093E\u0901", -1, -1),
+        Among(u"\u0907\u092F\u093E\u0901", 1, -1),
+        Among(u"\u0906\u0907\u092F\u093E\u0901", 2, -1),
+        Among(u"\u093E\u0907\u092F\u093E\u0901", 2, -1),
+        Among(u"\u093F\u092F\u093E\u0901", 1, -1),
+        Among(u"\u0906\u0902", -1, -1),
+        Among(u"\u0909\u0906\u0902", 6, -1),
+        Among(u"\u0941\u0906\u0902", 6, -1),
+        Among(u"\u0908\u0902", -1, -1),
+        Among(u"\u0906\u0908\u0902", 9, -1),
+        Among(u"\u093E\u0908\u0902", 9, -1),
+        Among(u"\u090F\u0902", -1, -1),
+        Among(u"\u0906\u090F\u0902", 12, -1),
+        Among(u"\u0909\u090F\u0902", 12, -1),
+        Among(u"\u093E\u090F\u0902", 12, -1),
+        Among(u"\u0924\u093E\u090F\u0902", 15, -1, __r_CONSONANT),
+        Among(u"\u0905\u0924\u093E\u090F\u0902", 16, -1),
+        Among(u"\u0928\u093E\u090F\u0902", 15, -1, __r_CONSONANT),
+        Among(u"\u0905\u0928\u093E\u090F\u0902", 18, -1),
+        Among(u"\u0941\u090F\u0902", 12, -1),
+        Among(u"\u0913\u0902", -1, -1),
+        Among(u"\u0906\u0913\u0902", 21, -1),
+        Among(u"\u0909\u0913\u0902", 21, -1),
+        Among(u"\u093E\u0913\u0902", 21, -1),
+        Among(u"\u0924\u093E\u0913\u0902", 24, -1, __r_CONSONANT),
+        Among(u"\u0905\u0924\u093E\u0913\u0902", 25, -1),
+        Among(u"\u0928\u093E\u0913\u0902", 24, -1, __r_CONSONANT),
+        Among(u"\u0905\u0928\u093E\u0913\u0902", 27, -1),
+        Among(u"\u0941\u0913\u0902", 21, -1),
+        Among(u"\u093E\u0902", -1, -1),
+        Among(u"\u0907\u092F\u093E\u0902", 30, -1),
+        Among(u"\u0906\u0907\u092F\u093E\u0902", 31, -1),
+        Among(u"\u093E\u0907\u092F\u093E\u0902", 31, -1),
+        Among(u"\u093F\u092F\u093E\u0902", 30, -1),
+        Among(u"\u0940\u0902", -1, -1),
+        Among(u"\u0924\u0940\u0902", 35, -1, __r_CONSONANT),
+        Among(u"\u0905\u0924\u0940\u0902", 36, -1),
+        Among(u"\u0906\u0924\u0940\u0902", 36, -1),
+        Among(u"\u093E\u0924\u0940\u0902", 36, -1),
+        Among(u"\u0947\u0902", -1, -1),
+        Among(u"\u094B\u0902", -1, -1),
+        Among(u"\u0907\u092F\u094B\u0902", 41, -1),
+        Among(u"\u0906\u0907\u092F\u094B\u0902", 42, -1),
+        Among(u"\u093E\u0907\u092F\u094B\u0902", 42, -1),
+        Among(u"\u093F\u092F\u094B\u0902", 41, -1),
+        Among(u"\u0905", -1, -1),
+        Among(u"\u0906", -1, -1),
+        Among(u"\u0907", -1, -1),
+        Among(u"\u0908", -1, -1),
+        Among(u"\u0906\u0908", 49, -1),
+        Among(u"\u093E\u0908", 49, -1),
+        Among(u"\u0909", -1, -1),
+        Among(u"\u090A", -1, -1),
+        Among(u"\u090F", -1, -1),
+        Among(u"\u0906\u090F", 54, -1),
+        Among(u"\u0907\u090F", 54, -1),
+        Among(u"\u0906\u0907\u090F", 56, -1),
+        Among(u"\u093E\u0907\u090F", 56, -1),
+        Among(u"\u093E\u090F", 54, -1),
+        Among(u"\u093F\u090F", 54, -1),
+        Among(u"\u0913", -1, -1),
+        Among(u"\u0906\u0913", 61, -1),
+        Among(u"\u093E\u0913", 61, -1),
+        Among(u"\u0915\u0930", -1, -1, __r_CONSONANT),
+        Among(u"\u0905\u0915\u0930", 64, -1),
+        Among(u"\u0906\u0915\u0930", 64, -1),
+        Among(u"\u093E\u0915\u0930", 64, -1),
+        Among(u"\u093E", -1, -1),
+        Among(u"\u090A\u0902\u0917\u093E", 68, -1),
+        Among(u"\u0906\u090A\u0902\u0917\u093E", 69, -1),
+        Among(u"\u093E\u090A\u0902\u0917\u093E", 69, -1),
+        Among(u"\u0942\u0902\u0917\u093E", 68, -1),
+        Among(u"\u090F\u0917\u093E", 68, -1),
+        Among(u"\u0906\u090F\u0917\u093E", 73, -1),
+        Among(u"\u093E\u090F\u0917\u093E", 73, -1),
+        Among(u"\u0947\u0917\u093E", 68, -1),
+        Among(u"\u0924\u093E", 68, -1, __r_CONSONANT),
+        Among(u"\u0905\u0924\u093E", 77, -1),
+        Among(u"\u0906\u0924\u093E", 77, -1),
+        Among(u"\u093E\u0924\u093E", 77, -1),
+        Among(u"\u0928\u093E", 68, -1, __r_CONSONANT),
+        Among(u"\u0905\u0928\u093E", 81, -1),
+        Among(u"\u0906\u0928\u093E", 81, -1),
+        Among(u"\u093E\u0928\u093E", 81, -1),
+        Among(u"\u0906\u092F\u093E", 68, -1),
+        Among(u"\u093E\u092F\u093E", 68, -1),
+        Among(u"\u093F", -1, -1),
+        Among(u"\u0940", -1, -1),
+        Among(u"\u090A\u0902\u0917\u0940", 88, -1),
+        Among(u"\u0906\u090A\u0902\u0917\u0940", 89, -1),
+        Among(u"\u093E\u090A\u0902\u0917\u0940", 89, -1),
+        Among(u"\u090F\u0902\u0917\u0940", 88, -1),
+        Among(u"\u0906\u090F\u0902\u0917\u0940", 92, -1),
+        Among(u"\u093E\u090F\u0902\u0917\u0940", 92, -1),
+        Among(u"\u0942\u0902\u0917\u0940", 88, -1),
+        Among(u"\u0947\u0902\u0917\u0940", 88, -1),
+        Among(u"\u090F\u0917\u0940", 88, -1),
+        Among(u"\u0906\u090F\u0917\u0940", 97, -1),
+        Among(u"\u093E\u090F\u0917\u0940", 97, -1),
+        Among(u"\u0913\u0917\u0940", 88, -1),
+        Among(u"\u0906\u0913\u0917\u0940", 100, -1),
+        Among(u"\u093E\u0913\u0917\u0940", 100, -1),
+        Among(u"\u0947\u0917\u0940", 88, -1),
+        Among(u"\u094B\u0917\u0940", 88, -1),
+        Among(u"\u0924\u0940", 88, -1, __r_CONSONANT),
+        Among(u"\u0905\u0924\u0940", 105, -1),
+        Among(u"\u0906\u0924\u0940", 105, -1),
+        Among(u"\u093E\u0924\u0940", 105, -1),
+        Among(u"\u0928\u0940", 88, -1, __r_CONSONANT),
+        Among(u"\u0905\u0928\u0940", 109, -1),
+        Among(u"\u0941", -1, -1),
+        Among(u"\u0942", -1, -1),
+        Among(u"\u0947", -1, -1),
+        Among(u"\u090F\u0902\u0917\u0947", 113, -1),
+        Among(u"\u0906\u090F\u0902\u0917\u0947", 114, -1),
+        Among(u"\u093E\u090F\u0902\u0917\u0947", 114, -1),
+        Among(u"\u0947\u0902\u0917\u0947", 113, -1),
+        Among(u"\u0913\u0917\u0947", 113, -1),
+        Among(u"\u0906\u0913\u0917\u0947", 118, -1),
+        Among(u"\u093E\u0913\u0917\u0947", 118, -1),
+        Among(u"\u094B\u0917\u0947", 113, -1),
+        Among(u"\u0924\u0947", 113, -1, __r_CONSONANT),
+        Among(u"\u0905\u0924\u0947", 122, -1),
+        Among(u"\u0906\u0924\u0947", 122, -1),
+        Among(u"\u093E\u0924\u0947", 122, -1),
+        Among(u"\u0928\u0947", 113, -1, __r_CONSONANT),
+        Among(u"\u0905\u0928\u0947", 126, -1),
+        Among(u"\u0906\u0928\u0947", 126, -1),
+        Among(u"\u093E\u0928\u0947", 126, -1),
+        Among(u"\u094B", -1, -1),
+        Among(u"\u094D", -1, -1)
+    ]
+
+
+class lab0(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/hungarian_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/hungarian_stemmer.py
new file mode 100644
index 000000000..dcc9a82ed
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/hungarian_stemmer.py
@@ -0,0 +1,495 @@
+#-*- coding: utf-8 -*-
+# Generated from hungarian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class HungarianStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from hungarian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"á", u"é", u"í", u"ó", u"ö", u"ő", u"ú", u"ü", u"ű"}
+
+    I_p1 = 0
+
+    def __r_mark_regions(self):
+        self.I_p1 = self.limit
+        try:
+            v_1 = self.cursor
+            try:
+                if not self.in_grouping(HungarianStemmer.g_v):
+                    raise lab1()
+                v_2 = self.cursor
+                try:
+                    if not self.go_in_grouping(HungarianStemmer.g_v):
+                        raise lab2()
+                    self.cursor += 1
+                    self.I_p1 = self.cursor
+                except lab2: pass
+                self.cursor = v_2
+                raise lab0()
+            except lab1: pass
+            self.cursor = v_1
+            if not self.go_out_grouping(HungarianStemmer.g_v):
+                return False
+            self.cursor += 1
+            self.I_p1 = self.cursor
+        except lab0: pass
+        return True
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_v_ending(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(HungarianStemmer.a_0)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"a"):
+                return False
+        else:
+            if not self.slice_from(u"e"):
+                return False
+        return True
+
+    def __r_double(self):
+        v_1 = self.limit - self.cursor
+        if self.find_among_b(HungarianStemmer.a_1) == 0:
+            return False
+        self.cursor = self.limit - v_1
+        return True
+
+    def __r_undouble(self):
+        if self.cursor <= self.limit_backward:
+            return False
+        self.cursor -= 1
+        self.ket = self.cursor
+        if self.cursor <= self.limit_backward:
+            return False
+        self.cursor -= 1
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_instrum(self):
+        self.ket = self.cursor
+        if self.find_among_b(HungarianStemmer.a_2) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if not self.__r_double():
+            return False
+        if not self.slice_del():
+            return False
+
+        if not self.__r_undouble():
+            return False
+        return True
+
+    def __r_case(self):
+        self.ket = self.cursor
+        if self.find_among_b(HungarianStemmer.a_3) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if not self.slice_del():
+            return False
+
+        if not self.__r_v_ending():
+            return False
+        return True
+
+    def __r_case_special(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(HungarianStemmer.a_4)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"e"):
+                return False
+        else:
+            if not self.slice_from(u"a"):
+                return False
+        return True
+
+    def __r_case_other(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(HungarianStemmer.a_5)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.slice_from(u"a"):
+                return False
+        else:
+            if not self.slice_from(u"e"):
+                return False
+        return True
+
+    def __r_factive(self):
+        self.ket = self.cursor
+        if self.find_among_b(HungarianStemmer.a_6) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if not self.__r_double():
+            return False
+        if not self.slice_del():
+            return False
+
+        if not self.__r_undouble():
+            return False
+        return True
+
+    def __r_plural(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(HungarianStemmer.a_7)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"a"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"e"):
+                return False
+        else:
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_owned(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(HungarianStemmer.a_8)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.slice_from(u"e"):
+                return False
+        else:
+            if not self.slice_from(u"a"):
+                return False
+        return True
+
+    def __r_sing_owner(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(HungarianStemmer.a_9)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.slice_from(u"a"):
+                return False
+        else:
+            if not self.slice_from(u"e"):
+                return False
+        return True
+
+    def __r_plur_owner(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(HungarianStemmer.a_10)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.slice_from(u"a"):
+                return False
+        else:
+            if not self.slice_from(u"e"):
+                return False
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        self.__r_mark_regions()
+        self.cursor = v_1
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_2 = self.limit - self.cursor
+        self.__r_instrum()
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        self.__r_case()
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        self.__r_case_special()
+        self.cursor = self.limit - v_4
+        v_5 = self.limit - self.cursor
+        self.__r_case_other()
+        self.cursor = self.limit - v_5
+        v_6 = self.limit - self.cursor
+        self.__r_factive()
+        self.cursor = self.limit - v_6
+        v_7 = self.limit - self.cursor
+        self.__r_owned()
+        self.cursor = self.limit - v_7
+        v_8 = self.limit - self.cursor
+        self.__r_sing_owner()
+        self.cursor = self.limit - v_8
+        v_9 = self.limit - self.cursor
+        self.__r_plur_owner()
+        self.cursor = self.limit - v_9
+        v_10 = self.limit - self.cursor
+        self.__r_plural()
+        self.cursor = self.limit - v_10
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"á", -1, 1),
+        Among(u"é", -1, 2)
+    ]
+
+    a_1 = [
+        Among(u"bb", -1, -1),
+        Among(u"cc", -1, -1),
+        Among(u"dd", -1, -1),
+        Among(u"ff", -1, -1),
+        Among(u"gg", -1, -1),
+        Among(u"jj", -1, -1),
+        Among(u"kk", -1, -1),
+        Among(u"ll", -1, -1),
+        Among(u"mm", -1, -1),
+        Among(u"nn", -1, -1),
+        Among(u"pp", -1, -1),
+        Among(u"rr", -1, -1),
+        Among(u"ccs", -1, -1),
+        Among(u"ss", -1, -1),
+        Among(u"zzs", -1, -1),
+        Among(u"tt", -1, -1),
+        Among(u"vv", -1, -1),
+        Among(u"ggy", -1, -1),
+        Among(u"lly", -1, -1),
+        Among(u"nny", -1, -1),
+        Among(u"tty", -1, -1),
+        Among(u"ssz", -1, -1),
+        Among(u"zz", -1, -1)
+    ]
+
+    a_2 = [
+        Among(u"al", -1, 1),
+        Among(u"el", -1, 1)
+    ]
+
+    a_3 = [
+        Among(u"ba", -1, -1),
+        Among(u"ra", -1, -1),
+        Among(u"be", -1, -1),
+        Among(u"re", -1, -1),
+        Among(u"ig", -1, -1),
+        Among(u"nak", -1, -1),
+        Among(u"nek", -1, -1),
+        Among(u"val", -1, -1),
+        Among(u"vel", -1, -1),
+        Among(u"ul", -1, -1),
+        Among(u"nál", -1, -1),
+        Among(u"nél", -1, -1),
+        Among(u"ból", -1, -1),
+        Among(u"ról", -1, -1),
+        Among(u"tól", -1, -1),
+        Among(u"ül", -1, -1),
+        Among(u"ből", -1, -1),
+        Among(u"ről", -1, -1),
+        Among(u"től", -1, -1),
+        Among(u"n", -1, -1),
+        Among(u"an", 19, -1),
+        Among(u"ban", 20, -1),
+        Among(u"en", 19, -1),
+        Among(u"ben", 22, -1),
+        Among(u"képpen", 22, -1),
+        Among(u"on", 19, -1),
+        Among(u"ön", 19, -1),
+        Among(u"képp", -1, -1),
+        Among(u"kor", -1, -1),
+        Among(u"t", -1, -1),
+        Among(u"at", 29, -1),
+        Among(u"et", 29, -1),
+        Among(u"ként", 29, -1),
+        Among(u"anként", 32, -1),
+        Among(u"enként", 32, -1),
+        Among(u"onként", 32, -1),
+        Among(u"ot", 29, -1),
+        Among(u"ért", 29, -1),
+        Among(u"öt", 29, -1),
+        Among(u"hez", -1, -1),
+        Among(u"hoz", -1, -1),
+        Among(u"höz", -1, -1),
+        Among(u"vá", -1, -1),
+        Among(u"vé", -1, -1)
+    ]
+
+    a_4 = [
+        Among(u"án", -1, 2),
+        Among(u"én", -1, 1),
+        Among(u"ánként", -1, 2)
+    ]
+
+    a_5 = [
+        Among(u"stul", -1, 1),
+        Among(u"astul", 0, 1),
+        Among(u"ástul", 0, 2),
+        Among(u"stül", -1, 1),
+        Among(u"estül", 3, 1),
+        Among(u"éstül", 3, 3)
+    ]
+
+    a_6 = [
+        Among(u"á", -1, 1),
+        Among(u"é", -1, 1)
+    ]
+
+    a_7 = [
+        Among(u"k", -1, 3),
+        Among(u"ak", 0, 3),
+        Among(u"ek", 0, 3),
+        Among(u"ok", 0, 3),
+        Among(u"ák", 0, 1),
+        Among(u"ék", 0, 2),
+        Among(u"ök", 0, 3)
+    ]
+
+    a_8 = [
+        Among(u"éi", -1, 1),
+        Among(u"áéi", 0, 3),
+        Among(u"ééi", 0, 2),
+        Among(u"é", -1, 1),
+        Among(u"ké", 3, 1),
+        Among(u"aké", 4, 1),
+        Among(u"eké", 4, 1),
+        Among(u"oké", 4, 1),
+        Among(u"áké", 4, 3),
+        Among(u"éké", 4, 2),
+        Among(u"öké", 4, 1),
+        Among(u"éé", 3, 2)
+    ]
+
+    a_9 = [
+        Among(u"a", -1, 1),
+        Among(u"ja", 0, 1),
+        Among(u"d", -1, 1),
+        Among(u"ad", 2, 1),
+        Among(u"ed", 2, 1),
+        Among(u"od", 2, 1),
+        Among(u"ád", 2, 2),
+        Among(u"éd", 2, 3),
+        Among(u"öd", 2, 1),
+        Among(u"e", -1, 1),
+        Among(u"je", 9, 1),
+        Among(u"nk", -1, 1),
+        Among(u"unk", 11, 1),
+        Among(u"ánk", 11, 2),
+        Among(u"énk", 11, 3),
+        Among(u"ünk", 11, 1),
+        Among(u"uk", -1, 1),
+        Among(u"juk", 16, 1),
+        Among(u"ájuk", 17, 2),
+        Among(u"ük", -1, 1),
+        Among(u"jük", 19, 1),
+        Among(u"éjük", 20, 3),
+        Among(u"m", -1, 1),
+        Among(u"am", 22, 1),
+        Among(u"em", 22, 1),
+        Among(u"om", 22, 1),
+        Among(u"ám", 22, 2),
+        Among(u"ém", 22, 3),
+        Among(u"o", -1, 1),
+        Among(u"á", -1, 2),
+        Among(u"é", -1, 3)
+    ]
+
+    a_10 = [
+        Among(u"id", -1, 1),
+        Among(u"aid", 0, 1),
+        Among(u"jaid", 1, 1),
+        Among(u"eid", 0, 1),
+        Among(u"jeid", 3, 1),
+        Among(u"áid", 0, 2),
+        Among(u"éid", 0, 3),
+        Among(u"i", -1, 1),
+        Among(u"ai", 7, 1),
+        Among(u"jai", 8, 1),
+        Among(u"ei", 7, 1),
+        Among(u"jei", 10, 1),
+        Among(u"ái", 7, 2),
+        Among(u"éi", 7, 3),
+        Among(u"itek", -1, 1),
+        Among(u"eitek", 14, 1),
+        Among(u"jeitek", 15, 1),
+        Among(u"éitek", 14, 3),
+        Among(u"ik", -1, 1),
+        Among(u"aik", 18, 1),
+        Among(u"jaik", 19, 1),
+        Among(u"eik", 18, 1),
+        Among(u"jeik", 21, 1),
+        Among(u"áik", 18, 2),
+        Among(u"éik", 18, 3),
+        Among(u"ink", -1, 1),
+        Among(u"aink", 25, 1),
+        Among(u"jaink", 26, 1),
+        Among(u"eink", 25, 1),
+        Among(u"jeink", 28, 1),
+        Among(u"áink", 25, 2),
+        Among(u"éink", 25, 3),
+        Among(u"aitok", -1, 1),
+        Among(u"jaitok", 32, 1),
+        Among(u"áitok", -1, 2),
+        Among(u"im", -1, 1),
+        Among(u"aim", 35, 1),
+        Among(u"jaim", 36, 1),
+        Among(u"eim", 35, 1),
+        Among(u"jeim", 38, 1),
+        Among(u"áim", 35, 2),
+        Among(u"éim", 35, 3)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/indonesian_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/indonesian_stemmer.py
new file mode 100644
index 000000000..516de98cc
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/indonesian_stemmer.py
@@ -0,0 +1,316 @@
+#-*- coding: utf-8 -*-
+# Generated from indonesian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class IndonesianStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from indonesian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_vowel = {u"a", u"e", u"i", u"o", u"u"}
+
+    I_prefix = 0
+    I_measure = 0
+
+    def __r_remove_particle(self):
+        self.ket = self.cursor
+        if self.find_among_b(IndonesianStemmer.a_0) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.I_measure -= 1
+        return True
+
+    def __r_remove_possessive_pronoun(self):
+        self.ket = self.cursor
+        if self.find_among_b(IndonesianStemmer.a_1) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.I_measure -= 1
+        return True
+
+    def __r_SUFFIX_KAN_OK(self):
+        if self.I_prefix == 3:
+            return False
+        if self.I_prefix == 2:
+            return False
+        return True
+
+    def __r_SUFFIX_AN_OK(self):
+        return self.I_prefix != 1
+
+    def __r_SUFFIX_I_OK(self):
+        if self.I_prefix > 2:
+            return False
+        v_1 = self.limit - self.cursor
+        try:
+            if not self.eq_s_b(u"s"):
+                raise lab0()
+            return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        return True
+
+    def __r_remove_suffix(self):
+        self.ket = self.cursor
+        if self.find_among_b(IndonesianStemmer.a_2) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.I_measure -= 1
+        return True
+
+    def __r_VOWEL(self):
+        if not self.in_grouping(IndonesianStemmer.g_vowel):
+            return False
+        return True
+
+    def __r_KER(self):
+        if not self.out_grouping(IndonesianStemmer.g_vowel):
+            return False
+        if not self.eq_s(u"er"):
+            return False
+        return True
+
+    def __r_remove_first_order_prefix(self):
+        self.bra = self.cursor
+        among_var = self.find_among(IndonesianStemmer.a_3)
+        if among_var == 0:
+            return False
+        self.ket = self.cursor
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+            self.I_prefix = 1
+            self.I_measure -= 1
+        elif among_var == 2:
+            if not self.slice_del():
+                return False
+
+            self.I_prefix = 3
+            self.I_measure -= 1
+        elif among_var == 3:
+            self.I_prefix = 1
+            if not self.slice_from(u"s"):
+                return False
+            self.I_measure -= 1
+        elif among_var == 4:
+            self.I_prefix = 3
+            if not self.slice_from(u"s"):
+                return False
+            self.I_measure -= 1
+        elif among_var == 5:
+            self.I_prefix = 1
+            self.I_measure -= 1
+            try:
+                v_1 = self.cursor
+                try:
+                    v_2 = self.cursor
+                    if not self.in_grouping(IndonesianStemmer.g_vowel):
+                        raise lab1()
+                    self.cursor = v_2
+                    if not self.slice_from(u"p"):
+                        return False
+                    raise lab0()
+                except lab1: pass
+                self.cursor = v_1
+                if not self.slice_del():
+                    return False
+
+            except lab0: pass
+        else:
+            self.I_prefix = 3
+            self.I_measure -= 1
+            try:
+                v_3 = self.cursor
+                try:
+                    v_4 = self.cursor
+                    if not self.in_grouping(IndonesianStemmer.g_vowel):
+                        raise lab3()
+                    self.cursor = v_4
+                    if not self.slice_from(u"p"):
+                        return False
+                    raise lab2()
+                except lab3: pass
+                self.cursor = v_3
+                if not self.slice_del():
+                    return False
+
+            except lab2: pass
+        return True
+
+    def __r_remove_second_order_prefix(self):
+        self.bra = self.cursor
+        among_var = self.find_among(IndonesianStemmer.a_4)
+        if among_var == 0:
+            return False
+        self.ket = self.cursor
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+            self.I_prefix = 2
+            self.I_measure -= 1
+        elif among_var == 2:
+            if not self.slice_from(u"ajar"):
+                return False
+            self.I_measure -= 1
+        elif among_var == 3:
+            if not self.slice_del():
+                return False
+
+            self.I_prefix = 4
+            self.I_measure -= 1
+        else:
+            if not self.slice_from(u"ajar"):
+                return False
+            self.I_prefix = 4
+            self.I_measure -= 1
+        return True
+
+    def _stem(self):
+        self.I_measure = 0
+        v_1 = self.cursor
+        try:
+            while True:
+                try:
+                    if not self.go_out_grouping(IndonesianStemmer.g_vowel):
+                        raise lab1()
+                    self.cursor += 1
+                    self.I_measure += 1
+                    continue
+                except lab1: pass
+                break
+        except lab0: pass
+        self.cursor = v_1
+        if self.I_measure <= 2:
+            return False
+        self.I_prefix = 0
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_3 = self.limit - self.cursor
+        self.__r_remove_particle()
+        self.cursor = self.limit - v_3
+        if self.I_measure <= 2:
+            return False
+        v_4 = self.limit - self.cursor
+        self.__r_remove_possessive_pronoun()
+        self.cursor = self.limit - v_4
+        self.cursor = self.limit_backward
+        if self.I_measure <= 2:
+            return False
+        try:
+            v_5 = self.cursor
+            try:
+                v_6 = self.cursor
+                if not self.__r_remove_first_order_prefix():
+                    raise lab3()
+                v_7 = self.cursor
+                try:
+                    v_8 = self.cursor
+                    if self.I_measure <= 2:
+                        raise lab4()
+                    self.limit_backward = self.cursor
+                    self.cursor = self.limit
+                    if not self.__r_remove_suffix():
+                        raise lab4()
+                    self.cursor = self.limit_backward
+                    self.cursor = v_8
+                    if self.I_measure <= 2:
+                        raise lab4()
+                    if not self.__r_remove_second_order_prefix():
+                        raise lab4()
+                except lab4: pass
+                self.cursor = v_7
+                self.cursor = v_6
+                raise lab2()
+            except lab3: pass
+            self.cursor = v_5
+            v_9 = self.cursor
+            self.__r_remove_second_order_prefix()
+            self.cursor = v_9
+            v_10 = self.cursor
+            try:
+                if self.I_measure <= 2:
+                    raise lab5()
+                self.limit_backward = self.cursor
+                self.cursor = self.limit
+                if not self.__r_remove_suffix():
+                    raise lab5()
+                self.cursor = self.limit_backward
+            except lab5: pass
+            self.cursor = v_10
+        except lab2: pass
+        return True
+
+    a_0 = [
+        Among(u"kah", -1, 1),
+        Among(u"lah", -1, 1),
+        Among(u"pun", -1, 1)
+    ]
+
+    a_1 = [
+        Among(u"nya", -1, 1),
+        Among(u"ku", -1, 1),
+        Among(u"mu", -1, 1)
+    ]
+
+    a_2 = [
+        Among(u"i", -1, 1, __r_SUFFIX_I_OK),
+        Among(u"an", -1, 1, __r_SUFFIX_AN_OK),
+        Among(u"kan", 1, 1, __r_SUFFIX_KAN_OK)
+    ]
+
+    a_3 = [
+        Among(u"di", -1, 1),
+        Among(u"ke", -1, 2),
+        Among(u"me", -1, 1),
+        Among(u"mem", 2, 5),
+        Among(u"men", 2, 1),
+        Among(u"meng", 4, 1),
+        Among(u"meny", 4, 3, __r_VOWEL),
+        Among(u"pem", -1, 6),
+        Among(u"pen", -1, 2),
+        Among(u"peng", 8, 2),
+        Among(u"peny", 8, 4, __r_VOWEL),
+        Among(u"ter", -1, 1)
+    ]
+
+    a_4 = [
+        Among(u"be", -1, 3, __r_KER),
+        Among(u"belajar", 0, 4),
+        Among(u"ber", 0, 3),
+        Among(u"pe", -1, 1),
+        Among(u"pelajar", 3, 2),
+        Among(u"per", 3, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/irish_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/irish_stemmer.py
new file mode 100644
index 000000000..c414ca3aa
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/irish_stemmer.py
@@ -0,0 +1,271 @@
+#-*- coding: utf-8 -*-
+# Generated from irish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class IrishStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from irish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"á", u"é", u"í", u"ó", u"ú"}
+
+    I_p2 = 0
+    I_p1 = 0
+    I_pV = 0
+
+    def __r_mark_regions(self):
+        self.I_pV = self.limit
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            if not self.go_out_grouping(IrishStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            self.I_pV = self.cursor
+            if not self.go_in_grouping(IrishStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+            if not self.go_out_grouping(IrishStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            if not self.go_in_grouping(IrishStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        return True
+
+    def __r_initial_morph(self):
+        self.bra = self.cursor
+        among_var = self.find_among(IrishStemmer.a_0)
+        if among_var == 0:
+            return False
+        self.ket = self.cursor
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.slice_from(u"f"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"s"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"b"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"c"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"d"):
+                return False
+        elif among_var == 7:
+            if not self.slice_from(u"g"):
+                return False
+        elif among_var == 8:
+            if not self.slice_from(u"p"):
+                return False
+        elif among_var == 9:
+            if not self.slice_from(u"t"):
+                return False
+        else:
+            if not self.slice_from(u"m"):
+                return False
+        return True
+
+    def __r_RV(self):
+        return self.I_pV <= self.cursor
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_noun_sfx(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(IrishStemmer.a_1)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_deriv(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(IrishStemmer.a_2)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.slice_from(u"arc"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"gin"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"graf"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"paite"):
+                return False
+        else:
+            if not self.slice_from(u"óid"):
+                return False
+        return True
+
+    def __r_verb_sfx(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(IrishStemmer.a_3)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_RV():
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        self.__r_initial_morph()
+        self.cursor = v_1
+        self.__r_mark_regions()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_3 = self.limit - self.cursor
+        self.__r_noun_sfx()
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        self.__r_deriv()
+        self.cursor = self.limit - v_4
+        v_5 = self.limit - self.cursor
+        self.__r_verb_sfx()
+        self.cursor = self.limit - v_5
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"b'", -1, 1),
+        Among(u"bh", -1, 4),
+        Among(u"bhf", 1, 2),
+        Among(u"bp", -1, 8),
+        Among(u"ch", -1, 5),
+        Among(u"d'", -1, 1),
+        Among(u"d'fh", 5, 2),
+        Among(u"dh", -1, 6),
+        Among(u"dt", -1, 9),
+        Among(u"fh", -1, 2),
+        Among(u"gc", -1, 5),
+        Among(u"gh", -1, 7),
+        Among(u"h-", -1, 1),
+        Among(u"m'", -1, 1),
+        Among(u"mb", -1, 4),
+        Among(u"mh", -1, 10),
+        Among(u"n-", -1, 1),
+        Among(u"nd", -1, 6),
+        Among(u"ng", -1, 7),
+        Among(u"ph", -1, 8),
+        Among(u"sh", -1, 3),
+        Among(u"t-", -1, 1),
+        Among(u"th", -1, 9),
+        Among(u"ts", -1, 3)
+    ]
+
+    a_1 = [
+        Among(u"íochta", -1, 1),
+        Among(u"aíochta", 0, 1),
+        Among(u"ire", -1, 2),
+        Among(u"aire", 2, 2),
+        Among(u"abh", -1, 1),
+        Among(u"eabh", 4, 1),
+        Among(u"ibh", -1, 1),
+        Among(u"aibh", 6, 1),
+        Among(u"amh", -1, 1),
+        Among(u"eamh", 8, 1),
+        Among(u"imh", -1, 1),
+        Among(u"aimh", 10, 1),
+        Among(u"íocht", -1, 1),
+        Among(u"aíocht", 12, 1),
+        Among(u"irí", -1, 2),
+        Among(u"airí", 14, 2)
+    ]
+
+    a_2 = [
+        Among(u"óideacha", -1, 6),
+        Among(u"patacha", -1, 5),
+        Among(u"achta", -1, 1),
+        Among(u"arcachta", 2, 2),
+        Among(u"eachta", 2, 1),
+        Among(u"grafaíochta", -1, 4),
+        Among(u"paite", -1, 5),
+        Among(u"ach", -1, 1),
+        Among(u"each", 7, 1),
+        Among(u"óideach", 8, 6),
+        Among(u"gineach", 8, 3),
+        Among(u"patach", 7, 5),
+        Among(u"grafaíoch", -1, 4),
+        Among(u"pataigh", -1, 5),
+        Among(u"óidigh", -1, 6),
+        Among(u"achtúil", -1, 1),
+        Among(u"eachtúil", 15, 1),
+        Among(u"gineas", -1, 3),
+        Among(u"ginis", -1, 3),
+        Among(u"acht", -1, 1),
+        Among(u"arcacht", 19, 2),
+        Among(u"eacht", 19, 1),
+        Among(u"grafaíocht", -1, 4),
+        Among(u"arcachtaí", -1, 2),
+        Among(u"grafaíochtaí", -1, 4)
+    ]
+
+    a_3 = [
+        Among(u"imid", -1, 1),
+        Among(u"aimid", 0, 1),
+        Among(u"ímid", -1, 1),
+        Among(u"aímid", 2, 1),
+        Among(u"adh", -1, 2),
+        Among(u"eadh", 4, 2),
+        Among(u"faidh", -1, 1),
+        Among(u"fidh", -1, 1),
+        Among(u"áil", -1, 2),
+        Among(u"ain", -1, 2),
+        Among(u"tear", -1, 2),
+        Among(u"tar", -1, 2)
+    ]
+
+
+class lab0(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/italian_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/italian_stemmer.py
new file mode 100644
index 000000000..d9cd5e384
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/italian_stemmer.py
@@ -0,0 +1,715 @@
+#-*- coding: utf-8 -*-
+# Generated from italian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class ItalianStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from italian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"à", u"è", u"ì", u"ò", u"ù"}
+
+    g_AEIO = {u"a", u"e", u"i", u"o", u"à", u"è", u"ì", u"ò"}
+
+    g_CG = {u"c", u"g"}
+
+    I_p2 = 0
+    I_p1 = 0
+    I_pV = 0
+
+    def __r_prelude(self):
+        v_1 = self.cursor
+        while True:
+            v_2 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(ItalianStemmer.a_0)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"à"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"è"):
+                        return False
+                elif among_var == 3:
+                    if not self.slice_from(u"ì"):
+                        return False
+                elif among_var == 4:
+                    if not self.slice_from(u"ò"):
+                        return False
+                elif among_var == 5:
+                    if not self.slice_from(u"ù"):
+                        return False
+                elif among_var == 6:
+                    if not self.slice_from(u"qU"):
+                        return False
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_2
+            break
+        self.cursor = v_1
+        while True:
+            v_3 = self.cursor
+            try:
+                try:
+                    while True:
+                        v_4 = self.cursor
+                        try:
+                            if not self.in_grouping(ItalianStemmer.g_v):
+                                raise lab3()
+                            self.bra = self.cursor
+                            try:
+                                v_5 = self.cursor
+                                try:
+                                    if not self.eq_s(u"u"):
+                                        raise lab5()
+                                    self.ket = self.cursor
+                                    if not self.in_grouping(ItalianStemmer.g_v):
+                                        raise lab5()
+                                    if not self.slice_from(u"U"):
+                                        return False
+                                    raise lab4()
+                                except lab5: pass
+                                self.cursor = v_5
+                                if not self.eq_s(u"i"):
+                                    raise lab3()
+                                self.ket = self.cursor
+                                if not self.in_grouping(ItalianStemmer.g_v):
+                                    raise lab3()
+                                if not self.slice_from(u"I"):
+                                    return False
+                            except lab4: pass
+                            self.cursor = v_4
+                            raise lab2()
+                        except lab3: pass
+                        self.cursor = v_4
+                        if self.cursor >= self.limit:
+                            raise lab1()
+                        self.cursor += 1
+                except lab2: pass
+                continue
+            except lab1: pass
+            self.cursor = v_3
+            break
+        return True
+
+    def __r_mark_regions(self):
+        self.I_pV = self.limit
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            try:
+                v_2 = self.cursor
+                try:
+                    if not self.in_grouping(ItalianStemmer.g_v):
+                        raise lab2()
+                    try:
+                        v_3 = self.cursor
+                        try:
+                            if not self.out_grouping(ItalianStemmer.g_v):
+                                raise lab4()
+                            if not self.go_out_grouping(ItalianStemmer.g_v):
+                                raise lab4()
+                            self.cursor += 1
+                            raise lab3()
+                        except lab4: pass
+                        self.cursor = v_3
+                        if not self.in_grouping(ItalianStemmer.g_v):
+                            raise lab2()
+                        if not self.go_in_grouping(ItalianStemmer.g_v):
+                            raise lab2()
+                        self.cursor += 1
+                    except lab3: pass
+                    raise lab1()
+                except lab2: pass
+                self.cursor = v_2
+                try:
+                    if not self.eq_s(u"divan"):
+                        raise lab5()
+                    raise lab1()
+                except lab5: pass
+                self.cursor = v_2
+                if not self.out_grouping(ItalianStemmer.g_v):
+                    raise lab0()
+                try:
+                    v_4 = self.cursor
+                    try:
+                        if not self.out_grouping(ItalianStemmer.g_v):
+                            raise lab7()
+                        if not self.go_out_grouping(ItalianStemmer.g_v):
+                            raise lab7()
+                        self.cursor += 1
+                        raise lab6()
+                    except lab7: pass
+                    self.cursor = v_4
+                    if not self.in_grouping(ItalianStemmer.g_v):
+                        raise lab0()
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                except lab6: pass
+            except lab1: pass
+            self.I_pV = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        v_5 = self.cursor
+        try:
+            if not self.go_out_grouping(ItalianStemmer.g_v):
+                raise lab8()
+            self.cursor += 1
+            if not self.go_in_grouping(ItalianStemmer.g_v):
+                raise lab8()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+            if not self.go_out_grouping(ItalianStemmer.g_v):
+                raise lab8()
+            self.cursor += 1
+            if not self.go_in_grouping(ItalianStemmer.g_v):
+                raise lab8()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab8: pass
+        self.cursor = v_5
+        return True
+
+    def __r_postlude(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(ItalianStemmer.a_1)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"i"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"u"):
+                        return False
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_RV(self):
+        return self.I_pV <= self.cursor
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_attached_pronoun(self):
+        self.ket = self.cursor
+        if self.find_among_b(ItalianStemmer.a_2) == 0:
+            return False
+        self.bra = self.cursor
+        among_var = self.find_among_b(ItalianStemmer.a_3)
+        if among_var == 0:
+            return False
+        if not self.__r_RV():
+            return False
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.slice_from(u"e"):
+                return False
+        return True
+
+    def __r_standard_suffix(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(ItalianStemmer.a_6)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if not self.eq_s_b(u"ic"):
+                    self.cursor = self.limit - v_1
+                    raise lab0()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_1
+                    raise lab0()
+                if not self.slice_del():
+                    return False
+
+            except lab0: pass
+        elif among_var == 3:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"log"):
+                return False
+        elif among_var == 4:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"u"):
+                return False
+        elif among_var == 5:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"ente"):
+                return False
+        elif among_var == 6:
+            if not self.__r_RV():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 7:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_2 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                among_var = self.find_among_b(ItalianStemmer.a_4)
+                if among_var == 0:
+                    self.cursor = self.limit - v_2
+                    raise lab1()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_2
+                    raise lab1()
+                if not self.slice_del():
+                    return False
+
+                if among_var == 1:
+                    self.ket = self.cursor
+                    if not self.eq_s_b(u"at"):
+                        self.cursor = self.limit - v_2
+                        raise lab1()
+                    self.bra = self.cursor
+                    if not self.__r_R2():
+                        self.cursor = self.limit - v_2
+                        raise lab1()
+                    if not self.slice_del():
+                        return False
+
+            except lab1: pass
+        elif among_var == 8:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_3 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if self.find_among_b(ItalianStemmer.a_5) == 0:
+                    self.cursor = self.limit - v_3
+                    raise lab2()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_3
+                    raise lab2()
+                if not self.slice_del():
+                    return False
+
+            except lab2: pass
+        else:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_4 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if not self.eq_s_b(u"at"):
+                    self.cursor = self.limit - v_4
+                    raise lab3()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_4
+                    raise lab3()
+                if not self.slice_del():
+                    return False
+
+                self.ket = self.cursor
+                if not self.eq_s_b(u"ic"):
+                    self.cursor = self.limit - v_4
+                    raise lab3()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_4
+                    raise lab3()
+                if not self.slice_del():
+                    return False
+
+            except lab3: pass
+        return True
+
+    def __r_verb_suffix(self):
+        if self.cursor < self.I_pV:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_pV
+        self.ket = self.cursor
+        if self.find_among_b(ItalianStemmer.a_7) == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.limit_backward = v_2
+        return True
+
+    def __r_vowel_suffix(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.in_grouping_b(ItalianStemmer.g_AEIO):
+                self.cursor = self.limit - v_1
+                raise lab0()
+            self.bra = self.cursor
+            if not self.__r_RV():
+                self.cursor = self.limit - v_1
+                raise lab0()
+            if not self.slice_del():
+                return False
+
+            self.ket = self.cursor
+            if not self.eq_s_b(u"i"):
+                self.cursor = self.limit - v_1
+                raise lab0()
+            self.bra = self.cursor
+            if not self.__r_RV():
+                self.cursor = self.limit - v_1
+                raise lab0()
+            if not self.slice_del():
+                return False
+
+        except lab0: pass
+        v_2 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.eq_s_b(u"h"):
+                self.cursor = self.limit - v_2
+                raise lab1()
+            self.bra = self.cursor
+            if not self.in_grouping_b(ItalianStemmer.g_CG):
+                self.cursor = self.limit - v_2
+                raise lab1()
+            if not self.__r_RV():
+                self.cursor = self.limit - v_2
+                raise lab1()
+            if not self.slice_del():
+                return False
+
+        except lab1: pass
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        self.__r_prelude()
+        self.cursor = v_1
+        self.__r_mark_regions()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_3 = self.limit - self.cursor
+        self.__r_attached_pronoun()
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        try:
+            try:
+                v_5 = self.limit - self.cursor
+                try:
+                    if not self.__r_standard_suffix():
+                        raise lab2()
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_5
+                if not self.__r_verb_suffix():
+                    raise lab0()
+            except lab1: pass
+        except lab0: pass
+        self.cursor = self.limit - v_4
+        v_6 = self.limit - self.cursor
+        self.__r_vowel_suffix()
+        self.cursor = self.limit - v_6
+        self.cursor = self.limit_backward
+        v_7 = self.cursor
+        self.__r_postlude()
+        self.cursor = v_7
+        return True
+
+    a_0 = [
+        Among(u"", -1, 7),
+        Among(u"qu", 0, 6),
+        Among(u"á", 0, 1),
+        Among(u"é", 0, 2),
+        Among(u"í", 0, 3),
+        Among(u"ó", 0, 4),
+        Among(u"ú", 0, 5)
+    ]
+
+    a_1 = [
+        Among(u"", -1, 3),
+        Among(u"I", 0, 1),
+        Among(u"U", 0, 2)
+    ]
+
+    a_2 = [
+        Among(u"la", -1, -1),
+        Among(u"cela", 0, -1),
+        Among(u"gliela", 0, -1),
+        Among(u"mela", 0, -1),
+        Among(u"tela", 0, -1),
+        Among(u"vela", 0, -1),
+        Among(u"le", -1, -1),
+        Among(u"cele", 6, -1),
+        Among(u"gliele", 6, -1),
+        Among(u"mele", 6, -1),
+        Among(u"tele", 6, -1),
+        Among(u"vele", 6, -1),
+        Among(u"ne", -1, -1),
+        Among(u"cene", 12, -1),
+        Among(u"gliene", 12, -1),
+        Among(u"mene", 12, -1),
+        Among(u"sene", 12, -1),
+        Among(u"tene", 12, -1),
+        Among(u"vene", 12, -1),
+        Among(u"ci", -1, -1),
+        Among(u"li", -1, -1),
+        Among(u"celi", 20, -1),
+        Among(u"glieli", 20, -1),
+        Among(u"meli", 20, -1),
+        Among(u"teli", 20, -1),
+        Among(u"veli", 20, -1),
+        Among(u"gli", 20, -1),
+        Among(u"mi", -1, -1),
+        Among(u"si", -1, -1),
+        Among(u"ti", -1, -1),
+        Among(u"vi", -1, -1),
+        Among(u"lo", -1, -1),
+        Among(u"celo", 31, -1),
+        Among(u"glielo", 31, -1),
+        Among(u"melo", 31, -1),
+        Among(u"telo", 31, -1),
+        Among(u"velo", 31, -1)
+    ]
+
+    a_3 = [
+        Among(u"ando", -1, 1),
+        Among(u"endo", -1, 1),
+        Among(u"ar", -1, 2),
+        Among(u"er", -1, 2),
+        Among(u"ir", -1, 2)
+    ]
+
+    a_4 = [
+        Among(u"ic", -1, -1),
+        Among(u"abil", -1, -1),
+        Among(u"os", -1, -1),
+        Among(u"iv", -1, 1)
+    ]
+
+    a_5 = [
+        Among(u"ic", -1, 1),
+        Among(u"abil", -1, 1),
+        Among(u"iv", -1, 1)
+    ]
+
+    a_6 = [
+        Among(u"ica", -1, 1),
+        Among(u"logia", -1, 3),
+        Among(u"osa", -1, 1),
+        Among(u"ista", -1, 1),
+        Among(u"iva", -1, 9),
+        Among(u"anza", -1, 1),
+        Among(u"enza", -1, 5),
+        Among(u"ice", -1, 1),
+        Among(u"atrice", 7, 1),
+        Among(u"iche", -1, 1),
+        Among(u"logie", -1, 3),
+        Among(u"abile", -1, 1),
+        Among(u"ibile", -1, 1),
+        Among(u"usione", -1, 4),
+        Among(u"azione", -1, 2),
+        Among(u"uzione", -1, 4),
+        Among(u"atore", -1, 2),
+        Among(u"ose", -1, 1),
+        Among(u"ante", -1, 1),
+        Among(u"mente", -1, 1),
+        Among(u"amente", 19, 7),
+        Among(u"iste", -1, 1),
+        Among(u"ive", -1, 9),
+        Among(u"anze", -1, 1),
+        Among(u"enze", -1, 5),
+        Among(u"ici", -1, 1),
+        Among(u"atrici", 25, 1),
+        Among(u"ichi", -1, 1),
+        Among(u"abili", -1, 1),
+        Among(u"ibili", -1, 1),
+        Among(u"ismi", -1, 1),
+        Among(u"usioni", -1, 4),
+        Among(u"azioni", -1, 2),
+        Among(u"uzioni", -1, 4),
+        Among(u"atori", -1, 2),
+        Among(u"osi", -1, 1),
+        Among(u"anti", -1, 1),
+        Among(u"amenti", -1, 6),
+        Among(u"imenti", -1, 6),
+        Among(u"isti", -1, 1),
+        Among(u"ivi", -1, 9),
+        Among(u"ico", -1, 1),
+        Among(u"ismo", -1, 1),
+        Among(u"oso", -1, 1),
+        Among(u"amento", -1, 6),
+        Among(u"imento", -1, 6),
+        Among(u"ivo", -1, 9),
+        Among(u"ità", -1, 8),
+        Among(u"istà", -1, 1),
+        Among(u"istè", -1, 1),
+        Among(u"istì", -1, 1)
+    ]
+
+    a_7 = [
+        Among(u"isca", -1, 1),
+        Among(u"enda", -1, 1),
+        Among(u"ata", -1, 1),
+        Among(u"ita", -1, 1),
+        Among(u"uta", -1, 1),
+        Among(u"ava", -1, 1),
+        Among(u"eva", -1, 1),
+        Among(u"iva", -1, 1),
+        Among(u"erebbe", -1, 1),
+        Among(u"irebbe", -1, 1),
+        Among(u"isce", -1, 1),
+        Among(u"ende", -1, 1),
+        Among(u"are", -1, 1),
+        Among(u"ere", -1, 1),
+        Among(u"ire", -1, 1),
+        Among(u"asse", -1, 1),
+        Among(u"ate", -1, 1),
+        Among(u"avate", 16, 1),
+        Among(u"evate", 16, 1),
+        Among(u"ivate", 16, 1),
+        Among(u"ete", -1, 1),
+        Among(u"erete", 20, 1),
+        Among(u"irete", 20, 1),
+        Among(u"ite", -1, 1),
+        Among(u"ereste", -1, 1),
+        Among(u"ireste", -1, 1),
+        Among(u"ute", -1, 1),
+        Among(u"erai", -1, 1),
+        Among(u"irai", -1, 1),
+        Among(u"isci", -1, 1),
+        Among(u"endi", -1, 1),
+        Among(u"erei", -1, 1),
+        Among(u"irei", -1, 1),
+        Among(u"assi", -1, 1),
+        Among(u"ati", -1, 1),
+        Among(u"iti", -1, 1),
+        Among(u"eresti", -1, 1),
+        Among(u"iresti", -1, 1),
+        Among(u"uti", -1, 1),
+        Among(u"avi", -1, 1),
+        Among(u"evi", -1, 1),
+        Among(u"ivi", -1, 1),
+        Among(u"isco", -1, 1),
+        Among(u"ando", -1, 1),
+        Among(u"endo", -1, 1),
+        Among(u"Yamo", -1, 1),
+        Among(u"iamo", -1, 1),
+        Among(u"avamo", -1, 1),
+        Among(u"evamo", -1, 1),
+        Among(u"ivamo", -1, 1),
+        Among(u"eremo", -1, 1),
+        Among(u"iremo", -1, 1),
+        Among(u"assimo", -1, 1),
+        Among(u"ammo", -1, 1),
+        Among(u"emmo", -1, 1),
+        Among(u"eremmo", 54, 1),
+        Among(u"iremmo", 54, 1),
+        Among(u"immo", -1, 1),
+        Among(u"ano", -1, 1),
+        Among(u"iscano", 58, 1),
+        Among(u"avano", 58, 1),
+        Among(u"evano", 58, 1),
+        Among(u"ivano", 58, 1),
+        Among(u"eranno", -1, 1),
+        Among(u"iranno", -1, 1),
+        Among(u"ono", -1, 1),
+        Among(u"iscono", 65, 1),
+        Among(u"arono", 65, 1),
+        Among(u"erono", 65, 1),
+        Among(u"irono", 65, 1),
+        Among(u"erebbero", -1, 1),
+        Among(u"irebbero", -1, 1),
+        Among(u"assero", -1, 1),
+        Among(u"essero", -1, 1),
+        Among(u"issero", -1, 1),
+        Among(u"ato", -1, 1),
+        Among(u"ito", -1, 1),
+        Among(u"uto", -1, 1),
+        Among(u"avo", -1, 1),
+        Among(u"evo", -1, 1),
+        Among(u"ivo", -1, 1),
+        Among(u"ar", -1, 1),
+        Among(u"ir", -1, 1),
+        Among(u"erà", -1, 1),
+        Among(u"irà", -1, 1),
+        Among(u"erò", -1, 1),
+        Among(u"irò", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/lithuanian_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/lithuanian_stemmer.py
new file mode 100644
index 000000000..2a47e073c
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/lithuanian_stemmer.py
@@ -0,0 +1,462 @@
+#-*- coding: utf-8 -*-
+# Generated from lithuanian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class LithuanianStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from lithuanian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"y", u"o", u"u", u"ą", u"ę", u"į", u"ų", u"ė", u"ū"}
+
+    I_p1 = 0
+
+    def __r_step1(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        if self.find_among_b(LithuanianStemmer.a_0) == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_step2(self):
+        while True:
+            v_1 = self.limit - self.cursor
+            try:
+                if self.cursor < self.I_p1:
+                    raise lab0()
+                v_3 = self.limit_backward
+                self.limit_backward = self.I_p1
+                self.ket = self.cursor
+                if self.find_among_b(LithuanianStemmer.a_1) == 0:
+                    self.limit_backward = v_3
+                    raise lab0()
+                self.bra = self.cursor
+                self.limit_backward = v_3
+                if not self.slice_del():
+                    return False
+
+                continue
+            except lab0: pass
+            self.cursor = self.limit - v_1
+            break
+        return True
+
+    def __r_fix_conflicts(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(LithuanianStemmer.a_2)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"aitė"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"uotė"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"ėjimas"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"esys"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"asys"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"avimas"):
+                return False
+        elif among_var == 7:
+            if not self.slice_from(u"ojimas"):
+                return False
+        else:
+            if not self.slice_from(u"okatė"):
+                return False
+        return True
+
+    def __r_fix_chdz(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(LithuanianStemmer.a_3)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"t"):
+                return False
+        else:
+            if not self.slice_from(u"d"):
+                return False
+        return True
+
+    def __r_fix_gd(self):
+        self.ket = self.cursor
+        if self.find_among_b(LithuanianStemmer.a_4) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_from(u"g"):
+            return False
+        return True
+
+    def _stem(self):
+        self.I_p1 = self.limit
+        v_1 = self.cursor
+        try:
+            v_2 = self.cursor
+            try:
+                v_3 = self.cursor
+                if not self.eq_s(u"a"):
+                    self.cursor = v_2
+                    raise lab1()
+                self.cursor = v_3
+                if len(self.current) <= 6:
+                    self.cursor = v_2
+                    raise lab1()
+                if self.cursor >= self.limit:
+                    self.cursor = v_2
+                    raise lab1()
+                self.cursor += 1
+            except lab1: pass
+            if not self.go_out_grouping(LithuanianStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            if not self.go_in_grouping(LithuanianStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_4 = self.limit - self.cursor
+        self.__r_fix_conflicts()
+        self.cursor = self.limit - v_4
+        v_5 = self.limit - self.cursor
+        self.__r_step1()
+        self.cursor = self.limit - v_5
+        v_6 = self.limit - self.cursor
+        self.__r_fix_chdz()
+        self.cursor = self.limit - v_6
+        v_7 = self.limit - self.cursor
+        self.__r_step2()
+        self.cursor = self.limit - v_7
+        v_8 = self.limit - self.cursor
+        self.__r_fix_chdz()
+        self.cursor = self.limit - v_8
+        v_9 = self.limit - self.cursor
+        self.__r_fix_gd()
+        self.cursor = self.limit - v_9
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"a", -1, -1),
+        Among(u"ia", 0, -1),
+        Among(u"eria", 1, -1),
+        Among(u"osna", 0, -1),
+        Among(u"iosna", 3, -1),
+        Among(u"uosna", 3, -1),
+        Among(u"iuosna", 5, -1),
+        Among(u"ysna", 0, -1),
+        Among(u"ėsna", 0, -1),
+        Among(u"e", -1, -1),
+        Among(u"ie", 9, -1),
+        Among(u"enie", 10, -1),
+        Among(u"erie", 10, -1),
+        Among(u"oje", 9, -1),
+        Among(u"ioje", 13, -1),
+        Among(u"uje", 9, -1),
+        Among(u"iuje", 15, -1),
+        Among(u"yje", 9, -1),
+        Among(u"enyje", 17, -1),
+        Among(u"eryje", 17, -1),
+        Among(u"ėje", 9, -1),
+        Among(u"ame", 9, -1),
+        Among(u"iame", 21, -1),
+        Among(u"sime", 9, -1),
+        Among(u"ome", 9, -1),
+        Among(u"ėme", 9, -1),
+        Among(u"tumėme", 25, -1),
+        Among(u"ose", 9, -1),
+        Among(u"iose", 27, -1),
+        Among(u"uose", 27, -1),
+        Among(u"iuose", 29, -1),
+        Among(u"yse", 9, -1),
+        Among(u"enyse", 31, -1),
+        Among(u"eryse", 31, -1),
+        Among(u"ėse", 9, -1),
+        Among(u"ate", 9, -1),
+        Among(u"iate", 35, -1),
+        Among(u"ite", 9, -1),
+        Among(u"kite", 37, -1),
+        Among(u"site", 37, -1),
+        Among(u"ote", 9, -1),
+        Among(u"tute", 9, -1),
+        Among(u"ėte", 9, -1),
+        Among(u"tumėte", 42, -1),
+        Among(u"i", -1, -1),
+        Among(u"ai", 44, -1),
+        Among(u"iai", 45, -1),
+        Among(u"eriai", 46, -1),
+        Among(u"ei", 44, -1),
+        Among(u"tumei", 48, -1),
+        Among(u"ki", 44, -1),
+        Among(u"imi", 44, -1),
+        Among(u"erimi", 51, -1),
+        Among(u"umi", 44, -1),
+        Among(u"iumi", 53, -1),
+        Among(u"si", 44, -1),
+        Among(u"asi", 55, -1),
+        Among(u"iasi", 56, -1),
+        Among(u"esi", 55, -1),
+        Among(u"iesi", 58, -1),
+        Among(u"siesi", 59, -1),
+        Among(u"isi", 55, -1),
+        Among(u"aisi", 61, -1),
+        Among(u"eisi", 61, -1),
+        Among(u"tumeisi", 63, -1),
+        Among(u"uisi", 61, -1),
+        Among(u"osi", 55, -1),
+        Among(u"ėjosi", 66, -1),
+        Among(u"uosi", 66, -1),
+        Among(u"iuosi", 68, -1),
+        Among(u"siuosi", 69, -1),
+        Among(u"usi", 55, -1),
+        Among(u"ausi", 71, -1),
+        Among(u"čiausi", 72, -1),
+        Among(u"ąsi", 55, -1),
+        Among(u"ėsi", 55, -1),
+        Among(u"ųsi", 55, -1),
+        Among(u"tųsi", 76, -1),
+        Among(u"ti", 44, -1),
+        Among(u"enti", 78, -1),
+        Among(u"inti", 78, -1),
+        Among(u"oti", 78, -1),
+        Among(u"ioti", 81, -1),
+        Among(u"uoti", 81, -1),
+        Among(u"iuoti", 83, -1),
+        Among(u"auti", 78, -1),
+        Among(u"iauti", 85, -1),
+        Among(u"yti", 78, -1),
+        Among(u"ėti", 78, -1),
+        Among(u"telėti", 88, -1),
+        Among(u"inėti", 88, -1),
+        Among(u"terėti", 88, -1),
+        Among(u"ui", 44, -1),
+        Among(u"iui", 92, -1),
+        Among(u"eniui", 93, -1),
+        Among(u"oj", -1, -1),
+        Among(u"ėj", -1, -1),
+        Among(u"k", -1, -1),
+        Among(u"am", -1, -1),
+        Among(u"iam", 98, -1),
+        Among(u"iem", -1, -1),
+        Among(u"im", -1, -1),
+        Among(u"sim", 101, -1),
+        Among(u"om", -1, -1),
+        Among(u"tum", -1, -1),
+        Among(u"ėm", -1, -1),
+        Among(u"tumėm", 105, -1),
+        Among(u"an", -1, -1),
+        Among(u"on", -1, -1),
+        Among(u"ion", 108, -1),
+        Among(u"un", -1, -1),
+        Among(u"iun", 110, -1),
+        Among(u"ėn", -1, -1),
+        Among(u"o", -1, -1),
+        Among(u"io", 113, -1),
+        Among(u"enio", 114, -1),
+        Among(u"ėjo", 113, -1),
+        Among(u"uo", 113, -1),
+        Among(u"s", -1, -1),
+        Among(u"as", 118, -1),
+        Among(u"ias", 119, -1),
+        Among(u"es", 118, -1),
+        Among(u"ies", 121, -1),
+        Among(u"is", 118, -1),
+        Among(u"ais", 123, -1),
+        Among(u"iais", 124, -1),
+        Among(u"tumeis", 123, -1),
+        Among(u"imis", 123, -1),
+        Among(u"enimis", 127, -1),
+        Among(u"omis", 123, -1),
+        Among(u"iomis", 129, -1),
+        Among(u"umis", 123, -1),
+        Among(u"ėmis", 123, -1),
+        Among(u"enis", 123, -1),
+        Among(u"asis", 123, -1),
+        Among(u"ysis", 123, -1),
+        Among(u"ams", 118, -1),
+        Among(u"iams", 136, -1),
+        Among(u"iems", 118, -1),
+        Among(u"ims", 118, -1),
+        Among(u"enims", 139, -1),
+        Among(u"erims", 139, -1),
+        Among(u"oms", 118, -1),
+        Among(u"ioms", 142, -1),
+        Among(u"ums", 118, -1),
+        Among(u"ėms", 118, -1),
+        Among(u"ens", 118, -1),
+        Among(u"os", 118, -1),
+        Among(u"ios", 147, -1),
+        Among(u"uos", 147, -1),
+        Among(u"iuos", 149, -1),
+        Among(u"ers", 118, -1),
+        Among(u"us", 118, -1),
+        Among(u"aus", 152, -1),
+        Among(u"iaus", 153, -1),
+        Among(u"ius", 152, -1),
+        Among(u"ys", 118, -1),
+        Among(u"enys", 156, -1),
+        Among(u"erys", 156, -1),
+        Among(u"ąs", 118, -1),
+        Among(u"iąs", 159, -1),
+        Among(u"ės", 118, -1),
+        Among(u"amės", 161, -1),
+        Among(u"iamės", 162, -1),
+        Among(u"imės", 161, -1),
+        Among(u"kimės", 164, -1),
+        Among(u"simės", 164, -1),
+        Among(u"omės", 161, -1),
+        Among(u"ėmės", 161, -1),
+        Among(u"tumėmės", 168, -1),
+        Among(u"atės", 161, -1),
+        Among(u"iatės", 170, -1),
+        Among(u"sitės", 161, -1),
+        Among(u"otės", 161, -1),
+        Among(u"ėtės", 161, -1),
+        Among(u"tumėtės", 174, -1),
+        Among(u"įs", 118, -1),
+        Among(u"ūs", 118, -1),
+        Among(u"tųs", 118, -1),
+        Among(u"at", -1, -1),
+        Among(u"iat", 179, -1),
+        Among(u"it", -1, -1),
+        Among(u"sit", 181, -1),
+        Among(u"ot", -1, -1),
+        Among(u"ėt", -1, -1),
+        Among(u"tumėt", 184, -1),
+        Among(u"u", -1, -1),
+        Among(u"au", 186, -1),
+        Among(u"iau", 187, -1),
+        Among(u"čiau", 188, -1),
+        Among(u"iu", 186, -1),
+        Among(u"eniu", 190, -1),
+        Among(u"siu", 190, -1),
+        Among(u"y", -1, -1),
+        Among(u"ą", -1, -1),
+        Among(u"ią", 194, -1),
+        Among(u"ė", -1, -1),
+        Among(u"ę", -1, -1),
+        Among(u"į", -1, -1),
+        Among(u"enį", 198, -1),
+        Among(u"erį", 198, -1),
+        Among(u"ų", -1, -1),
+        Among(u"ių", 201, -1),
+        Among(u"erų", 201, -1)
+    ]
+
+    a_1 = [
+        Among(u"ing", -1, -1),
+        Among(u"aj", -1, -1),
+        Among(u"iaj", 1, -1),
+        Among(u"iej", -1, -1),
+        Among(u"oj", -1, -1),
+        Among(u"ioj", 4, -1),
+        Among(u"uoj", 4, -1),
+        Among(u"iuoj", 6, -1),
+        Among(u"auj", -1, -1),
+        Among(u"ąj", -1, -1),
+        Among(u"iąj", 9, -1),
+        Among(u"ėj", -1, -1),
+        Among(u"ųj", -1, -1),
+        Among(u"iųj", 12, -1),
+        Among(u"ok", -1, -1),
+        Among(u"iok", 14, -1),
+        Among(u"iuk", -1, -1),
+        Among(u"uliuk", 16, -1),
+        Among(u"učiuk", 16, -1),
+        Among(u"išk", -1, -1),
+        Among(u"iul", -1, -1),
+        Among(u"yl", -1, -1),
+        Among(u"ėl", -1, -1),
+        Among(u"am", -1, -1),
+        Among(u"dam", 23, -1),
+        Among(u"jam", 23, -1),
+        Among(u"zgan", -1, -1),
+        Among(u"ain", -1, -1),
+        Among(u"esn", -1, -1),
+        Among(u"op", -1, -1),
+        Among(u"iop", 29, -1),
+        Among(u"ias", -1, -1),
+        Among(u"ies", -1, -1),
+        Among(u"ais", -1, -1),
+        Among(u"iais", 33, -1),
+        Among(u"os", -1, -1),
+        Among(u"ios", 35, -1),
+        Among(u"uos", 35, -1),
+        Among(u"iuos", 37, -1),
+        Among(u"aus", -1, -1),
+        Among(u"iaus", 39, -1),
+        Among(u"ąs", -1, -1),
+        Among(u"iąs", 41, -1),
+        Among(u"ęs", -1, -1),
+        Among(u"utėait", -1, -1),
+        Among(u"ant", -1, -1),
+        Among(u"iant", 45, -1),
+        Among(u"siant", 46, -1),
+        Among(u"int", -1, -1),
+        Among(u"ot", -1, -1),
+        Among(u"uot", 49, -1),
+        Among(u"iuot", 50, -1),
+        Among(u"yt", -1, -1),
+        Among(u"ėt", -1, -1),
+        Among(u"ykšt", -1, -1),
+        Among(u"iau", -1, -1),
+        Among(u"dav", -1, -1),
+        Among(u"sv", -1, -1),
+        Among(u"šv", -1, -1),
+        Among(u"ykšč", -1, -1),
+        Among(u"ę", -1, -1),
+        Among(u"ėję", 60, -1)
+    ]
+
+    a_2 = [
+        Among(u"ojime", -1, 7),
+        Among(u"ėjime", -1, 3),
+        Among(u"avime", -1, 6),
+        Among(u"okate", -1, 8),
+        Among(u"aite", -1, 1),
+        Among(u"uote", -1, 2),
+        Among(u"asius", -1, 5),
+        Among(u"okatės", -1, 8),
+        Among(u"aitės", -1, 1),
+        Among(u"uotės", -1, 2),
+        Among(u"esiu", -1, 4)
+    ]
+
+    a_3 = [
+        Among(u"č", -1, 1),
+        Among(u"dž", -1, 2)
+    ]
+
+    a_4 = [
+        Among(u"gd", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/nepali_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/nepali_stemmer.py
new file mode 100644
index 000000000..cd7ccb5a4
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/nepali_stemmer.py
@@ -0,0 +1,248 @@
+#-*- coding: utf-8 -*-
+# Generated from nepali.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class NepaliStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from nepali.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+
+    def __r_remove_category_1(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(NepaliStemmer.a_0)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        else:
+            try:
+                v_1 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"\u090F"):
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_1
+                try:
+                    if not self.eq_s_b(u"\u0947"):
+                        raise lab2()
+                    raise lab0()
+                except lab2: pass
+                self.cursor = self.limit - v_1
+                if not self.slice_del():
+                    return False
+
+            except lab0: pass
+        return True
+
+    def __r_remove_category_2(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(NepaliStemmer.a_1)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            try:
+                v_1 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"\u092F\u094C"):
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_1
+                try:
+                    if not self.eq_s_b(u"\u091B\u094C"):
+                        raise lab2()
+                    raise lab0()
+                except lab2: pass
+                self.cursor = self.limit - v_1
+                try:
+                    if not self.eq_s_b(u"\u0928\u094C"):
+                        raise lab3()
+                    raise lab0()
+                except lab3: pass
+                self.cursor = self.limit - v_1
+                if not self.eq_s_b(u"\u0925\u0947"):
+                    return False
+            except lab0: pass
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.eq_s_b(u"\u0924\u094D\u0930"):
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_remove_category_3(self):
+        self.ket = self.cursor
+        if self.find_among_b(NepaliStemmer.a_2) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def _stem(self):
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_1 = self.limit - self.cursor
+        self.__r_remove_category_1()
+        self.cursor = self.limit - v_1
+        while True:
+            v_2 = self.limit - self.cursor
+            try:
+                v_3 = self.limit - self.cursor
+                self.__r_remove_category_2()
+                self.cursor = self.limit - v_3
+                if not self.__r_remove_category_3():
+                    raise lab0()
+                continue
+            except lab0: pass
+            self.cursor = self.limit - v_2
+            break
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"\u0932\u093E\u0907", -1, 1),
+        Among(u"\u0932\u093E\u0908", -1, 1),
+        Among(u"\u0938\u0901\u0917", -1, 1),
+        Among(u"\u0938\u0902\u0917", -1, 1),
+        Among(u"\u092E\u093E\u0930\u094D\u092B\u0924", -1, 1),
+        Among(u"\u0930\u0924", -1, 1),
+        Among(u"\u0915\u093E", -1, 2),
+        Among(u"\u092E\u093E", -1, 1),
+        Among(u"\u0926\u094D\u0935\u093E\u0930\u093E", -1, 1),
+        Among(u"\u0915\u093F", -1, 2),
+        Among(u"\u092A\u091B\u093F", -1, 1),
+        Among(u"\u0915\u0940", -1, 2),
+        Among(u"\u0932\u0947", -1, 1),
+        Among(u"\u0915\u0948", -1, 2),
+        Among(u"\u0938\u0901\u0917\u0948", -1, 1),
+        Among(u"\u092E\u0948", -1, 1),
+        Among(u"\u0915\u094B", -1, 2)
+    ]
+
+    a_1 = [
+        Among(u"\u0901", -1, 1),
+        Among(u"\u0902", -1, 1),
+        Among(u"\u0948", -1, 2)
+    ]
+
+    a_2 = [
+        Among(u"\u0925\u093F\u090F", -1, 1),
+        Among(u"\u091B", -1, 1),
+        Among(u"\u0907\u091B", 1, 1),
+        Among(u"\u090F\u091B", 1, 1),
+        Among(u"\u093F\u091B", 1, 1),
+        Among(u"\u0947\u091B", 1, 1),
+        Among(u"\u0928\u0947\u091B", 5, 1),
+        Among(u"\u0939\u0941\u0928\u0947\u091B", 6, 1),
+        Among(u"\u0907\u0928\u094D\u091B", 1, 1),
+        Among(u"\u093F\u0928\u094D\u091B", 1, 1),
+        Among(u"\u0939\u0941\u0928\u094D\u091B", 1, 1),
+        Among(u"\u090F\u0915\u093E", -1, 1),
+        Among(u"\u0907\u090F\u0915\u093E", 11, 1),
+        Among(u"\u093F\u090F\u0915\u093E", 11, 1),
+        Among(u"\u0947\u0915\u093E", -1, 1),
+        Among(u"\u0928\u0947\u0915\u093E", 14, 1),
+        Among(u"\u0926\u093E", -1, 1),
+        Among(u"\u0907\u0926\u093E", 16, 1),
+        Among(u"\u093F\u0926\u093E", 16, 1),
+        Among(u"\u0926\u0947\u0916\u093F", -1, 1),
+        Among(u"\u092E\u093E\u0925\u093F", -1, 1),
+        Among(u"\u090F\u0915\u0940", -1, 1),
+        Among(u"\u0907\u090F\u0915\u0940", 21, 1),
+        Among(u"\u093F\u090F\u0915\u0940", 21, 1),
+        Among(u"\u0947\u0915\u0940", -1, 1),
+        Among(u"\u0926\u0947\u0916\u0940", -1, 1),
+        Among(u"\u0925\u0940", -1, 1),
+        Among(u"\u0926\u0940", -1, 1),
+        Among(u"\u091B\u0941", -1, 1),
+        Among(u"\u090F\u091B\u0941", 28, 1),
+        Among(u"\u0947\u091B\u0941", 28, 1),
+        Among(u"\u0928\u0947\u091B\u0941", 30, 1),
+        Among(u"\u0928\u0941", -1, 1),
+        Among(u"\u0939\u0930\u0941", -1, 1),
+        Among(u"\u0939\u0930\u0942", -1, 1),
+        Among(u"\u091B\u0947", -1, 1),
+        Among(u"\u0925\u0947", -1, 1),
+        Among(u"\u0928\u0947", -1, 1),
+        Among(u"\u090F\u0915\u0948", -1, 1),
+        Among(u"\u0947\u0915\u0948", -1, 1),
+        Among(u"\u0928\u0947\u0915\u0948", 39, 1),
+        Among(u"\u0926\u0948", -1, 1),
+        Among(u"\u0907\u0926\u0948", 41, 1),
+        Among(u"\u093F\u0926\u0948", 41, 1),
+        Among(u"\u090F\u0915\u094B", -1, 1),
+        Among(u"\u0907\u090F\u0915\u094B", 44, 1),
+        Among(u"\u093F\u090F\u0915\u094B", 44, 1),
+        Among(u"\u0947\u0915\u094B", -1, 1),
+        Among(u"\u0928\u0947\u0915\u094B", 47, 1),
+        Among(u"\u0926\u094B", -1, 1),
+        Among(u"\u0907\u0926\u094B", 49, 1),
+        Among(u"\u093F\u0926\u094B", 49, 1),
+        Among(u"\u092F\u094B", -1, 1),
+        Among(u"\u0907\u092F\u094B", 52, 1),
+        Among(u"\u092D\u092F\u094B", 52, 1),
+        Among(u"\u093F\u092F\u094B", 52, 1),
+        Among(u"\u0925\u093F\u092F\u094B", 55, 1),
+        Among(u"\u0926\u093F\u092F\u094B", 55, 1),
+        Among(u"\u0925\u094D\u092F\u094B", 52, 1),
+        Among(u"\u091B\u094C", -1, 1),
+        Among(u"\u0907\u091B\u094C", 59, 1),
+        Among(u"\u090F\u091B\u094C", 59, 1),
+        Among(u"\u093F\u091B\u094C", 59, 1),
+        Among(u"\u0947\u091B\u094C", 59, 1),
+        Among(u"\u0928\u0947\u091B\u094C", 63, 1),
+        Among(u"\u092F\u094C", -1, 1),
+        Among(u"\u0925\u093F\u092F\u094C", 65, 1),
+        Among(u"\u091B\u094D\u092F\u094C", 65, 1),
+        Among(u"\u0925\u094D\u092F\u094C", 65, 1),
+        Among(u"\u091B\u0928\u094D", -1, 1),
+        Among(u"\u0907\u091B\u0928\u094D", 69, 1),
+        Among(u"\u090F\u091B\u0928\u094D", 69, 1),
+        Among(u"\u093F\u091B\u0928\u094D", 69, 1),
+        Among(u"\u0947\u091B\u0928\u094D", 69, 1),
+        Among(u"\u0928\u0947\u091B\u0928\u094D", 73, 1),
+        Among(u"\u0932\u093E\u0928\u094D", -1, 1),
+        Among(u"\u091B\u093F\u0928\u094D", -1, 1),
+        Among(u"\u0925\u093F\u0928\u094D", -1, 1),
+        Among(u"\u092A\u0930\u094D", -1, 1),
+        Among(u"\u0907\u0938\u094D", -1, 1),
+        Among(u"\u0925\u093F\u0907\u0938\u094D", 79, 1),
+        Among(u"\u091B\u0938\u094D", -1, 1),
+        Among(u"\u0907\u091B\u0938\u094D", 81, 1),
+        Among(u"\u090F\u091B\u0938\u094D", 81, 1),
+        Among(u"\u093F\u091B\u0938\u094D", 81, 1),
+        Among(u"\u0947\u091B\u0938\u094D", 81, 1),
+        Among(u"\u0928\u0947\u091B\u0938\u094D", 85, 1),
+        Among(u"\u093F\u0938\u094D", -1, 1),
+        Among(u"\u0925\u093F\u0938\u094D", 87, 1),
+        Among(u"\u091B\u0947\u0938\u094D", -1, 1),
+        Among(u"\u0939\u094B\u0938\u094D", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/norwegian_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/norwegian_stemmer.py
new file mode 100644
index 000000000..1bb84ee0f
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/norwegian_stemmer.py
@@ -0,0 +1,236 @@
+#-*- coding: utf-8 -*-
+# Generated from norwegian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class NorwegianStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from norwegian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"ê", u"i", u"o", u"ò", u"ó", u"ô", u"u", u"y", u"æ", u"å", u"ø"}
+
+    g_s_ending = {u"b", u"c", u"d", u"f", u"g", u"h", u"j", u"l", u"m", u"n", u"o", u"p", u"t", u"v", u"y", u"z"}
+
+    I_x = 0
+    I_p1 = 0
+
+    def __r_mark_regions(self):
+        self.I_p1 = self.limit
+        v_1 = self.cursor
+        c = self.cursor + 3
+        if c > self.limit:
+            return False
+        self.cursor = c
+        self.I_x = self.cursor
+        self.cursor = v_1
+        if not self.go_out_grouping(NorwegianStemmer.g_v):
+            return False
+        self.cursor += 1
+        if not self.go_in_grouping(NorwegianStemmer.g_v):
+            return False
+        self.cursor += 1
+        self.I_p1 = self.cursor
+        try:
+            if self.I_p1 >= self.I_x:
+                raise lab0()
+            self.I_p1 = self.I_x
+        except lab0: pass
+        return True
+
+    def __r_main_suffix(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(NorwegianStemmer.a_1)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            among_var = self.find_among_b(NorwegianStemmer.a_0)
+            if among_var == 1:
+                if not self.slice_del():
+                    return False
+
+        elif among_var == 3:
+            try:
+                v_3 = self.limit - self.cursor
+                try:
+                    if not self.in_grouping_b(NorwegianStemmer.g_s_ending):
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_3
+                try:
+                    if not self.eq_s_b(u"r"):
+                        raise lab2()
+                    v_4 = self.limit - self.cursor
+                    try:
+                        if not self.eq_s_b(u"e"):
+                            raise lab3()
+                        raise lab2()
+                    except lab3: pass
+                    self.cursor = self.limit - v_4
+                    raise lab0()
+                except lab2: pass
+                self.cursor = self.limit - v_3
+                if not self.eq_s_b(u"k"):
+                    return False
+                if not self.out_grouping_b(NorwegianStemmer.g_v):
+                    return False
+            except lab0: pass
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.slice_from(u"er"):
+                return False
+        return True
+
+    def __r_consonant_pair(self):
+        v_1 = self.limit - self.cursor
+        if self.cursor < self.I_p1:
+            return False
+        v_3 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        if self.find_among_b(NorwegianStemmer.a_2) == 0:
+            self.limit_backward = v_3
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_3
+        self.cursor = self.limit - v_1
+        if self.cursor <= self.limit_backward:
+            return False
+        self.cursor -= 1
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_other_suffix(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        if self.find_among_b(NorwegianStemmer.a_3) == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        self.__r_mark_regions()
+        self.cursor = v_1
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_2 = self.limit - self.cursor
+        self.__r_main_suffix()
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        self.__r_consonant_pair()
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        self.__r_other_suffix()
+        self.cursor = self.limit - v_4
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"", -1, 1),
+        Among(u"ind", 0, -1),
+        Among(u"kk", 0, -1),
+        Among(u"nk", 0, -1),
+        Among(u"amm", 0, -1),
+        Among(u"omm", 0, -1),
+        Among(u"kap", 0, -1),
+        Among(u"skap", 6, 1),
+        Among(u"pp", 0, -1),
+        Among(u"lt", 0, -1),
+        Among(u"ast", 0, -1),
+        Among(u"øst", 0, -1),
+        Among(u"v", 0, -1),
+        Among(u"hav", 12, 1),
+        Among(u"giv", 12, 1)
+    ]
+
+    a_1 = [
+        Among(u"a", -1, 1),
+        Among(u"e", -1, 1),
+        Among(u"ede", 1, 1),
+        Among(u"ande", 1, 1),
+        Among(u"ende", 1, 1),
+        Among(u"ane", 1, 1),
+        Among(u"ene", 1, 1),
+        Among(u"hetene", 6, 1),
+        Among(u"erte", 1, 4),
+        Among(u"en", -1, 1),
+        Among(u"heten", 9, 1),
+        Among(u"ar", -1, 1),
+        Among(u"er", -1, 1),
+        Among(u"heter", 12, 1),
+        Among(u"s", -1, 3),
+        Among(u"as", 14, 1),
+        Among(u"es", 14, 1),
+        Among(u"edes", 16, 1),
+        Among(u"endes", 16, 1),
+        Among(u"enes", 16, 1),
+        Among(u"hetenes", 19, 1),
+        Among(u"ens", 14, 1),
+        Among(u"hetens", 21, 1),
+        Among(u"ers", 14, 2),
+        Among(u"ets", 14, 1),
+        Among(u"et", -1, 1),
+        Among(u"het", 25, 1),
+        Among(u"ert", -1, 4),
+        Among(u"ast", -1, 1)
+    ]
+
+    a_2 = [
+        Among(u"dt", -1, -1),
+        Among(u"vt", -1, -1)
+    ]
+
+    a_3 = [
+        Among(u"leg", -1, 1),
+        Among(u"eleg", 0, 1),
+        Among(u"ig", -1, 1),
+        Among(u"eig", 2, 1),
+        Among(u"lig", 2, 1),
+        Among(u"elig", 4, 1),
+        Among(u"els", -1, 1),
+        Among(u"lov", -1, 1),
+        Among(u"elov", 7, 1),
+        Among(u"slov", 7, 1),
+        Among(u"hetslov", 9, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/porter_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/porter_stemmer.py
new file mode 100644
index 000000000..99c9db975
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/porter_stemmer.py
@@ -0,0 +1,499 @@
+#-*- coding: utf-8 -*-
+# Generated from porter.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class PorterStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from porter.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"y"}
+
+    g_v_WXY = {u"a", u"e", u"i", u"o", u"u", u"y", u"w", u"x", u"Y"}
+
+    B_Y_found = False
+    I_p2 = 0
+    I_p1 = 0
+
+    def __r_shortv(self):
+        if not self.out_grouping_b(PorterStemmer.g_v_WXY):
+            return False
+        if not self.in_grouping_b(PorterStemmer.g_v):
+            return False
+        if not self.out_grouping_b(PorterStemmer.g_v):
+            return False
+        return True
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_Step_1a(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(PorterStemmer.a_0)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"ss"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"i"):
+                return False
+        elif among_var == 3:
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Step_1b(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(PorterStemmer.a_2)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R1():
+                return False
+            if not self.slice_from(u"ee"):
+                return False
+        else:
+            v_1 = self.limit - self.cursor
+            if not self.go_out_grouping_b(PorterStemmer.g_v):
+                return False
+            self.cursor -= 1
+            self.cursor = self.limit - v_1
+            if not self.slice_del():
+                return False
+
+            v_2 = self.limit - self.cursor
+            among_var = self.find_among_b(PorterStemmer.a_1)
+            self.cursor = self.limit - v_2
+            if among_var == 1:
+                c = self.cursor
+                self.insert(self.cursor, self.cursor, u"e")
+                self.cursor = c
+            elif among_var == 2:
+                self.ket = self.cursor
+                if self.cursor <= self.limit_backward:
+                    return False
+                self.cursor -= 1
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+            else:
+                if self.cursor != self.I_p1:
+                    return False
+                v_3 = self.limit - self.cursor
+                if not self.__r_shortv():
+                    return False
+                self.cursor = self.limit - v_3
+                c = self.cursor
+                self.insert(self.cursor, self.cursor, u"e")
+                self.cursor = c
+        return True
+
+    def __r_Step_1c(self):
+        self.ket = self.cursor
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"y"):
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            if not self.eq_s_b(u"Y"):
+                return False
+        except lab0: pass
+        self.bra = self.cursor
+        if not self.go_out_grouping_b(PorterStemmer.g_v):
+            return False
+        self.cursor -= 1
+        if not self.slice_from(u"i"):
+            return False
+        return True
+
+    def __r_Step_2(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(PorterStemmer.a_3)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"tion"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"ence"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"ance"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"able"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"ent"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"e"):
+                return False
+        elif among_var == 7:
+            if not self.slice_from(u"ize"):
+                return False
+        elif among_var == 8:
+            if not self.slice_from(u"ate"):
+                return False
+        elif among_var == 9:
+            if not self.slice_from(u"al"):
+                return False
+        elif among_var == 10:
+            if not self.slice_from(u"ful"):
+                return False
+        elif among_var == 11:
+            if not self.slice_from(u"ous"):
+                return False
+        elif among_var == 12:
+            if not self.slice_from(u"ive"):
+                return False
+        else:
+            if not self.slice_from(u"ble"):
+                return False
+        return True
+
+    def __r_Step_3(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(PorterStemmer.a_4)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"al"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"ic"):
+                return False
+        else:
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Step_4(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(PorterStemmer.a_5)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R2():
+            return False
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        else:
+            try:
+                v_1 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"s"):
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_1
+                if not self.eq_s_b(u"t"):
+                    return False
+            except lab0: pass
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_Step_5a(self):
+        self.ket = self.cursor
+        if not self.eq_s_b(u"e"):
+            return False
+        self.bra = self.cursor
+        try:
+            try:
+                if not self.__r_R2():
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            if not self.__r_R1():
+                return False
+            v_2 = self.limit - self.cursor
+            try:
+                if not self.__r_shortv():
+                    raise lab2()
+                return False
+            except lab2: pass
+            self.cursor = self.limit - v_2
+        except lab0: pass
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_Step_5b(self):
+        self.ket = self.cursor
+        if not self.eq_s_b(u"l"):
+            return False
+        self.bra = self.cursor
+        if not self.__r_R2():
+            return False
+        if not self.eq_s_b(u"l"):
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def _stem(self):
+        self.B_Y_found = False
+        v_1 = self.cursor
+        try:
+            self.bra = self.cursor
+            if not self.eq_s(u"y"):
+                raise lab0()
+            self.ket = self.cursor
+            if not self.slice_from(u"Y"):
+                return False
+            self.B_Y_found = True
+        except lab0: pass
+        self.cursor = v_1
+        v_2 = self.cursor
+        try:
+            while True:
+                v_3 = self.cursor
+                try:
+                    try:
+                        while True:
+                            v_4 = self.cursor
+                            try:
+                                if not self.in_grouping(PorterStemmer.g_v):
+                                    raise lab4()
+                                self.bra = self.cursor
+                                if not self.eq_s(u"y"):
+                                    raise lab4()
+                                self.ket = self.cursor
+                                self.cursor = v_4
+                                raise lab3()
+                            except lab4: pass
+                            self.cursor = v_4
+                            if self.cursor >= self.limit:
+                                raise lab2()
+                            self.cursor += 1
+                    except lab3: pass
+                    if not self.slice_from(u"Y"):
+                        return False
+                    self.B_Y_found = True
+                    continue
+                except lab2: pass
+                self.cursor = v_3
+                break
+        except lab1: pass
+        self.cursor = v_2
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_5 = self.cursor
+        try:
+            if not self.go_out_grouping(PorterStemmer.g_v):
+                raise lab5()
+            self.cursor += 1
+            if not self.go_in_grouping(PorterStemmer.g_v):
+                raise lab5()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+            if not self.go_out_grouping(PorterStemmer.g_v):
+                raise lab5()
+            self.cursor += 1
+            if not self.go_in_grouping(PorterStemmer.g_v):
+                raise lab5()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab5: pass
+        self.cursor = v_5
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_6 = self.limit - self.cursor
+        self.__r_Step_1a()
+        self.cursor = self.limit - v_6
+        v_7 = self.limit - self.cursor
+        self.__r_Step_1b()
+        self.cursor = self.limit - v_7
+        v_8 = self.limit - self.cursor
+        self.__r_Step_1c()
+        self.cursor = self.limit - v_8
+        v_9 = self.limit - self.cursor
+        self.__r_Step_2()
+        self.cursor = self.limit - v_9
+        v_10 = self.limit - self.cursor
+        self.__r_Step_3()
+        self.cursor = self.limit - v_10
+        v_11 = self.limit - self.cursor
+        self.__r_Step_4()
+        self.cursor = self.limit - v_11
+        v_12 = self.limit - self.cursor
+        self.__r_Step_5a()
+        self.cursor = self.limit - v_12
+        v_13 = self.limit - self.cursor
+        self.__r_Step_5b()
+        self.cursor = self.limit - v_13
+        self.cursor = self.limit_backward
+        v_14 = self.cursor
+        try:
+            if not self.B_Y_found:
+                raise lab6()
+            while True:
+                v_15 = self.cursor
+                try:
+                    try:
+                        while True:
+                            v_16 = self.cursor
+                            try:
+                                self.bra = self.cursor
+                                if not self.eq_s(u"Y"):
+                                    raise lab9()
+                                self.ket = self.cursor
+                                self.cursor = v_16
+                                raise lab8()
+                            except lab9: pass
+                            self.cursor = v_16
+                            if self.cursor >= self.limit:
+                                raise lab7()
+                            self.cursor += 1
+                    except lab8: pass
+                    if not self.slice_from(u"y"):
+                        return False
+                    continue
+                except lab7: pass
+                self.cursor = v_15
+                break
+        except lab6: pass
+        self.cursor = v_14
+        return True
+
+    a_0 = [
+        Among(u"s", -1, 3),
+        Among(u"ies", 0, 2),
+        Among(u"sses", 0, 1),
+        Among(u"ss", 0, -1)
+    ]
+
+    a_1 = [
+        Among(u"", -1, 3),
+        Among(u"bb", 0, 2),
+        Among(u"dd", 0, 2),
+        Among(u"ff", 0, 2),
+        Among(u"gg", 0, 2),
+        Among(u"bl", 0, 1),
+        Among(u"mm", 0, 2),
+        Among(u"nn", 0, 2),
+        Among(u"pp", 0, 2),
+        Among(u"rr", 0, 2),
+        Among(u"at", 0, 1),
+        Among(u"tt", 0, 2),
+        Among(u"iz", 0, 1)
+    ]
+
+    a_2 = [
+        Among(u"ed", -1, 2),
+        Among(u"eed", 0, 1),
+        Among(u"ing", -1, 2)
+    ]
+
+    a_3 = [
+        Among(u"anci", -1, 3),
+        Among(u"enci", -1, 2),
+        Among(u"abli", -1, 4),
+        Among(u"eli", -1, 6),
+        Among(u"alli", -1, 9),
+        Among(u"ousli", -1, 11),
+        Among(u"entli", -1, 5),
+        Among(u"aliti", -1, 9),
+        Among(u"biliti", -1, 13),
+        Among(u"iviti", -1, 12),
+        Among(u"tional", -1, 1),
+        Among(u"ational", 10, 8),
+        Among(u"alism", -1, 9),
+        Among(u"ation", -1, 8),
+        Among(u"ization", 13, 7),
+        Among(u"izer", -1, 7),
+        Among(u"ator", -1, 8),
+        Among(u"iveness", -1, 12),
+        Among(u"fulness", -1, 10),
+        Among(u"ousness", -1, 11)
+    ]
+
+    a_4 = [
+        Among(u"icate", -1, 2),
+        Among(u"ative", -1, 3),
+        Among(u"alize", -1, 1),
+        Among(u"iciti", -1, 2),
+        Among(u"ical", -1, 2),
+        Among(u"ful", -1, 3),
+        Among(u"ness", -1, 3)
+    ]
+
+    a_5 = [
+        Among(u"ic", -1, 1),
+        Among(u"ance", -1, 1),
+        Among(u"ence", -1, 1),
+        Among(u"able", -1, 1),
+        Among(u"ible", -1, 1),
+        Among(u"ate", -1, 1),
+        Among(u"ive", -1, 1),
+        Among(u"ize", -1, 1),
+        Among(u"iti", -1, 1),
+        Among(u"al", -1, 1),
+        Among(u"ism", -1, 1),
+        Among(u"ion", -1, 2),
+        Among(u"er", -1, 1),
+        Among(u"ous", -1, 1),
+        Among(u"ant", -1, 1),
+        Among(u"ent", -1, 1),
+        Among(u"ment", 15, 1),
+        Among(u"ement", 16, 1),
+        Among(u"ou", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
+
+
+class lab9(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/portuguese_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/portuguese_stemmer.py
new file mode 100644
index 000000000..4e1ad7f28
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/portuguese_stemmer.py
@@ -0,0 +1,650 @@
+#-*- coding: utf-8 -*-
+# Generated from portuguese.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class PortugueseStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from portuguese.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"á", u"é", u"í", u"ó", u"ú", u"â", u"ê", u"ô"}
+
+    I_p2 = 0
+    I_p1 = 0
+    I_pV = 0
+
+    def __r_prelude(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(PortugueseStemmer.a_0)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"a~"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"o~"):
+                        return False
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_mark_regions(self):
+        self.I_pV = self.limit
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            try:
+                v_2 = self.cursor
+                try:
+                    if not self.in_grouping(PortugueseStemmer.g_v):
+                        raise lab2()
+                    try:
+                        v_3 = self.cursor
+                        try:
+                            if not self.out_grouping(PortugueseStemmer.g_v):
+                                raise lab4()
+                            if not self.go_out_grouping(PortugueseStemmer.g_v):
+                                raise lab4()
+                            self.cursor += 1
+                            raise lab3()
+                        except lab4: pass
+                        self.cursor = v_3
+                        if not self.in_grouping(PortugueseStemmer.g_v):
+                            raise lab2()
+                        if not self.go_in_grouping(PortugueseStemmer.g_v):
+                            raise lab2()
+                        self.cursor += 1
+                    except lab3: pass
+                    raise lab1()
+                except lab2: pass
+                self.cursor = v_2
+                if not self.out_grouping(PortugueseStemmer.g_v):
+                    raise lab0()
+                try:
+                    v_4 = self.cursor
+                    try:
+                        if not self.out_grouping(PortugueseStemmer.g_v):
+                            raise lab6()
+                        if not self.go_out_grouping(PortugueseStemmer.g_v):
+                            raise lab6()
+                        self.cursor += 1
+                        raise lab5()
+                    except lab6: pass
+                    self.cursor = v_4
+                    if not self.in_grouping(PortugueseStemmer.g_v):
+                        raise lab0()
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                except lab5: pass
+            except lab1: pass
+            self.I_pV = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        v_5 = self.cursor
+        try:
+            if not self.go_out_grouping(PortugueseStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            if not self.go_in_grouping(PortugueseStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+            if not self.go_out_grouping(PortugueseStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            if not self.go_in_grouping(PortugueseStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab7: pass
+        self.cursor = v_5
+        return True
+
+    def __r_postlude(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(PortugueseStemmer.a_1)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"ã"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"õ"):
+                        return False
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_RV(self):
+        return self.I_pV <= self.cursor
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_standard_suffix(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(PortugueseStemmer.a_5)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"log"):
+                return False
+        elif among_var == 3:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"u"):
+                return False
+        elif among_var == 4:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"ente"):
+                return False
+        elif among_var == 5:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                among_var = self.find_among_b(PortugueseStemmer.a_2)
+                if among_var == 0:
+                    self.cursor = self.limit - v_1
+                    raise lab0()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_1
+                    raise lab0()
+                if not self.slice_del():
+                    return False
+
+                if among_var == 1:
+                    self.ket = self.cursor
+                    if not self.eq_s_b(u"at"):
+                        self.cursor = self.limit - v_1
+                        raise lab0()
+                    self.bra = self.cursor
+                    if not self.__r_R2():
+                        self.cursor = self.limit - v_1
+                        raise lab0()
+                    if not self.slice_del():
+                        return False
+
+            except lab0: pass
+        elif among_var == 6:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_2 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if self.find_among_b(PortugueseStemmer.a_3) == 0:
+                    self.cursor = self.limit - v_2
+                    raise lab1()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_2
+                    raise lab1()
+                if not self.slice_del():
+                    return False
+
+            except lab1: pass
+        elif among_var == 7:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_3 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if self.find_among_b(PortugueseStemmer.a_4) == 0:
+                    self.cursor = self.limit - v_3
+                    raise lab2()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_3
+                    raise lab2()
+                if not self.slice_del():
+                    return False
+
+            except lab2: pass
+        elif among_var == 8:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_4 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if not self.eq_s_b(u"at"):
+                    self.cursor = self.limit - v_4
+                    raise lab3()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_4
+                    raise lab3()
+                if not self.slice_del():
+                    return False
+
+            except lab3: pass
+        else:
+            if not self.__r_RV():
+                return False
+            if not self.eq_s_b(u"e"):
+                return False
+            if not self.slice_from(u"ir"):
+                return False
+        return True
+
+    def __r_verb_suffix(self):
+        if self.cursor < self.I_pV:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_pV
+        self.ket = self.cursor
+        if self.find_among_b(PortugueseStemmer.a_6) == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.limit_backward = v_2
+        return True
+
+    def __r_residual_suffix(self):
+        self.ket = self.cursor
+        if self.find_among_b(PortugueseStemmer.a_7) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_RV():
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_residual_form(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(PortugueseStemmer.a_8)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_RV():
+                return False
+            if not self.slice_del():
+                return False
+
+            self.ket = self.cursor
+            try:
+                v_1 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"u"):
+                        raise lab1()
+                    self.bra = self.cursor
+                    v_2 = self.limit - self.cursor
+                    if not self.eq_s_b(u"g"):
+                        raise lab1()
+                    self.cursor = self.limit - v_2
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_1
+                if not self.eq_s_b(u"i"):
+                    return False
+                self.bra = self.cursor
+                v_3 = self.limit - self.cursor
+                if not self.eq_s_b(u"c"):
+                    return False
+                self.cursor = self.limit - v_3
+            except lab0: pass
+            if not self.__r_RV():
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.slice_from(u"c"):
+                return False
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        self.__r_prelude()
+        self.cursor = v_1
+        self.__r_mark_regions()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_3 = self.limit - self.cursor
+        try:
+            try:
+                v_4 = self.limit - self.cursor
+                try:
+                    v_5 = self.limit - self.cursor
+                    try:
+                        v_6 = self.limit - self.cursor
+                        try:
+                            if not self.__r_standard_suffix():
+                                raise lab4()
+                            raise lab3()
+                        except lab4: pass
+                        self.cursor = self.limit - v_6
+                        if not self.__r_verb_suffix():
+                            raise lab2()
+                    except lab3: pass
+                    self.cursor = self.limit - v_5
+                    v_7 = self.limit - self.cursor
+                    try:
+                        self.ket = self.cursor
+                        if not self.eq_s_b(u"i"):
+                            raise lab5()
+                        self.bra = self.cursor
+                        v_8 = self.limit - self.cursor
+                        if not self.eq_s_b(u"c"):
+                            raise lab5()
+                        self.cursor = self.limit - v_8
+                        if not self.__r_RV():
+                            raise lab5()
+                        if not self.slice_del():
+                            return False
+
+                    except lab5: pass
+                    self.cursor = self.limit - v_7
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_4
+                if not self.__r_residual_suffix():
+                    raise lab0()
+            except lab1: pass
+        except lab0: pass
+        self.cursor = self.limit - v_3
+        v_9 = self.limit - self.cursor
+        self.__r_residual_form()
+        self.cursor = self.limit - v_9
+        self.cursor = self.limit_backward
+        v_10 = self.cursor
+        self.__r_postlude()
+        self.cursor = v_10
+        return True
+
+    a_0 = [
+        Among(u"", -1, 3),
+        Among(u"ã", 0, 1),
+        Among(u"õ", 0, 2)
+    ]
+
+    a_1 = [
+        Among(u"", -1, 3),
+        Among(u"a~", 0, 1),
+        Among(u"o~", 0, 2)
+    ]
+
+    a_2 = [
+        Among(u"ic", -1, -1),
+        Among(u"ad", -1, -1),
+        Among(u"os", -1, -1),
+        Among(u"iv", -1, 1)
+    ]
+
+    a_3 = [
+        Among(u"ante", -1, 1),
+        Among(u"avel", -1, 1),
+        Among(u"ível", -1, 1)
+    ]
+
+    a_4 = [
+        Among(u"ic", -1, 1),
+        Among(u"abil", -1, 1),
+        Among(u"iv", -1, 1)
+    ]
+
+    a_5 = [
+        Among(u"ica", -1, 1),
+        Among(u"ância", -1, 1),
+        Among(u"ência", -1, 4),
+        Among(u"logia", -1, 2),
+        Among(u"ira", -1, 9),
+        Among(u"adora", -1, 1),
+        Among(u"osa", -1, 1),
+        Among(u"ista", -1, 1),
+        Among(u"iva", -1, 8),
+        Among(u"eza", -1, 1),
+        Among(u"idade", -1, 7),
+        Among(u"ante", -1, 1),
+        Among(u"mente", -1, 6),
+        Among(u"amente", 12, 5),
+        Among(u"ável", -1, 1),
+        Among(u"ível", -1, 1),
+        Among(u"ico", -1, 1),
+        Among(u"ismo", -1, 1),
+        Among(u"oso", -1, 1),
+        Among(u"amento", -1, 1),
+        Among(u"imento", -1, 1),
+        Among(u"ivo", -1, 8),
+        Among(u"aça~o", -1, 1),
+        Among(u"uça~o", -1, 3),
+        Among(u"ador", -1, 1),
+        Among(u"icas", -1, 1),
+        Among(u"ências", -1, 4),
+        Among(u"logias", -1, 2),
+        Among(u"iras", -1, 9),
+        Among(u"adoras", -1, 1),
+        Among(u"osas", -1, 1),
+        Among(u"istas", -1, 1),
+        Among(u"ivas", -1, 8),
+        Among(u"ezas", -1, 1),
+        Among(u"idades", -1, 7),
+        Among(u"adores", -1, 1),
+        Among(u"antes", -1, 1),
+        Among(u"aço~es", -1, 1),
+        Among(u"uço~es", -1, 3),
+        Among(u"icos", -1, 1),
+        Among(u"ismos", -1, 1),
+        Among(u"osos", -1, 1),
+        Among(u"amentos", -1, 1),
+        Among(u"imentos", -1, 1),
+        Among(u"ivos", -1, 8)
+    ]
+
+    a_6 = [
+        Among(u"ada", -1, 1),
+        Among(u"ida", -1, 1),
+        Among(u"ia", -1, 1),
+        Among(u"aria", 2, 1),
+        Among(u"eria", 2, 1),
+        Among(u"iria", 2, 1),
+        Among(u"ara", -1, 1),
+        Among(u"era", -1, 1),
+        Among(u"ira", -1, 1),
+        Among(u"ava", -1, 1),
+        Among(u"asse", -1, 1),
+        Among(u"esse", -1, 1),
+        Among(u"isse", -1, 1),
+        Among(u"aste", -1, 1),
+        Among(u"este", -1, 1),
+        Among(u"iste", -1, 1),
+        Among(u"ei", -1, 1),
+        Among(u"arei", 16, 1),
+        Among(u"erei", 16, 1),
+        Among(u"irei", 16, 1),
+        Among(u"am", -1, 1),
+        Among(u"iam", 20, 1),
+        Among(u"ariam", 21, 1),
+        Among(u"eriam", 21, 1),
+        Among(u"iriam", 21, 1),
+        Among(u"aram", 20, 1),
+        Among(u"eram", 20, 1),
+        Among(u"iram", 20, 1),
+        Among(u"avam", 20, 1),
+        Among(u"em", -1, 1),
+        Among(u"arem", 29, 1),
+        Among(u"erem", 29, 1),
+        Among(u"irem", 29, 1),
+        Among(u"assem", 29, 1),
+        Among(u"essem", 29, 1),
+        Among(u"issem", 29, 1),
+        Among(u"ado", -1, 1),
+        Among(u"ido", -1, 1),
+        Among(u"ando", -1, 1),
+        Among(u"endo", -1, 1),
+        Among(u"indo", -1, 1),
+        Among(u"ara~o", -1, 1),
+        Among(u"era~o", -1, 1),
+        Among(u"ira~o", -1, 1),
+        Among(u"ar", -1, 1),
+        Among(u"er", -1, 1),
+        Among(u"ir", -1, 1),
+        Among(u"as", -1, 1),
+        Among(u"adas", 47, 1),
+        Among(u"idas", 47, 1),
+        Among(u"ias", 47, 1),
+        Among(u"arias", 50, 1),
+        Among(u"erias", 50, 1),
+        Among(u"irias", 50, 1),
+        Among(u"aras", 47, 1),
+        Among(u"eras", 47, 1),
+        Among(u"iras", 47, 1),
+        Among(u"avas", 47, 1),
+        Among(u"es", -1, 1),
+        Among(u"ardes", 58, 1),
+        Among(u"erdes", 58, 1),
+        Among(u"irdes", 58, 1),
+        Among(u"ares", 58, 1),
+        Among(u"eres", 58, 1),
+        Among(u"ires", 58, 1),
+        Among(u"asses", 58, 1),
+        Among(u"esses", 58, 1),
+        Among(u"isses", 58, 1),
+        Among(u"astes", 58, 1),
+        Among(u"estes", 58, 1),
+        Among(u"istes", 58, 1),
+        Among(u"is", -1, 1),
+        Among(u"ais", 71, 1),
+        Among(u"eis", 71, 1),
+        Among(u"areis", 73, 1),
+        Among(u"ereis", 73, 1),
+        Among(u"ireis", 73, 1),
+        Among(u"áreis", 73, 1),
+        Among(u"éreis", 73, 1),
+        Among(u"íreis", 73, 1),
+        Among(u"ásseis", 73, 1),
+        Among(u"ésseis", 73, 1),
+        Among(u"ísseis", 73, 1),
+        Among(u"áveis", 73, 1),
+        Among(u"íeis", 73, 1),
+        Among(u"aríeis", 84, 1),
+        Among(u"eríeis", 84, 1),
+        Among(u"iríeis", 84, 1),
+        Among(u"ados", -1, 1),
+        Among(u"idos", -1, 1),
+        Among(u"amos", -1, 1),
+        Among(u"áramos", 90, 1),
+        Among(u"éramos", 90, 1),
+        Among(u"íramos", 90, 1),
+        Among(u"ávamos", 90, 1),
+        Among(u"íamos", 90, 1),
+        Among(u"aríamos", 95, 1),
+        Among(u"eríamos", 95, 1),
+        Among(u"iríamos", 95, 1),
+        Among(u"emos", -1, 1),
+        Among(u"aremos", 99, 1),
+        Among(u"eremos", 99, 1),
+        Among(u"iremos", 99, 1),
+        Among(u"ássemos", 99, 1),
+        Among(u"êssemos", 99, 1),
+        Among(u"íssemos", 99, 1),
+        Among(u"imos", -1, 1),
+        Among(u"armos", -1, 1),
+        Among(u"ermos", -1, 1),
+        Among(u"irmos", -1, 1),
+        Among(u"ámos", -1, 1),
+        Among(u"arás", -1, 1),
+        Among(u"erás", -1, 1),
+        Among(u"irás", -1, 1),
+        Among(u"eu", -1, 1),
+        Among(u"iu", -1, 1),
+        Among(u"ou", -1, 1),
+        Among(u"ará", -1, 1),
+        Among(u"erá", -1, 1),
+        Among(u"irá", -1, 1)
+    ]
+
+    a_7 = [
+        Among(u"a", -1, 1),
+        Among(u"i", -1, 1),
+        Among(u"o", -1, 1),
+        Among(u"os", -1, 1),
+        Among(u"á", -1, 1),
+        Among(u"í", -1, 1),
+        Among(u"ó", -1, 1)
+    ]
+
+    a_8 = [
+        Among(u"e", -1, 1),
+        Among(u"ç", -1, 2),
+        Among(u"é", -1, 1),
+        Among(u"ê", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/romanian_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/romanian_stemmer.py
new file mode 100644
index 000000000..c319afcd0
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/romanian_stemmer.py
@@ -0,0 +1,669 @@
+#-*- coding: utf-8 -*-
+# Generated from romanian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class RomanianStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from romanian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"â", u"î", u"ă"}
+
+    B_standard_suffix_removed = False
+    I_p2 = 0
+    I_p1 = 0
+    I_pV = 0
+
+    def __r_norm(self):
+        v_1 = self.cursor
+        try:
+            while True:
+                v_2 = self.cursor
+                try:
+                    try:
+                        while True:
+                            v_3 = self.cursor
+                            try:
+                                self.bra = self.cursor
+                                among_var = self.find_among(RomanianStemmer.a_0)
+                                if among_var == 0:
+                                    raise lab3()
+                                self.ket = self.cursor
+                                if among_var == 1:
+                                    if not self.slice_from(u"ș"):
+                                        return False
+                                else:
+                                    if not self.slice_from(u"ț"):
+                                        return False
+                                self.cursor = v_3
+                                raise lab2()
+                            except lab3: pass
+                            self.cursor = v_3
+                            if self.cursor >= self.limit:
+                                raise lab1()
+                            self.cursor += 1
+                    except lab2: pass
+                    continue
+                except lab1: pass
+                self.cursor = v_2
+                break
+        except lab0: pass
+        self.cursor = v_1
+        return True
+
+    def __r_prelude(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                try:
+                    while True:
+                        v_2 = self.cursor
+                        try:
+                            if not self.in_grouping(RomanianStemmer.g_v):
+                                raise lab2()
+                            self.bra = self.cursor
+                            try:
+                                v_3 = self.cursor
+                                try:
+                                    if not self.eq_s(u"u"):
+                                        raise lab4()
+                                    self.ket = self.cursor
+                                    if not self.in_grouping(RomanianStemmer.g_v):
+                                        raise lab4()
+                                    if not self.slice_from(u"U"):
+                                        return False
+                                    raise lab3()
+                                except lab4: pass
+                                self.cursor = v_3
+                                if not self.eq_s(u"i"):
+                                    raise lab2()
+                                self.ket = self.cursor
+                                if not self.in_grouping(RomanianStemmer.g_v):
+                                    raise lab2()
+                                if not self.slice_from(u"I"):
+                                    return False
+                            except lab3: pass
+                            self.cursor = v_2
+                            raise lab1()
+                        except lab2: pass
+                        self.cursor = v_2
+                        if self.cursor >= self.limit:
+                            raise lab0()
+                        self.cursor += 1
+                except lab1: pass
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_mark_regions(self):
+        self.I_pV = self.limit
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            try:
+                v_2 = self.cursor
+                try:
+                    if not self.in_grouping(RomanianStemmer.g_v):
+                        raise lab2()
+                    try:
+                        v_3 = self.cursor
+                        try:
+                            if not self.out_grouping(RomanianStemmer.g_v):
+                                raise lab4()
+                            if not self.go_out_grouping(RomanianStemmer.g_v):
+                                raise lab4()
+                            self.cursor += 1
+                            raise lab3()
+                        except lab4: pass
+                        self.cursor = v_3
+                        if not self.in_grouping(RomanianStemmer.g_v):
+                            raise lab2()
+                        if not self.go_in_grouping(RomanianStemmer.g_v):
+                            raise lab2()
+                        self.cursor += 1
+                    except lab3: pass
+                    raise lab1()
+                except lab2: pass
+                self.cursor = v_2
+                if not self.out_grouping(RomanianStemmer.g_v):
+                    raise lab0()
+                try:
+                    v_4 = self.cursor
+                    try:
+                        if not self.out_grouping(RomanianStemmer.g_v):
+                            raise lab6()
+                        if not self.go_out_grouping(RomanianStemmer.g_v):
+                            raise lab6()
+                        self.cursor += 1
+                        raise lab5()
+                    except lab6: pass
+                    self.cursor = v_4
+                    if not self.in_grouping(RomanianStemmer.g_v):
+                        raise lab0()
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                except lab5: pass
+            except lab1: pass
+            self.I_pV = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        v_5 = self.cursor
+        try:
+            if not self.go_out_grouping(RomanianStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            if not self.go_in_grouping(RomanianStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+            if not self.go_out_grouping(RomanianStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            if not self.go_in_grouping(RomanianStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab7: pass
+        self.cursor = v_5
+        return True
+
+    def __r_postlude(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(RomanianStemmer.a_1)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"i"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"u"):
+                        return False
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_RV(self):
+        return self.I_pV <= self.cursor
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_step_0(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(RomanianStemmer.a_2)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.slice_from(u"a"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"e"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"i"):
+                return False
+        elif among_var == 5:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"ab"):
+                    raise lab0()
+                return False
+            except lab0: pass
+            self.cursor = self.limit - v_1
+            if not self.slice_from(u"i"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"at"):
+                return False
+        else:
+            if not self.slice_from(u"ați"):
+                return False
+        return True
+
+    def __r_combo_suffix(self):
+        v_1 = self.limit - self.cursor
+        self.ket = self.cursor
+        among_var = self.find_among_b(RomanianStemmer.a_3)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"abil"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"ibil"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"iv"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"ic"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"at"):
+                return False
+        else:
+            if not self.slice_from(u"it"):
+                return False
+        self.B_standard_suffix_removed = True
+        self.cursor = self.limit - v_1
+        return True
+
+    def __r_standard_suffix(self):
+        self.B_standard_suffix_removed = False
+        while True:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.__r_combo_suffix():
+                    raise lab0()
+                continue
+            except lab0: pass
+            self.cursor = self.limit - v_1
+            break
+        self.ket = self.cursor
+        among_var = self.find_among_b(RomanianStemmer.a_4)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R2():
+            return False
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.eq_s_b(u"ț"):
+                return False
+            self.bra = self.cursor
+            if not self.slice_from(u"t"):
+                return False
+        else:
+            if not self.slice_from(u"ist"):
+                return False
+        self.B_standard_suffix_removed = True
+        return True
+
+    def __r_verb_suffix(self):
+        if self.cursor < self.I_pV:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_pV
+        self.ket = self.cursor
+        among_var = self.find_among_b(RomanianStemmer.a_5)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            try:
+                v_3 = self.limit - self.cursor
+                try:
+                    if not self.out_grouping_b(RomanianStemmer.g_v):
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_3
+                if not self.eq_s_b(u"u"):
+                    self.limit_backward = v_2
+                    return False
+            except lab0: pass
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.slice_del():
+                return False
+
+        self.limit_backward = v_2
+        return True
+
+    def __r_vowel_suffix(self):
+        self.ket = self.cursor
+        if self.find_among_b(RomanianStemmer.a_6) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_RV():
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def _stem(self):
+        self.__r_norm()
+        v_2 = self.cursor
+        self.__r_prelude()
+        self.cursor = v_2
+        self.__r_mark_regions()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_4 = self.limit - self.cursor
+        self.__r_step_0()
+        self.cursor = self.limit - v_4
+        v_5 = self.limit - self.cursor
+        self.__r_standard_suffix()
+        self.cursor = self.limit - v_5
+        v_6 = self.limit - self.cursor
+        try:
+            try:
+                v_7 = self.limit - self.cursor
+                try:
+                    if not self.B_standard_suffix_removed:
+                        raise lab2()
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_7
+                if not self.__r_verb_suffix():
+                    raise lab0()
+            except lab1: pass
+        except lab0: pass
+        self.cursor = self.limit - v_6
+        v_8 = self.limit - self.cursor
+        self.__r_vowel_suffix()
+        self.cursor = self.limit - v_8
+        self.cursor = self.limit_backward
+        v_9 = self.cursor
+        self.__r_postlude()
+        self.cursor = v_9
+        return True
+
+    a_0 = [
+        Among(u"ş", -1, 1),
+        Among(u"ţ", -1, 2)
+    ]
+
+    a_1 = [
+        Among(u"", -1, 3),
+        Among(u"I", 0, 1),
+        Among(u"U", 0, 2)
+    ]
+
+    a_2 = [
+        Among(u"ea", -1, 3),
+        Among(u"ația", -1, 7),
+        Among(u"aua", -1, 2),
+        Among(u"iua", -1, 4),
+        Among(u"ație", -1, 7),
+        Among(u"ele", -1, 3),
+        Among(u"ile", -1, 5),
+        Among(u"iile", 6, 4),
+        Among(u"iei", -1, 4),
+        Among(u"atei", -1, 6),
+        Among(u"ii", -1, 4),
+        Among(u"ului", -1, 1),
+        Among(u"ul", -1, 1),
+        Among(u"elor", -1, 3),
+        Among(u"ilor", -1, 4),
+        Among(u"iilor", 14, 4)
+    ]
+
+    a_3 = [
+        Among(u"icala", -1, 4),
+        Among(u"iciva", -1, 4),
+        Among(u"ativa", -1, 5),
+        Among(u"itiva", -1, 6),
+        Among(u"icale", -1, 4),
+        Among(u"ațiune", -1, 5),
+        Among(u"ițiune", -1, 6),
+        Among(u"atoare", -1, 5),
+        Among(u"itoare", -1, 6),
+        Among(u"ătoare", -1, 5),
+        Among(u"icitate", -1, 4),
+        Among(u"abilitate", -1, 1),
+        Among(u"ibilitate", -1, 2),
+        Among(u"ivitate", -1, 3),
+        Among(u"icive", -1, 4),
+        Among(u"ative", -1, 5),
+        Among(u"itive", -1, 6),
+        Among(u"icali", -1, 4),
+        Among(u"atori", -1, 5),
+        Among(u"icatori", 18, 4),
+        Among(u"itori", -1, 6),
+        Among(u"ători", -1, 5),
+        Among(u"icitati", -1, 4),
+        Among(u"abilitati", -1, 1),
+        Among(u"ivitati", -1, 3),
+        Among(u"icivi", -1, 4),
+        Among(u"ativi", -1, 5),
+        Among(u"itivi", -1, 6),
+        Among(u"icităi", -1, 4),
+        Among(u"abilităi", -1, 1),
+        Among(u"ivităi", -1, 3),
+        Among(u"icități", -1, 4),
+        Among(u"abilități", -1, 1),
+        Among(u"ivități", -1, 3),
+        Among(u"ical", -1, 4),
+        Among(u"ator", -1, 5),
+        Among(u"icator", 35, 4),
+        Among(u"itor", -1, 6),
+        Among(u"ător", -1, 5),
+        Among(u"iciv", -1, 4),
+        Among(u"ativ", -1, 5),
+        Among(u"itiv", -1, 6),
+        Among(u"icală", -1, 4),
+        Among(u"icivă", -1, 4),
+        Among(u"ativă", -1, 5),
+        Among(u"itivă", -1, 6)
+    ]
+
+    a_4 = [
+        Among(u"ica", -1, 1),
+        Among(u"abila", -1, 1),
+        Among(u"ibila", -1, 1),
+        Among(u"oasa", -1, 1),
+        Among(u"ata", -1, 1),
+        Among(u"ita", -1, 1),
+        Among(u"anta", -1, 1),
+        Among(u"ista", -1, 3),
+        Among(u"uta", -1, 1),
+        Among(u"iva", -1, 1),
+        Among(u"ic", -1, 1),
+        Among(u"ice", -1, 1),
+        Among(u"abile", -1, 1),
+        Among(u"ibile", -1, 1),
+        Among(u"isme", -1, 3),
+        Among(u"iune", -1, 2),
+        Among(u"oase", -1, 1),
+        Among(u"ate", -1, 1),
+        Among(u"itate", 17, 1),
+        Among(u"ite", -1, 1),
+        Among(u"ante", -1, 1),
+        Among(u"iste", -1, 3),
+        Among(u"ute", -1, 1),
+        Among(u"ive", -1, 1),
+        Among(u"ici", -1, 1),
+        Among(u"abili", -1, 1),
+        Among(u"ibili", -1, 1),
+        Among(u"iuni", -1, 2),
+        Among(u"atori", -1, 1),
+        Among(u"osi", -1, 1),
+        Among(u"ati", -1, 1),
+        Among(u"itati", 30, 1),
+        Among(u"iti", -1, 1),
+        Among(u"anti", -1, 1),
+        Among(u"isti", -1, 3),
+        Among(u"uti", -1, 1),
+        Among(u"iști", -1, 3),
+        Among(u"ivi", -1, 1),
+        Among(u"ităi", -1, 1),
+        Among(u"oși", -1, 1),
+        Among(u"ități", -1, 1),
+        Among(u"abil", -1, 1),
+        Among(u"ibil", -1, 1),
+        Among(u"ism", -1, 3),
+        Among(u"ator", -1, 1),
+        Among(u"os", -1, 1),
+        Among(u"at", -1, 1),
+        Among(u"it", -1, 1),
+        Among(u"ant", -1, 1),
+        Among(u"ist", -1, 3),
+        Among(u"ut", -1, 1),
+        Among(u"iv", -1, 1),
+        Among(u"ică", -1, 1),
+        Among(u"abilă", -1, 1),
+        Among(u"ibilă", -1, 1),
+        Among(u"oasă", -1, 1),
+        Among(u"ată", -1, 1),
+        Among(u"ită", -1, 1),
+        Among(u"antă", -1, 1),
+        Among(u"istă", -1, 3),
+        Among(u"ută", -1, 1),
+        Among(u"ivă", -1, 1)
+    ]
+
+    a_5 = [
+        Among(u"ea", -1, 1),
+        Among(u"ia", -1, 1),
+        Among(u"esc", -1, 1),
+        Among(u"ăsc", -1, 1),
+        Among(u"ind", -1, 1),
+        Among(u"ând", -1, 1),
+        Among(u"are", -1, 1),
+        Among(u"ere", -1, 1),
+        Among(u"ire", -1, 1),
+        Among(u"âre", -1, 1),
+        Among(u"se", -1, 2),
+        Among(u"ase", 10, 1),
+        Among(u"sese", 10, 2),
+        Among(u"ise", 10, 1),
+        Among(u"use", 10, 1),
+        Among(u"âse", 10, 1),
+        Among(u"ește", -1, 1),
+        Among(u"ăște", -1, 1),
+        Among(u"eze", -1, 1),
+        Among(u"ai", -1, 1),
+        Among(u"eai", 19, 1),
+        Among(u"iai", 19, 1),
+        Among(u"sei", -1, 2),
+        Among(u"ești", -1, 1),
+        Among(u"ăști", -1, 1),
+        Among(u"ui", -1, 1),
+        Among(u"ezi", -1, 1),
+        Among(u"âi", -1, 1),
+        Among(u"ași", -1, 1),
+        Among(u"seși", -1, 2),
+        Among(u"aseși", 29, 1),
+        Among(u"seseși", 29, 2),
+        Among(u"iseși", 29, 1),
+        Among(u"useși", 29, 1),
+        Among(u"âseși", 29, 1),
+        Among(u"iși", -1, 1),
+        Among(u"uși", -1, 1),
+        Among(u"âși", -1, 1),
+        Among(u"ați", -1, 2),
+        Among(u"eați", 38, 1),
+        Among(u"iați", 38, 1),
+        Among(u"eți", -1, 2),
+        Among(u"iți", -1, 2),
+        Among(u"âți", -1, 2),
+        Among(u"arăți", -1, 1),
+        Among(u"serăți", -1, 2),
+        Among(u"aserăți", 45, 1),
+        Among(u"seserăți", 45, 2),
+        Among(u"iserăți", 45, 1),
+        Among(u"userăți", 45, 1),
+        Among(u"âserăți", 45, 1),
+        Among(u"irăți", -1, 1),
+        Among(u"urăți", -1, 1),
+        Among(u"ârăți", -1, 1),
+        Among(u"am", -1, 1),
+        Among(u"eam", 54, 1),
+        Among(u"iam", 54, 1),
+        Among(u"em", -1, 2),
+        Among(u"asem", 57, 1),
+        Among(u"sesem", 57, 2),
+        Among(u"isem", 57, 1),
+        Among(u"usem", 57, 1),
+        Among(u"âsem", 57, 1),
+        Among(u"im", -1, 2),
+        Among(u"âm", -1, 2),
+        Among(u"ăm", -1, 2),
+        Among(u"arăm", 65, 1),
+        Among(u"serăm", 65, 2),
+        Among(u"aserăm", 67, 1),
+        Among(u"seserăm", 67, 2),
+        Among(u"iserăm", 67, 1),
+        Among(u"userăm", 67, 1),
+        Among(u"âserăm", 67, 1),
+        Among(u"irăm", 65, 1),
+        Among(u"urăm", 65, 1),
+        Among(u"ârăm", 65, 1),
+        Among(u"au", -1, 1),
+        Among(u"eau", 76, 1),
+        Among(u"iau", 76, 1),
+        Among(u"indu", -1, 1),
+        Among(u"ându", -1, 1),
+        Among(u"ez", -1, 1),
+        Among(u"ească", -1, 1),
+        Among(u"ară", -1, 1),
+        Among(u"seră", -1, 2),
+        Among(u"aseră", 84, 1),
+        Among(u"seseră", 84, 2),
+        Among(u"iseră", 84, 1),
+        Among(u"useră", 84, 1),
+        Among(u"âseră", 84, 1),
+        Among(u"iră", -1, 1),
+        Among(u"ură", -1, 1),
+        Among(u"âră", -1, 1),
+        Among(u"ează", -1, 1)
+    ]
+
+    a_6 = [
+        Among(u"a", -1, 1),
+        Among(u"e", -1, 1),
+        Among(u"ie", 1, 1),
+        Among(u"i", -1, 1),
+        Among(u"ă", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/russian_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/russian_stemmer.py
new file mode 100644
index 000000000..646215d72
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/russian_stemmer.py
@@ -0,0 +1,491 @@
+#-*- coding: utf-8 -*-
+# Generated from russian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class RussianStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from russian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"а", u"е", u"и", u"о", u"у", u"ы", u"э", u"ю", u"я"}
+
+    I_p2 = 0
+    I_pV = 0
+
+    def __r_mark_regions(self):
+        self.I_pV = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            if not self.go_out_grouping(RussianStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            self.I_pV = self.cursor
+            if not self.go_in_grouping(RussianStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            if not self.go_out_grouping(RussianStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            if not self.go_in_grouping(RussianStemmer.g_v):
+                raise lab0()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        return True
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_perfective_gerund(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(RussianStemmer.a_0)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            try:
+                v_1 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"а"):
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_1
+                if not self.eq_s_b(u"я"):
+                    return False
+            except lab0: pass
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_adjective(self):
+        self.ket = self.cursor
+        if self.find_among_b(RussianStemmer.a_1) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_adjectival(self):
+        if not self.__r_adjective():
+            return False
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            among_var = self.find_among_b(RussianStemmer.a_2)
+            if among_var == 0:
+                self.cursor = self.limit - v_1
+                raise lab0()
+            self.bra = self.cursor
+            if among_var == 1:
+                try:
+                    v_2 = self.limit - self.cursor
+                    try:
+                        if not self.eq_s_b(u"а"):
+                            raise lab2()
+                        raise lab1()
+                    except lab2: pass
+                    self.cursor = self.limit - v_2
+                    if not self.eq_s_b(u"я"):
+                        self.cursor = self.limit - v_1
+                        raise lab0()
+                except lab1: pass
+                if not self.slice_del():
+                    return False
+
+            else:
+                if not self.slice_del():
+                    return False
+
+        except lab0: pass
+        return True
+
+    def __r_reflexive(self):
+        self.ket = self.cursor
+        if self.find_among_b(RussianStemmer.a_3) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_verb(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(RussianStemmer.a_4)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            try:
+                v_1 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"а"):
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_1
+                if not self.eq_s_b(u"я"):
+                    return False
+            except lab0: pass
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_noun(self):
+        self.ket = self.cursor
+        if self.find_among_b(RussianStemmer.a_5) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_derivational(self):
+        self.ket = self.cursor
+        if self.find_among_b(RussianStemmer.a_6) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R2():
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_tidy_up(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(RussianStemmer.a_7)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+            self.ket = self.cursor
+            if not self.eq_s_b(u"н"):
+                return False
+            self.bra = self.cursor
+            if not self.eq_s_b(u"н"):
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.eq_s_b(u"н"):
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        try:
+            while True:
+                v_2 = self.cursor
+                try:
+                    try:
+                        while True:
+                            v_3 = self.cursor
+                            try:
+                                self.bra = self.cursor
+                                if not self.eq_s(u"ё"):
+                                    raise lab3()
+                                self.ket = self.cursor
+                                self.cursor = v_3
+                                raise lab2()
+                            except lab3: pass
+                            self.cursor = v_3
+                            if self.cursor >= self.limit:
+                                raise lab1()
+                            self.cursor += 1
+                    except lab2: pass
+                    if not self.slice_from(u"е"):
+                        return False
+                    continue
+                except lab1: pass
+                self.cursor = v_2
+                break
+        except lab0: pass
+        self.cursor = v_1
+        self.__r_mark_regions()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        if self.cursor < self.I_pV:
+            return False
+        v_6 = self.limit_backward
+        self.limit_backward = self.I_pV
+        v_7 = self.limit - self.cursor
+        try:
+            try:
+                v_8 = self.limit - self.cursor
+                try:
+                    if not self.__r_perfective_gerund():
+                        raise lab6()
+                    raise lab5()
+                except lab6: pass
+                self.cursor = self.limit - v_8
+                v_9 = self.limit - self.cursor
+                try:
+                    if not self.__r_reflexive():
+                        self.cursor = self.limit - v_9
+                        raise lab7()
+                except lab7: pass
+                try:
+                    v_10 = self.limit - self.cursor
+                    try:
+                        if not self.__r_adjectival():
+                            raise lab9()
+                        raise lab8()
+                    except lab9: pass
+                    self.cursor = self.limit - v_10
+                    try:
+                        if not self.__r_verb():
+                            raise lab10()
+                        raise lab8()
+                    except lab10: pass
+                    self.cursor = self.limit - v_10
+                    if not self.__r_noun():
+                        raise lab4()
+                except lab8: pass
+            except lab5: pass
+        except lab4: pass
+        self.cursor = self.limit - v_7
+        v_11 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.eq_s_b(u"и"):
+                self.cursor = self.limit - v_11
+                raise lab11()
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+        except lab11: pass
+        v_12 = self.limit - self.cursor
+        self.__r_derivational()
+        self.cursor = self.limit - v_12
+        v_13 = self.limit - self.cursor
+        self.__r_tidy_up()
+        self.cursor = self.limit - v_13
+        self.limit_backward = v_6
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"в", -1, 1),
+        Among(u"ив", 0, 2),
+        Among(u"ыв", 0, 2),
+        Among(u"вши", -1, 1),
+        Among(u"ивши", 3, 2),
+        Among(u"ывши", 3, 2),
+        Among(u"вшись", -1, 1),
+        Among(u"ившись", 6, 2),
+        Among(u"ывшись", 6, 2)
+    ]
+
+    a_1 = [
+        Among(u"ее", -1, 1),
+        Among(u"ие", -1, 1),
+        Among(u"ое", -1, 1),
+        Among(u"ые", -1, 1),
+        Among(u"ими", -1, 1),
+        Among(u"ыми", -1, 1),
+        Among(u"ей", -1, 1),
+        Among(u"ий", -1, 1),
+        Among(u"ой", -1, 1),
+        Among(u"ый", -1, 1),
+        Among(u"ем", -1, 1),
+        Among(u"им", -1, 1),
+        Among(u"ом", -1, 1),
+        Among(u"ым", -1, 1),
+        Among(u"его", -1, 1),
+        Among(u"ого", -1, 1),
+        Among(u"ему", -1, 1),
+        Among(u"ому", -1, 1),
+        Among(u"их", -1, 1),
+        Among(u"ых", -1, 1),
+        Among(u"ею", -1, 1),
+        Among(u"ою", -1, 1),
+        Among(u"ую", -1, 1),
+        Among(u"юю", -1, 1),
+        Among(u"ая", -1, 1),
+        Among(u"яя", -1, 1)
+    ]
+
+    a_2 = [
+        Among(u"ем", -1, 1),
+        Among(u"нн", -1, 1),
+        Among(u"вш", -1, 1),
+        Among(u"ивш", 2, 2),
+        Among(u"ывш", 2, 2),
+        Among(u"щ", -1, 1),
+        Among(u"ющ", 5, 1),
+        Among(u"ующ", 6, 2)
+    ]
+
+    a_3 = [
+        Among(u"сь", -1, 1),
+        Among(u"ся", -1, 1)
+    ]
+
+    a_4 = [
+        Among(u"ла", -1, 1),
+        Among(u"ила", 0, 2),
+        Among(u"ыла", 0, 2),
+        Among(u"на", -1, 1),
+        Among(u"ена", 3, 2),
+        Among(u"ете", -1, 1),
+        Among(u"ите", -1, 2),
+        Among(u"йте", -1, 1),
+        Among(u"ейте", 7, 2),
+        Among(u"уйте", 7, 2),
+        Among(u"ли", -1, 1),
+        Among(u"или", 10, 2),
+        Among(u"ыли", 10, 2),
+        Among(u"й", -1, 1),
+        Among(u"ей", 13, 2),
+        Among(u"уй", 13, 2),
+        Among(u"л", -1, 1),
+        Among(u"ил", 16, 2),
+        Among(u"ыл", 16, 2),
+        Among(u"ем", -1, 1),
+        Among(u"им", -1, 2),
+        Among(u"ым", -1, 2),
+        Among(u"н", -1, 1),
+        Among(u"ен", 22, 2),
+        Among(u"ло", -1, 1),
+        Among(u"ило", 24, 2),
+        Among(u"ыло", 24, 2),
+        Among(u"но", -1, 1),
+        Among(u"ено", 27, 2),
+        Among(u"нно", 27, 1),
+        Among(u"ет", -1, 1),
+        Among(u"ует", 30, 2),
+        Among(u"ит", -1, 2),
+        Among(u"ыт", -1, 2),
+        Among(u"ют", -1, 1),
+        Among(u"уют", 34, 2),
+        Among(u"ят", -1, 2),
+        Among(u"ны", -1, 1),
+        Among(u"ены", 37, 2),
+        Among(u"ть", -1, 1),
+        Among(u"ить", 39, 2),
+        Among(u"ыть", 39, 2),
+        Among(u"ешь", -1, 1),
+        Among(u"ишь", -1, 2),
+        Among(u"ю", -1, 2),
+        Among(u"ую", 44, 2)
+    ]
+
+    a_5 = [
+        Among(u"а", -1, 1),
+        Among(u"ев", -1, 1),
+        Among(u"ов", -1, 1),
+        Among(u"е", -1, 1),
+        Among(u"ие", 3, 1),
+        Among(u"ье", 3, 1),
+        Among(u"и", -1, 1),
+        Among(u"еи", 6, 1),
+        Among(u"ии", 6, 1),
+        Among(u"ами", 6, 1),
+        Among(u"ями", 6, 1),
+        Among(u"иями", 10, 1),
+        Among(u"й", -1, 1),
+        Among(u"ей", 12, 1),
+        Among(u"ией", 13, 1),
+        Among(u"ий", 12, 1),
+        Among(u"ой", 12, 1),
+        Among(u"ам", -1, 1),
+        Among(u"ем", -1, 1),
+        Among(u"ием", 18, 1),
+        Among(u"ом", -1, 1),
+        Among(u"ям", -1, 1),
+        Among(u"иям", 21, 1),
+        Among(u"о", -1, 1),
+        Among(u"у", -1, 1),
+        Among(u"ах", -1, 1),
+        Among(u"ях", -1, 1),
+        Among(u"иях", 26, 1),
+        Among(u"ы", -1, 1),
+        Among(u"ь", -1, 1),
+        Among(u"ю", -1, 1),
+        Among(u"ию", 30, 1),
+        Among(u"ью", 30, 1),
+        Among(u"я", -1, 1),
+        Among(u"ия", 33, 1),
+        Among(u"ья", 33, 1)
+    ]
+
+    a_6 = [
+        Among(u"ост", -1, 1),
+        Among(u"ость", -1, 1)
+    ]
+
+    a_7 = [
+        Among(u"ейше", -1, 1),
+        Among(u"н", -1, 2),
+        Among(u"ейш", -1, 1),
+        Among(u"ь", -1, 3)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
+
+
+class lab9(BaseException): pass
+
+
+class lab10(BaseException): pass
+
+
+class lab11(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/serbian_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/serbian_stemmer.py
new file mode 100644
index 000000000..8f7e1732a
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/serbian_stemmer.py
@@ -0,0 +1,3496 @@
+#-*- coding: utf-8 -*-
+# Generated from serbian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class SerbianStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from serbian.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u"}
+
+    g_sa = {u"č", u"ć", u"ž", u"š", u"đ"}
+
+    g_ca = {u"b", u"v", u"g", u"d", u"z", u"j", u"k", u"l", u"m", u"n", u"p", u"r", u"s", u"t", u"f", u"h", u"c", u"č", u"ć", u"ž", u"š", u"đ"}
+
+    g_rg = {u"r"}
+
+    I_p1 = 0
+    B_no_diacritics = False
+
+    def __r_cyr_to_lat(self):
+        v_1 = self.cursor
+        try:
+            while True:
+                v_2 = self.cursor
+                try:
+                    try:
+                        while True:
+                            v_3 = self.cursor
+                            try:
+                                self.bra = self.cursor
+                                among_var = self.find_among(SerbianStemmer.a_0)
+                                if among_var == 0:
+                                    raise lab3()
+                                self.ket = self.cursor
+                                if among_var == 1:
+                                    if not self.slice_from(u"a"):
+                                        return False
+                                elif among_var == 2:
+                                    if not self.slice_from(u"b"):
+                                        return False
+                                elif among_var == 3:
+                                    if not self.slice_from(u"v"):
+                                        return False
+                                elif among_var == 4:
+                                    if not self.slice_from(u"g"):
+                                        return False
+                                elif among_var == 5:
+                                    if not self.slice_from(u"d"):
+                                        return False
+                                elif among_var == 6:
+                                    if not self.slice_from(u"đ"):
+                                        return False
+                                elif among_var == 7:
+                                    if not self.slice_from(u"e"):
+                                        return False
+                                elif among_var == 8:
+                                    if not self.slice_from(u"ž"):
+                                        return False
+                                elif among_var == 9:
+                                    if not self.slice_from(u"z"):
+                                        return False
+                                elif among_var == 10:
+                                    if not self.slice_from(u"i"):
+                                        return False
+                                elif among_var == 11:
+                                    if not self.slice_from(u"j"):
+                                        return False
+                                elif among_var == 12:
+                                    if not self.slice_from(u"k"):
+                                        return False
+                                elif among_var == 13:
+                                    if not self.slice_from(u"l"):
+                                        return False
+                                elif among_var == 14:
+                                    if not self.slice_from(u"lj"):
+                                        return False
+                                elif among_var == 15:
+                                    if not self.slice_from(u"m"):
+                                        return False
+                                elif among_var == 16:
+                                    if not self.slice_from(u"n"):
+                                        return False
+                                elif among_var == 17:
+                                    if not self.slice_from(u"nj"):
+                                        return False
+                                elif among_var == 18:
+                                    if not self.slice_from(u"o"):
+                                        return False
+                                elif among_var == 19:
+                                    if not self.slice_from(u"p"):
+                                        return False
+                                elif among_var == 20:
+                                    if not self.slice_from(u"r"):
+                                        return False
+                                elif among_var == 21:
+                                    if not self.slice_from(u"s"):
+                                        return False
+                                elif among_var == 22:
+                                    if not self.slice_from(u"t"):
+                                        return False
+                                elif among_var == 23:
+                                    if not self.slice_from(u"ć"):
+                                        return False
+                                elif among_var == 24:
+                                    if not self.slice_from(u"u"):
+                                        return False
+                                elif among_var == 25:
+                                    if not self.slice_from(u"f"):
+                                        return False
+                                elif among_var == 26:
+                                    if not self.slice_from(u"h"):
+                                        return False
+                                elif among_var == 27:
+                                    if not self.slice_from(u"c"):
+                                        return False
+                                elif among_var == 28:
+                                    if not self.slice_from(u"č"):
+                                        return False
+                                elif among_var == 29:
+                                    if not self.slice_from(u"dž"):
+                                        return False
+                                else:
+                                    if not self.slice_from(u"š"):
+                                        return False
+                                self.cursor = v_3
+                                raise lab2()
+                            except lab3: pass
+                            self.cursor = v_3
+                            if self.cursor >= self.limit:
+                                raise lab1()
+                            self.cursor += 1
+                    except lab2: pass
+                    continue
+                except lab1: pass
+                self.cursor = v_2
+                break
+        except lab0: pass
+        self.cursor = v_1
+        return True
+
+    def __r_prelude(self):
+        v_1 = self.cursor
+        try:
+            while True:
+                v_2 = self.cursor
+                try:
+                    try:
+                        while True:
+                            v_3 = self.cursor
+                            try:
+                                if not self.in_grouping(SerbianStemmer.g_ca):
+                                    raise lab3()
+                                self.bra = self.cursor
+                                if not self.eq_s(u"ije"):
+                                    raise lab3()
+                                self.ket = self.cursor
+                                if not self.in_grouping(SerbianStemmer.g_ca):
+                                    raise lab3()
+                                if not self.slice_from(u"e"):
+                                    return False
+                                self.cursor = v_3
+                                raise lab2()
+                            except lab3: pass
+                            self.cursor = v_3
+                            if self.cursor >= self.limit:
+                                raise lab1()
+                            self.cursor += 1
+                    except lab2: pass
+                    continue
+                except lab1: pass
+                self.cursor = v_2
+                break
+        except lab0: pass
+        self.cursor = v_1
+        v_4 = self.cursor
+        try:
+            while True:
+                v_5 = self.cursor
+                try:
+                    try:
+                        while True:
+                            v_6 = self.cursor
+                            try:
+                                if not self.in_grouping(SerbianStemmer.g_ca):
+                                    raise lab7()
+                                self.bra = self.cursor
+                                if not self.eq_s(u"je"):
+                                    raise lab7()
+                                self.ket = self.cursor
+                                if not self.in_grouping(SerbianStemmer.g_ca):
+                                    raise lab7()
+                                if not self.slice_from(u"e"):
+                                    return False
+                                self.cursor = v_6
+                                raise lab6()
+                            except lab7: pass
+                            self.cursor = v_6
+                            if self.cursor >= self.limit:
+                                raise lab5()
+                            self.cursor += 1
+                    except lab6: pass
+                    continue
+                except lab5: pass
+                self.cursor = v_5
+                break
+        except lab4: pass
+        self.cursor = v_4
+        v_7 = self.cursor
+        try:
+            while True:
+                v_8 = self.cursor
+                try:
+                    try:
+                        while True:
+                            v_9 = self.cursor
+                            try:
+                                self.bra = self.cursor
+                                if not self.eq_s(u"dj"):
+                                    raise lab11()
+                                self.ket = self.cursor
+                                if not self.slice_from(u"đ"):
+                                    return False
+                                self.cursor = v_9
+                                raise lab10()
+                            except lab11: pass
+                            self.cursor = v_9
+                            if self.cursor >= self.limit:
+                                raise lab9()
+                            self.cursor += 1
+                    except lab10: pass
+                    continue
+                except lab9: pass
+                self.cursor = v_8
+                break
+        except lab8: pass
+        self.cursor = v_7
+        return True
+
+    def __r_mark_regions(self):
+        self.B_no_diacritics = True
+        v_1 = self.cursor
+        try:
+            if not self.go_out_grouping(SerbianStemmer.g_sa):
+                raise lab0()
+            self.cursor += 1
+            self.B_no_diacritics = False
+        except lab0: pass
+        self.cursor = v_1
+        self.I_p1 = self.limit
+        v_2 = self.cursor
+        try:
+            if not self.go_out_grouping(SerbianStemmer.g_v):
+                raise lab1()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+            if self.I_p1 >= 2:
+                raise lab1()
+            if not self.go_in_grouping(SerbianStemmer.g_v):
+                raise lab1()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+        except lab1: pass
+        self.cursor = v_2
+        v_3 = self.cursor
+        try:
+            try:
+                while True:
+                    try:
+                        if not self.eq_s(u"r"):
+                            raise lab4()
+                        raise lab3()
+                    except lab4: pass
+                    if self.cursor >= self.limit:
+                        raise lab2()
+                    self.cursor += 1
+            except lab3: pass
+            try:
+                v_5 = self.cursor
+                try:
+                    if self.cursor < 2:
+                        raise lab6()
+                    raise lab5()
+                except lab6: pass
+                self.cursor = v_5
+                if not self.go_in_grouping(SerbianStemmer.g_rg):
+                    raise lab2()
+                self.cursor += 1
+            except lab5: pass
+            if (self.I_p1 - self.cursor) <= 1:
+                raise lab2()
+            self.I_p1 = self.cursor
+        except lab2: pass
+        self.cursor = v_3
+        return True
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_Step_1(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(SerbianStemmer.a_1)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"loga"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"peh"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"vojka"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"bojka"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"jak"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"čajni"):
+                return False
+        elif among_var == 7:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"cajni"):
+                return False
+        elif among_var == 8:
+            if not self.slice_from(u"erni"):
+                return False
+        elif among_var == 9:
+            if not self.slice_from(u"larni"):
+                return False
+        elif among_var == 10:
+            if not self.slice_from(u"esni"):
+                return False
+        elif among_var == 11:
+            if not self.slice_from(u"anjca"):
+                return False
+        elif among_var == 12:
+            if not self.slice_from(u"ajca"):
+                return False
+        elif among_var == 13:
+            if not self.slice_from(u"ljca"):
+                return False
+        elif among_var == 14:
+            if not self.slice_from(u"ejca"):
+                return False
+        elif among_var == 15:
+            if not self.slice_from(u"ojca"):
+                return False
+        elif among_var == 16:
+            if not self.slice_from(u"ajka"):
+                return False
+        elif among_var == 17:
+            if not self.slice_from(u"ojka"):
+                return False
+        elif among_var == 18:
+            if not self.slice_from(u"šca"):
+                return False
+        elif among_var == 19:
+            if not self.slice_from(u"ing"):
+                return False
+        elif among_var == 20:
+            if not self.slice_from(u"tvenik"):
+                return False
+        elif among_var == 21:
+            if not self.slice_from(u"tetika"):
+                return False
+        elif among_var == 22:
+            if not self.slice_from(u"nstva"):
+                return False
+        elif among_var == 23:
+            if not self.slice_from(u"nik"):
+                return False
+        elif among_var == 24:
+            if not self.slice_from(u"tik"):
+                return False
+        elif among_var == 25:
+            if not self.slice_from(u"zik"):
+                return False
+        elif among_var == 26:
+            if not self.slice_from(u"snik"):
+                return False
+        elif among_var == 27:
+            if not self.slice_from(u"kusi"):
+                return False
+        elif among_var == 28:
+            if not self.slice_from(u"kusni"):
+                return False
+        elif among_var == 29:
+            if not self.slice_from(u"kustva"):
+                return False
+        elif among_var == 30:
+            if not self.slice_from(u"dušni"):
+                return False
+        elif among_var == 31:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"dusni"):
+                return False
+        elif among_var == 32:
+            if not self.slice_from(u"antni"):
+                return False
+        elif among_var == 33:
+            if not self.slice_from(u"bilni"):
+                return False
+        elif among_var == 34:
+            if not self.slice_from(u"tilni"):
+                return False
+        elif among_var == 35:
+            if not self.slice_from(u"avilni"):
+                return False
+        elif among_var == 36:
+            if not self.slice_from(u"silni"):
+                return False
+        elif among_var == 37:
+            if not self.slice_from(u"gilni"):
+                return False
+        elif among_var == 38:
+            if not self.slice_from(u"rilni"):
+                return False
+        elif among_var == 39:
+            if not self.slice_from(u"nilni"):
+                return False
+        elif among_var == 40:
+            if not self.slice_from(u"alni"):
+                return False
+        elif among_var == 41:
+            if not self.slice_from(u"ozni"):
+                return False
+        elif among_var == 42:
+            if not self.slice_from(u"ravi"):
+                return False
+        elif among_var == 43:
+            if not self.slice_from(u"stavni"):
+                return False
+        elif among_var == 44:
+            if not self.slice_from(u"pravni"):
+                return False
+        elif among_var == 45:
+            if not self.slice_from(u"tivni"):
+                return False
+        elif among_var == 46:
+            if not self.slice_from(u"sivni"):
+                return False
+        elif among_var == 47:
+            if not self.slice_from(u"atni"):
+                return False
+        elif among_var == 48:
+            if not self.slice_from(u"enta"):
+                return False
+        elif among_var == 49:
+            if not self.slice_from(u"tetni"):
+                return False
+        elif among_var == 50:
+            if not self.slice_from(u"pletni"):
+                return False
+        elif among_var == 51:
+            if not self.slice_from(u"šavi"):
+                return False
+        elif among_var == 52:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"savi"):
+                return False
+        elif among_var == 53:
+            if not self.slice_from(u"anta"):
+                return False
+        elif among_var == 54:
+            if not self.slice_from(u"ačka"):
+                return False
+        elif among_var == 55:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"acka"):
+                return False
+        elif among_var == 56:
+            if not self.slice_from(u"uška"):
+                return False
+        elif among_var == 57:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"uska"):
+                return False
+        elif among_var == 58:
+            if not self.slice_from(u"atka"):
+                return False
+        elif among_var == 59:
+            if not self.slice_from(u"etka"):
+                return False
+        elif among_var == 60:
+            if not self.slice_from(u"itka"):
+                return False
+        elif among_var == 61:
+            if not self.slice_from(u"otka"):
+                return False
+        elif among_var == 62:
+            if not self.slice_from(u"utka"):
+                return False
+        elif among_var == 63:
+            if not self.slice_from(u"eskna"):
+                return False
+        elif among_var == 64:
+            if not self.slice_from(u"tični"):
+                return False
+        elif among_var == 65:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ticni"):
+                return False
+        elif among_var == 66:
+            if not self.slice_from(u"ojska"):
+                return False
+        elif among_var == 67:
+            if not self.slice_from(u"esma"):
+                return False
+        elif among_var == 68:
+            if not self.slice_from(u"metra"):
+                return False
+        elif among_var == 69:
+            if not self.slice_from(u"centra"):
+                return False
+        elif among_var == 70:
+            if not self.slice_from(u"istra"):
+                return False
+        elif among_var == 71:
+            if not self.slice_from(u"osti"):
+                return False
+        elif among_var == 72:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"osti"):
+                return False
+        elif among_var == 73:
+            if not self.slice_from(u"dba"):
+                return False
+        elif among_var == 74:
+            if not self.slice_from(u"čka"):
+                return False
+        elif among_var == 75:
+            if not self.slice_from(u"mca"):
+                return False
+        elif among_var == 76:
+            if not self.slice_from(u"nca"):
+                return False
+        elif among_var == 77:
+            if not self.slice_from(u"voljni"):
+                return False
+        elif among_var == 78:
+            if not self.slice_from(u"anki"):
+                return False
+        elif among_var == 79:
+            if not self.slice_from(u"vca"):
+                return False
+        elif among_var == 80:
+            if not self.slice_from(u"sca"):
+                return False
+        elif among_var == 81:
+            if not self.slice_from(u"rca"):
+                return False
+        elif among_var == 82:
+            if not self.slice_from(u"alca"):
+                return False
+        elif among_var == 83:
+            if not self.slice_from(u"elca"):
+                return False
+        elif among_var == 84:
+            if not self.slice_from(u"olca"):
+                return False
+        elif among_var == 85:
+            if not self.slice_from(u"njca"):
+                return False
+        elif among_var == 86:
+            if not self.slice_from(u"ekta"):
+                return False
+        elif among_var == 87:
+            if not self.slice_from(u"izma"):
+                return False
+        elif among_var == 88:
+            if not self.slice_from(u"jebi"):
+                return False
+        elif among_var == 89:
+            if not self.slice_from(u"baci"):
+                return False
+        elif among_var == 90:
+            if not self.slice_from(u"ašni"):
+                return False
+        else:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"asni"):
+                return False
+        return True
+
+    def __r_Step_2(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(SerbianStemmer.a_2)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if among_var == 1:
+            if not self.slice_from(u"sk"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"šk"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"stv"):
+                return False
+        elif among_var == 4:
+            if not self.slice_from(u"štv"):
+                return False
+        elif among_var == 5:
+            if not self.slice_from(u"tanij"):
+                return False
+        elif among_var == 6:
+            if not self.slice_from(u"manij"):
+                return False
+        elif among_var == 7:
+            if not self.slice_from(u"panij"):
+                return False
+        elif among_var == 8:
+            if not self.slice_from(u"ranij"):
+                return False
+        elif among_var == 9:
+            if not self.slice_from(u"ganij"):
+                return False
+        elif among_var == 10:
+            if not self.slice_from(u"an"):
+                return False
+        elif among_var == 11:
+            if not self.slice_from(u"in"):
+                return False
+        elif among_var == 12:
+            if not self.slice_from(u"on"):
+                return False
+        elif among_var == 13:
+            if not self.slice_from(u"n"):
+                return False
+        elif among_var == 14:
+            if not self.slice_from(u"ać"):
+                return False
+        elif among_var == 15:
+            if not self.slice_from(u"eć"):
+                return False
+        elif among_var == 16:
+            if not self.slice_from(u"uć"):
+                return False
+        elif among_var == 17:
+            if not self.slice_from(u"ugov"):
+                return False
+        elif among_var == 18:
+            if not self.slice_from(u"ug"):
+                return False
+        elif among_var == 19:
+            if not self.slice_from(u"log"):
+                return False
+        elif among_var == 20:
+            if not self.slice_from(u"g"):
+                return False
+        elif among_var == 21:
+            if not self.slice_from(u"rari"):
+                return False
+        elif among_var == 22:
+            if not self.slice_from(u"oti"):
+                return False
+        elif among_var == 23:
+            if not self.slice_from(u"si"):
+                return False
+        elif among_var == 24:
+            if not self.slice_from(u"li"):
+                return False
+        elif among_var == 25:
+            if not self.slice_from(u"uj"):
+                return False
+        elif among_var == 26:
+            if not self.slice_from(u"caj"):
+                return False
+        elif among_var == 27:
+            if not self.slice_from(u"čaj"):
+                return False
+        elif among_var == 28:
+            if not self.slice_from(u"ćaj"):
+                return False
+        elif among_var == 29:
+            if not self.slice_from(u"đaj"):
+                return False
+        elif among_var == 30:
+            if not self.slice_from(u"laj"):
+                return False
+        elif among_var == 31:
+            if not self.slice_from(u"raj"):
+                return False
+        elif among_var == 32:
+            if not self.slice_from(u"bij"):
+                return False
+        elif among_var == 33:
+            if not self.slice_from(u"cij"):
+                return False
+        elif among_var == 34:
+            if not self.slice_from(u"dij"):
+                return False
+        elif among_var == 35:
+            if not self.slice_from(u"lij"):
+                return False
+        elif among_var == 36:
+            if not self.slice_from(u"nij"):
+                return False
+        elif among_var == 37:
+            if not self.slice_from(u"mij"):
+                return False
+        elif among_var == 38:
+            if not self.slice_from(u"žij"):
+                return False
+        elif among_var == 39:
+            if not self.slice_from(u"gij"):
+                return False
+        elif among_var == 40:
+            if not self.slice_from(u"fij"):
+                return False
+        elif among_var == 41:
+            if not self.slice_from(u"pij"):
+                return False
+        elif among_var == 42:
+            if not self.slice_from(u"rij"):
+                return False
+        elif among_var == 43:
+            if not self.slice_from(u"sij"):
+                return False
+        elif among_var == 44:
+            if not self.slice_from(u"tij"):
+                return False
+        elif among_var == 45:
+            if not self.slice_from(u"zij"):
+                return False
+        elif among_var == 46:
+            if not self.slice_from(u"nal"):
+                return False
+        elif among_var == 47:
+            if not self.slice_from(u"ijal"):
+                return False
+        elif among_var == 48:
+            if not self.slice_from(u"ozil"):
+                return False
+        elif among_var == 49:
+            if not self.slice_from(u"olov"):
+                return False
+        elif among_var == 50:
+            if not self.slice_from(u"ol"):
+                return False
+        elif among_var == 51:
+            if not self.slice_from(u"lem"):
+                return False
+        elif among_var == 52:
+            if not self.slice_from(u"ram"):
+                return False
+        elif among_var == 53:
+            if not self.slice_from(u"ar"):
+                return False
+        elif among_var == 54:
+            if not self.slice_from(u"dr"):
+                return False
+        elif among_var == 55:
+            if not self.slice_from(u"er"):
+                return False
+        elif among_var == 56:
+            if not self.slice_from(u"or"):
+                return False
+        elif among_var == 57:
+            if not self.slice_from(u"es"):
+                return False
+        elif among_var == 58:
+            if not self.slice_from(u"is"):
+                return False
+        elif among_var == 59:
+            if not self.slice_from(u"taš"):
+                return False
+        elif among_var == 60:
+            if not self.slice_from(u"naš"):
+                return False
+        elif among_var == 61:
+            if not self.slice_from(u"jaš"):
+                return False
+        elif among_var == 62:
+            if not self.slice_from(u"kaš"):
+                return False
+        elif among_var == 63:
+            if not self.slice_from(u"baš"):
+                return False
+        elif among_var == 64:
+            if not self.slice_from(u"gaš"):
+                return False
+        elif among_var == 65:
+            if not self.slice_from(u"vaš"):
+                return False
+        elif among_var == 66:
+            if not self.slice_from(u"eš"):
+                return False
+        elif among_var == 67:
+            if not self.slice_from(u"iš"):
+                return False
+        elif among_var == 68:
+            if not self.slice_from(u"ikat"):
+                return False
+        elif among_var == 69:
+            if not self.slice_from(u"lat"):
+                return False
+        elif among_var == 70:
+            if not self.slice_from(u"et"):
+                return False
+        elif among_var == 71:
+            if not self.slice_from(u"est"):
+                return False
+        elif among_var == 72:
+            if not self.slice_from(u"ist"):
+                return False
+        elif among_var == 73:
+            if not self.slice_from(u"kst"):
+                return False
+        elif among_var == 74:
+            if not self.slice_from(u"ost"):
+                return False
+        elif among_var == 75:
+            if not self.slice_from(u"išt"):
+                return False
+        elif among_var == 76:
+            if not self.slice_from(u"ova"):
+                return False
+        elif among_var == 77:
+            if not self.slice_from(u"av"):
+                return False
+        elif among_var == 78:
+            if not self.slice_from(u"ev"):
+                return False
+        elif among_var == 79:
+            if not self.slice_from(u"iv"):
+                return False
+        elif among_var == 80:
+            if not self.slice_from(u"ov"):
+                return False
+        elif among_var == 81:
+            if not self.slice_from(u"mov"):
+                return False
+        elif among_var == 82:
+            if not self.slice_from(u"lov"):
+                return False
+        elif among_var == 83:
+            if not self.slice_from(u"el"):
+                return False
+        elif among_var == 84:
+            if not self.slice_from(u"anj"):
+                return False
+        elif among_var == 85:
+            if not self.slice_from(u"enj"):
+                return False
+        elif among_var == 86:
+            if not self.slice_from(u"šnj"):
+                return False
+        elif among_var == 87:
+            if not self.slice_from(u"en"):
+                return False
+        elif among_var == 88:
+            if not self.slice_from(u"šn"):
+                return False
+        elif among_var == 89:
+            if not self.slice_from(u"čin"):
+                return False
+        elif among_var == 90:
+            if not self.slice_from(u"roši"):
+                return False
+        elif among_var == 91:
+            if not self.slice_from(u"oš"):
+                return False
+        elif among_var == 92:
+            if not self.slice_from(u"evit"):
+                return False
+        elif among_var == 93:
+            if not self.slice_from(u"ovit"):
+                return False
+        elif among_var == 94:
+            if not self.slice_from(u"ast"):
+                return False
+        elif among_var == 95:
+            if not self.slice_from(u"k"):
+                return False
+        elif among_var == 96:
+            if not self.slice_from(u"eva"):
+                return False
+        elif among_var == 97:
+            if not self.slice_from(u"ava"):
+                return False
+        elif among_var == 98:
+            if not self.slice_from(u"iva"):
+                return False
+        elif among_var == 99:
+            if not self.slice_from(u"uva"):
+                return False
+        elif among_var == 100:
+            if not self.slice_from(u"ir"):
+                return False
+        elif among_var == 101:
+            if not self.slice_from(u"ač"):
+                return False
+        elif among_var == 102:
+            if not self.slice_from(u"ača"):
+                return False
+        elif among_var == 103:
+            if not self.slice_from(u"ni"):
+                return False
+        elif among_var == 104:
+            if not self.slice_from(u"a"):
+                return False
+        elif among_var == 105:
+            if not self.slice_from(u"ur"):
+                return False
+        elif among_var == 106:
+            if not self.slice_from(u"astaj"):
+                return False
+        elif among_var == 107:
+            if not self.slice_from(u"istaj"):
+                return False
+        elif among_var == 108:
+            if not self.slice_from(u"ostaj"):
+                return False
+        elif among_var == 109:
+            if not self.slice_from(u"aj"):
+                return False
+        elif among_var == 110:
+            if not self.slice_from(u"asta"):
+                return False
+        elif among_var == 111:
+            if not self.slice_from(u"ista"):
+                return False
+        elif among_var == 112:
+            if not self.slice_from(u"osta"):
+                return False
+        elif among_var == 113:
+            if not self.slice_from(u"ta"):
+                return False
+        elif among_var == 114:
+            if not self.slice_from(u"inj"):
+                return False
+        elif among_var == 115:
+            if not self.slice_from(u"as"):
+                return False
+        elif among_var == 116:
+            if not self.slice_from(u"i"):
+                return False
+        elif among_var == 117:
+            if not self.slice_from(u"luč"):
+                return False
+        elif among_var == 118:
+            if not self.slice_from(u"jeti"):
+                return False
+        elif among_var == 119:
+            if not self.slice_from(u"e"):
+                return False
+        elif among_var == 120:
+            if not self.slice_from(u"at"):
+                return False
+        elif among_var == 121:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"luc"):
+                return False
+        elif among_var == 122:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"snj"):
+                return False
+        elif among_var == 123:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"os"):
+                return False
+        elif among_var == 124:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ac"):
+                return False
+        elif among_var == 125:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ec"):
+                return False
+        elif among_var == 126:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"uc"):
+                return False
+        elif among_var == 127:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"rosi"):
+                return False
+        elif among_var == 128:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"aca"):
+                return False
+        elif among_var == 129:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"jas"):
+                return False
+        elif among_var == 130:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"tas"):
+                return False
+        elif among_var == 131:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"gas"):
+                return False
+        elif among_var == 132:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"nas"):
+                return False
+        elif among_var == 133:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"kas"):
+                return False
+        elif among_var == 134:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"vas"):
+                return False
+        elif among_var == 135:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"bas"):
+                return False
+        elif among_var == 136:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"as"):
+                return False
+        elif among_var == 137:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"cin"):
+                return False
+        elif among_var == 138:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"astaj"):
+                return False
+        elif among_var == 139:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"istaj"):
+                return False
+        elif among_var == 140:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ostaj"):
+                return False
+        elif among_var == 141:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"asta"):
+                return False
+        elif among_var == 142:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ista"):
+                return False
+        elif among_var == 143:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"osta"):
+                return False
+        elif among_var == 144:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ava"):
+                return False
+        elif among_var == 145:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"eva"):
+                return False
+        elif among_var == 146:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"iva"):
+                return False
+        elif among_var == 147:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"uva"):
+                return False
+        elif among_var == 148:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ova"):
+                return False
+        elif among_var == 149:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"jeti"):
+                return False
+        elif among_var == 150:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"inj"):
+                return False
+        elif among_var == 151:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ist"):
+                return False
+        elif among_var == 152:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"es"):
+                return False
+        elif among_var == 153:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"et"):
+                return False
+        elif among_var == 154:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"is"):
+                return False
+        elif among_var == 155:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ir"):
+                return False
+        elif among_var == 156:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ur"):
+                return False
+        elif among_var == 157:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"uj"):
+                return False
+        elif among_var == 158:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ni"):
+                return False
+        elif among_var == 159:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"sn"):
+                return False
+        elif among_var == 160:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"ta"):
+                return False
+        elif among_var == 161:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"a"):
+                return False
+        elif among_var == 162:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"i"):
+                return False
+        elif among_var == 163:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"e"):
+                return False
+        else:
+            if not self.B_no_diacritics:
+                return False
+            if not self.slice_from(u"n"):
+                return False
+        return True
+
+    def __r_Step_3(self):
+        self.ket = self.cursor
+        if self.find_among_b(SerbianStemmer.a_3) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.__r_R1():
+            return False
+        if not self.slice_from(u""):
+            return False
+        return True
+
+    def _stem(self):
+        self.__r_cyr_to_lat()
+        self.__r_prelude()
+        self.__r_mark_regions()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_4 = self.limit - self.cursor
+        self.__r_Step_1()
+        self.cursor = self.limit - v_4
+        v_5 = self.limit - self.cursor
+        try:
+            try:
+                v_6 = self.limit - self.cursor
+                try:
+                    if not self.__r_Step_2():
+                        raise lab2()
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_6
+                if not self.__r_Step_3():
+                    raise lab0()
+            except lab1: pass
+        except lab0: pass
+        self.cursor = self.limit - v_5
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"а", -1, 1),
+        Among(u"б", -1, 2),
+        Among(u"в", -1, 3),
+        Among(u"г", -1, 4),
+        Among(u"д", -1, 5),
+        Among(u"е", -1, 7),
+        Among(u"ж", -1, 8),
+        Among(u"з", -1, 9),
+        Among(u"и", -1, 10),
+        Among(u"к", -1, 12),
+        Among(u"л", -1, 13),
+        Among(u"м", -1, 15),
+        Among(u"н", -1, 16),
+        Among(u"о", -1, 18),
+        Among(u"п", -1, 19),
+        Among(u"р", -1, 20),
+        Among(u"с", -1, 21),
+        Among(u"т", -1, 22),
+        Among(u"у", -1, 24),
+        Among(u"ф", -1, 25),
+        Among(u"х", -1, 26),
+        Among(u"ц", -1, 27),
+        Among(u"ч", -1, 28),
+        Among(u"ш", -1, 30),
+        Among(u"ђ", -1, 6),
+        Among(u"ј", -1, 11),
+        Among(u"љ", -1, 14),
+        Among(u"њ", -1, 17),
+        Among(u"ћ", -1, 23),
+        Among(u"џ", -1, 29)
+    ]
+
+    a_1 = [
+        Among(u"daba", -1, 73),
+        Among(u"ajaca", -1, 12),
+        Among(u"ejaca", -1, 14),
+        Among(u"ljaca", -1, 13),
+        Among(u"njaca", -1, 85),
+        Among(u"ojaca", -1, 15),
+        Among(u"alaca", -1, 82),
+        Among(u"elaca", -1, 83),
+        Among(u"olaca", -1, 84),
+        Among(u"maca", -1, 75),
+        Among(u"naca", -1, 76),
+        Among(u"raca", -1, 81),
+        Among(u"saca", -1, 80),
+        Among(u"vaca", -1, 79),
+        Among(u"šaca", -1, 18),
+        Among(u"aoca", -1, 82),
+        Among(u"acaka", -1, 55),
+        Among(u"ajaka", -1, 16),
+        Among(u"ojaka", -1, 17),
+        Among(u"anaka", -1, 78),
+        Among(u"ataka", -1, 58),
+        Among(u"etaka", -1, 59),
+        Among(u"itaka", -1, 60),
+        Among(u"otaka", -1, 61),
+        Among(u"utaka", -1, 62),
+        Among(u"ačaka", -1, 54),
+        Among(u"esama", -1, 67),
+        Among(u"izama", -1, 87),
+        Among(u"jacima", -1, 5),
+        Among(u"nicima", -1, 23),
+        Among(u"ticima", -1, 24),
+        Among(u"teticima", 30, 21),
+        Among(u"zicima", -1, 25),
+        Among(u"atcima", -1, 58),
+        Among(u"utcima", -1, 62),
+        Among(u"čcima", -1, 74),
+        Among(u"pesima", -1, 2),
+        Among(u"inzima", -1, 19),
+        Among(u"lozima", -1, 1),
+        Among(u"metara", -1, 68),
+        Among(u"centara", -1, 69),
+        Among(u"istara", -1, 70),
+        Among(u"ekata", -1, 86),
+        Among(u"anata", -1, 53),
+        Among(u"nstava", -1, 22),
+        Among(u"kustava", -1, 29),
+        Among(u"ajac", -1, 12),
+        Among(u"ejac", -1, 14),
+        Among(u"ljac", -1, 13),
+        Among(u"njac", -1, 85),
+        Among(u"anjac", 49, 11),
+        Among(u"ojac", -1, 15),
+        Among(u"alac", -1, 82),
+        Among(u"elac", -1, 83),
+        Among(u"olac", -1, 84),
+        Among(u"mac", -1, 75),
+        Among(u"nac", -1, 76),
+        Among(u"rac", -1, 81),
+        Among(u"sac", -1, 80),
+        Among(u"vac", -1, 79),
+        Among(u"šac", -1, 18),
+        Among(u"jebe", -1, 88),
+        Among(u"olce", -1, 84),
+        Among(u"kuse", -1, 27),
+        Among(u"rave", -1, 42),
+        Among(u"save", -1, 52),
+        Among(u"šave", -1, 51),
+        Among(u"baci", -1, 89),
+        Among(u"jaci", -1, 5),
+        Among(u"tvenici", -1, 20),
+        Among(u"snici", -1, 26),
+        Among(u"tetici", -1, 21),
+        Among(u"bojci", -1, 4),
+        Among(u"vojci", -1, 3),
+        Among(u"ojsci", -1, 66),
+        Among(u"atci", -1, 58),
+        Among(u"itci", -1, 60),
+        Among(u"utci", -1, 62),
+        Among(u"čci", -1, 74),
+        Among(u"pesi", -1, 2),
+        Among(u"inzi", -1, 19),
+        Among(u"lozi", -1, 1),
+        Among(u"acak", -1, 55),
+        Among(u"usak", -1, 57),
+        Among(u"atak", -1, 58),
+        Among(u"etak", -1, 59),
+        Among(u"itak", -1, 60),
+        Among(u"otak", -1, 61),
+        Among(u"utak", -1, 62),
+        Among(u"ačak", -1, 54),
+        Among(u"ušak", -1, 56),
+        Among(u"izam", -1, 87),
+        Among(u"tican", -1, 65),
+        Among(u"cajan", -1, 7),
+        Among(u"čajan", -1, 6),
+        Among(u"voljan", -1, 77),
+        Among(u"eskan", -1, 63),
+        Among(u"alan", -1, 40),
+        Among(u"bilan", -1, 33),
+        Among(u"gilan", -1, 37),
+        Among(u"nilan", -1, 39),
+        Among(u"rilan", -1, 38),
+        Among(u"silan", -1, 36),
+        Among(u"tilan", -1, 34),
+        Among(u"avilan", -1, 35),
+        Among(u"laran", -1, 9),
+        Among(u"eran", -1, 8),
+        Among(u"asan", -1, 91),
+        Among(u"esan", -1, 10),
+        Among(u"dusan", -1, 31),
+        Among(u"kusan", -1, 28),
+        Among(u"atan", -1, 47),
+        Among(u"pletan", -1, 50),
+        Among(u"tetan", -1, 49),
+        Among(u"antan", -1, 32),
+        Among(u"pravan", -1, 44),
+        Among(u"stavan", -1, 43),
+        Among(u"sivan", -1, 46),
+        Among(u"tivan", -1, 45),
+        Among(u"ozan", -1, 41),
+        Among(u"tičan", -1, 64),
+        Among(u"ašan", -1, 90),
+        Among(u"dušan", -1, 30),
+        Among(u"metar", -1, 68),
+        Among(u"centar", -1, 69),
+        Among(u"istar", -1, 70),
+        Among(u"ekat", -1, 86),
+        Among(u"enat", -1, 48),
+        Among(u"oscu", -1, 72),
+        Among(u"ošću", -1, 71)
+    ]
+
+    a_2 = [
+        Among(u"aca", -1, 124),
+        Among(u"eca", -1, 125),
+        Among(u"uca", -1, 126),
+        Among(u"ga", -1, 20),
+        Among(u"acega", 3, 124),
+        Among(u"ecega", 3, 125),
+        Among(u"ucega", 3, 126),
+        Among(u"anjijega", 3, 84),
+        Among(u"enjijega", 3, 85),
+        Among(u"snjijega", 3, 122),
+        Among(u"šnjijega", 3, 86),
+        Among(u"kijega", 3, 95),
+        Among(u"skijega", 11, 1),
+        Among(u"škijega", 11, 2),
+        Among(u"elijega", 3, 83),
+        Among(u"nijega", 3, 13),
+        Among(u"osijega", 3, 123),
+        Among(u"atijega", 3, 120),
+        Among(u"evitijega", 3, 92),
+        Among(u"ovitijega", 3, 93),
+        Among(u"astijega", 3, 94),
+        Among(u"avijega", 3, 77),
+        Among(u"evijega", 3, 78),
+        Among(u"ivijega", 3, 79),
+        Among(u"ovijega", 3, 80),
+        Among(u"ošijega", 3, 91),
+        Among(u"anjega", 3, 84),
+        Among(u"enjega", 3, 85),
+        Among(u"snjega", 3, 122),
+        Among(u"šnjega", 3, 86),
+        Among(u"kega", 3, 95),
+        Among(u"skega", 30, 1),
+        Among(u"škega", 30, 2),
+        Among(u"elega", 3, 83),
+        Among(u"nega", 3, 13),
+        Among(u"anega", 34, 10),
+        Among(u"enega", 34, 87),
+        Among(u"snega", 34, 159),
+        Among(u"šnega", 34, 88),
+        Among(u"osega", 3, 123),
+        Among(u"atega", 3, 120),
+        Among(u"evitega", 3, 92),
+        Among(u"ovitega", 3, 93),
+        Among(u"astega", 3, 94),
+        Among(u"avega", 3, 77),
+        Among(u"evega", 3, 78),
+        Among(u"ivega", 3, 79),
+        Among(u"ovega", 3, 80),
+        Among(u"aćega", 3, 14),
+        Among(u"ećega", 3, 15),
+        Among(u"ućega", 3, 16),
+        Among(u"ošega", 3, 91),
+        Among(u"acoga", 3, 124),
+        Among(u"ecoga", 3, 125),
+        Among(u"ucoga", 3, 126),
+        Among(u"anjoga", 3, 84),
+        Among(u"enjoga", 3, 85),
+        Among(u"snjoga", 3, 122),
+        Among(u"šnjoga", 3, 86),
+        Among(u"koga", 3, 95),
+        Among(u"skoga", 59, 1),
+        Among(u"škoga", 59, 2),
+        Among(u"loga", 3, 19),
+        Among(u"eloga", 62, 83),
+        Among(u"noga", 3, 13),
+        Among(u"cinoga", 64, 137),
+        Among(u"činoga", 64, 89),
+        Among(u"osoga", 3, 123),
+        Among(u"atoga", 3, 120),
+        Among(u"evitoga", 3, 92),
+        Among(u"ovitoga", 3, 93),
+        Among(u"astoga", 3, 94),
+        Among(u"avoga", 3, 77),
+        Among(u"evoga", 3, 78),
+        Among(u"ivoga", 3, 79),
+        Among(u"ovoga", 3, 80),
+        Among(u"aćoga", 3, 14),
+        Among(u"ećoga", 3, 15),
+        Among(u"ućoga", 3, 16),
+        Among(u"ošoga", 3, 91),
+        Among(u"uga", 3, 18),
+        Among(u"aja", -1, 109),
+        Among(u"caja", 81, 26),
+        Among(u"laja", 81, 30),
+        Among(u"raja", 81, 31),
+        Among(u"ćaja", 81, 28),
+        Among(u"čaja", 81, 27),
+        Among(u"đaja", 81, 29),
+        Among(u"bija", -1, 32),
+        Among(u"cija", -1, 33),
+        Among(u"dija", -1, 34),
+        Among(u"fija", -1, 40),
+        Among(u"gija", -1, 39),
+        Among(u"anjija", -1, 84),
+        Among(u"enjija", -1, 85),
+        Among(u"snjija", -1, 122),
+        Among(u"šnjija", -1, 86),
+        Among(u"kija", -1, 95),
+        Among(u"skija", 97, 1),
+        Among(u"škija", 97, 2),
+        Among(u"lija", -1, 24),
+        Among(u"elija", 100, 83),
+        Among(u"mija", -1, 37),
+        Among(u"nija", -1, 13),
+        Among(u"ganija", 103, 9),
+        Among(u"manija", 103, 6),
+        Among(u"panija", 103, 7),
+        Among(u"ranija", 103, 8),
+        Among(u"tanija", 103, 5),
+        Among(u"pija", -1, 41),
+        Among(u"rija", -1, 42),
+        Among(u"rarija", 110, 21),
+        Among(u"sija", -1, 23),
+        Among(u"osija", 112, 123),
+        Among(u"tija", -1, 44),
+        Among(u"atija", 114, 120),
+        Among(u"evitija", 114, 92),
+        Among(u"ovitija", 114, 93),
+        Among(u"otija", 114, 22),
+        Among(u"astija", 114, 94),
+        Among(u"avija", -1, 77),
+        Among(u"evija", -1, 78),
+        Among(u"ivija", -1, 79),
+        Among(u"ovija", -1, 80),
+        Among(u"zija", -1, 45),
+        Among(u"ošija", -1, 91),
+        Among(u"žija", -1, 38),
+        Among(u"anja", -1, 84),
+        Among(u"enja", -1, 85),
+        Among(u"snja", -1, 122),
+        Among(u"šnja", -1, 86),
+        Among(u"ka", -1, 95),
+        Among(u"ska", 131, 1),
+        Among(u"ška", 131, 2),
+        Among(u"ala", -1, 104),
+        Among(u"acala", 134, 128),
+        Among(u"astajala", 134, 106),
+        Among(u"istajala", 134, 107),
+        Among(u"ostajala", 134, 108),
+        Among(u"ijala", 134, 47),
+        Among(u"injala", 134, 114),
+        Among(u"nala", 134, 46),
+        Among(u"irala", 134, 100),
+        Among(u"urala", 134, 105),
+        Among(u"tala", 134, 113),
+        Among(u"astala", 144, 110),
+        Among(u"istala", 144, 111),
+        Among(u"ostala", 144, 112),
+        Among(u"avala", 134, 97),
+        Among(u"evala", 134, 96),
+        Among(u"ivala", 134, 98),
+        Among(u"ovala", 134, 76),
+        Among(u"uvala", 134, 99),
+        Among(u"ačala", 134, 102),
+        Among(u"ela", -1, 83),
+        Among(u"ila", -1, 116),
+        Among(u"acila", 155, 124),
+        Among(u"lucila", 155, 121),
+        Among(u"nila", 155, 103),
+        Among(u"astanila", 158, 110),
+        Among(u"istanila", 158, 111),
+        Among(u"ostanila", 158, 112),
+        Among(u"rosila", 155, 127),
+        Among(u"jetila", 155, 118),
+        Among(u"ozila", 155, 48),
+        Among(u"ačila", 155, 101),
+        Among(u"lučila", 155, 117),
+        Among(u"rošila", 155, 90),
+        Among(u"ola", -1, 50),
+        Among(u"asla", -1, 115),
+        Among(u"nula", -1, 13),
+        Among(u"gama", -1, 20),
+        Among(u"logama", 171, 19),
+        Among(u"ugama", 171, 18),
+        Among(u"ajama", -1, 109),
+        Among(u"cajama", 174, 26),
+        Among(u"lajama", 174, 30),
+        Among(u"rajama", 174, 31),
+        Among(u"ćajama", 174, 28),
+        Among(u"čajama", 174, 27),
+        Among(u"đajama", 174, 29),
+        Among(u"bijama", -1, 32),
+        Among(u"cijama", -1, 33),
+        Among(u"dijama", -1, 34),
+        Among(u"fijama", -1, 40),
+        Among(u"gijama", -1, 39),
+        Among(u"lijama", -1, 35),
+        Among(u"mijama", -1, 37),
+        Among(u"nijama", -1, 36),
+        Among(u"ganijama", 188, 9),
+        Among(u"manijama", 188, 6),
+        Among(u"panijama", 188, 7),
+        Among(u"ranijama", 188, 8),
+        Among(u"tanijama", 188, 5),
+        Among(u"pijama", -1, 41),
+        Among(u"rijama", -1, 42),
+        Among(u"sijama", -1, 43),
+        Among(u"tijama", -1, 44),
+        Among(u"zijama", -1, 45),
+        Among(u"žijama", -1, 38),
+        Among(u"alama", -1, 104),
+        Among(u"ijalama", 200, 47),
+        Among(u"nalama", 200, 46),
+        Among(u"elama", -1, 119),
+        Among(u"ilama", -1, 116),
+        Among(u"ramama", -1, 52),
+        Among(u"lemama", -1, 51),
+        Among(u"inama", -1, 11),
+        Among(u"cinama", 207, 137),
+        Among(u"činama", 207, 89),
+        Among(u"rama", -1, 52),
+        Among(u"arama", 210, 53),
+        Among(u"drama", 210, 54),
+        Among(u"erama", 210, 55),
+        Among(u"orama", 210, 56),
+        Among(u"basama", -1, 135),
+        Among(u"gasama", -1, 131),
+        Among(u"jasama", -1, 129),
+        Among(u"kasama", -1, 133),
+        Among(u"nasama", -1, 132),
+        Among(u"tasama", -1, 130),
+        Among(u"vasama", -1, 134),
+        Among(u"esama", -1, 152),
+        Among(u"isama", -1, 154),
+        Among(u"etama", -1, 70),
+        Among(u"estama", -1, 71),
+        Among(u"istama", -1, 72),
+        Among(u"kstama", -1, 73),
+        Among(u"ostama", -1, 74),
+        Among(u"avama", -1, 77),
+        Among(u"evama", -1, 78),
+        Among(u"ivama", -1, 79),
+        Among(u"bašama", -1, 63),
+        Among(u"gašama", -1, 64),
+        Among(u"jašama", -1, 61),
+        Among(u"kašama", -1, 62),
+        Among(u"našama", -1, 60),
+        Among(u"tašama", -1, 59),
+        Among(u"vašama", -1, 65),
+        Among(u"ešama", -1, 66),
+        Among(u"išama", -1, 67),
+        Among(u"lema", -1, 51),
+        Among(u"acima", -1, 124),
+        Among(u"ecima", -1, 125),
+        Among(u"ucima", -1, 126),
+        Among(u"ajima", -1, 109),
+        Among(u"cajima", 245, 26),
+        Among(u"lajima", 245, 30),
+        Among(u"rajima", 245, 31),
+        Among(u"ćajima", 245, 28),
+        Among(u"čajima", 245, 27),
+        Among(u"đajima", 245, 29),
+        Among(u"bijima", -1, 32),
+        Among(u"cijima", -1, 33),
+        Among(u"dijima", -1, 34),
+        Among(u"fijima", -1, 40),
+        Among(u"gijima", -1, 39),
+        Among(u"anjijima", -1, 84),
+        Among(u"enjijima", -1, 85),
+        Among(u"snjijima", -1, 122),
+        Among(u"šnjijima", -1, 86),
+        Among(u"kijima", -1, 95),
+        Among(u"skijima", 261, 1),
+        Among(u"škijima", 261, 2),
+        Among(u"lijima", -1, 35),
+        Among(u"elijima", 264, 83),
+        Among(u"mijima", -1, 37),
+        Among(u"nijima", -1, 13),
+        Among(u"ganijima", 267, 9),
+        Among(u"manijima", 267, 6),
+        Among(u"panijima", 267, 7),
+        Among(u"ranijima", 267, 8),
+        Among(u"tanijima", 267, 5),
+        Among(u"pijima", -1, 41),
+        Among(u"rijima", -1, 42),
+        Among(u"sijima", -1, 43),
+        Among(u"osijima", 275, 123),
+        Among(u"tijima", -1, 44),
+        Among(u"atijima", 277, 120),
+        Among(u"evitijima", 277, 92),
+        Among(u"ovitijima", 277, 93),
+        Among(u"astijima", 277, 94),
+        Among(u"avijima", -1, 77),
+        Among(u"evijima", -1, 78),
+        Among(u"ivijima", -1, 79),
+        Among(u"ovijima", -1, 80),
+        Among(u"zijima", -1, 45),
+        Among(u"ošijima", -1, 91),
+        Among(u"žijima", -1, 38),
+        Among(u"anjima", -1, 84),
+        Among(u"enjima", -1, 85),
+        Among(u"snjima", -1, 122),
+        Among(u"šnjima", -1, 86),
+        Among(u"kima", -1, 95),
+        Among(u"skima", 293, 1),
+        Among(u"škima", 293, 2),
+        Among(u"alima", -1, 104),
+        Among(u"ijalima", 296, 47),
+        Among(u"nalima", 296, 46),
+        Among(u"elima", -1, 83),
+        Among(u"ilima", -1, 116),
+        Among(u"ozilima", 300, 48),
+        Among(u"olima", -1, 50),
+        Among(u"lemima", -1, 51),
+        Among(u"nima", -1, 13),
+        Among(u"anima", 304, 10),
+        Among(u"inima", 304, 11),
+        Among(u"cinima", 306, 137),
+        Among(u"činima", 306, 89),
+        Among(u"onima", 304, 12),
+        Among(u"arima", -1, 53),
+        Among(u"drima", -1, 54),
+        Among(u"erima", -1, 55),
+        Among(u"orima", -1, 56),
+        Among(u"basima", -1, 135),
+        Among(u"gasima", -1, 131),
+        Among(u"jasima", -1, 129),
+        Among(u"kasima", -1, 133),
+        Among(u"nasima", -1, 132),
+        Among(u"tasima", -1, 130),
+        Among(u"vasima", -1, 134),
+        Among(u"esima", -1, 57),
+        Among(u"isima", -1, 58),
+        Among(u"osima", -1, 123),
+        Among(u"atima", -1, 120),
+        Among(u"ikatima", 324, 68),
+        Among(u"latima", 324, 69),
+        Among(u"etima", -1, 70),
+        Among(u"evitima", -1, 92),
+        Among(u"ovitima", -1, 93),
+        Among(u"astima", -1, 94),
+        Among(u"estima", -1, 71),
+        Among(u"istima", -1, 72),
+        Among(u"kstima", -1, 73),
+        Among(u"ostima", -1, 74),
+        Among(u"ištima", -1, 75),
+        Among(u"avima", -1, 77),
+        Among(u"evima", -1, 78),
+        Among(u"ajevima", 337, 109),
+        Among(u"cajevima", 338, 26),
+        Among(u"lajevima", 338, 30),
+        Among(u"rajevima", 338, 31),
+        Among(u"ćajevima", 338, 28),
+        Among(u"čajevima", 338, 27),
+        Among(u"đajevima", 338, 29),
+        Among(u"ivima", -1, 79),
+        Among(u"ovima", -1, 80),
+        Among(u"govima", 346, 20),
+        Among(u"ugovima", 347, 17),
+        Among(u"lovima", 346, 82),
+        Among(u"olovima", 349, 49),
+        Among(u"movima", 346, 81),
+        Among(u"onovima", 346, 12),
+        Among(u"stvima", -1, 3),
+        Among(u"štvima", -1, 4),
+        Among(u"aćima", -1, 14),
+        Among(u"ećima", -1, 15),
+        Among(u"ućima", -1, 16),
+        Among(u"bašima", -1, 63),
+        Among(u"gašima", -1, 64),
+        Among(u"jašima", -1, 61),
+        Among(u"kašima", -1, 62),
+        Among(u"našima", -1, 60),
+        Among(u"tašima", -1, 59),
+        Among(u"vašima", -1, 65),
+        Among(u"ešima", -1, 66),
+        Among(u"išima", -1, 67),
+        Among(u"ošima", -1, 91),
+        Among(u"na", -1, 13),
+        Among(u"ana", 368, 10),
+        Among(u"acana", 369, 128),
+        Among(u"urana", 369, 105),
+        Among(u"tana", 369, 113),
+        Among(u"avana", 369, 97),
+        Among(u"evana", 369, 96),
+        Among(u"ivana", 369, 98),
+        Among(u"uvana", 369, 99),
+        Among(u"ačana", 369, 102),
+        Among(u"acena", 368, 124),
+        Among(u"lucena", 368, 121),
+        Among(u"ačena", 368, 101),
+        Among(u"lučena", 368, 117),
+        Among(u"ina", 368, 11),
+        Among(u"cina", 382, 137),
+        Among(u"anina", 382, 10),
+        Among(u"čina", 382, 89),
+        Among(u"ona", 368, 12),
+        Among(u"ara", -1, 53),
+        Among(u"dra", -1, 54),
+        Among(u"era", -1, 55),
+        Among(u"ora", -1, 56),
+        Among(u"basa", -1, 135),
+        Among(u"gasa", -1, 131),
+        Among(u"jasa", -1, 129),
+        Among(u"kasa", -1, 133),
+        Among(u"nasa", -1, 132),
+        Among(u"tasa", -1, 130),
+        Among(u"vasa", -1, 134),
+        Among(u"esa", -1, 57),
+        Among(u"isa", -1, 58),
+        Among(u"osa", -1, 123),
+        Among(u"ata", -1, 120),
+        Among(u"ikata", 401, 68),
+        Among(u"lata", 401, 69),
+        Among(u"eta", -1, 70),
+        Among(u"evita", -1, 92),
+        Among(u"ovita", -1, 93),
+        Among(u"asta", -1, 94),
+        Among(u"esta", -1, 71),
+        Among(u"ista", -1, 72),
+        Among(u"ksta", -1, 73),
+        Among(u"osta", -1, 74),
+        Among(u"nuta", -1, 13),
+        Among(u"išta", -1, 75),
+        Among(u"ava", -1, 77),
+        Among(u"eva", -1, 78),
+        Among(u"ajeva", 415, 109),
+        Among(u"cajeva", 416, 26),
+        Among(u"lajeva", 416, 30),
+        Among(u"rajeva", 416, 31),
+        Among(u"ćajeva", 416, 28),
+        Among(u"čajeva", 416, 27),
+        Among(u"đajeva", 416, 29),
+        Among(u"iva", -1, 79),
+        Among(u"ova", -1, 80),
+        Among(u"gova", 424, 20),
+        Among(u"ugova", 425, 17),
+        Among(u"lova", 424, 82),
+        Among(u"olova", 427, 49),
+        Among(u"mova", 424, 81),
+        Among(u"onova", 424, 12),
+        Among(u"stva", -1, 3),
+        Among(u"štva", -1, 4),
+        Among(u"aća", -1, 14),
+        Among(u"eća", -1, 15),
+        Among(u"uća", -1, 16),
+        Among(u"baša", -1, 63),
+        Among(u"gaša", -1, 64),
+        Among(u"jaša", -1, 61),
+        Among(u"kaša", -1, 62),
+        Among(u"naša", -1, 60),
+        Among(u"taša", -1, 59),
+        Among(u"vaša", -1, 65),
+        Among(u"eša", -1, 66),
+        Among(u"iša", -1, 67),
+        Among(u"oša", -1, 91),
+        Among(u"ace", -1, 124),
+        Among(u"ece", -1, 125),
+        Among(u"uce", -1, 126),
+        Among(u"luce", 448, 121),
+        Among(u"astade", -1, 110),
+        Among(u"istade", -1, 111),
+        Among(u"ostade", -1, 112),
+        Among(u"ge", -1, 20),
+        Among(u"loge", 453, 19),
+        Among(u"uge", 453, 18),
+        Among(u"aje", -1, 104),
+        Among(u"caje", 456, 26),
+        Among(u"laje", 456, 30),
+        Among(u"raje", 456, 31),
+        Among(u"astaje", 456, 106),
+        Among(u"istaje", 456, 107),
+        Among(u"ostaje", 456, 108),
+        Among(u"ćaje", 456, 28),
+        Among(u"čaje", 456, 27),
+        Among(u"đaje", 456, 29),
+        Among(u"ije", -1, 116),
+        Among(u"bije", 466, 32),
+        Among(u"cije", 466, 33),
+        Among(u"dije", 466, 34),
+        Among(u"fije", 466, 40),
+        Among(u"gije", 466, 39),
+        Among(u"anjije", 466, 84),
+        Among(u"enjije", 466, 85),
+        Among(u"snjije", 466, 122),
+        Among(u"šnjije", 466, 86),
+        Among(u"kije", 466, 95),
+        Among(u"skije", 476, 1),
+        Among(u"škije", 476, 2),
+        Among(u"lije", 466, 35),
+        Among(u"elije", 479, 83),
+        Among(u"mije", 466, 37),
+        Among(u"nije", 466, 13),
+        Among(u"ganije", 482, 9),
+        Among(u"manije", 482, 6),
+        Among(u"panije", 482, 7),
+        Among(u"ranije", 482, 8),
+        Among(u"tanije", 482, 5),
+        Among(u"pije", 466, 41),
+        Among(u"rije", 466, 42),
+        Among(u"sije", 466, 43),
+        Among(u"osije", 490, 123),
+        Among(u"tije", 466, 44),
+        Among(u"atije", 492, 120),
+        Among(u"evitije", 492, 92),
+        Among(u"ovitije", 492, 93),
+        Among(u"astije", 492, 94),
+        Among(u"avije", 466, 77),
+        Among(u"evije", 466, 78),
+        Among(u"ivije", 466, 79),
+        Among(u"ovije", 466, 80),
+        Among(u"zije", 466, 45),
+        Among(u"ošije", 466, 91),
+        Among(u"žije", 466, 38),
+        Among(u"anje", -1, 84),
+        Among(u"enje", -1, 85),
+        Among(u"snje", -1, 122),
+        Among(u"šnje", -1, 86),
+        Among(u"uje", -1, 25),
+        Among(u"lucuje", 508, 121),
+        Among(u"iruje", 508, 100),
+        Among(u"lučuje", 508, 117),
+        Among(u"ke", -1, 95),
+        Among(u"ske", 512, 1),
+        Among(u"ške", 512, 2),
+        Among(u"ale", -1, 104),
+        Among(u"acale", 515, 128),
+        Among(u"astajale", 515, 106),
+        Among(u"istajale", 515, 107),
+        Among(u"ostajale", 515, 108),
+        Among(u"ijale", 515, 47),
+        Among(u"injale", 515, 114),
+        Among(u"nale", 515, 46),
+        Among(u"irale", 515, 100),
+        Among(u"urale", 515, 105),
+        Among(u"tale", 515, 113),
+        Among(u"astale", 525, 110),
+        Among(u"istale", 525, 111),
+        Among(u"ostale", 525, 112),
+        Among(u"avale", 515, 97),
+        Among(u"evale", 515, 96),
+        Among(u"ivale", 515, 98),
+        Among(u"ovale", 515, 76),
+        Among(u"uvale", 515, 99),
+        Among(u"ačale", 515, 102),
+        Among(u"ele", -1, 83),
+        Among(u"ile", -1, 116),
+        Among(u"acile", 536, 124),
+        Among(u"lucile", 536, 121),
+        Among(u"nile", 536, 103),
+        Among(u"rosile", 536, 127),
+        Among(u"jetile", 536, 118),
+        Among(u"ozile", 536, 48),
+        Among(u"ačile", 536, 101),
+        Among(u"lučile", 536, 117),
+        Among(u"rošile", 536, 90),
+        Among(u"ole", -1, 50),
+        Among(u"asle", -1, 115),
+        Among(u"nule", -1, 13),
+        Among(u"rame", -1, 52),
+        Among(u"leme", -1, 51),
+        Among(u"acome", -1, 124),
+        Among(u"ecome", -1, 125),
+        Among(u"ucome", -1, 126),
+        Among(u"anjome", -1, 84),
+        Among(u"enjome", -1, 85),
+        Among(u"snjome", -1, 122),
+        Among(u"šnjome", -1, 86),
+        Among(u"kome", -1, 95),
+        Among(u"skome", 558, 1),
+        Among(u"škome", 558, 2),
+        Among(u"elome", -1, 83),
+        Among(u"nome", -1, 13),
+        Among(u"cinome", 562, 137),
+        Among(u"činome", 562, 89),
+        Among(u"osome", -1, 123),
+        Among(u"atome", -1, 120),
+        Among(u"evitome", -1, 92),
+        Among(u"ovitome", -1, 93),
+        Among(u"astome", -1, 94),
+        Among(u"avome", -1, 77),
+        Among(u"evome", -1, 78),
+        Among(u"ivome", -1, 79),
+        Among(u"ovome", -1, 80),
+        Among(u"aćome", -1, 14),
+        Among(u"ećome", -1, 15),
+        Among(u"ućome", -1, 16),
+        Among(u"ošome", -1, 91),
+        Among(u"ne", -1, 13),
+        Among(u"ane", 578, 10),
+        Among(u"acane", 579, 128),
+        Among(u"urane", 579, 105),
+        Among(u"tane", 579, 113),
+        Among(u"astane", 582, 110),
+        Among(u"istane", 582, 111),
+        Among(u"ostane", 582, 112),
+        Among(u"avane", 579, 97),
+        Among(u"evane", 579, 96),
+        Among(u"ivane", 579, 98),
+        Among(u"uvane", 579, 99),
+        Among(u"ačane", 579, 102),
+        Among(u"acene", 578, 124),
+        Among(u"lucene", 578, 121),
+        Among(u"ačene", 578, 101),
+        Among(u"lučene", 578, 117),
+        Among(u"ine", 578, 11),
+        Among(u"cine", 595, 137),
+        Among(u"anine", 595, 10),
+        Among(u"čine", 595, 89),
+        Among(u"one", 578, 12),
+        Among(u"are", -1, 53),
+        Among(u"dre", -1, 54),
+        Among(u"ere", -1, 55),
+        Among(u"ore", -1, 56),
+        Among(u"ase", -1, 161),
+        Among(u"base", 604, 135),
+        Among(u"acase", 604, 128),
+        Among(u"gase", 604, 131),
+        Among(u"jase", 604, 129),
+        Among(u"astajase", 608, 138),
+        Among(u"istajase", 608, 139),
+        Among(u"ostajase", 608, 140),
+        Among(u"injase", 608, 150),
+        Among(u"kase", 604, 133),
+        Among(u"nase", 604, 132),
+        Among(u"irase", 604, 155),
+        Among(u"urase", 604, 156),
+        Among(u"tase", 604, 130),
+        Among(u"vase", 604, 134),
+        Among(u"avase", 618, 144),
+        Among(u"evase", 618, 145),
+        Among(u"ivase", 618, 146),
+        Among(u"ovase", 618, 148),
+        Among(u"uvase", 618, 147),
+        Among(u"ese", -1, 57),
+        Among(u"ise", -1, 58),
+        Among(u"acise", 625, 124),
+        Among(u"lucise", 625, 121),
+        Among(u"rosise", 625, 127),
+        Among(u"jetise", 625, 149),
+        Among(u"ose", -1, 123),
+        Among(u"astadose", 630, 141),
+        Among(u"istadose", 630, 142),
+        Among(u"ostadose", 630, 143),
+        Among(u"ate", -1, 104),
+        Among(u"acate", 634, 128),
+        Among(u"ikate", 634, 68),
+        Among(u"late", 634, 69),
+        Among(u"irate", 634, 100),
+        Among(u"urate", 634, 105),
+        Among(u"tate", 634, 113),
+        Among(u"avate", 634, 97),
+        Among(u"evate", 634, 96),
+        Among(u"ivate", 634, 98),
+        Among(u"uvate", 634, 99),
+        Among(u"ačate", 634, 102),
+        Among(u"ete", -1, 70),
+        Among(u"astadete", 646, 110),
+        Among(u"istadete", 646, 111),
+        Among(u"ostadete", 646, 112),
+        Among(u"astajete", 646, 106),
+        Among(u"istajete", 646, 107),
+        Among(u"ostajete", 646, 108),
+        Among(u"ijete", 646, 116),
+        Among(u"injete", 646, 114),
+        Among(u"ujete", 646, 25),
+        Among(u"lucujete", 655, 121),
+        Among(u"irujete", 655, 100),
+        Among(u"lučujete", 655, 117),
+        Among(u"nete", 646, 13),
+        Among(u"astanete", 659, 110),
+        Among(u"istanete", 659, 111),
+        Among(u"ostanete", 659, 112),
+        Among(u"astete", 646, 115),
+        Among(u"ite", -1, 116),
+        Among(u"acite", 664, 124),
+        Among(u"lucite", 664, 121),
+        Among(u"nite", 664, 13),
+        Among(u"astanite", 667, 110),
+        Among(u"istanite", 667, 111),
+        Among(u"ostanite", 667, 112),
+        Among(u"rosite", 664, 127),
+        Among(u"jetite", 664, 118),
+        Among(u"astite", 664, 115),
+        Among(u"evite", 664, 92),
+        Among(u"ovite", 664, 93),
+        Among(u"ačite", 664, 101),
+        Among(u"lučite", 664, 117),
+        Among(u"rošite", 664, 90),
+        Among(u"ajte", -1, 104),
+        Among(u"urajte", 679, 105),
+        Among(u"tajte", 679, 113),
+        Among(u"astajte", 681, 106),
+        Among(u"istajte", 681, 107),
+        Among(u"ostajte", 681, 108),
+        Among(u"avajte", 679, 97),
+        Among(u"evajte", 679, 96),
+        Among(u"ivajte", 679, 98),
+        Among(u"uvajte", 679, 99),
+        Among(u"ijte", -1, 116),
+        Among(u"lucujte", -1, 121),
+        Among(u"irujte", -1, 100),
+        Among(u"lučujte", -1, 117),
+        Among(u"aste", -1, 94),
+        Among(u"acaste", 693, 128),
+        Among(u"astajaste", 693, 106),
+        Among(u"istajaste", 693, 107),
+        Among(u"ostajaste", 693, 108),
+        Among(u"injaste", 693, 114),
+        Among(u"iraste", 693, 100),
+        Among(u"uraste", 693, 105),
+        Among(u"taste", 693, 113),
+        Among(u"avaste", 693, 97),
+        Among(u"evaste", 693, 96),
+        Among(u"ivaste", 693, 98),
+        Among(u"ovaste", 693, 76),
+        Among(u"uvaste", 693, 99),
+        Among(u"ačaste", 693, 102),
+        Among(u"este", -1, 71),
+        Among(u"iste", -1, 72),
+        Among(u"aciste", 709, 124),
+        Among(u"luciste", 709, 121),
+        Among(u"niste", 709, 103),
+        Among(u"rosiste", 709, 127),
+        Among(u"jetiste", 709, 118),
+        Among(u"ačiste", 709, 101),
+        Among(u"lučiste", 709, 117),
+        Among(u"rošiste", 709, 90),
+        Among(u"kste", -1, 73),
+        Among(u"oste", -1, 74),
+        Among(u"astadoste", 719, 110),
+        Among(u"istadoste", 719, 111),
+        Among(u"ostadoste", 719, 112),
+        Among(u"nuste", -1, 13),
+        Among(u"ište", -1, 75),
+        Among(u"ave", -1, 77),
+        Among(u"eve", -1, 78),
+        Among(u"ajeve", 726, 109),
+        Among(u"cajeve", 727, 26),
+        Among(u"lajeve", 727, 30),
+        Among(u"rajeve", 727, 31),
+        Among(u"ćajeve", 727, 28),
+        Among(u"čajeve", 727, 27),
+        Among(u"đajeve", 727, 29),
+        Among(u"ive", -1, 79),
+        Among(u"ove", -1, 80),
+        Among(u"gove", 735, 20),
+        Among(u"ugove", 736, 17),
+        Among(u"love", 735, 82),
+        Among(u"olove", 738, 49),
+        Among(u"move", 735, 81),
+        Among(u"onove", 735, 12),
+        Among(u"aće", -1, 14),
+        Among(u"eće", -1, 15),
+        Among(u"uće", -1, 16),
+        Among(u"ače", -1, 101),
+        Among(u"luče", -1, 117),
+        Among(u"aše", -1, 104),
+        Among(u"baše", 747, 63),
+        Among(u"gaše", 747, 64),
+        Among(u"jaše", 747, 61),
+        Among(u"astajaše", 750, 106),
+        Among(u"istajaše", 750, 107),
+        Among(u"ostajaše", 750, 108),
+        Among(u"injaše", 750, 114),
+        Among(u"kaše", 747, 62),
+        Among(u"naše", 747, 60),
+        Among(u"iraše", 747, 100),
+        Among(u"uraše", 747, 105),
+        Among(u"taše", 747, 59),
+        Among(u"vaše", 747, 65),
+        Among(u"avaše", 760, 97),
+        Among(u"evaše", 760, 96),
+        Among(u"ivaše", 760, 98),
+        Among(u"ovaše", 760, 76),
+        Among(u"uvaše", 760, 99),
+        Among(u"ačaše", 747, 102),
+        Among(u"eše", -1, 66),
+        Among(u"iše", -1, 67),
+        Among(u"jetiše", 768, 118),
+        Among(u"ačiše", 768, 101),
+        Among(u"lučiše", 768, 117),
+        Among(u"rošiše", 768, 90),
+        Among(u"oše", -1, 91),
+        Among(u"astadoše", 773, 110),
+        Among(u"istadoše", 773, 111),
+        Among(u"ostadoše", 773, 112),
+        Among(u"aceg", -1, 124),
+        Among(u"eceg", -1, 125),
+        Among(u"uceg", -1, 126),
+        Among(u"anjijeg", -1, 84),
+        Among(u"enjijeg", -1, 85),
+        Among(u"snjijeg", -1, 122),
+        Among(u"šnjijeg", -1, 86),
+        Among(u"kijeg", -1, 95),
+        Among(u"skijeg", 784, 1),
+        Among(u"škijeg", 784, 2),
+        Among(u"elijeg", -1, 83),
+        Among(u"nijeg", -1, 13),
+        Among(u"osijeg", -1, 123),
+        Among(u"atijeg", -1, 120),
+        Among(u"evitijeg", -1, 92),
+        Among(u"ovitijeg", -1, 93),
+        Among(u"astijeg", -1, 94),
+        Among(u"avijeg", -1, 77),
+        Among(u"evijeg", -1, 78),
+        Among(u"ivijeg", -1, 79),
+        Among(u"ovijeg", -1, 80),
+        Among(u"ošijeg", -1, 91),
+        Among(u"anjeg", -1, 84),
+        Among(u"enjeg", -1, 85),
+        Among(u"snjeg", -1, 122),
+        Among(u"šnjeg", -1, 86),
+        Among(u"keg", -1, 95),
+        Among(u"eleg", -1, 83),
+        Among(u"neg", -1, 13),
+        Among(u"aneg", 805, 10),
+        Among(u"eneg", 805, 87),
+        Among(u"sneg", 805, 159),
+        Among(u"šneg", 805, 88),
+        Among(u"oseg", -1, 123),
+        Among(u"ateg", -1, 120),
+        Among(u"aveg", -1, 77),
+        Among(u"eveg", -1, 78),
+        Among(u"iveg", -1, 79),
+        Among(u"oveg", -1, 80),
+        Among(u"aćeg", -1, 14),
+        Among(u"ećeg", -1, 15),
+        Among(u"ućeg", -1, 16),
+        Among(u"ošeg", -1, 91),
+        Among(u"acog", -1, 124),
+        Among(u"ecog", -1, 125),
+        Among(u"ucog", -1, 126),
+        Among(u"anjog", -1, 84),
+        Among(u"enjog", -1, 85),
+        Among(u"snjog", -1, 122),
+        Among(u"šnjog", -1, 86),
+        Among(u"kog", -1, 95),
+        Among(u"skog", 827, 1),
+        Among(u"škog", 827, 2),
+        Among(u"elog", -1, 83),
+        Among(u"nog", -1, 13),
+        Among(u"cinog", 831, 137),
+        Among(u"činog", 831, 89),
+        Among(u"osog", -1, 123),
+        Among(u"atog", -1, 120),
+        Among(u"evitog", -1, 92),
+        Among(u"ovitog", -1, 93),
+        Among(u"astog", -1, 94),
+        Among(u"avog", -1, 77),
+        Among(u"evog", -1, 78),
+        Among(u"ivog", -1, 79),
+        Among(u"ovog", -1, 80),
+        Among(u"aćog", -1, 14),
+        Among(u"ećog", -1, 15),
+        Among(u"ućog", -1, 16),
+        Among(u"ošog", -1, 91),
+        Among(u"ah", -1, 104),
+        Among(u"acah", 847, 128),
+        Among(u"astajah", 847, 106),
+        Among(u"istajah", 847, 107),
+        Among(u"ostajah", 847, 108),
+        Among(u"injah", 847, 114),
+        Among(u"irah", 847, 100),
+        Among(u"urah", 847, 105),
+        Among(u"tah", 847, 113),
+        Among(u"avah", 847, 97),
+        Among(u"evah", 847, 96),
+        Among(u"ivah", 847, 98),
+        Among(u"ovah", 847, 76),
+        Among(u"uvah", 847, 99),
+        Among(u"ačah", 847, 102),
+        Among(u"ih", -1, 116),
+        Among(u"acih", 862, 124),
+        Among(u"ecih", 862, 125),
+        Among(u"ucih", 862, 126),
+        Among(u"lucih", 865, 121),
+        Among(u"anjijih", 862, 84),
+        Among(u"enjijih", 862, 85),
+        Among(u"snjijih", 862, 122),
+        Among(u"šnjijih", 862, 86),
+        Among(u"kijih", 862, 95),
+        Among(u"skijih", 871, 1),
+        Among(u"škijih", 871, 2),
+        Among(u"elijih", 862, 83),
+        Among(u"nijih", 862, 13),
+        Among(u"osijih", 862, 123),
+        Among(u"atijih", 862, 120),
+        Among(u"evitijih", 862, 92),
+        Among(u"ovitijih", 862, 93),
+        Among(u"astijih", 862, 94),
+        Among(u"avijih", 862, 77),
+        Among(u"evijih", 862, 78),
+        Among(u"ivijih", 862, 79),
+        Among(u"ovijih", 862, 80),
+        Among(u"ošijih", 862, 91),
+        Among(u"anjih", 862, 84),
+        Among(u"enjih", 862, 85),
+        Among(u"snjih", 862, 122),
+        Among(u"šnjih", 862, 86),
+        Among(u"kih", 862, 95),
+        Among(u"skih", 890, 1),
+        Among(u"ških", 890, 2),
+        Among(u"elih", 862, 83),
+        Among(u"nih", 862, 13),
+        Among(u"cinih", 894, 137),
+        Among(u"činih", 894, 89),
+        Among(u"osih", 862, 123),
+        Among(u"rosih", 897, 127),
+        Among(u"atih", 862, 120),
+        Among(u"jetih", 862, 118),
+        Among(u"evitih", 862, 92),
+        Among(u"ovitih", 862, 93),
+        Among(u"astih", 862, 94),
+        Among(u"avih", 862, 77),
+        Among(u"evih", 862, 78),
+        Among(u"ivih", 862, 79),
+        Among(u"ovih", 862, 80),
+        Among(u"aćih", 862, 14),
+        Among(u"ećih", 862, 15),
+        Among(u"ućih", 862, 16),
+        Among(u"ačih", 862, 101),
+        Among(u"lučih", 862, 117),
+        Among(u"oših", 862, 91),
+        Among(u"roših", 913, 90),
+        Among(u"astadoh", -1, 110),
+        Among(u"istadoh", -1, 111),
+        Among(u"ostadoh", -1, 112),
+        Among(u"acuh", -1, 124),
+        Among(u"ecuh", -1, 125),
+        Among(u"ucuh", -1, 126),
+        Among(u"aćuh", -1, 14),
+        Among(u"ećuh", -1, 15),
+        Among(u"ućuh", -1, 16),
+        Among(u"aci", -1, 124),
+        Among(u"aceci", -1, 124),
+        Among(u"ieci", -1, 162),
+        Among(u"ajuci", -1, 161),
+        Among(u"irajuci", 927, 155),
+        Among(u"urajuci", 927, 156),
+        Among(u"astajuci", 927, 138),
+        Among(u"istajuci", 927, 139),
+        Among(u"ostajuci", 927, 140),
+        Among(u"avajuci", 927, 144),
+        Among(u"evajuci", 927, 145),
+        Among(u"ivajuci", 927, 146),
+        Among(u"uvajuci", 927, 147),
+        Among(u"ujuci", -1, 157),
+        Among(u"lucujuci", 937, 121),
+        Among(u"irujuci", 937, 155),
+        Among(u"luci", -1, 121),
+        Among(u"nuci", -1, 164),
+        Among(u"etuci", -1, 153),
+        Among(u"astuci", -1, 136),
+        Among(u"gi", -1, 20),
+        Among(u"ugi", 944, 18),
+        Among(u"aji", -1, 109),
+        Among(u"caji", 946, 26),
+        Among(u"laji", 946, 30),
+        Among(u"raji", 946, 31),
+        Among(u"ćaji", 946, 28),
+        Among(u"čaji", 946, 27),
+        Among(u"đaji", 946, 29),
+        Among(u"biji", -1, 32),
+        Among(u"ciji", -1, 33),
+        Among(u"diji", -1, 34),
+        Among(u"fiji", -1, 40),
+        Among(u"giji", -1, 39),
+        Among(u"anjiji", -1, 84),
+        Among(u"enjiji", -1, 85),
+        Among(u"snjiji", -1, 122),
+        Among(u"šnjiji", -1, 86),
+        Among(u"kiji", -1, 95),
+        Among(u"skiji", 962, 1),
+        Among(u"škiji", 962, 2),
+        Among(u"liji", -1, 35),
+        Among(u"eliji", 965, 83),
+        Among(u"miji", -1, 37),
+        Among(u"niji", -1, 13),
+        Among(u"ganiji", 968, 9),
+        Among(u"maniji", 968, 6),
+        Among(u"paniji", 968, 7),
+        Among(u"raniji", 968, 8),
+        Among(u"taniji", 968, 5),
+        Among(u"piji", -1, 41),
+        Among(u"riji", -1, 42),
+        Among(u"siji", -1, 43),
+        Among(u"osiji", 976, 123),
+        Among(u"tiji", -1, 44),
+        Among(u"atiji", 978, 120),
+        Among(u"evitiji", 978, 92),
+        Among(u"ovitiji", 978, 93),
+        Among(u"astiji", 978, 94),
+        Among(u"aviji", -1, 77),
+        Among(u"eviji", -1, 78),
+        Among(u"iviji", -1, 79),
+        Among(u"oviji", -1, 80),
+        Among(u"ziji", -1, 45),
+        Among(u"ošiji", -1, 91),
+        Among(u"žiji", -1, 38),
+        Among(u"anji", -1, 84),
+        Among(u"enji", -1, 85),
+        Among(u"snji", -1, 122),
+        Among(u"šnji", -1, 86),
+        Among(u"ki", -1, 95),
+        Among(u"ski", 994, 1),
+        Among(u"ški", 994, 2),
+        Among(u"ali", -1, 104),
+        Among(u"acali", 997, 128),
+        Among(u"astajali", 997, 106),
+        Among(u"istajali", 997, 107),
+        Among(u"ostajali", 997, 108),
+        Among(u"ijali", 997, 47),
+        Among(u"injali", 997, 114),
+        Among(u"nali", 997, 46),
+        Among(u"irali", 997, 100),
+        Among(u"urali", 997, 105),
+        Among(u"tali", 997, 113),
+        Among(u"astali", 1007, 110),
+        Among(u"istali", 1007, 111),
+        Among(u"ostali", 1007, 112),
+        Among(u"avali", 997, 97),
+        Among(u"evali", 997, 96),
+        Among(u"ivali", 997, 98),
+        Among(u"ovali", 997, 76),
+        Among(u"uvali", 997, 99),
+        Among(u"ačali", 997, 102),
+        Among(u"eli", -1, 83),
+        Among(u"ili", -1, 116),
+        Among(u"acili", 1018, 124),
+        Among(u"lucili", 1018, 121),
+        Among(u"nili", 1018, 103),
+        Among(u"rosili", 1018, 127),
+        Among(u"jetili", 1018, 118),
+        Among(u"ozili", 1018, 48),
+        Among(u"ačili", 1018, 101),
+        Among(u"lučili", 1018, 117),
+        Among(u"rošili", 1018, 90),
+        Among(u"oli", -1, 50),
+        Among(u"asli", -1, 115),
+        Among(u"nuli", -1, 13),
+        Among(u"rami", -1, 52),
+        Among(u"lemi", -1, 51),
+        Among(u"ni", -1, 13),
+        Among(u"ani", 1033, 10),
+        Among(u"acani", 1034, 128),
+        Among(u"urani", 1034, 105),
+        Among(u"tani", 1034, 113),
+        Among(u"avani", 1034, 97),
+        Among(u"evani", 1034, 96),
+        Among(u"ivani", 1034, 98),
+        Among(u"uvani", 1034, 99),
+        Among(u"ačani", 1034, 102),
+        Among(u"aceni", 1033, 124),
+        Among(u"luceni", 1033, 121),
+        Among(u"ačeni", 1033, 101),
+        Among(u"lučeni", 1033, 117),
+        Among(u"ini", 1033, 11),
+        Among(u"cini", 1047, 137),
+        Among(u"čini", 1047, 89),
+        Among(u"oni", 1033, 12),
+        Among(u"ari", -1, 53),
+        Among(u"dri", -1, 54),
+        Among(u"eri", -1, 55),
+        Among(u"ori", -1, 56),
+        Among(u"basi", -1, 135),
+        Among(u"gasi", -1, 131),
+        Among(u"jasi", -1, 129),
+        Among(u"kasi", -1, 133),
+        Among(u"nasi", -1, 132),
+        Among(u"tasi", -1, 130),
+        Among(u"vasi", -1, 134),
+        Among(u"esi", -1, 152),
+        Among(u"isi", -1, 154),
+        Among(u"osi", -1, 123),
+        Among(u"avsi", -1, 161),
+        Among(u"acavsi", 1065, 128),
+        Among(u"iravsi", 1065, 155),
+        Among(u"tavsi", 1065, 160),
+        Among(u"etavsi", 1068, 153),
+        Among(u"astavsi", 1068, 141),
+        Among(u"istavsi", 1068, 142),
+        Among(u"ostavsi", 1068, 143),
+        Among(u"ivsi", -1, 162),
+        Among(u"nivsi", 1073, 158),
+        Among(u"rosivsi", 1073, 127),
+        Among(u"nuvsi", -1, 164),
+        Among(u"ati", -1, 104),
+        Among(u"acati", 1077, 128),
+        Among(u"astajati", 1077, 106),
+        Among(u"istajati", 1077, 107),
+        Among(u"ostajati", 1077, 108),
+        Among(u"injati", 1077, 114),
+        Among(u"ikati", 1077, 68),
+        Among(u"lati", 1077, 69),
+        Among(u"irati", 1077, 100),
+        Among(u"urati", 1077, 105),
+        Among(u"tati", 1077, 113),
+        Among(u"astati", 1087, 110),
+        Among(u"istati", 1087, 111),
+        Among(u"ostati", 1087, 112),
+        Among(u"avati", 1077, 97),
+        Among(u"evati", 1077, 96),
+        Among(u"ivati", 1077, 98),
+        Among(u"ovati", 1077, 76),
+        Among(u"uvati", 1077, 99),
+        Among(u"ačati", 1077, 102),
+        Among(u"eti", -1, 70),
+        Among(u"iti", -1, 116),
+        Among(u"aciti", 1098, 124),
+        Among(u"luciti", 1098, 121),
+        Among(u"niti", 1098, 103),
+        Among(u"rositi", 1098, 127),
+        Among(u"jetiti", 1098, 118),
+        Among(u"eviti", 1098, 92),
+        Among(u"oviti", 1098, 93),
+        Among(u"ačiti", 1098, 101),
+        Among(u"lučiti", 1098, 117),
+        Among(u"rošiti", 1098, 90),
+        Among(u"asti", -1, 94),
+        Among(u"esti", -1, 71),
+        Among(u"isti", -1, 72),
+        Among(u"ksti", -1, 73),
+        Among(u"osti", -1, 74),
+        Among(u"nuti", -1, 13),
+        Among(u"avi", -1, 77),
+        Among(u"evi", -1, 78),
+        Among(u"ajevi", 1116, 109),
+        Among(u"cajevi", 1117, 26),
+        Among(u"lajevi", 1117, 30),
+        Among(u"rajevi", 1117, 31),
+        Among(u"ćajevi", 1117, 28),
+        Among(u"čajevi", 1117, 27),
+        Among(u"đajevi", 1117, 29),
+        Among(u"ivi", -1, 79),
+        Among(u"ovi", -1, 80),
+        Among(u"govi", 1125, 20),
+        Among(u"ugovi", 1126, 17),
+        Among(u"lovi", 1125, 82),
+        Among(u"olovi", 1128, 49),
+        Among(u"movi", 1125, 81),
+        Among(u"onovi", 1125, 12),
+        Among(u"ieći", -1, 116),
+        Among(u"ačeći", -1, 101),
+        Among(u"ajući", -1, 104),
+        Among(u"irajući", 1134, 100),
+        Among(u"urajući", 1134, 105),
+        Among(u"astajući", 1134, 106),
+        Among(u"istajući", 1134, 107),
+        Among(u"ostajući", 1134, 108),
+        Among(u"avajući", 1134, 97),
+        Among(u"evajući", 1134, 96),
+        Among(u"ivajući", 1134, 98),
+        Among(u"uvajući", 1134, 99),
+        Among(u"ujući", -1, 25),
+        Among(u"irujući", 1144, 100),
+        Among(u"lučujući", 1144, 117),
+        Among(u"nući", -1, 13),
+        Among(u"etući", -1, 70),
+        Among(u"astući", -1, 115),
+        Among(u"ači", -1, 101),
+        Among(u"luči", -1, 117),
+        Among(u"baši", -1, 63),
+        Among(u"gaši", -1, 64),
+        Among(u"jaši", -1, 61),
+        Among(u"kaši", -1, 62),
+        Among(u"naši", -1, 60),
+        Among(u"taši", -1, 59),
+        Among(u"vaši", -1, 65),
+        Among(u"eši", -1, 66),
+        Among(u"iši", -1, 67),
+        Among(u"oši", -1, 91),
+        Among(u"avši", -1, 104),
+        Among(u"iravši", 1162, 100),
+        Among(u"tavši", 1162, 113),
+        Among(u"etavši", 1164, 70),
+        Among(u"astavši", 1164, 110),
+        Among(u"istavši", 1164, 111),
+        Among(u"ostavši", 1164, 112),
+        Among(u"ačavši", 1162, 102),
+        Among(u"ivši", -1, 116),
+        Among(u"nivši", 1170, 103),
+        Among(u"rošivši", 1170, 90),
+        Among(u"nuvši", -1, 13),
+        Among(u"aj", -1, 104),
+        Among(u"uraj", 1174, 105),
+        Among(u"taj", 1174, 113),
+        Among(u"avaj", 1174, 97),
+        Among(u"evaj", 1174, 96),
+        Among(u"ivaj", 1174, 98),
+        Among(u"uvaj", 1174, 99),
+        Among(u"ij", -1, 116),
+        Among(u"acoj", -1, 124),
+        Among(u"ecoj", -1, 125),
+        Among(u"ucoj", -1, 126),
+        Among(u"anjijoj", -1, 84),
+        Among(u"enjijoj", -1, 85),
+        Among(u"snjijoj", -1, 122),
+        Among(u"šnjijoj", -1, 86),
+        Among(u"kijoj", -1, 95),
+        Among(u"skijoj", 1189, 1),
+        Among(u"škijoj", 1189, 2),
+        Among(u"elijoj", -1, 83),
+        Among(u"nijoj", -1, 13),
+        Among(u"osijoj", -1, 123),
+        Among(u"evitijoj", -1, 92),
+        Among(u"ovitijoj", -1, 93),
+        Among(u"astijoj", -1, 94),
+        Among(u"avijoj", -1, 77),
+        Among(u"evijoj", -1, 78),
+        Among(u"ivijoj", -1, 79),
+        Among(u"ovijoj", -1, 80),
+        Among(u"ošijoj", -1, 91),
+        Among(u"anjoj", -1, 84),
+        Among(u"enjoj", -1, 85),
+        Among(u"snjoj", -1, 122),
+        Among(u"šnjoj", -1, 86),
+        Among(u"koj", -1, 95),
+        Among(u"skoj", 1207, 1),
+        Among(u"škoj", 1207, 2),
+        Among(u"aloj", -1, 104),
+        Among(u"eloj", -1, 83),
+        Among(u"noj", -1, 13),
+        Among(u"cinoj", 1212, 137),
+        Among(u"činoj", 1212, 89),
+        Among(u"osoj", -1, 123),
+        Among(u"atoj", -1, 120),
+        Among(u"evitoj", -1, 92),
+        Among(u"ovitoj", -1, 93),
+        Among(u"astoj", -1, 94),
+        Among(u"avoj", -1, 77),
+        Among(u"evoj", -1, 78),
+        Among(u"ivoj", -1, 79),
+        Among(u"ovoj", -1, 80),
+        Among(u"aćoj", -1, 14),
+        Among(u"ećoj", -1, 15),
+        Among(u"ućoj", -1, 16),
+        Among(u"ošoj", -1, 91),
+        Among(u"lucuj", -1, 121),
+        Among(u"iruj", -1, 100),
+        Among(u"lučuj", -1, 117),
+        Among(u"al", -1, 104),
+        Among(u"iral", 1231, 100),
+        Among(u"ural", 1231, 105),
+        Among(u"el", -1, 119),
+        Among(u"il", -1, 116),
+        Among(u"am", -1, 104),
+        Among(u"acam", 1236, 128),
+        Among(u"iram", 1236, 100),
+        Among(u"uram", 1236, 105),
+        Among(u"tam", 1236, 113),
+        Among(u"avam", 1236, 97),
+        Among(u"evam", 1236, 96),
+        Among(u"ivam", 1236, 98),
+        Among(u"uvam", 1236, 99),
+        Among(u"ačam", 1236, 102),
+        Among(u"em", -1, 119),
+        Among(u"acem", 1246, 124),
+        Among(u"ecem", 1246, 125),
+        Among(u"ucem", 1246, 126),
+        Among(u"astadem", 1246, 110),
+        Among(u"istadem", 1246, 111),
+        Among(u"ostadem", 1246, 112),
+        Among(u"ajem", 1246, 104),
+        Among(u"cajem", 1253, 26),
+        Among(u"lajem", 1253, 30),
+        Among(u"rajem", 1253, 31),
+        Among(u"astajem", 1253, 106),
+        Among(u"istajem", 1253, 107),
+        Among(u"ostajem", 1253, 108),
+        Among(u"ćajem", 1253, 28),
+        Among(u"čajem", 1253, 27),
+        Among(u"đajem", 1253, 29),
+        Among(u"ijem", 1246, 116),
+        Among(u"anjijem", 1263, 84),
+        Among(u"enjijem", 1263, 85),
+        Among(u"snjijem", 1263, 123),
+        Among(u"šnjijem", 1263, 86),
+        Among(u"kijem", 1263, 95),
+        Among(u"skijem", 1268, 1),
+        Among(u"škijem", 1268, 2),
+        Among(u"lijem", 1263, 24),
+        Among(u"elijem", 1271, 83),
+        Among(u"nijem", 1263, 13),
+        Among(u"rarijem", 1263, 21),
+        Among(u"sijem", 1263, 23),
+        Among(u"osijem", 1275, 123),
+        Among(u"atijem", 1263, 120),
+        Among(u"evitijem", 1263, 92),
+        Among(u"ovitijem", 1263, 93),
+        Among(u"otijem", 1263, 22),
+        Among(u"astijem", 1263, 94),
+        Among(u"avijem", 1263, 77),
+        Among(u"evijem", 1263, 78),
+        Among(u"ivijem", 1263, 79),
+        Among(u"ovijem", 1263, 80),
+        Among(u"ošijem", 1263, 91),
+        Among(u"anjem", 1246, 84),
+        Among(u"enjem", 1246, 85),
+        Among(u"injem", 1246, 114),
+        Among(u"snjem", 1246, 122),
+        Among(u"šnjem", 1246, 86),
+        Among(u"ujem", 1246, 25),
+        Among(u"lucujem", 1292, 121),
+        Among(u"irujem", 1292, 100),
+        Among(u"lučujem", 1292, 117),
+        Among(u"kem", 1246, 95),
+        Among(u"skem", 1296, 1),
+        Among(u"škem", 1296, 2),
+        Among(u"elem", 1246, 83),
+        Among(u"nem", 1246, 13),
+        Among(u"anem", 1300, 10),
+        Among(u"astanem", 1301, 110),
+        Among(u"istanem", 1301, 111),
+        Among(u"ostanem", 1301, 112),
+        Among(u"enem", 1300, 87),
+        Among(u"snem", 1300, 159),
+        Among(u"šnem", 1300, 88),
+        Among(u"basem", 1246, 135),
+        Among(u"gasem", 1246, 131),
+        Among(u"jasem", 1246, 129),
+        Among(u"kasem", 1246, 133),
+        Among(u"nasem", 1246, 132),
+        Among(u"tasem", 1246, 130),
+        Among(u"vasem", 1246, 134),
+        Among(u"esem", 1246, 152),
+        Among(u"isem", 1246, 154),
+        Among(u"osem", 1246, 123),
+        Among(u"atem", 1246, 120),
+        Among(u"etem", 1246, 70),
+        Among(u"evitem", 1246, 92),
+        Among(u"ovitem", 1246, 93),
+        Among(u"astem", 1246, 94),
+        Among(u"istem", 1246, 151),
+        Among(u"ištem", 1246, 75),
+        Among(u"avem", 1246, 77),
+        Among(u"evem", 1246, 78),
+        Among(u"ivem", 1246, 79),
+        Among(u"aćem", 1246, 14),
+        Among(u"ećem", 1246, 15),
+        Among(u"ućem", 1246, 16),
+        Among(u"bašem", 1246, 63),
+        Among(u"gašem", 1246, 64),
+        Among(u"jašem", 1246, 61),
+        Among(u"kašem", 1246, 62),
+        Among(u"našem", 1246, 60),
+        Among(u"tašem", 1246, 59),
+        Among(u"vašem", 1246, 65),
+        Among(u"ešem", 1246, 66),
+        Among(u"išem", 1246, 67),
+        Among(u"ošem", 1246, 91),
+        Among(u"im", -1, 116),
+        Among(u"acim", 1341, 124),
+        Among(u"ecim", 1341, 125),
+        Among(u"ucim", 1341, 126),
+        Among(u"lucim", 1344, 121),
+        Among(u"anjijim", 1341, 84),
+        Among(u"enjijim", 1341, 85),
+        Among(u"snjijim", 1341, 122),
+        Among(u"šnjijim", 1341, 86),
+        Among(u"kijim", 1341, 95),
+        Among(u"skijim", 1350, 1),
+        Among(u"škijim", 1350, 2),
+        Among(u"elijim", 1341, 83),
+        Among(u"nijim", 1341, 13),
+        Among(u"osijim", 1341, 123),
+        Among(u"atijim", 1341, 120),
+        Among(u"evitijim", 1341, 92),
+        Among(u"ovitijim", 1341, 93),
+        Among(u"astijim", 1341, 94),
+        Among(u"avijim", 1341, 77),
+        Among(u"evijim", 1341, 78),
+        Among(u"ivijim", 1341, 79),
+        Among(u"ovijim", 1341, 80),
+        Among(u"ošijim", 1341, 91),
+        Among(u"anjim", 1341, 84),
+        Among(u"enjim", 1341, 85),
+        Among(u"snjim", 1341, 122),
+        Among(u"šnjim", 1341, 86),
+        Among(u"kim", 1341, 95),
+        Among(u"skim", 1369, 1),
+        Among(u"škim", 1369, 2),
+        Among(u"elim", 1341, 83),
+        Among(u"nim", 1341, 13),
+        Among(u"cinim", 1373, 137),
+        Among(u"činim", 1373, 89),
+        Among(u"osim", 1341, 123),
+        Among(u"rosim", 1376, 127),
+        Among(u"atim", 1341, 120),
+        Among(u"jetim", 1341, 118),
+        Among(u"evitim", 1341, 92),
+        Among(u"ovitim", 1341, 93),
+        Among(u"astim", 1341, 94),
+        Among(u"avim", 1341, 77),
+        Among(u"evim", 1341, 78),
+        Among(u"ivim", 1341, 79),
+        Among(u"ovim", 1341, 80),
+        Among(u"aćim", 1341, 14),
+        Among(u"ećim", 1341, 15),
+        Among(u"ućim", 1341, 16),
+        Among(u"ačim", 1341, 101),
+        Among(u"lučim", 1341, 117),
+        Among(u"ošim", 1341, 91),
+        Among(u"rošim", 1392, 90),
+        Among(u"acom", -1, 124),
+        Among(u"ecom", -1, 125),
+        Among(u"ucom", -1, 126),
+        Among(u"gom", -1, 20),
+        Among(u"logom", 1397, 19),
+        Among(u"ugom", 1397, 18),
+        Among(u"bijom", -1, 32),
+        Among(u"cijom", -1, 33),
+        Among(u"dijom", -1, 34),
+        Among(u"fijom", -1, 40),
+        Among(u"gijom", -1, 39),
+        Among(u"lijom", -1, 35),
+        Among(u"mijom", -1, 37),
+        Among(u"nijom", -1, 36),
+        Among(u"ganijom", 1407, 9),
+        Among(u"manijom", 1407, 6),
+        Among(u"panijom", 1407, 7),
+        Among(u"ranijom", 1407, 8),
+        Among(u"tanijom", 1407, 5),
+        Among(u"pijom", -1, 41),
+        Among(u"rijom", -1, 42),
+        Among(u"sijom", -1, 43),
+        Among(u"tijom", -1, 44),
+        Among(u"zijom", -1, 45),
+        Among(u"žijom", -1, 38),
+        Among(u"anjom", -1, 84),
+        Among(u"enjom", -1, 85),
+        Among(u"snjom", -1, 122),
+        Among(u"šnjom", -1, 86),
+        Among(u"kom", -1, 95),
+        Among(u"skom", 1423, 1),
+        Among(u"škom", 1423, 2),
+        Among(u"alom", -1, 104),
+        Among(u"ijalom", 1426, 47),
+        Among(u"nalom", 1426, 46),
+        Among(u"elom", -1, 83),
+        Among(u"ilom", -1, 116),
+        Among(u"ozilom", 1430, 48),
+        Among(u"olom", -1, 50),
+        Among(u"ramom", -1, 52),
+        Among(u"lemom", -1, 51),
+        Among(u"nom", -1, 13),
+        Among(u"anom", 1435, 10),
+        Among(u"inom", 1435, 11),
+        Among(u"cinom", 1437, 137),
+        Among(u"aninom", 1437, 10),
+        Among(u"činom", 1437, 89),
+        Among(u"onom", 1435, 12),
+        Among(u"arom", -1, 53),
+        Among(u"drom", -1, 54),
+        Among(u"erom", -1, 55),
+        Among(u"orom", -1, 56),
+        Among(u"basom", -1, 135),
+        Among(u"gasom", -1, 131),
+        Among(u"jasom", -1, 129),
+        Among(u"kasom", -1, 133),
+        Among(u"nasom", -1, 132),
+        Among(u"tasom", -1, 130),
+        Among(u"vasom", -1, 134),
+        Among(u"esom", -1, 57),
+        Among(u"isom", -1, 58),
+        Among(u"osom", -1, 123),
+        Among(u"atom", -1, 120),
+        Among(u"ikatom", 1456, 68),
+        Among(u"latom", 1456, 69),
+        Among(u"etom", -1, 70),
+        Among(u"evitom", -1, 92),
+        Among(u"ovitom", -1, 93),
+        Among(u"astom", -1, 94),
+        Among(u"estom", -1, 71),
+        Among(u"istom", -1, 72),
+        Among(u"kstom", -1, 73),
+        Among(u"ostom", -1, 74),
+        Among(u"avom", -1, 77),
+        Among(u"evom", -1, 78),
+        Among(u"ivom", -1, 79),
+        Among(u"ovom", -1, 80),
+        Among(u"lovom", 1470, 82),
+        Among(u"movom", 1470, 81),
+        Among(u"stvom", -1, 3),
+        Among(u"štvom", -1, 4),
+        Among(u"aćom", -1, 14),
+        Among(u"ećom", -1, 15),
+        Among(u"ućom", -1, 16),
+        Among(u"bašom", -1, 63),
+        Among(u"gašom", -1, 64),
+        Among(u"jašom", -1, 61),
+        Among(u"kašom", -1, 62),
+        Among(u"našom", -1, 60),
+        Among(u"tašom", -1, 59),
+        Among(u"vašom", -1, 65),
+        Among(u"ešom", -1, 66),
+        Among(u"išom", -1, 67),
+        Among(u"ošom", -1, 91),
+        Among(u"an", -1, 104),
+        Among(u"acan", 1488, 128),
+        Among(u"iran", 1488, 100),
+        Among(u"uran", 1488, 105),
+        Among(u"tan", 1488, 113),
+        Among(u"avan", 1488, 97),
+        Among(u"evan", 1488, 96),
+        Among(u"ivan", 1488, 98),
+        Among(u"uvan", 1488, 99),
+        Among(u"ačan", 1488, 102),
+        Among(u"acen", -1, 124),
+        Among(u"lucen", -1, 121),
+        Among(u"ačen", -1, 101),
+        Among(u"lučen", -1, 117),
+        Among(u"anin", -1, 10),
+        Among(u"ao", -1, 104),
+        Among(u"acao", 1503, 128),
+        Among(u"astajao", 1503, 106),
+        Among(u"istajao", 1503, 107),
+        Among(u"ostajao", 1503, 108),
+        Among(u"injao", 1503, 114),
+        Among(u"irao", 1503, 100),
+        Among(u"urao", 1503, 105),
+        Among(u"tao", 1503, 113),
+        Among(u"astao", 1511, 110),
+        Among(u"istao", 1511, 111),
+        Among(u"ostao", 1511, 112),
+        Among(u"avao", 1503, 97),
+        Among(u"evao", 1503, 96),
+        Among(u"ivao", 1503, 98),
+        Among(u"ovao", 1503, 76),
+        Among(u"uvao", 1503, 99),
+        Among(u"ačao", 1503, 102),
+        Among(u"go", -1, 20),
+        Among(u"ugo", 1521, 18),
+        Among(u"io", -1, 116),
+        Among(u"acio", 1523, 124),
+        Among(u"lucio", 1523, 121),
+        Among(u"lio", 1523, 24),
+        Among(u"nio", 1523, 103),
+        Among(u"rario", 1523, 21),
+        Among(u"sio", 1523, 23),
+        Among(u"rosio", 1529, 127),
+        Among(u"jetio", 1523, 118),
+        Among(u"otio", 1523, 22),
+        Among(u"ačio", 1523, 101),
+        Among(u"lučio", 1523, 117),
+        Among(u"rošio", 1523, 90),
+        Among(u"bijo", -1, 32),
+        Among(u"cijo", -1, 33),
+        Among(u"dijo", -1, 34),
+        Among(u"fijo", -1, 40),
+        Among(u"gijo", -1, 39),
+        Among(u"lijo", -1, 35),
+        Among(u"mijo", -1, 37),
+        Among(u"nijo", -1, 36),
+        Among(u"pijo", -1, 41),
+        Among(u"rijo", -1, 42),
+        Among(u"sijo", -1, 43),
+        Among(u"tijo", -1, 44),
+        Among(u"zijo", -1, 45),
+        Among(u"žijo", -1, 38),
+        Among(u"anjo", -1, 84),
+        Among(u"enjo", -1, 85),
+        Among(u"snjo", -1, 122),
+        Among(u"šnjo", -1, 86),
+        Among(u"ko", -1, 95),
+        Among(u"sko", 1554, 1),
+        Among(u"ško", 1554, 2),
+        Among(u"alo", -1, 104),
+        Among(u"acalo", 1557, 128),
+        Among(u"astajalo", 1557, 106),
+        Among(u"istajalo", 1557, 107),
+        Among(u"ostajalo", 1557, 108),
+        Among(u"ijalo", 1557, 47),
+        Among(u"injalo", 1557, 114),
+        Among(u"nalo", 1557, 46),
+        Among(u"iralo", 1557, 100),
+        Among(u"uralo", 1557, 105),
+        Among(u"talo", 1557, 113),
+        Among(u"astalo", 1567, 110),
+        Among(u"istalo", 1567, 111),
+        Among(u"ostalo", 1567, 112),
+        Among(u"avalo", 1557, 97),
+        Among(u"evalo", 1557, 96),
+        Among(u"ivalo", 1557, 98),
+        Among(u"ovalo", 1557, 76),
+        Among(u"uvalo", 1557, 99),
+        Among(u"ačalo", 1557, 102),
+        Among(u"elo", -1, 83),
+        Among(u"ilo", -1, 116),
+        Among(u"acilo", 1578, 124),
+        Among(u"lucilo", 1578, 121),
+        Among(u"nilo", 1578, 103),
+        Among(u"rosilo", 1578, 127),
+        Among(u"jetilo", 1578, 118),
+        Among(u"ačilo", 1578, 101),
+        Among(u"lučilo", 1578, 117),
+        Among(u"rošilo", 1578, 90),
+        Among(u"aslo", -1, 115),
+        Among(u"nulo", -1, 13),
+        Among(u"amo", -1, 104),
+        Among(u"acamo", 1589, 128),
+        Among(u"ramo", 1589, 52),
+        Among(u"iramo", 1591, 100),
+        Among(u"uramo", 1591, 105),
+        Among(u"tamo", 1589, 113),
+        Among(u"avamo", 1589, 97),
+        Among(u"evamo", 1589, 96),
+        Among(u"ivamo", 1589, 98),
+        Among(u"uvamo", 1589, 99),
+        Among(u"ačamo", 1589, 102),
+        Among(u"emo", -1, 119),
+        Among(u"astademo", 1600, 110),
+        Among(u"istademo", 1600, 111),
+        Among(u"ostademo", 1600, 112),
+        Among(u"astajemo", 1600, 106),
+        Among(u"istajemo", 1600, 107),
+        Among(u"ostajemo", 1600, 108),
+        Among(u"ijemo", 1600, 116),
+        Among(u"injemo", 1600, 114),
+        Among(u"ujemo", 1600, 25),
+        Among(u"lucujemo", 1609, 121),
+        Among(u"irujemo", 1609, 100),
+        Among(u"lučujemo", 1609, 117),
+        Among(u"lemo", 1600, 51),
+        Among(u"nemo", 1600, 13),
+        Among(u"astanemo", 1614, 110),
+        Among(u"istanemo", 1614, 111),
+        Among(u"ostanemo", 1614, 112),
+        Among(u"etemo", 1600, 70),
+        Among(u"astemo", 1600, 115),
+        Among(u"imo", -1, 116),
+        Among(u"acimo", 1620, 124),
+        Among(u"lucimo", 1620, 121),
+        Among(u"nimo", 1620, 13),
+        Among(u"astanimo", 1623, 110),
+        Among(u"istanimo", 1623, 111),
+        Among(u"ostanimo", 1623, 112),
+        Among(u"rosimo", 1620, 127),
+        Among(u"etimo", 1620, 70),
+        Among(u"jetimo", 1628, 118),
+        Among(u"astimo", 1620, 115),
+        Among(u"ačimo", 1620, 101),
+        Among(u"lučimo", 1620, 117),
+        Among(u"rošimo", 1620, 90),
+        Among(u"ajmo", -1, 104),
+        Among(u"urajmo", 1634, 105),
+        Among(u"tajmo", 1634, 113),
+        Among(u"astajmo", 1636, 106),
+        Among(u"istajmo", 1636, 107),
+        Among(u"ostajmo", 1636, 108),
+        Among(u"avajmo", 1634, 97),
+        Among(u"evajmo", 1634, 96),
+        Among(u"ivajmo", 1634, 98),
+        Among(u"uvajmo", 1634, 99),
+        Among(u"ijmo", -1, 116),
+        Among(u"ujmo", -1, 25),
+        Among(u"lucujmo", 1645, 121),
+        Among(u"irujmo", 1645, 100),
+        Among(u"lučujmo", 1645, 117),
+        Among(u"asmo", -1, 104),
+        Among(u"acasmo", 1649, 128),
+        Among(u"astajasmo", 1649, 106),
+        Among(u"istajasmo", 1649, 107),
+        Among(u"ostajasmo", 1649, 108),
+        Among(u"injasmo", 1649, 114),
+        Among(u"irasmo", 1649, 100),
+        Among(u"urasmo", 1649, 105),
+        Among(u"tasmo", 1649, 113),
+        Among(u"avasmo", 1649, 97),
+        Among(u"evasmo", 1649, 96),
+        Among(u"ivasmo", 1649, 98),
+        Among(u"ovasmo", 1649, 76),
+        Among(u"uvasmo", 1649, 99),
+        Among(u"ačasmo", 1649, 102),
+        Among(u"ismo", -1, 116),
+        Among(u"acismo", 1664, 124),
+        Among(u"lucismo", 1664, 121),
+        Among(u"nismo", 1664, 103),
+        Among(u"rosismo", 1664, 127),
+        Among(u"jetismo", 1664, 118),
+        Among(u"ačismo", 1664, 101),
+        Among(u"lučismo", 1664, 117),
+        Among(u"rošismo", 1664, 90),
+        Among(u"astadosmo", -1, 110),
+        Among(u"istadosmo", -1, 111),
+        Among(u"ostadosmo", -1, 112),
+        Among(u"nusmo", -1, 13),
+        Among(u"no", -1, 13),
+        Among(u"ano", 1677, 104),
+        Among(u"acano", 1678, 128),
+        Among(u"urano", 1678, 105),
+        Among(u"tano", 1678, 113),
+        Among(u"avano", 1678, 97),
+        Among(u"evano", 1678, 96),
+        Among(u"ivano", 1678, 98),
+        Among(u"uvano", 1678, 99),
+        Among(u"ačano", 1678, 102),
+        Among(u"aceno", 1677, 124),
+        Among(u"luceno", 1677, 121),
+        Among(u"ačeno", 1677, 101),
+        Among(u"lučeno", 1677, 117),
+        Among(u"ino", 1677, 11),
+        Among(u"cino", 1691, 137),
+        Among(u"čino", 1691, 89),
+        Among(u"ato", -1, 120),
+        Among(u"ikato", 1694, 68),
+        Among(u"lato", 1694, 69),
+        Among(u"eto", -1, 70),
+        Among(u"evito", -1, 92),
+        Among(u"ovito", -1, 93),
+        Among(u"asto", -1, 94),
+        Among(u"esto", -1, 71),
+        Among(u"isto", -1, 72),
+        Among(u"ksto", -1, 73),
+        Among(u"osto", -1, 74),
+        Among(u"nuto", -1, 13),
+        Among(u"nuo", -1, 13),
+        Among(u"avo", -1, 77),
+        Among(u"evo", -1, 78),
+        Among(u"ivo", -1, 79),
+        Among(u"ovo", -1, 80),
+        Among(u"stvo", -1, 3),
+        Among(u"štvo", -1, 4),
+        Among(u"as", -1, 161),
+        Among(u"acas", 1713, 128),
+        Among(u"iras", 1713, 155),
+        Among(u"uras", 1713, 156),
+        Among(u"tas", 1713, 160),
+        Among(u"avas", 1713, 144),
+        Among(u"evas", 1713, 145),
+        Among(u"ivas", 1713, 146),
+        Among(u"uvas", 1713, 147),
+        Among(u"es", -1, 163),
+        Among(u"astades", 1722, 141),
+        Among(u"istades", 1722, 142),
+        Among(u"ostades", 1722, 143),
+        Among(u"astajes", 1722, 138),
+        Among(u"istajes", 1722, 139),
+        Among(u"ostajes", 1722, 140),
+        Among(u"ijes", 1722, 162),
+        Among(u"injes", 1722, 150),
+        Among(u"ujes", 1722, 157),
+        Among(u"lucujes", 1731, 121),
+        Among(u"irujes", 1731, 155),
+        Among(u"nes", 1722, 164),
+        Among(u"astanes", 1734, 141),
+        Among(u"istanes", 1734, 142),
+        Among(u"ostanes", 1734, 143),
+        Among(u"etes", 1722, 153),
+        Among(u"astes", 1722, 136),
+        Among(u"is", -1, 162),
+        Among(u"acis", 1740, 124),
+        Among(u"lucis", 1740, 121),
+        Among(u"nis", 1740, 158),
+        Among(u"rosis", 1740, 127),
+        Among(u"jetis", 1740, 149),
+        Among(u"at", -1, 104),
+        Among(u"acat", 1746, 128),
+        Among(u"astajat", 1746, 106),
+        Among(u"istajat", 1746, 107),
+        Among(u"ostajat", 1746, 108),
+        Among(u"injat", 1746, 114),
+        Among(u"irat", 1746, 100),
+        Among(u"urat", 1746, 105),
+        Among(u"tat", 1746, 113),
+        Among(u"astat", 1754, 110),
+        Among(u"istat", 1754, 111),
+        Among(u"ostat", 1754, 112),
+        Among(u"avat", 1746, 97),
+        Among(u"evat", 1746, 96),
+        Among(u"ivat", 1746, 98),
+        Among(u"irivat", 1760, 100),
+        Among(u"ovat", 1746, 76),
+        Among(u"uvat", 1746, 99),
+        Among(u"ačat", 1746, 102),
+        Among(u"it", -1, 116),
+        Among(u"acit", 1765, 124),
+        Among(u"lucit", 1765, 121),
+        Among(u"rosit", 1765, 127),
+        Among(u"jetit", 1765, 118),
+        Among(u"ačit", 1765, 101),
+        Among(u"lučit", 1765, 117),
+        Among(u"rošit", 1765, 90),
+        Among(u"nut", -1, 13),
+        Among(u"astadu", -1, 110),
+        Among(u"istadu", -1, 111),
+        Among(u"ostadu", -1, 112),
+        Among(u"gu", -1, 20),
+        Among(u"logu", 1777, 19),
+        Among(u"ugu", 1777, 18),
+        Among(u"ahu", -1, 104),
+        Among(u"acahu", 1780, 128),
+        Among(u"astajahu", 1780, 106),
+        Among(u"istajahu", 1780, 107),
+        Among(u"ostajahu", 1780, 108),
+        Among(u"injahu", 1780, 114),
+        Among(u"irahu", 1780, 100),
+        Among(u"urahu", 1780, 105),
+        Among(u"avahu", 1780, 97),
+        Among(u"evahu", 1780, 96),
+        Among(u"ivahu", 1780, 98),
+        Among(u"ovahu", 1780, 76),
+        Among(u"uvahu", 1780, 99),
+        Among(u"ačahu", 1780, 102),
+        Among(u"aju", -1, 104),
+        Among(u"caju", 1794, 26),
+        Among(u"acaju", 1795, 128),
+        Among(u"laju", 1794, 30),
+        Among(u"raju", 1794, 31),
+        Among(u"iraju", 1798, 100),
+        Among(u"uraju", 1798, 105),
+        Among(u"taju", 1794, 113),
+        Among(u"astaju", 1801, 106),
+        Among(u"istaju", 1801, 107),
+        Among(u"ostaju", 1801, 108),
+        Among(u"avaju", 1794, 97),
+        Among(u"evaju", 1794, 96),
+        Among(u"ivaju", 1794, 98),
+        Among(u"uvaju", 1794, 99),
+        Among(u"ćaju", 1794, 28),
+        Among(u"čaju", 1794, 27),
+        Among(u"ačaju", 1810, 102),
+        Among(u"đaju", 1794, 29),
+        Among(u"iju", -1, 116),
+        Among(u"biju", 1813, 32),
+        Among(u"ciju", 1813, 33),
+        Among(u"diju", 1813, 34),
+        Among(u"fiju", 1813, 40),
+        Among(u"giju", 1813, 39),
+        Among(u"anjiju", 1813, 84),
+        Among(u"enjiju", 1813, 85),
+        Among(u"snjiju", 1813, 122),
+        Among(u"šnjiju", 1813, 86),
+        Among(u"kiju", 1813, 95),
+        Among(u"liju", 1813, 24),
+        Among(u"eliju", 1824, 83),
+        Among(u"miju", 1813, 37),
+        Among(u"niju", 1813, 13),
+        Among(u"ganiju", 1827, 9),
+        Among(u"maniju", 1827, 6),
+        Among(u"paniju", 1827, 7),
+        Among(u"raniju", 1827, 8),
+        Among(u"taniju", 1827, 5),
+        Among(u"piju", 1813, 41),
+        Among(u"riju", 1813, 42),
+        Among(u"rariju", 1834, 21),
+        Among(u"siju", 1813, 23),
+        Among(u"osiju", 1836, 123),
+        Among(u"tiju", 1813, 44),
+        Among(u"atiju", 1838, 120),
+        Among(u"otiju", 1838, 22),
+        Among(u"aviju", 1813, 77),
+        Among(u"eviju", 1813, 78),
+        Among(u"iviju", 1813, 79),
+        Among(u"oviju", 1813, 80),
+        Among(u"ziju", 1813, 45),
+        Among(u"ošiju", 1813, 91),
+        Among(u"žiju", 1813, 38),
+        Among(u"anju", -1, 84),
+        Among(u"enju", -1, 85),
+        Among(u"snju", -1, 122),
+        Among(u"šnju", -1, 86),
+        Among(u"uju", -1, 25),
+        Among(u"lucuju", 1852, 121),
+        Among(u"iruju", 1852, 100),
+        Among(u"lučuju", 1852, 117),
+        Among(u"ku", -1, 95),
+        Among(u"sku", 1856, 1),
+        Among(u"šku", 1856, 2),
+        Among(u"alu", -1, 104),
+        Among(u"ijalu", 1859, 47),
+        Among(u"nalu", 1859, 46),
+        Among(u"elu", -1, 83),
+        Among(u"ilu", -1, 116),
+        Among(u"ozilu", 1863, 48),
+        Among(u"olu", -1, 50),
+        Among(u"ramu", -1, 52),
+        Among(u"acemu", -1, 124),
+        Among(u"ecemu", -1, 125),
+        Among(u"ucemu", -1, 126),
+        Among(u"anjijemu", -1, 84),
+        Among(u"enjijemu", -1, 85),
+        Among(u"snjijemu", -1, 122),
+        Among(u"šnjijemu", -1, 86),
+        Among(u"kijemu", -1, 95),
+        Among(u"skijemu", 1874, 1),
+        Among(u"škijemu", 1874, 2),
+        Among(u"elijemu", -1, 83),
+        Among(u"nijemu", -1, 13),
+        Among(u"osijemu", -1, 123),
+        Among(u"atijemu", -1, 120),
+        Among(u"evitijemu", -1, 92),
+        Among(u"ovitijemu", -1, 93),
+        Among(u"astijemu", -1, 94),
+        Among(u"avijemu", -1, 77),
+        Among(u"evijemu", -1, 78),
+        Among(u"ivijemu", -1, 79),
+        Among(u"ovijemu", -1, 80),
+        Among(u"ošijemu", -1, 91),
+        Among(u"anjemu", -1, 84),
+        Among(u"enjemu", -1, 85),
+        Among(u"snjemu", -1, 122),
+        Among(u"šnjemu", -1, 86),
+        Among(u"kemu", -1, 95),
+        Among(u"skemu", 1893, 1),
+        Among(u"škemu", 1893, 2),
+        Among(u"lemu", -1, 51),
+        Among(u"elemu", 1896, 83),
+        Among(u"nemu", -1, 13),
+        Among(u"anemu", 1898, 10),
+        Among(u"enemu", 1898, 87),
+        Among(u"snemu", 1898, 159),
+        Among(u"šnemu", 1898, 88),
+        Among(u"osemu", -1, 123),
+        Among(u"atemu", -1, 120),
+        Among(u"evitemu", -1, 92),
+        Among(u"ovitemu", -1, 93),
+        Among(u"astemu", -1, 94),
+        Among(u"avemu", -1, 77),
+        Among(u"evemu", -1, 78),
+        Among(u"ivemu", -1, 79),
+        Among(u"ovemu", -1, 80),
+        Among(u"aćemu", -1, 14),
+        Among(u"ećemu", -1, 15),
+        Among(u"ućemu", -1, 16),
+        Among(u"ošemu", -1, 91),
+        Among(u"acomu", -1, 124),
+        Among(u"ecomu", -1, 125),
+        Among(u"ucomu", -1, 126),
+        Among(u"anjomu", -1, 84),
+        Among(u"enjomu", -1, 85),
+        Among(u"snjomu", -1, 122),
+        Among(u"šnjomu", -1, 86),
+        Among(u"komu", -1, 95),
+        Among(u"skomu", 1923, 1),
+        Among(u"škomu", 1923, 2),
+        Among(u"elomu", -1, 83),
+        Among(u"nomu", -1, 13),
+        Among(u"cinomu", 1927, 137),
+        Among(u"činomu", 1927, 89),
+        Among(u"osomu", -1, 123),
+        Among(u"atomu", -1, 120),
+        Among(u"evitomu", -1, 92),
+        Among(u"ovitomu", -1, 93),
+        Among(u"astomu", -1, 94),
+        Among(u"avomu", -1, 77),
+        Among(u"evomu", -1, 78),
+        Among(u"ivomu", -1, 79),
+        Among(u"ovomu", -1, 80),
+        Among(u"aćomu", -1, 14),
+        Among(u"ećomu", -1, 15),
+        Among(u"ućomu", -1, 16),
+        Among(u"ošomu", -1, 91),
+        Among(u"nu", -1, 13),
+        Among(u"anu", 1943, 10),
+        Among(u"astanu", 1944, 110),
+        Among(u"istanu", 1944, 111),
+        Among(u"ostanu", 1944, 112),
+        Among(u"inu", 1943, 11),
+        Among(u"cinu", 1948, 137),
+        Among(u"aninu", 1948, 10),
+        Among(u"činu", 1948, 89),
+        Among(u"onu", 1943, 12),
+        Among(u"aru", -1, 53),
+        Among(u"dru", -1, 54),
+        Among(u"eru", -1, 55),
+        Among(u"oru", -1, 56),
+        Among(u"basu", -1, 135),
+        Among(u"gasu", -1, 131),
+        Among(u"jasu", -1, 129),
+        Among(u"kasu", -1, 133),
+        Among(u"nasu", -1, 132),
+        Among(u"tasu", -1, 130),
+        Among(u"vasu", -1, 134),
+        Among(u"esu", -1, 57),
+        Among(u"isu", -1, 58),
+        Among(u"osu", -1, 123),
+        Among(u"atu", -1, 120),
+        Among(u"ikatu", 1967, 68),
+        Among(u"latu", 1967, 69),
+        Among(u"etu", -1, 70),
+        Among(u"evitu", -1, 92),
+        Among(u"ovitu", -1, 93),
+        Among(u"astu", -1, 94),
+        Among(u"estu", -1, 71),
+        Among(u"istu", -1, 72),
+        Among(u"kstu", -1, 73),
+        Among(u"ostu", -1, 74),
+        Among(u"ištu", -1, 75),
+        Among(u"avu", -1, 77),
+        Among(u"evu", -1, 78),
+        Among(u"ivu", -1, 79),
+        Among(u"ovu", -1, 80),
+        Among(u"lovu", 1982, 82),
+        Among(u"movu", 1982, 81),
+        Among(u"stvu", -1, 3),
+        Among(u"štvu", -1, 4),
+        Among(u"bašu", -1, 63),
+        Among(u"gašu", -1, 64),
+        Among(u"jašu", -1, 61),
+        Among(u"kašu", -1, 62),
+        Among(u"našu", -1, 60),
+        Among(u"tašu", -1, 59),
+        Among(u"vašu", -1, 65),
+        Among(u"ešu", -1, 66),
+        Among(u"išu", -1, 67),
+        Among(u"ošu", -1, 91),
+        Among(u"avav", -1, 97),
+        Among(u"evav", -1, 96),
+        Among(u"ivav", -1, 98),
+        Among(u"uvav", -1, 99),
+        Among(u"kov", -1, 95),
+        Among(u"aš", -1, 104),
+        Among(u"iraš", 2002, 100),
+        Among(u"uraš", 2002, 105),
+        Among(u"taš", 2002, 113),
+        Among(u"avaš", 2002, 97),
+        Among(u"evaš", 2002, 96),
+        Among(u"ivaš", 2002, 98),
+        Among(u"uvaš", 2002, 99),
+        Among(u"ačaš", 2002, 102),
+        Among(u"eš", -1, 119),
+        Among(u"astadeš", 2011, 110),
+        Among(u"istadeš", 2011, 111),
+        Among(u"ostadeš", 2011, 112),
+        Among(u"astaješ", 2011, 106),
+        Among(u"istaješ", 2011, 107),
+        Among(u"ostaješ", 2011, 108),
+        Among(u"iješ", 2011, 116),
+        Among(u"inješ", 2011, 114),
+        Among(u"uješ", 2011, 25),
+        Among(u"iruješ", 2020, 100),
+        Among(u"lučuješ", 2020, 117),
+        Among(u"neš", 2011, 13),
+        Among(u"astaneš", 2023, 110),
+        Among(u"istaneš", 2023, 111),
+        Among(u"ostaneš", 2023, 112),
+        Among(u"eteš", 2011, 70),
+        Among(u"asteš", 2011, 115),
+        Among(u"iš", -1, 116),
+        Among(u"niš", 2029, 103),
+        Among(u"jetiš", 2029, 118),
+        Among(u"ačiš", 2029, 101),
+        Among(u"lučiš", 2029, 117),
+        Among(u"rošiš", 2029, 90)
+    ]
+
+    a_3 = [
+        Among(u"a", -1, 1),
+        Among(u"oga", 0, 1),
+        Among(u"ama", 0, 1),
+        Among(u"ima", 0, 1),
+        Among(u"ena", 0, 1),
+        Among(u"e", -1, 1),
+        Among(u"og", -1, 1),
+        Among(u"anog", 6, 1),
+        Among(u"enog", 6, 1),
+        Among(u"anih", -1, 1),
+        Among(u"enih", -1, 1),
+        Among(u"i", -1, 1),
+        Among(u"ani", 11, 1),
+        Among(u"eni", 11, 1),
+        Among(u"anoj", -1, 1),
+        Among(u"enoj", -1, 1),
+        Among(u"anim", -1, 1),
+        Among(u"enim", -1, 1),
+        Among(u"om", -1, 1),
+        Among(u"enom", 18, 1),
+        Among(u"o", -1, 1),
+        Among(u"ano", 20, 1),
+        Among(u"eno", 20, 1),
+        Among(u"ost", -1, 1),
+        Among(u"u", -1, 1),
+        Among(u"enu", 24, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
+
+
+class lab9(BaseException): pass
+
+
+class lab10(BaseException): pass
+
+
+class lab11(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/spanish_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/spanish_stemmer.py
new file mode 100644
index 000000000..61dd22304
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/spanish_stemmer.py
@@ -0,0 +1,703 @@
+#-*- coding: utf-8 -*-
+# Generated from spanish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class SpanishStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from spanish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"á", u"é", u"í", u"ó", u"ú", u"ü"}
+
+    I_p2 = 0
+    I_p1 = 0
+    I_pV = 0
+
+    def __r_mark_regions(self):
+        self.I_pV = self.limit
+        self.I_p1 = self.limit
+        self.I_p2 = self.limit
+        v_1 = self.cursor
+        try:
+            try:
+                v_2 = self.cursor
+                try:
+                    if not self.in_grouping(SpanishStemmer.g_v):
+                        raise lab2()
+                    try:
+                        v_3 = self.cursor
+                        try:
+                            if not self.out_grouping(SpanishStemmer.g_v):
+                                raise lab4()
+                            if not self.go_out_grouping(SpanishStemmer.g_v):
+                                raise lab4()
+                            self.cursor += 1
+                            raise lab3()
+                        except lab4: pass
+                        self.cursor = v_3
+                        if not self.in_grouping(SpanishStemmer.g_v):
+                            raise lab2()
+                        if not self.go_in_grouping(SpanishStemmer.g_v):
+                            raise lab2()
+                        self.cursor += 1
+                    except lab3: pass
+                    raise lab1()
+                except lab2: pass
+                self.cursor = v_2
+                if not self.out_grouping(SpanishStemmer.g_v):
+                    raise lab0()
+                try:
+                    v_4 = self.cursor
+                    try:
+                        if not self.out_grouping(SpanishStemmer.g_v):
+                            raise lab6()
+                        if not self.go_out_grouping(SpanishStemmer.g_v):
+                            raise lab6()
+                        self.cursor += 1
+                        raise lab5()
+                    except lab6: pass
+                    self.cursor = v_4
+                    if not self.in_grouping(SpanishStemmer.g_v):
+                        raise lab0()
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                except lab5: pass
+            except lab1: pass
+            self.I_pV = self.cursor
+        except lab0: pass
+        self.cursor = v_1
+        v_5 = self.cursor
+        try:
+            if not self.go_out_grouping(SpanishStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            if not self.go_in_grouping(SpanishStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            self.I_p1 = self.cursor
+            if not self.go_out_grouping(SpanishStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            if not self.go_in_grouping(SpanishStemmer.g_v):
+                raise lab7()
+            self.cursor += 1
+            self.I_p2 = self.cursor
+        except lab7: pass
+        self.cursor = v_5
+        return True
+
+    def __r_postlude(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                self.bra = self.cursor
+                among_var = self.find_among(SpanishStemmer.a_0)
+                self.ket = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"a"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"e"):
+                        return False
+                elif among_var == 3:
+                    if not self.slice_from(u"i"):
+                        return False
+                elif among_var == 4:
+                    if not self.slice_from(u"o"):
+                        return False
+                elif among_var == 5:
+                    if not self.slice_from(u"u"):
+                        return False
+                else:
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_RV(self):
+        return self.I_pV <= self.cursor
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R2(self):
+        return self.I_p2 <= self.cursor
+
+    def __r_attached_pronoun(self):
+        self.ket = self.cursor
+        if self.find_among_b(SpanishStemmer.a_1) == 0:
+            return False
+        self.bra = self.cursor
+        among_var = self.find_among_b(SpanishStemmer.a_2)
+        if among_var == 0:
+            return False
+        if not self.__r_RV():
+            return False
+        if among_var == 1:
+            self.bra = self.cursor
+            if not self.slice_from(u"iendo"):
+                return False
+        elif among_var == 2:
+            self.bra = self.cursor
+            if not self.slice_from(u"ando"):
+                return False
+        elif among_var == 3:
+            self.bra = self.cursor
+            if not self.slice_from(u"ar"):
+                return False
+        elif among_var == 4:
+            self.bra = self.cursor
+            if not self.slice_from(u"er"):
+                return False
+        elif among_var == 5:
+            self.bra = self.cursor
+            if not self.slice_from(u"ir"):
+                return False
+        elif among_var == 6:
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.eq_s_b(u"u"):
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_standard_suffix(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(SpanishStemmer.a_6)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if not self.eq_s_b(u"ic"):
+                    self.cursor = self.limit - v_1
+                    raise lab0()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_1
+                    raise lab0()
+                if not self.slice_del():
+                    return False
+
+            except lab0: pass
+        elif among_var == 3:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"log"):
+                return False
+        elif among_var == 4:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"u"):
+                return False
+        elif among_var == 5:
+            if not self.__r_R2():
+                return False
+            if not self.slice_from(u"ente"):
+                return False
+        elif among_var == 6:
+            if not self.__r_R1():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_2 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                among_var = self.find_among_b(SpanishStemmer.a_3)
+                if among_var == 0:
+                    self.cursor = self.limit - v_2
+                    raise lab1()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_2
+                    raise lab1()
+                if not self.slice_del():
+                    return False
+
+                if among_var == 1:
+                    self.ket = self.cursor
+                    if not self.eq_s_b(u"at"):
+                        self.cursor = self.limit - v_2
+                        raise lab1()
+                    self.bra = self.cursor
+                    if not self.__r_R2():
+                        self.cursor = self.limit - v_2
+                        raise lab1()
+                    if not self.slice_del():
+                        return False
+
+            except lab1: pass
+        elif among_var == 7:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_3 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if self.find_among_b(SpanishStemmer.a_4) == 0:
+                    self.cursor = self.limit - v_3
+                    raise lab2()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_3
+                    raise lab2()
+                if not self.slice_del():
+                    return False
+
+            except lab2: pass
+        elif among_var == 8:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_4 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if self.find_among_b(SpanishStemmer.a_5) == 0:
+                    self.cursor = self.limit - v_4
+                    raise lab3()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_4
+                    raise lab3()
+                if not self.slice_del():
+                    return False
+
+            except lab3: pass
+        else:
+            if not self.__r_R2():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_5 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if not self.eq_s_b(u"at"):
+                    self.cursor = self.limit - v_5
+                    raise lab4()
+                self.bra = self.cursor
+                if not self.__r_R2():
+                    self.cursor = self.limit - v_5
+                    raise lab4()
+                if not self.slice_del():
+                    return False
+
+            except lab4: pass
+        return True
+
+    def __r_y_verb_suffix(self):
+        if self.cursor < self.I_pV:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_pV
+        self.ket = self.cursor
+        if self.find_among_b(SpanishStemmer.a_7) == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if not self.eq_s_b(u"u"):
+            return False
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_verb_suffix(self):
+        if self.cursor < self.I_pV:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_pV
+        self.ket = self.cursor
+        among_var = self.find_among_b(SpanishStemmer.a_8)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            v_3 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"u"):
+                    self.cursor = self.limit - v_3
+                    raise lab0()
+                v_4 = self.limit - self.cursor
+                if not self.eq_s_b(u"g"):
+                    self.cursor = self.limit - v_3
+                    raise lab0()
+                self.cursor = self.limit - v_4
+            except lab0: pass
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_residual_suffix(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(SpanishStemmer.a_9)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.__r_RV():
+                return False
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.__r_RV():
+                return False
+            if not self.slice_del():
+                return False
+
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if not self.eq_s_b(u"u"):
+                    self.cursor = self.limit - v_1
+                    raise lab0()
+                self.bra = self.cursor
+                v_2 = self.limit - self.cursor
+                if not self.eq_s_b(u"g"):
+                    self.cursor = self.limit - v_1
+                    raise lab0()
+                self.cursor = self.limit - v_2
+                if not self.__r_RV():
+                    self.cursor = self.limit - v_1
+                    raise lab0()
+                if not self.slice_del():
+                    return False
+
+            except lab0: pass
+        return True
+
+    def _stem(self):
+        self.__r_mark_regions()
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_2 = self.limit - self.cursor
+        self.__r_attached_pronoun()
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        try:
+            try:
+                v_4 = self.limit - self.cursor
+                try:
+                    if not self.__r_standard_suffix():
+                        raise lab2()
+                    raise lab1()
+                except lab2: pass
+                self.cursor = self.limit - v_4
+                try:
+                    if not self.__r_y_verb_suffix():
+                        raise lab3()
+                    raise lab1()
+                except lab3: pass
+                self.cursor = self.limit - v_4
+                if not self.__r_verb_suffix():
+                    raise lab0()
+            except lab1: pass
+        except lab0: pass
+        self.cursor = self.limit - v_3
+        v_5 = self.limit - self.cursor
+        self.__r_residual_suffix()
+        self.cursor = self.limit - v_5
+        self.cursor = self.limit_backward
+        v_6 = self.cursor
+        self.__r_postlude()
+        self.cursor = v_6
+        return True
+
+    a_0 = [
+        Among(u"", -1, 6),
+        Among(u"á", 0, 1),
+        Among(u"é", 0, 2),
+        Among(u"í", 0, 3),
+        Among(u"ó", 0, 4),
+        Among(u"ú", 0, 5)
+    ]
+
+    a_1 = [
+        Among(u"la", -1, -1),
+        Among(u"sela", 0, -1),
+        Among(u"le", -1, -1),
+        Among(u"me", -1, -1),
+        Among(u"se", -1, -1),
+        Among(u"lo", -1, -1),
+        Among(u"selo", 5, -1),
+        Among(u"las", -1, -1),
+        Among(u"selas", 7, -1),
+        Among(u"les", -1, -1),
+        Among(u"los", -1, -1),
+        Among(u"selos", 10, -1),
+        Among(u"nos", -1, -1)
+    ]
+
+    a_2 = [
+        Among(u"ando", -1, 6),
+        Among(u"iendo", -1, 6),
+        Among(u"yendo", -1, 7),
+        Among(u"ándo", -1, 2),
+        Among(u"iéndo", -1, 1),
+        Among(u"ar", -1, 6),
+        Among(u"er", -1, 6),
+        Among(u"ir", -1, 6),
+        Among(u"ár", -1, 3),
+        Among(u"ér", -1, 4),
+        Among(u"ír", -1, 5)
+    ]
+
+    a_3 = [
+        Among(u"ic", -1, -1),
+        Among(u"ad", -1, -1),
+        Among(u"os", -1, -1),
+        Among(u"iv", -1, 1)
+    ]
+
+    a_4 = [
+        Among(u"able", -1, 1),
+        Among(u"ible", -1, 1),
+        Among(u"ante", -1, 1)
+    ]
+
+    a_5 = [
+        Among(u"ic", -1, 1),
+        Among(u"abil", -1, 1),
+        Among(u"iv", -1, 1)
+    ]
+
+    a_6 = [
+        Among(u"ica", -1, 1),
+        Among(u"ancia", -1, 2),
+        Among(u"encia", -1, 5),
+        Among(u"adora", -1, 2),
+        Among(u"osa", -1, 1),
+        Among(u"ista", -1, 1),
+        Among(u"iva", -1, 9),
+        Among(u"anza", -1, 1),
+        Among(u"logía", -1, 3),
+        Among(u"idad", -1, 8),
+        Among(u"able", -1, 1),
+        Among(u"ible", -1, 1),
+        Among(u"ante", -1, 2),
+        Among(u"mente", -1, 7),
+        Among(u"amente", 13, 6),
+        Among(u"acion", -1, 2),
+        Among(u"ucion", -1, 4),
+        Among(u"ación", -1, 2),
+        Among(u"ución", -1, 4),
+        Among(u"ico", -1, 1),
+        Among(u"ismo", -1, 1),
+        Among(u"oso", -1, 1),
+        Among(u"amiento", -1, 1),
+        Among(u"imiento", -1, 1),
+        Among(u"ivo", -1, 9),
+        Among(u"ador", -1, 2),
+        Among(u"icas", -1, 1),
+        Among(u"ancias", -1, 2),
+        Among(u"encias", -1, 5),
+        Among(u"adoras", -1, 2),
+        Among(u"osas", -1, 1),
+        Among(u"istas", -1, 1),
+        Among(u"ivas", -1, 9),
+        Among(u"anzas", -1, 1),
+        Among(u"logías", -1, 3),
+        Among(u"idades", -1, 8),
+        Among(u"ables", -1, 1),
+        Among(u"ibles", -1, 1),
+        Among(u"aciones", -1, 2),
+        Among(u"uciones", -1, 4),
+        Among(u"adores", -1, 2),
+        Among(u"antes", -1, 2),
+        Among(u"icos", -1, 1),
+        Among(u"ismos", -1, 1),
+        Among(u"osos", -1, 1),
+        Among(u"amientos", -1, 1),
+        Among(u"imientos", -1, 1),
+        Among(u"ivos", -1, 9)
+    ]
+
+    a_7 = [
+        Among(u"ya", -1, 1),
+        Among(u"ye", -1, 1),
+        Among(u"yan", -1, 1),
+        Among(u"yen", -1, 1),
+        Among(u"yeron", -1, 1),
+        Among(u"yendo", -1, 1),
+        Among(u"yo", -1, 1),
+        Among(u"yas", -1, 1),
+        Among(u"yes", -1, 1),
+        Among(u"yais", -1, 1),
+        Among(u"yamos", -1, 1),
+        Among(u"yó", -1, 1)
+    ]
+
+    a_8 = [
+        Among(u"aba", -1, 2),
+        Among(u"ada", -1, 2),
+        Among(u"ida", -1, 2),
+        Among(u"ara", -1, 2),
+        Among(u"iera", -1, 2),
+        Among(u"ía", -1, 2),
+        Among(u"aría", 5, 2),
+        Among(u"ería", 5, 2),
+        Among(u"iría", 5, 2),
+        Among(u"ad", -1, 2),
+        Among(u"ed", -1, 2),
+        Among(u"id", -1, 2),
+        Among(u"ase", -1, 2),
+        Among(u"iese", -1, 2),
+        Among(u"aste", -1, 2),
+        Among(u"iste", -1, 2),
+        Among(u"an", -1, 2),
+        Among(u"aban", 16, 2),
+        Among(u"aran", 16, 2),
+        Among(u"ieran", 16, 2),
+        Among(u"ían", 16, 2),
+        Among(u"arían", 20, 2),
+        Among(u"erían", 20, 2),
+        Among(u"irían", 20, 2),
+        Among(u"en", -1, 1),
+        Among(u"asen", 24, 2),
+        Among(u"iesen", 24, 2),
+        Among(u"aron", -1, 2),
+        Among(u"ieron", -1, 2),
+        Among(u"arán", -1, 2),
+        Among(u"erán", -1, 2),
+        Among(u"irán", -1, 2),
+        Among(u"ado", -1, 2),
+        Among(u"ido", -1, 2),
+        Among(u"ando", -1, 2),
+        Among(u"iendo", -1, 2),
+        Among(u"ar", -1, 2),
+        Among(u"er", -1, 2),
+        Among(u"ir", -1, 2),
+        Among(u"as", -1, 2),
+        Among(u"abas", 39, 2),
+        Among(u"adas", 39, 2),
+        Among(u"idas", 39, 2),
+        Among(u"aras", 39, 2),
+        Among(u"ieras", 39, 2),
+        Among(u"ías", 39, 2),
+        Among(u"arías", 45, 2),
+        Among(u"erías", 45, 2),
+        Among(u"irías", 45, 2),
+        Among(u"es", -1, 1),
+        Among(u"ases", 49, 2),
+        Among(u"ieses", 49, 2),
+        Among(u"abais", -1, 2),
+        Among(u"arais", -1, 2),
+        Among(u"ierais", -1, 2),
+        Among(u"íais", -1, 2),
+        Among(u"aríais", 55, 2),
+        Among(u"eríais", 55, 2),
+        Among(u"iríais", 55, 2),
+        Among(u"aseis", -1, 2),
+        Among(u"ieseis", -1, 2),
+        Among(u"asteis", -1, 2),
+        Among(u"isteis", -1, 2),
+        Among(u"áis", -1, 2),
+        Among(u"éis", -1, 1),
+        Among(u"aréis", 64, 2),
+        Among(u"eréis", 64, 2),
+        Among(u"iréis", 64, 2),
+        Among(u"ados", -1, 2),
+        Among(u"idos", -1, 2),
+        Among(u"amos", -1, 2),
+        Among(u"ábamos", 70, 2),
+        Among(u"áramos", 70, 2),
+        Among(u"iéramos", 70, 2),
+        Among(u"íamos", 70, 2),
+        Among(u"aríamos", 74, 2),
+        Among(u"eríamos", 74, 2),
+        Among(u"iríamos", 74, 2),
+        Among(u"emos", -1, 1),
+        Among(u"aremos", 78, 2),
+        Among(u"eremos", 78, 2),
+        Among(u"iremos", 78, 2),
+        Among(u"ásemos", 78, 2),
+        Among(u"iésemos", 78, 2),
+        Among(u"imos", -1, 2),
+        Among(u"arás", -1, 2),
+        Among(u"erás", -1, 2),
+        Among(u"irás", -1, 2),
+        Among(u"ís", -1, 2),
+        Among(u"ará", -1, 2),
+        Among(u"erá", -1, 2),
+        Among(u"irá", -1, 2),
+        Among(u"aré", -1, 2),
+        Among(u"eré", -1, 2),
+        Among(u"iré", -1, 2),
+        Among(u"ió", -1, 2)
+    ]
+
+    a_9 = [
+        Among(u"a", -1, 1),
+        Among(u"e", -1, 2),
+        Among(u"o", -1, 1),
+        Among(u"os", -1, 1),
+        Among(u"á", -1, 1),
+        Among(u"é", -1, 2),
+        Among(u"í", -1, 1),
+        Among(u"ó", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/swedish_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/swedish_stemmer.py
new file mode 100644
index 000000000..b65e8ebf5
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/swedish_stemmer.py
@@ -0,0 +1,262 @@
+#-*- coding: utf-8 -*-
+# Generated from swedish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class SwedishStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from swedish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_v = {u"a", u"e", u"i", u"o", u"u", u"y", u"ä", u"å", u"ö"}
+
+    g_s_ending = {u"b", u"c", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"m", u"n", u"o", u"p", u"r", u"t", u"v", u"y"}
+
+    g_ost_ending = {u"i", u"k", u"l", u"n", u"p", u"r", u"t", u"u", u"v"}
+
+    I_x = 0
+    I_p1 = 0
+
+    def __r_mark_regions(self):
+        self.I_p1 = self.limit
+        v_1 = self.cursor
+        c = self.cursor + 3
+        if c > self.limit:
+            return False
+        self.cursor = c
+        self.I_x = self.cursor
+        self.cursor = v_1
+        if not self.go_out_grouping(SwedishStemmer.g_v):
+            return False
+        self.cursor += 1
+        if not self.go_in_grouping(SwedishStemmer.g_v):
+            return False
+        self.cursor += 1
+        self.I_p1 = self.cursor
+        try:
+            if self.I_p1 >= self.I_x:
+                raise lab0()
+            self.I_p1 = self.I_x
+        except lab0: pass
+        return True
+
+    def __r_et_condition(self):
+        v_1 = self.limit - self.cursor
+        if not self.out_grouping_b(SwedishStemmer.g_v):
+            return False
+        if not self.in_grouping_b(SwedishStemmer.g_v):
+            return False
+        try:
+            if self.cursor > self.limit_backward:
+                raise lab0()
+            return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        v_3 = self.limit - self.cursor
+        try:
+            if self.find_among_b(SwedishStemmer.a_0) == 0:
+                raise lab1()
+            return False
+        except lab1: pass
+        self.cursor = self.limit - v_3
+        return True
+
+    def __r_main_suffix(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(SwedishStemmer.a_1)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            try:
+                v_3 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"et"):
+                        raise lab1()
+                    if not self.__r_et_condition():
+                        raise lab1()
+                    self.bra = self.cursor
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_3
+                if not self.in_grouping_b(SwedishStemmer.g_s_ending):
+                    return False
+            except lab0: pass
+            if not self.slice_del():
+                return False
+
+        else:
+            if not self.__r_et_condition():
+                return False
+            if not self.slice_del():
+                return False
+
+        return True
+
+    def __r_consonant_pair(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        v_3 = self.limit - self.cursor
+        if self.find_among_b(SwedishStemmer.a_2) == 0:
+            self.limit_backward = v_2
+            return False
+        self.cursor = self.limit - v_3
+        self.ket = self.cursor
+        if self.cursor <= self.limit_backward:
+            self.limit_backward = v_2
+            return False
+        self.cursor -= 1
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.limit_backward = v_2
+        return True
+
+    def __r_other_suffix(self):
+        if self.cursor < self.I_p1:
+            return False
+        v_2 = self.limit_backward
+        self.limit_backward = self.I_p1
+        self.ket = self.cursor
+        among_var = self.find_among_b(SwedishStemmer.a_3)
+        if among_var == 0:
+            self.limit_backward = v_2
+            return False
+        self.bra = self.cursor
+        self.limit_backward = v_2
+        if among_var == 1:
+            if not self.slice_del():
+                return False
+
+        elif among_var == 2:
+            if not self.in_grouping_b(SwedishStemmer.g_ost_ending):
+                return False
+            if not self.slice_from(u"ös"):
+                return False
+        else:
+            if not self.slice_from(u"full"):
+                return False
+        return True
+
+    def _stem(self):
+        v_1 = self.cursor
+        self.__r_mark_regions()
+        self.cursor = v_1
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_2 = self.limit - self.cursor
+        self.__r_main_suffix()
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        self.__r_consonant_pair()
+        self.cursor = self.limit - v_3
+        v_4 = self.limit - self.cursor
+        self.__r_other_suffix()
+        self.cursor = self.limit - v_4
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"fab", -1, -1),
+        Among(u"h", -1, -1),
+        Among(u"pak", -1, -1),
+        Among(u"rak", -1, -1),
+        Among(u"stak", -1, -1),
+        Among(u"kom", -1, -1),
+        Among(u"iet", -1, -1),
+        Among(u"cit", -1, -1),
+        Among(u"dit", -1, -1),
+        Among(u"alit", -1, -1),
+        Among(u"ilit", -1, -1),
+        Among(u"mit", -1, -1),
+        Among(u"nit", -1, -1),
+        Among(u"pit", -1, -1),
+        Among(u"rit", -1, -1),
+        Among(u"sit", -1, -1),
+        Among(u"tit", -1, -1),
+        Among(u"uit", -1, -1),
+        Among(u"ivit", -1, -1),
+        Among(u"kvit", -1, -1),
+        Among(u"xit", -1, -1)
+    ]
+
+    a_1 = [
+        Among(u"a", -1, 1),
+        Among(u"arna", 0, 1),
+        Among(u"erna", 0, 1),
+        Among(u"heterna", 2, 1),
+        Among(u"orna", 0, 1),
+        Among(u"ad", -1, 1),
+        Among(u"e", -1, 1),
+        Among(u"ade", 6, 1),
+        Among(u"ande", 6, 1),
+        Among(u"arne", 6, 1),
+        Among(u"are", 6, 1),
+        Among(u"aste", 6, 1),
+        Among(u"en", -1, 1),
+        Among(u"anden", 12, 1),
+        Among(u"aren", 12, 1),
+        Among(u"heten", 12, 1),
+        Among(u"ern", -1, 1),
+        Among(u"ar", -1, 1),
+        Among(u"er", -1, 1),
+        Among(u"heter", 18, 1),
+        Among(u"or", -1, 1),
+        Among(u"s", -1, 2),
+        Among(u"as", 21, 1),
+        Among(u"arnas", 22, 1),
+        Among(u"ernas", 22, 1),
+        Among(u"ornas", 22, 1),
+        Among(u"es", 21, 1),
+        Among(u"ades", 26, 1),
+        Among(u"andes", 26, 1),
+        Among(u"ens", 21, 1),
+        Among(u"arens", 29, 1),
+        Among(u"hetens", 29, 1),
+        Among(u"erns", 21, 1),
+        Among(u"at", -1, 1),
+        Among(u"et", -1, 3),
+        Among(u"andet", 34, 1),
+        Among(u"het", 34, 1),
+        Among(u"ast", -1, 1)
+    ]
+
+    a_2 = [
+        Among(u"dd", -1, -1),
+        Among(u"gd", -1, -1),
+        Among(u"nn", -1, -1),
+        Among(u"dt", -1, -1),
+        Among(u"gt", -1, -1),
+        Among(u"kt", -1, -1),
+        Among(u"tt", -1, -1)
+    ]
+
+    a_3 = [
+        Among(u"ig", -1, 1),
+        Among(u"lig", 0, 1),
+        Among(u"els", -1, 1),
+        Among(u"fullt", -1, 3),
+        Among(u"öst", -1, 2)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/tamil_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/tamil_stemmer.py
new file mode 100644
index 000000000..ce6eb24b5
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/tamil_stemmer.py
@@ -0,0 +1,935 @@
+#-*- coding: utf-8 -*-
+# Generated from tamil.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class TamilStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from tamil.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    B_found_vetrumai_urupu = False
+    B_found_a_match = False
+
+    def __r_has_min_length(self):
+        return len(self.current) > 4
+
+    def __r_fix_va_start(self):
+        self.bra = self.cursor
+        among_var = self.find_among(TamilStemmer.a_0)
+        if among_var == 0:
+            return False
+        self.ket = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"\u0B93"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"\u0B92"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"\u0B89"):
+                return False
+        else:
+            if not self.slice_from(u"\u0B8A"):
+                return False
+        return True
+
+    def __r_fix_endings(self):
+        v_1 = self.cursor
+        try:
+            while True:
+                v_2 = self.cursor
+                try:
+                    if not self.__r_fix_ending():
+                        raise lab1()
+                    continue
+                except lab1: pass
+                self.cursor = v_2
+                break
+        except lab0: pass
+        self.cursor = v_1
+        return True
+
+    def __r_remove_question_prefixes(self):
+        self.bra = self.cursor
+        if not self.eq_s(u"\u0B8E"):
+            return False
+        if self.find_among(TamilStemmer.a_1) == 0:
+            return False
+        if not self.eq_s(u"\u0BCD"):
+            return False
+        self.ket = self.cursor
+        if not self.slice_del():
+            return False
+
+        v_1 = self.cursor
+        self.__r_fix_va_start()
+        self.cursor = v_1
+        return True
+
+    def __r_fix_ending(self):
+        if len(self.current) <= 3:
+            return False
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                among_var = self.find_among_b(TamilStemmer.a_5)
+                if among_var == 0:
+                    raise lab1()
+                self.bra = self.cursor
+                if among_var == 1:
+                    if not self.slice_del():
+                        return False
+
+                elif among_var == 2:
+                    v_2 = self.limit - self.cursor
+                    if self.find_among_b(TamilStemmer.a_2) == 0:
+                        raise lab1()
+                    self.cursor = self.limit - v_2
+                    if not self.slice_del():
+                        return False
+
+                elif among_var == 3:
+                    if not self.slice_from(u"\u0BB3\u0BCD"):
+                        return False
+                elif among_var == 4:
+                    if not self.slice_from(u"\u0BB2\u0BCD"):
+                        return False
+                elif among_var == 5:
+                    if not self.slice_from(u"\u0B9F\u0BC1"):
+                        return False
+                elif among_var == 6:
+                    if not self.B_found_vetrumai_urupu:
+                        raise lab1()
+                    v_3 = self.limit - self.cursor
+                    try:
+                        if not self.eq_s_b(u"\u0BC8"):
+                            raise lab2()
+                        raise lab1()
+                    except lab2: pass
+                    self.cursor = self.limit - v_3
+                    if not self.slice_from(u"\u0BAE\u0BCD"):
+                        return False
+                elif among_var == 7:
+                    if not self.slice_from(u"\u0BCD"):
+                        return False
+                elif among_var == 8:
+                    v_4 = self.limit - self.cursor
+                    try:
+                        if self.find_among_b(TamilStemmer.a_3) == 0:
+                            raise lab3()
+                        raise lab1()
+                    except lab3: pass
+                    self.cursor = self.limit - v_4
+                    if not self.slice_del():
+                        return False
+
+                else:
+                    among_var = self.find_among_b(TamilStemmer.a_4)
+                    if among_var == 1:
+                        if not self.slice_del():
+                            return False
+
+                    else:
+                        if not self.slice_from(u"\u0BAE\u0BCD"):
+                            return False
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            self.ket = self.cursor
+            if not self.eq_s_b(u"\u0BCD"):
+                return False
+            try:
+                v_5 = self.limit - self.cursor
+                try:
+                    if self.find_among_b(TamilStemmer.a_6) == 0:
+                        raise lab5()
+                    v_6 = self.limit - self.cursor
+                    try:
+                        if not self.eq_s_b(u"\u0BCD"):
+                            self.cursor = self.limit - v_6
+                            raise lab6()
+                        if self.find_among_b(TamilStemmer.a_7) == 0:
+                            self.cursor = self.limit - v_6
+                            raise lab6()
+                    except lab6: pass
+                    self.bra = self.cursor
+                    if not self.slice_del():
+                        return False
+
+                    raise lab4()
+                except lab5: pass
+                self.cursor = self.limit - v_5
+                try:
+                    if self.find_among_b(TamilStemmer.a_8) == 0:
+                        raise lab7()
+                    self.bra = self.cursor
+                    if not self.eq_s_b(u"\u0BCD"):
+                        raise lab7()
+                    if not self.slice_del():
+                        return False
+
+                    raise lab4()
+                except lab7: pass
+                self.cursor = self.limit - v_5
+                v_7 = self.limit - self.cursor
+                if self.find_among_b(TamilStemmer.a_9) == 0:
+                    return False
+                self.cursor = self.limit - v_7
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+            except lab4: pass
+        except lab0: pass
+        self.cursor = self.limit_backward
+        return True
+
+    def __r_remove_pronoun_prefixes(self):
+        self.bra = self.cursor
+        if self.find_among(TamilStemmer.a_10) == 0:
+            return False
+        if self.find_among(TamilStemmer.a_11) == 0:
+            return False
+        if not self.eq_s(u"\u0BCD"):
+            return False
+        self.ket = self.cursor
+        if not self.slice_del():
+            return False
+
+        v_1 = self.cursor
+        self.__r_fix_va_start()
+        self.cursor = v_1
+        return True
+
+    def __r_remove_plural_suffix(self):
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        self.ket = self.cursor
+        among_var = self.find_among_b(TamilStemmer.a_13)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            try:
+                v_1 = self.limit - self.cursor
+                try:
+                    if self.find_among_b(TamilStemmer.a_12) == 0:
+                        raise lab1()
+                    if not self.slice_from(u"\u0BC1\u0B99\u0BCD"):
+                        return False
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_1
+                if not self.slice_from(u"\u0BCD"):
+                    return False
+            except lab0: pass
+        elif among_var == 2:
+            if not self.slice_from(u"\u0BB2\u0BCD"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"\u0BB3\u0BCD"):
+                return False
+        else:
+            if not self.slice_del():
+                return False
+
+        self.cursor = self.limit_backward
+        return True
+
+    def __r_remove_question_suffixes(self):
+        if not self.__r_has_min_length():
+            return False
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if self.find_among_b(TamilStemmer.a_14) == 0:
+                raise lab0()
+            self.bra = self.cursor
+            if not self.slice_from(u"\u0BCD"):
+                return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        self.cursor = self.limit_backward
+        self.__r_fix_endings()
+        return True
+
+    def __r_remove_command_suffixes(self):
+        if not self.__r_has_min_length():
+            return False
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        self.ket = self.cursor
+        if self.find_among_b(TamilStemmer.a_15) == 0:
+            return False
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        self.cursor = self.limit_backward
+        return True
+
+    def __r_remove_um(self):
+        if not self.__r_has_min_length():
+            return False
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        self.ket = self.cursor
+        if not self.eq_s_b(u"\u0BC1\u0BAE\u0BCD"):
+            return False
+        self.bra = self.cursor
+        if not self.slice_from(u"\u0BCD"):
+            return False
+        self.cursor = self.limit_backward
+        v_1 = self.cursor
+        self.__r_fix_ending()
+        self.cursor = v_1
+        return True
+
+    def __r_remove_common_word_endings(self):
+        if not self.__r_has_min_length():
+            return False
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        self.ket = self.cursor
+        among_var = self.find_among_b(TamilStemmer.a_17)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"\u0BCD"):
+                return False
+        elif among_var == 2:
+            v_1 = self.limit - self.cursor
+            try:
+                if self.find_among_b(TamilStemmer.a_16) == 0:
+                    raise lab0()
+                return False
+            except lab0: pass
+            self.cursor = self.limit - v_1
+            if not self.slice_from(u"\u0BCD"):
+                return False
+        else:
+            if not self.slice_del():
+                return False
+
+        self.cursor = self.limit_backward
+        self.__r_fix_endings()
+        return True
+
+    def __r_remove_vetrumai_urupukal(self):
+        self.B_found_vetrumai_urupu = False
+        if not self.__r_has_min_length():
+            return False
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                v_2 = self.limit - self.cursor
+                self.ket = self.cursor
+                among_var = self.find_among_b(TamilStemmer.a_20)
+                if among_var == 0:
+                    raise lab1()
+                self.bra = self.cursor
+                if among_var == 1:
+                    if not self.slice_del():
+                        return False
+
+                elif among_var == 2:
+                    if not self.slice_from(u"\u0BCD"):
+                        return False
+                elif among_var == 3:
+                    v_3 = self.limit - self.cursor
+                    try:
+                        if not self.eq_s_b(u"\u0BAE"):
+                            raise lab2()
+                        raise lab1()
+                    except lab2: pass
+                    self.cursor = self.limit - v_3
+                    if not self.slice_from(u"\u0BCD"):
+                        return False
+                elif among_var == 4:
+                    if len(self.current) < 7:
+                        raise lab1()
+                    if not self.slice_from(u"\u0BCD"):
+                        return False
+                elif among_var == 5:
+                    v_4 = self.limit - self.cursor
+                    try:
+                        if self.find_among_b(TamilStemmer.a_18) == 0:
+                            raise lab3()
+                        raise lab1()
+                    except lab3: pass
+                    self.cursor = self.limit - v_4
+                    if not self.slice_from(u"\u0BCD"):
+                        return False
+                elif among_var == 6:
+                    v_5 = self.limit - self.cursor
+                    try:
+                        if self.find_among_b(TamilStemmer.a_19) == 0:
+                            raise lab4()
+                        raise lab1()
+                    except lab4: pass
+                    self.cursor = self.limit - v_5
+                    if not self.slice_del():
+                        return False
+
+                else:
+                    if not self.slice_from(u"\u0BBF"):
+                        return False
+                self.cursor = self.limit - v_2
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            v_6 = self.limit - self.cursor
+            self.ket = self.cursor
+            if not self.eq_s_b(u"\u0BC8"):
+                return False
+            try:
+                v_7 = self.limit - self.cursor
+                try:
+                    v_8 = self.limit - self.cursor
+                    try:
+                        if self.find_among_b(TamilStemmer.a_21) == 0:
+                            raise lab7()
+                        raise lab6()
+                    except lab7: pass
+                    self.cursor = self.limit - v_8
+                    raise lab5()
+                except lab6: pass
+                self.cursor = self.limit - v_7
+                v_9 = self.limit - self.cursor
+                if self.find_among_b(TamilStemmer.a_22) == 0:
+                    return False
+                if not self.eq_s_b(u"\u0BCD"):
+                    return False
+                self.cursor = self.limit - v_9
+            except lab5: pass
+            self.bra = self.cursor
+            if not self.slice_from(u"\u0BCD"):
+                return False
+            self.cursor = self.limit - v_6
+        except lab0: pass
+        self.B_found_vetrumai_urupu = True
+        v_10 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if not self.eq_s_b(u"\u0BBF\u0BA9\u0BCD"):
+                raise lab8()
+            self.bra = self.cursor
+            if not self.slice_from(u"\u0BCD"):
+                return False
+        except lab8: pass
+        self.cursor = self.limit - v_10
+        self.cursor = self.limit_backward
+        self.__r_fix_endings()
+        return True
+
+    def __r_remove_tense_suffixes(self):
+        while True:
+            v_1 = self.cursor
+            try:
+                if not self.__r_remove_tense_suffix():
+                    raise lab0()
+                continue
+            except lab0: pass
+            self.cursor = v_1
+            break
+        return True
+
+    def __r_remove_tense_suffix(self):
+        self.B_found_a_match = False
+        if not self.__r_has_min_length():
+            return False
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_1 = self.limit - self.cursor
+        try:
+            v_2 = self.limit - self.cursor
+            self.ket = self.cursor
+            among_var = self.find_among_b(TamilStemmer.a_25)
+            if among_var == 0:
+                raise lab0()
+            self.bra = self.cursor
+            if among_var == 1:
+                if not self.slice_del():
+                    return False
+
+            elif among_var == 2:
+                v_3 = self.limit - self.cursor
+                try:
+                    if self.find_among_b(TamilStemmer.a_23) == 0:
+                        raise lab1()
+                    raise lab0()
+                except lab1: pass
+                self.cursor = self.limit - v_3
+                if not self.slice_del():
+                    return False
+
+            elif among_var == 3:
+                v_4 = self.limit - self.cursor
+                try:
+                    if self.find_among_b(TamilStemmer.a_24) == 0:
+                        raise lab2()
+                    raise lab0()
+                except lab2: pass
+                self.cursor = self.limit - v_4
+                if not self.slice_del():
+                    return False
+
+            elif among_var == 4:
+                v_5 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"\u0B9A"):
+                        raise lab3()
+                    raise lab0()
+                except lab3: pass
+                self.cursor = self.limit - v_5
+                if not self.slice_from(u"\u0BCD"):
+                    return False
+            elif among_var == 5:
+                if not self.slice_from(u"\u0BCD"):
+                    return False
+            else:
+                v_6 = self.limit - self.cursor
+                if not self.eq_s_b(u"\u0BCD"):
+                    raise lab0()
+                self.cursor = self.limit - v_6
+                if not self.slice_del():
+                    return False
+
+            self.B_found_a_match = True
+            self.cursor = self.limit - v_2
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        v_7 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            if self.find_among_b(TamilStemmer.a_26) == 0:
+                raise lab4()
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+            self.B_found_a_match = True
+        except lab4: pass
+        self.cursor = self.limit - v_7
+        self.cursor = self.limit_backward
+        self.__r_fix_endings()
+        if not self.B_found_a_match:
+            return False
+        return True
+
+    def _stem(self):
+        self.B_found_vetrumai_urupu = False
+        v_1 = self.cursor
+        self.__r_fix_ending()
+        self.cursor = v_1
+        if not self.__r_has_min_length():
+            return False
+        v_2 = self.cursor
+        self.__r_remove_question_prefixes()
+        self.cursor = v_2
+        v_3 = self.cursor
+        self.__r_remove_pronoun_prefixes()
+        self.cursor = v_3
+        v_4 = self.cursor
+        self.__r_remove_question_suffixes()
+        self.cursor = v_4
+        v_5 = self.cursor
+        self.__r_remove_um()
+        self.cursor = v_5
+        v_6 = self.cursor
+        self.__r_remove_common_word_endings()
+        self.cursor = v_6
+        v_7 = self.cursor
+        self.__r_remove_vetrumai_urupukal()
+        self.cursor = v_7
+        v_8 = self.cursor
+        self.__r_remove_plural_suffix()
+        self.cursor = v_8
+        v_9 = self.cursor
+        self.__r_remove_command_suffixes()
+        self.cursor = v_9
+        v_10 = self.cursor
+        self.__r_remove_tense_suffixes()
+        self.cursor = v_10
+        return True
+
+    a_0 = [
+        Among(u"\u0BB5\u0BC1", -1, 3),
+        Among(u"\u0BB5\u0BC2", -1, 4),
+        Among(u"\u0BB5\u0BCA", -1, 2),
+        Among(u"\u0BB5\u0BCB", -1, 1)
+    ]
+
+    a_1 = [
+        Among(u"\u0B95", -1, -1),
+        Among(u"\u0B99", -1, -1),
+        Among(u"\u0B9A", -1, -1),
+        Among(u"\u0B9E", -1, -1),
+        Among(u"\u0BA4", -1, -1),
+        Among(u"\u0BA8", -1, -1),
+        Among(u"\u0BAA", -1, -1),
+        Among(u"\u0BAE", -1, -1),
+        Among(u"\u0BAF", -1, -1),
+        Among(u"\u0BB5", -1, -1)
+    ]
+
+    a_2 = [
+        Among(u"\u0BBF", -1, -1),
+        Among(u"\u0BC0", -1, -1),
+        Among(u"\u0BC8", -1, -1)
+    ]
+
+    a_3 = [
+        Among(u"\u0BBE", -1, -1),
+        Among(u"\u0BBF", -1, -1),
+        Among(u"\u0BC0", -1, -1),
+        Among(u"\u0BC1", -1, -1),
+        Among(u"\u0BC2", -1, -1),
+        Among(u"\u0BC6", -1, -1),
+        Among(u"\u0BC7", -1, -1),
+        Among(u"\u0BC8", -1, -1)
+    ]
+
+    a_4 = [
+        Among(u"", -1, 2),
+        Among(u"\u0BC8", 0, 1),
+        Among(u"\u0BCD", 0, 1)
+    ]
+
+    a_5 = [
+        Among(u"\u0BA8\u0BCD\u0BA4", -1, 1),
+        Among(u"\u0BAF", -1, 1),
+        Among(u"\u0BB5", -1, 1),
+        Among(u"\u0BA9\u0BC1", -1, 8),
+        Among(u"\u0BC1\u0B95\u0BCD", -1, 7),
+        Among(u"\u0BC1\u0B95\u0BCD\u0B95\u0BCD", -1, 7),
+        Among(u"\u0B9F\u0BCD\u0B95\u0BCD", -1, 3),
+        Among(u"\u0BB1\u0BCD\u0B95\u0BCD", -1, 4),
+        Among(u"\u0B99\u0BCD", -1, 9),
+        Among(u"\u0B9F\u0BCD\u0B9F\u0BCD", -1, 5),
+        Among(u"\u0BA4\u0BCD\u0BA4\u0BCD", -1, 6),
+        Among(u"\u0BA8\u0BCD\u0BA4\u0BCD", -1, 1),
+        Among(u"\u0BA8\u0BCD", -1, 1),
+        Among(u"\u0B9F\u0BCD\u0BAA\u0BCD", -1, 3),
+        Among(u"\u0BAF\u0BCD", -1, 2),
+        Among(u"\u0BA9\u0BCD\u0BB1\u0BCD", -1, 4),
+        Among(u"\u0BB5\u0BCD", -1, 1)
+    ]
+
+    a_6 = [
+        Among(u"\u0B95", -1, -1),
+        Among(u"\u0B9A", -1, -1),
+        Among(u"\u0B9F", -1, -1),
+        Among(u"\u0BA4", -1, -1),
+        Among(u"\u0BAA", -1, -1),
+        Among(u"\u0BB1", -1, -1)
+    ]
+
+    a_7 = [
+        Among(u"\u0B95", -1, -1),
+        Among(u"\u0B9A", -1, -1),
+        Among(u"\u0B9F", -1, -1),
+        Among(u"\u0BA4", -1, -1),
+        Among(u"\u0BAA", -1, -1),
+        Among(u"\u0BB1", -1, -1)
+    ]
+
+    a_8 = [
+        Among(u"\u0B9E", -1, -1),
+        Among(u"\u0BA3", -1, -1),
+        Among(u"\u0BA8", -1, -1),
+        Among(u"\u0BA9", -1, -1),
+        Among(u"\u0BAE", -1, -1),
+        Among(u"\u0BAF", -1, -1),
+        Among(u"\u0BB0", -1, -1),
+        Among(u"\u0BB2", -1, -1),
+        Among(u"\u0BB3", -1, -1),
+        Among(u"\u0BB4", -1, -1),
+        Among(u"\u0BB5", -1, -1)
+    ]
+
+    a_9 = [
+        Among(u"\u0BBE", -1, -1),
+        Among(u"\u0BBF", -1, -1),
+        Among(u"\u0BC0", -1, -1),
+        Among(u"\u0BC1", -1, -1),
+        Among(u"\u0BC2", -1, -1),
+        Among(u"\u0BC6", -1, -1),
+        Among(u"\u0BC7", -1, -1),
+        Among(u"\u0BC8", -1, -1),
+        Among(u"\u0BCD", -1, -1)
+    ]
+
+    a_10 = [
+        Among(u"\u0B85", -1, -1),
+        Among(u"\u0B87", -1, -1),
+        Among(u"\u0B89", -1, -1)
+    ]
+
+    a_11 = [
+        Among(u"\u0B95", -1, -1),
+        Among(u"\u0B99", -1, -1),
+        Among(u"\u0B9A", -1, -1),
+        Among(u"\u0B9E", -1, -1),
+        Among(u"\u0BA4", -1, -1),
+        Among(u"\u0BA8", -1, -1),
+        Among(u"\u0BAA", -1, -1),
+        Among(u"\u0BAE", -1, -1),
+        Among(u"\u0BAF", -1, -1),
+        Among(u"\u0BB5", -1, -1)
+    ]
+
+    a_12 = [
+        Among(u"\u0B95", -1, -1),
+        Among(u"\u0B9A", -1, -1),
+        Among(u"\u0B9F", -1, -1),
+        Among(u"\u0BA4", -1, -1),
+        Among(u"\u0BAA", -1, -1),
+        Among(u"\u0BB1", -1, -1)
+    ]
+
+    a_13 = [
+        Among(u"\u0B95\u0BB3\u0BCD", -1, 4),
+        Among(u"\u0BC1\u0B99\u0BCD\u0B95\u0BB3\u0BCD", 0, 1),
+        Among(u"\u0B9F\u0BCD\u0B95\u0BB3\u0BCD", 0, 3),
+        Among(u"\u0BB1\u0BCD\u0B95\u0BB3\u0BCD", 0, 2)
+    ]
+
+    a_14 = [
+        Among(u"\u0BBE", -1, -1),
+        Among(u"\u0BC7", -1, -1),
+        Among(u"\u0BCB", -1, -1)
+    ]
+
+    a_15 = [
+        Among(u"\u0BAA\u0BBF", -1, -1),
+        Among(u"\u0BB5\u0BBF", -1, -1)
+    ]
+
+    a_16 = [
+        Among(u"\u0BBE", -1, -1),
+        Among(u"\u0BBF", -1, -1),
+        Among(u"\u0BC0", -1, -1),
+        Among(u"\u0BC1", -1, -1),
+        Among(u"\u0BC2", -1, -1),
+        Among(u"\u0BC6", -1, -1),
+        Among(u"\u0BC7", -1, -1),
+        Among(u"\u0BC8", -1, -1)
+    ]
+
+    a_17 = [
+        Among(u"\u0BAA\u0B9F\u0BCD\u0B9F", -1, 3),
+        Among(u"\u0BAA\u0B9F\u0BCD\u0B9F\u0BA3", -1, 3),
+        Among(u"\u0BA4\u0BBE\u0BA9", -1, 3),
+        Among(u"\u0BAA\u0B9F\u0BBF\u0BA4\u0BBE\u0BA9", 2, 3),
+        Among(u"\u0BC6\u0BA9", -1, 1),
+        Among(u"\u0BBE\u0B95\u0BBF\u0BAF", -1, 1),
+        Among(u"\u0B95\u0BC1\u0BB0\u0BBF\u0BAF", -1, 3),
+        Among(u"\u0BC1\u0B9F\u0BC8\u0BAF", -1, 1),
+        Among(u"\u0BB2\u0BCD\u0BB2", -1, 2),
+        Among(u"\u0BC1\u0BB3\u0BCD\u0BB3", -1, 1),
+        Among(u"\u0BBE\u0B95\u0BBF", -1, 1),
+        Among(u"\u0BAA\u0B9F\u0BBF", -1, 3),
+        Among(u"\u0BBF\u0BA9\u0BCD\u0BB1\u0BBF", -1, 1),
+        Among(u"\u0BAA\u0BB1\u0BCD\u0BB1\u0BBF", -1, 3),
+        Among(u"\u0BAA\u0B9F\u0BC1", -1, 3),
+        Among(u"\u0BB5\u0BBF\u0B9F\u0BC1", -1, 3),
+        Among(u"\u0BAA\u0B9F\u0BCD\u0B9F\u0BC1", -1, 3),
+        Among(u"\u0BB5\u0BBF\u0B9F\u0BCD\u0B9F\u0BC1", -1, 3),
+        Among(u"\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1", -1, 3),
+        Among(u"\u0BC6\u0BA9\u0BCD\u0BB1\u0BC1", -1, 1),
+        Among(u"\u0BC1\u0B9F\u0BC8", -1, 1),
+        Among(u"\u0BBF\u0BB2\u0BCD\u0BB2\u0BC8", -1, 1),
+        Among(u"\u0BC1\u0B9F\u0BA9\u0BCD", -1, 1),
+        Among(u"\u0BBF\u0B9F\u0BAE\u0BCD", -1, 1),
+        Among(u"\u0BC6\u0BB2\u0BCD\u0BB2\u0BBE\u0BAE\u0BCD", -1, 3),
+        Among(u"\u0BC6\u0BA9\u0BC1\u0BAE\u0BCD", -1, 1)
+    ]
+
+    a_18 = [
+        Among(u"\u0BBE", -1, -1),
+        Among(u"\u0BBF", -1, -1),
+        Among(u"\u0BC0", -1, -1),
+        Among(u"\u0BC1", -1, -1),
+        Among(u"\u0BC2", -1, -1),
+        Among(u"\u0BC6", -1, -1),
+        Among(u"\u0BC7", -1, -1),
+        Among(u"\u0BC8", -1, -1)
+    ]
+
+    a_19 = [
+        Among(u"\u0BBE", -1, -1),
+        Among(u"\u0BBF", -1, -1),
+        Among(u"\u0BC0", -1, -1),
+        Among(u"\u0BC1", -1, -1),
+        Among(u"\u0BC2", -1, -1),
+        Among(u"\u0BC6", -1, -1),
+        Among(u"\u0BC7", -1, -1),
+        Among(u"\u0BC8", -1, -1)
+    ]
+
+    a_20 = [
+        Among(u"\u0BB5\u0BBF\u0B9F", -1, 2),
+        Among(u"\u0BC0", -1, 7),
+        Among(u"\u0BCA\u0B9F\u0BC1", -1, 2),
+        Among(u"\u0BCB\u0B9F\u0BC1", -1, 2),
+        Among(u"\u0BA4\u0BC1", -1, 6),
+        Among(u"\u0BBF\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4\u0BC1", 4, 2),
+        Among(u"\u0BBF\u0BA9\u0BCD\u0BB1\u0BC1", -1, 2),
+        Among(u"\u0BC1\u0B9F\u0BC8", -1, 2),
+        Among(u"\u0BA9\u0BC8", -1, 1),
+        Among(u"\u0B95\u0BA3\u0BCD", -1, 1),
+        Among(u"\u0BBF\u0BA9\u0BCD", -1, 3),
+        Among(u"\u0BAE\u0BC1\u0BA9\u0BCD", -1, 1),
+        Among(u"\u0BBF\u0B9F\u0BAE\u0BCD", -1, 4),
+        Among(u"\u0BBF\u0BB1\u0BCD", -1, 2),
+        Among(u"\u0BAE\u0BC7\u0BB1\u0BCD", -1, 1),
+        Among(u"\u0BB2\u0BCD", -1, 5),
+        Among(u"\u0BBE\u0BAE\u0BB2\u0BCD", 15, 2),
+        Among(u"\u0BBE\u0BB2\u0BCD", 15, 2),
+        Among(u"\u0BBF\u0BB2\u0BCD", 15, 2),
+        Among(u"\u0BAE\u0BC7\u0BB2\u0BCD", 15, 1),
+        Among(u"\u0BC1\u0BB3\u0BCD", -1, 2),
+        Among(u"\u0B95\u0BC0\u0BB4\u0BCD", -1, 1)
+    ]
+
+    a_21 = [
+        Among(u"\u0B95", -1, -1),
+        Among(u"\u0B9A", -1, -1),
+        Among(u"\u0B9F", -1, -1),
+        Among(u"\u0BA4", -1, -1),
+        Among(u"\u0BAA", -1, -1),
+        Among(u"\u0BB1", -1, -1)
+    ]
+
+    a_22 = [
+        Among(u"\u0B95", -1, -1),
+        Among(u"\u0B9A", -1, -1),
+        Among(u"\u0B9F", -1, -1),
+        Among(u"\u0BA4", -1, -1),
+        Among(u"\u0BAA", -1, -1),
+        Among(u"\u0BB1", -1, -1)
+    ]
+
+    a_23 = [
+        Among(u"\u0B85", -1, -1),
+        Among(u"\u0B86", -1, -1),
+        Among(u"\u0B87", -1, -1),
+        Among(u"\u0B88", -1, -1),
+        Among(u"\u0B89", -1, -1),
+        Among(u"\u0B8A", -1, -1),
+        Among(u"\u0B8E", -1, -1),
+        Among(u"\u0B8F", -1, -1),
+        Among(u"\u0B90", -1, -1),
+        Among(u"\u0B92", -1, -1),
+        Among(u"\u0B93", -1, -1),
+        Among(u"\u0B94", -1, -1)
+    ]
+
+    a_24 = [
+        Among(u"\u0BBE", -1, -1),
+        Among(u"\u0BBF", -1, -1),
+        Among(u"\u0BC0", -1, -1),
+        Among(u"\u0BC1", -1, -1),
+        Among(u"\u0BC2", -1, -1),
+        Among(u"\u0BC6", -1, -1),
+        Among(u"\u0BC7", -1, -1),
+        Among(u"\u0BC8", -1, -1)
+    ]
+
+    a_25 = [
+        Among(u"\u0B95", -1, 1),
+        Among(u"\u0BA4", -1, 1),
+        Among(u"\u0BA9", -1, 1),
+        Among(u"\u0BAA", -1, 1),
+        Among(u"\u0BAF", -1, 1),
+        Among(u"\u0BBE", -1, 5),
+        Among(u"\u0B95\u0BC1", -1, 6),
+        Among(u"\u0BAA\u0B9F\u0BC1", -1, 1),
+        Among(u"\u0BA4\u0BC1", -1, 3),
+        Among(u"\u0BBF\u0BB1\u0BCD\u0BB1\u0BC1", -1, 1),
+        Among(u"\u0BA9\u0BC8", -1, 1),
+        Among(u"\u0BB5\u0BC8", -1, 1),
+        Among(u"\u0BA9\u0BA9\u0BCD", -1, 1),
+        Among(u"\u0BAA\u0BA9\u0BCD", -1, 1),
+        Among(u"\u0BB5\u0BA9\u0BCD", -1, 2),
+        Among(u"\u0BBE\u0BA9\u0BCD", -1, 4),
+        Among(u"\u0BA9\u0BBE\u0BA9\u0BCD", 15, 1),
+        Among(u"\u0BAE\u0BBF\u0BA9\u0BCD", -1, 1),
+        Among(u"\u0BA9\u0BC6\u0BA9\u0BCD", -1, 1),
+        Among(u"\u0BC7\u0BA9\u0BCD", -1, 5),
+        Among(u"\u0BA9\u0BAE\u0BCD", -1, 1),
+        Among(u"\u0BAA\u0BAE\u0BCD", -1, 1),
+        Among(u"\u0BBE\u0BAE\u0BCD", -1, 5),
+        Among(u"\u0B95\u0BC1\u0BAE\u0BCD", -1, 1),
+        Among(u"\u0B9F\u0BC1\u0BAE\u0BCD", -1, 5),
+        Among(u"\u0BA4\u0BC1\u0BAE\u0BCD", -1, 1),
+        Among(u"\u0BB1\u0BC1\u0BAE\u0BCD", -1, 1),
+        Among(u"\u0BC6\u0BAE\u0BCD", -1, 5),
+        Among(u"\u0BC7\u0BAE\u0BCD", -1, 5),
+        Among(u"\u0BCB\u0BAE\u0BCD", -1, 5),
+        Among(u"\u0BBE\u0BAF\u0BCD", -1, 5),
+        Among(u"\u0BA9\u0BB0\u0BCD", -1, 1),
+        Among(u"\u0BAA\u0BB0\u0BCD", -1, 1),
+        Among(u"\u0BC0\u0BAF\u0BB0\u0BCD", -1, 5),
+        Among(u"\u0BB5\u0BB0\u0BCD", -1, 1),
+        Among(u"\u0BBE\u0BB0\u0BCD", -1, 5),
+        Among(u"\u0BA9\u0BBE\u0BB0\u0BCD", 35, 1),
+        Among(u"\u0BAE\u0BBE\u0BB0\u0BCD", 35, 1),
+        Among(u"\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BCD", -1, 1),
+        Among(u"\u0BA9\u0BBF\u0BB0\u0BCD", -1, 5),
+        Among(u"\u0BC0\u0BB0\u0BCD", -1, 5),
+        Among(u"\u0BA9\u0BB3\u0BCD", -1, 1),
+        Among(u"\u0BAA\u0BB3\u0BCD", -1, 1),
+        Among(u"\u0BB5\u0BB3\u0BCD", -1, 1),
+        Among(u"\u0BBE\u0BB3\u0BCD", -1, 5),
+        Among(u"\u0BA9\u0BBE\u0BB3\u0BCD", 44, 1)
+    ]
+
+    a_26 = [
+        Among(u"\u0B95\u0BBF\u0BB1", -1, -1),
+        Among(u"\u0B95\u0BBF\u0BA9\u0BCD\u0BB1", -1, -1),
+        Among(u"\u0BBE\u0BA8\u0BBF\u0BA9\u0BCD\u0BB1", -1, -1),
+        Among(u"\u0B95\u0BBF\u0BB1\u0BCD", -1, -1),
+        Among(u"\u0B95\u0BBF\u0BA9\u0BCD\u0BB1\u0BCD", -1, -1),
+        Among(u"\u0BBE\u0BA8\u0BBF\u0BA9\u0BCD\u0BB1\u0BCD", -1, -1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/turkish_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/turkish_stemmer.py
new file mode 100644
index 000000000..6e732f59d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/turkish_stemmer.py
@@ -0,0 +1,1837 @@
+#-*- coding: utf-8 -*-
+# Generated from turkish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class TurkishStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from turkish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_vowel = {u"a", u"e", u"ı", u"i", u"o", u"ö", u"u", u"ü"}
+
+    g_U = {u"ı", u"i", u"u", u"ü"}
+
+    g_vowel1 = {u"a", u"ı", u"o", u"u"}
+
+    g_vowel2 = {u"e", u"i", u"ö", u"ü"}
+
+    g_vowel3 = {u"a", u"ı"}
+
+    g_vowel4 = {u"e", u"i"}
+
+    g_vowel5 = {u"o", u"u"}
+
+    g_vowel6 = {u"ö", u"ü"}
+
+    B_continue_stemming_noun_suffixes = False
+
+    def __r_check_vowel_harmony(self):
+        v_1 = self.limit - self.cursor
+        if not self.go_out_grouping_b(TurkishStemmer.g_vowel):
+            return False
+        try:
+            v_2 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"a"):
+                    raise lab1()
+                if not self.go_out_grouping_b(TurkishStemmer.g_vowel1):
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_2
+            try:
+                if not self.eq_s_b(u"e"):
+                    raise lab2()
+                if not self.go_out_grouping_b(TurkishStemmer.g_vowel2):
+                    raise lab2()
+                raise lab0()
+            except lab2: pass
+            self.cursor = self.limit - v_2
+            try:
+                if not self.eq_s_b(u"ı"):
+                    raise lab3()
+                if not self.go_out_grouping_b(TurkishStemmer.g_vowel3):
+                    raise lab3()
+                raise lab0()
+            except lab3: pass
+            self.cursor = self.limit - v_2
+            try:
+                if not self.eq_s_b(u"i"):
+                    raise lab4()
+                if not self.go_out_grouping_b(TurkishStemmer.g_vowel4):
+                    raise lab4()
+                raise lab0()
+            except lab4: pass
+            self.cursor = self.limit - v_2
+            try:
+                if not self.eq_s_b(u"o"):
+                    raise lab5()
+                if not self.go_out_grouping_b(TurkishStemmer.g_vowel5):
+                    raise lab5()
+                raise lab0()
+            except lab5: pass
+            self.cursor = self.limit - v_2
+            try:
+                if not self.eq_s_b(u"ö"):
+                    raise lab6()
+                if not self.go_out_grouping_b(TurkishStemmer.g_vowel6):
+                    raise lab6()
+                raise lab0()
+            except lab6: pass
+            self.cursor = self.limit - v_2
+            try:
+                if not self.eq_s_b(u"u"):
+                    raise lab7()
+                if not self.go_out_grouping_b(TurkishStemmer.g_vowel5):
+                    raise lab7()
+                raise lab0()
+            except lab7: pass
+            self.cursor = self.limit - v_2
+            if not self.eq_s_b(u"ü"):
+                return False
+            if not self.go_out_grouping_b(TurkishStemmer.g_vowel6):
+                return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        return True
+
+    def __r_mark_suffix_with_optional_n_consonant(self):
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"n"):
+                    raise lab1()
+                v_2 = self.limit - self.cursor
+                if not self.in_grouping_b(TurkishStemmer.g_vowel):
+                    raise lab1()
+                self.cursor = self.limit - v_2
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            v_3 = self.limit - self.cursor
+            try:
+                v_4 = self.limit - self.cursor
+                if not self.eq_s_b(u"n"):
+                    raise lab2()
+                self.cursor = self.limit - v_4
+                return False
+            except lab2: pass
+            self.cursor = self.limit - v_3
+            v_5 = self.limit - self.cursor
+            if self.cursor <= self.limit_backward:
+                return False
+            self.cursor -= 1
+            if not self.in_grouping_b(TurkishStemmer.g_vowel):
+                return False
+            self.cursor = self.limit - v_5
+        except lab0: pass
+        return True
+
+    def __r_mark_suffix_with_optional_s_consonant(self):
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"s"):
+                    raise lab1()
+                v_2 = self.limit - self.cursor
+                if not self.in_grouping_b(TurkishStemmer.g_vowel):
+                    raise lab1()
+                self.cursor = self.limit - v_2
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            v_3 = self.limit - self.cursor
+            try:
+                v_4 = self.limit - self.cursor
+                if not self.eq_s_b(u"s"):
+                    raise lab2()
+                self.cursor = self.limit - v_4
+                return False
+            except lab2: pass
+            self.cursor = self.limit - v_3
+            v_5 = self.limit - self.cursor
+            if self.cursor <= self.limit_backward:
+                return False
+            self.cursor -= 1
+            if not self.in_grouping_b(TurkishStemmer.g_vowel):
+                return False
+            self.cursor = self.limit - v_5
+        except lab0: pass
+        return True
+
+    def __r_mark_suffix_with_optional_y_consonant(self):
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"y"):
+                    raise lab1()
+                v_2 = self.limit - self.cursor
+                if not self.in_grouping_b(TurkishStemmer.g_vowel):
+                    raise lab1()
+                self.cursor = self.limit - v_2
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            v_3 = self.limit - self.cursor
+            try:
+                v_4 = self.limit - self.cursor
+                if not self.eq_s_b(u"y"):
+                    raise lab2()
+                self.cursor = self.limit - v_4
+                return False
+            except lab2: pass
+            self.cursor = self.limit - v_3
+            v_5 = self.limit - self.cursor
+            if self.cursor <= self.limit_backward:
+                return False
+            self.cursor -= 1
+            if not self.in_grouping_b(TurkishStemmer.g_vowel):
+                return False
+            self.cursor = self.limit - v_5
+        except lab0: pass
+        return True
+
+    def __r_mark_suffix_with_optional_U_vowel(self):
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.in_grouping_b(TurkishStemmer.g_U):
+                    raise lab1()
+                v_2 = self.limit - self.cursor
+                if not self.out_grouping_b(TurkishStemmer.g_vowel):
+                    raise lab1()
+                self.cursor = self.limit - v_2
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            v_3 = self.limit - self.cursor
+            try:
+                v_4 = self.limit - self.cursor
+                if not self.in_grouping_b(TurkishStemmer.g_U):
+                    raise lab2()
+                self.cursor = self.limit - v_4
+                return False
+            except lab2: pass
+            self.cursor = self.limit - v_3
+            v_5 = self.limit - self.cursor
+            if self.cursor <= self.limit_backward:
+                return False
+            self.cursor -= 1
+            if not self.out_grouping_b(TurkishStemmer.g_vowel):
+                return False
+            self.cursor = self.limit - v_5
+        except lab0: pass
+        return True
+
+    def __r_mark_possessives(self):
+        if self.find_among_b(TurkishStemmer.a_0) == 0:
+            return False
+        if not self.__r_mark_suffix_with_optional_U_vowel():
+            return False
+        return True
+
+    def __r_mark_sU(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if not self.in_grouping_b(TurkishStemmer.g_U):
+            return False
+        if not self.__r_mark_suffix_with_optional_s_consonant():
+            return False
+        return True
+
+    def __r_mark_lArI(self):
+        if self.find_among_b(TurkishStemmer.a_1) == 0:
+            return False
+        return True
+
+    def __r_mark_yU(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if not self.in_grouping_b(TurkishStemmer.g_U):
+            return False
+        if not self.__r_mark_suffix_with_optional_y_consonant():
+            return False
+        return True
+
+    def __r_mark_nU(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_2) == 0:
+            return False
+        return True
+
+    def __r_mark_nUn(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_3) == 0:
+            return False
+        if not self.__r_mark_suffix_with_optional_n_consonant():
+            return False
+        return True
+
+    def __r_mark_yA(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_4) == 0:
+            return False
+        if not self.__r_mark_suffix_with_optional_y_consonant():
+            return False
+        return True
+
+    def __r_mark_nA(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_5) == 0:
+            return False
+        return True
+
+    def __r_mark_DA(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_6) == 0:
+            return False
+        return True
+
+    def __r_mark_ndA(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_7) == 0:
+            return False
+        return True
+
+    def __r_mark_DAn(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_8) == 0:
+            return False
+        return True
+
+    def __r_mark_ndAn(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_9) == 0:
+            return False
+        return True
+
+    def __r_mark_ylA(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_10) == 0:
+            return False
+        if not self.__r_mark_suffix_with_optional_y_consonant():
+            return False
+        return True
+
+    def __r_mark_ki(self):
+        if not self.eq_s_b(u"ki"):
+            return False
+        return True
+
+    def __r_mark_ncA(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_11) == 0:
+            return False
+        if not self.__r_mark_suffix_with_optional_n_consonant():
+            return False
+        return True
+
+    def __r_mark_yUm(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_12) == 0:
+            return False
+        if not self.__r_mark_suffix_with_optional_y_consonant():
+            return False
+        return True
+
+    def __r_mark_sUn(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_13) == 0:
+            return False
+        return True
+
+    def __r_mark_yUz(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_14) == 0:
+            return False
+        if not self.__r_mark_suffix_with_optional_y_consonant():
+            return False
+        return True
+
+    def __r_mark_sUnUz(self):
+        if self.find_among_b(TurkishStemmer.a_15) == 0:
+            return False
+        return True
+
+    def __r_mark_lAr(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_16) == 0:
+            return False
+        return True
+
+    def __r_mark_nUz(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_17) == 0:
+            return False
+        return True
+
+    def __r_mark_DUr(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_18) == 0:
+            return False
+        return True
+
+    def __r_mark_cAsInA(self):
+        if self.find_among_b(TurkishStemmer.a_19) == 0:
+            return False
+        return True
+
+    def __r_mark_yDU(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_20) == 0:
+            return False
+        if not self.__r_mark_suffix_with_optional_y_consonant():
+            return False
+        return True
+
+    def __r_mark_ysA(self):
+        if self.find_among_b(TurkishStemmer.a_21) == 0:
+            return False
+        if not self.__r_mark_suffix_with_optional_y_consonant():
+            return False
+        return True
+
+    def __r_mark_ymUs_(self):
+        if not self.__r_check_vowel_harmony():
+            return False
+        if self.find_among_b(TurkishStemmer.a_22) == 0:
+            return False
+        if not self.__r_mark_suffix_with_optional_y_consonant():
+            return False
+        return True
+
+    def __r_mark_yken(self):
+        if not self.eq_s_b(u"ken"):
+            return False
+        if not self.__r_mark_suffix_with_optional_y_consonant():
+            return False
+        return True
+
+    def __r_stem_nominal_verb_suffixes(self):
+        self.ket = self.cursor
+        self.B_continue_stemming_noun_suffixes = True
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                try:
+                    v_2 = self.limit - self.cursor
+                    try:
+                        if not self.__r_mark_ymUs_():
+                            raise lab3()
+                        raise lab2()
+                    except lab3: pass
+                    self.cursor = self.limit - v_2
+                    try:
+                        if not self.__r_mark_yDU():
+                            raise lab4()
+                        raise lab2()
+                    except lab4: pass
+                    self.cursor = self.limit - v_2
+                    try:
+                        if not self.__r_mark_ysA():
+                            raise lab5()
+                        raise lab2()
+                    except lab5: pass
+                    self.cursor = self.limit - v_2
+                    if not self.__r_mark_yken():
+                        raise lab1()
+                except lab2: pass
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            try:
+                if not self.__r_mark_cAsInA():
+                    raise lab6()
+                try:
+                    v_3 = self.limit - self.cursor
+                    try:
+                        if not self.__r_mark_sUnUz():
+                            raise lab8()
+                        raise lab7()
+                    except lab8: pass
+                    self.cursor = self.limit - v_3
+                    try:
+                        if not self.__r_mark_lAr():
+                            raise lab9()
+                        raise lab7()
+                    except lab9: pass
+                    self.cursor = self.limit - v_3
+                    try:
+                        if not self.__r_mark_yUm():
+                            raise lab10()
+                        raise lab7()
+                    except lab10: pass
+                    self.cursor = self.limit - v_3
+                    try:
+                        if not self.__r_mark_sUn():
+                            raise lab11()
+                        raise lab7()
+                    except lab11: pass
+                    self.cursor = self.limit - v_3
+                    try:
+                        if not self.__r_mark_yUz():
+                            raise lab12()
+                        raise lab7()
+                    except lab12: pass
+                    self.cursor = self.limit - v_3
+                except lab7: pass
+                if not self.__r_mark_ymUs_():
+                    raise lab6()
+                raise lab0()
+            except lab6: pass
+            self.cursor = self.limit - v_1
+            try:
+                if not self.__r_mark_lAr():
+                    raise lab13()
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+                v_4 = self.limit - self.cursor
+                try:
+                    self.ket = self.cursor
+                    try:
+                        v_5 = self.limit - self.cursor
+                        try:
+                            if not self.__r_mark_DUr():
+                                raise lab16()
+                            raise lab15()
+                        except lab16: pass
+                        self.cursor = self.limit - v_5
+                        try:
+                            if not self.__r_mark_yDU():
+                                raise lab17()
+                            raise lab15()
+                        except lab17: pass
+                        self.cursor = self.limit - v_5
+                        try:
+                            if not self.__r_mark_ysA():
+                                raise lab18()
+                            raise lab15()
+                        except lab18: pass
+                        self.cursor = self.limit - v_5
+                        if not self.__r_mark_ymUs_():
+                            self.cursor = self.limit - v_4
+                            raise lab14()
+                    except lab15: pass
+                except lab14: pass
+                self.B_continue_stemming_noun_suffixes = False
+                raise lab0()
+            except lab13: pass
+            self.cursor = self.limit - v_1
+            try:
+                if not self.__r_mark_nUz():
+                    raise lab19()
+                try:
+                    v_6 = self.limit - self.cursor
+                    try:
+                        if not self.__r_mark_yDU():
+                            raise lab21()
+                        raise lab20()
+                    except lab21: pass
+                    self.cursor = self.limit - v_6
+                    if not self.__r_mark_ysA():
+                        raise lab19()
+                except lab20: pass
+                raise lab0()
+            except lab19: pass
+            self.cursor = self.limit - v_1
+            try:
+                try:
+                    v_7 = self.limit - self.cursor
+                    try:
+                        if not self.__r_mark_sUnUz():
+                            raise lab24()
+                        raise lab23()
+                    except lab24: pass
+                    self.cursor = self.limit - v_7
+                    try:
+                        if not self.__r_mark_yUz():
+                            raise lab25()
+                        raise lab23()
+                    except lab25: pass
+                    self.cursor = self.limit - v_7
+                    try:
+                        if not self.__r_mark_sUn():
+                            raise lab26()
+                        raise lab23()
+                    except lab26: pass
+                    self.cursor = self.limit - v_7
+                    if not self.__r_mark_yUm():
+                        raise lab22()
+                except lab23: pass
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+                v_8 = self.limit - self.cursor
+                try:
+                    self.ket = self.cursor
+                    if not self.__r_mark_ymUs_():
+                        self.cursor = self.limit - v_8
+                        raise lab27()
+                except lab27: pass
+                raise lab0()
+            except lab22: pass
+            self.cursor = self.limit - v_1
+            if not self.__r_mark_DUr():
+                return False
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+            v_9 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                try:
+                    v_10 = self.limit - self.cursor
+                    try:
+                        if not self.__r_mark_sUnUz():
+                            raise lab30()
+                        raise lab29()
+                    except lab30: pass
+                    self.cursor = self.limit - v_10
+                    try:
+                        if not self.__r_mark_lAr():
+                            raise lab31()
+                        raise lab29()
+                    except lab31: pass
+                    self.cursor = self.limit - v_10
+                    try:
+                        if not self.__r_mark_yUm():
+                            raise lab32()
+                        raise lab29()
+                    except lab32: pass
+                    self.cursor = self.limit - v_10
+                    try:
+                        if not self.__r_mark_sUn():
+                            raise lab33()
+                        raise lab29()
+                    except lab33: pass
+                    self.cursor = self.limit - v_10
+                    try:
+                        if not self.__r_mark_yUz():
+                            raise lab34()
+                        raise lab29()
+                    except lab34: pass
+                    self.cursor = self.limit - v_10
+                except lab29: pass
+                if not self.__r_mark_ymUs_():
+                    self.cursor = self.limit - v_9
+                    raise lab28()
+            except lab28: pass
+        except lab0: pass
+        self.bra = self.cursor
+        if not self.slice_del():
+            return False
+
+        return True
+
+    def __r_stem_suffix_chain_before_ki(self):
+        self.ket = self.cursor
+        if not self.__r_mark_ki():
+            return False
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.__r_mark_DA():
+                    raise lab1()
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+                v_2 = self.limit - self.cursor
+                try:
+                    self.ket = self.cursor
+                    try:
+                        v_3 = self.limit - self.cursor
+                        try:
+                            if not self.__r_mark_lAr():
+                                raise lab4()
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            v_4 = self.limit - self.cursor
+                            try:
+                                if not self.__r_stem_suffix_chain_before_ki():
+                                    self.cursor = self.limit - v_4
+                                    raise lab5()
+                            except lab5: pass
+                            raise lab3()
+                        except lab4: pass
+                        self.cursor = self.limit - v_3
+                        if not self.__r_mark_possessives():
+                            self.cursor = self.limit - v_2
+                            raise lab2()
+                        self.bra = self.cursor
+                        if not self.slice_del():
+                            return False
+
+                        v_5 = self.limit - self.cursor
+                        try:
+                            self.ket = self.cursor
+                            if not self.__r_mark_lAr():
+                                self.cursor = self.limit - v_5
+                                raise lab6()
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            if not self.__r_stem_suffix_chain_before_ki():
+                                self.cursor = self.limit - v_5
+                                raise lab6()
+                        except lab6: pass
+                    except lab3: pass
+                except lab2: pass
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            try:
+                if not self.__r_mark_nUn():
+                    raise lab7()
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+                v_6 = self.limit - self.cursor
+                try:
+                    self.ket = self.cursor
+                    try:
+                        v_7 = self.limit - self.cursor
+                        try:
+                            if not self.__r_mark_lArI():
+                                raise lab10()
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            raise lab9()
+                        except lab10: pass
+                        self.cursor = self.limit - v_7
+                        try:
+                            self.ket = self.cursor
+                            try:
+                                v_8 = self.limit - self.cursor
+                                try:
+                                    if not self.__r_mark_possessives():
+                                        raise lab13()
+                                    raise lab12()
+                                except lab13: pass
+                                self.cursor = self.limit - v_8
+                                if not self.__r_mark_sU():
+                                    raise lab11()
+                            except lab12: pass
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            v_9 = self.limit - self.cursor
+                            try:
+                                self.ket = self.cursor
+                                if not self.__r_mark_lAr():
+                                    self.cursor = self.limit - v_9
+                                    raise lab14()
+                                self.bra = self.cursor
+                                if not self.slice_del():
+                                    return False
+
+                                if not self.__r_stem_suffix_chain_before_ki():
+                                    self.cursor = self.limit - v_9
+                                    raise lab14()
+                            except lab14: pass
+                            raise lab9()
+                        except lab11: pass
+                        self.cursor = self.limit - v_7
+                        if not self.__r_stem_suffix_chain_before_ki():
+                            self.cursor = self.limit - v_6
+                            raise lab8()
+                    except lab9: pass
+                except lab8: pass
+                raise lab0()
+            except lab7: pass
+            self.cursor = self.limit - v_1
+            if not self.__r_mark_ndA():
+                return False
+            try:
+                v_10 = self.limit - self.cursor
+                try:
+                    if not self.__r_mark_lArI():
+                        raise lab16()
+                    self.bra = self.cursor
+                    if not self.slice_del():
+                        return False
+
+                    raise lab15()
+                except lab16: pass
+                self.cursor = self.limit - v_10
+                try:
+                    if not self.__r_mark_sU():
+                        raise lab17()
+                    self.bra = self.cursor
+                    if not self.slice_del():
+                        return False
+
+                    v_11 = self.limit - self.cursor
+                    try:
+                        self.ket = self.cursor
+                        if not self.__r_mark_lAr():
+                            self.cursor = self.limit - v_11
+                            raise lab18()
+                        self.bra = self.cursor
+                        if not self.slice_del():
+                            return False
+
+                        if not self.__r_stem_suffix_chain_before_ki():
+                            self.cursor = self.limit - v_11
+                            raise lab18()
+                    except lab18: pass
+                    raise lab15()
+                except lab17: pass
+                self.cursor = self.limit - v_10
+                if not self.__r_stem_suffix_chain_before_ki():
+                    return False
+            except lab15: pass
+        except lab0: pass
+        return True
+
+    def __r_stem_noun_suffixes(self):
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if not self.__r_mark_lAr():
+                    raise lab1()
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+                v_2 = self.limit - self.cursor
+                try:
+                    if not self.__r_stem_suffix_chain_before_ki():
+                        self.cursor = self.limit - v_2
+                        raise lab2()
+                except lab2: pass
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            try:
+                self.ket = self.cursor
+                if not self.__r_mark_ncA():
+                    raise lab3()
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+                v_3 = self.limit - self.cursor
+                try:
+                    try:
+                        v_4 = self.limit - self.cursor
+                        try:
+                            self.ket = self.cursor
+                            if not self.__r_mark_lArI():
+                                raise lab6()
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            raise lab5()
+                        except lab6: pass
+                        self.cursor = self.limit - v_4
+                        try:
+                            self.ket = self.cursor
+                            try:
+                                v_5 = self.limit - self.cursor
+                                try:
+                                    if not self.__r_mark_possessives():
+                                        raise lab9()
+                                    raise lab8()
+                                except lab9: pass
+                                self.cursor = self.limit - v_5
+                                if not self.__r_mark_sU():
+                                    raise lab7()
+                            except lab8: pass
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            v_6 = self.limit - self.cursor
+                            try:
+                                self.ket = self.cursor
+                                if not self.__r_mark_lAr():
+                                    self.cursor = self.limit - v_6
+                                    raise lab10()
+                                self.bra = self.cursor
+                                if not self.slice_del():
+                                    return False
+
+                                if not self.__r_stem_suffix_chain_before_ki():
+                                    self.cursor = self.limit - v_6
+                                    raise lab10()
+                            except lab10: pass
+                            raise lab5()
+                        except lab7: pass
+                        self.cursor = self.limit - v_4
+                        self.ket = self.cursor
+                        if not self.__r_mark_lAr():
+                            self.cursor = self.limit - v_3
+                            raise lab4()
+                        self.bra = self.cursor
+                        if not self.slice_del():
+                            return False
+
+                        if not self.__r_stem_suffix_chain_before_ki():
+                            self.cursor = self.limit - v_3
+                            raise lab4()
+                    except lab5: pass
+                except lab4: pass
+                raise lab0()
+            except lab3: pass
+            self.cursor = self.limit - v_1
+            try:
+                self.ket = self.cursor
+                try:
+                    v_7 = self.limit - self.cursor
+                    try:
+                        if not self.__r_mark_ndA():
+                            raise lab13()
+                        raise lab12()
+                    except lab13: pass
+                    self.cursor = self.limit - v_7
+                    if not self.__r_mark_nA():
+                        raise lab11()
+                except lab12: pass
+                try:
+                    v_8 = self.limit - self.cursor
+                    try:
+                        if not self.__r_mark_lArI():
+                            raise lab15()
+                        self.bra = self.cursor
+                        if not self.slice_del():
+                            return False
+
+                        raise lab14()
+                    except lab15: pass
+                    self.cursor = self.limit - v_8
+                    try:
+                        if not self.__r_mark_sU():
+                            raise lab16()
+                        self.bra = self.cursor
+                        if not self.slice_del():
+                            return False
+
+                        v_9 = self.limit - self.cursor
+                        try:
+                            self.ket = self.cursor
+                            if not self.__r_mark_lAr():
+                                self.cursor = self.limit - v_9
+                                raise lab17()
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            if not self.__r_stem_suffix_chain_before_ki():
+                                self.cursor = self.limit - v_9
+                                raise lab17()
+                        except lab17: pass
+                        raise lab14()
+                    except lab16: pass
+                    self.cursor = self.limit - v_8
+                    if not self.__r_stem_suffix_chain_before_ki():
+                        raise lab11()
+                except lab14: pass
+                raise lab0()
+            except lab11: pass
+            self.cursor = self.limit - v_1
+            try:
+                self.ket = self.cursor
+                try:
+                    v_10 = self.limit - self.cursor
+                    try:
+                        if not self.__r_mark_ndAn():
+                            raise lab20()
+                        raise lab19()
+                    except lab20: pass
+                    self.cursor = self.limit - v_10
+                    if not self.__r_mark_nU():
+                        raise lab18()
+                except lab19: pass
+                try:
+                    v_11 = self.limit - self.cursor
+                    try:
+                        if not self.__r_mark_sU():
+                            raise lab22()
+                        self.bra = self.cursor
+                        if not self.slice_del():
+                            return False
+
+                        v_12 = self.limit - self.cursor
+                        try:
+                            self.ket = self.cursor
+                            if not self.__r_mark_lAr():
+                                self.cursor = self.limit - v_12
+                                raise lab23()
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            if not self.__r_stem_suffix_chain_before_ki():
+                                self.cursor = self.limit - v_12
+                                raise lab23()
+                        except lab23: pass
+                        raise lab21()
+                    except lab22: pass
+                    self.cursor = self.limit - v_11
+                    if not self.__r_mark_lArI():
+                        raise lab18()
+                except lab21: pass
+                raise lab0()
+            except lab18: pass
+            self.cursor = self.limit - v_1
+            try:
+                self.ket = self.cursor
+                if not self.__r_mark_DAn():
+                    raise lab24()
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+                v_13 = self.limit - self.cursor
+                try:
+                    self.ket = self.cursor
+                    try:
+                        v_14 = self.limit - self.cursor
+                        try:
+                            if not self.__r_mark_possessives():
+                                raise lab27()
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            v_15 = self.limit - self.cursor
+                            try:
+                                self.ket = self.cursor
+                                if not self.__r_mark_lAr():
+                                    self.cursor = self.limit - v_15
+                                    raise lab28()
+                                self.bra = self.cursor
+                                if not self.slice_del():
+                                    return False
+
+                                if not self.__r_stem_suffix_chain_before_ki():
+                                    self.cursor = self.limit - v_15
+                                    raise lab28()
+                            except lab28: pass
+                            raise lab26()
+                        except lab27: pass
+                        self.cursor = self.limit - v_14
+                        try:
+                            if not self.__r_mark_lAr():
+                                raise lab29()
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            v_16 = self.limit - self.cursor
+                            try:
+                                if not self.__r_stem_suffix_chain_before_ki():
+                                    self.cursor = self.limit - v_16
+                                    raise lab30()
+                            except lab30: pass
+                            raise lab26()
+                        except lab29: pass
+                        self.cursor = self.limit - v_14
+                        if not self.__r_stem_suffix_chain_before_ki():
+                            self.cursor = self.limit - v_13
+                            raise lab25()
+                    except lab26: pass
+                except lab25: pass
+                raise lab0()
+            except lab24: pass
+            self.cursor = self.limit - v_1
+            try:
+                self.ket = self.cursor
+                try:
+                    v_17 = self.limit - self.cursor
+                    try:
+                        if not self.__r_mark_nUn():
+                            raise lab33()
+                        raise lab32()
+                    except lab33: pass
+                    self.cursor = self.limit - v_17
+                    if not self.__r_mark_ylA():
+                        raise lab31()
+                except lab32: pass
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+                v_18 = self.limit - self.cursor
+                try:
+                    try:
+                        v_19 = self.limit - self.cursor
+                        try:
+                            self.ket = self.cursor
+                            if not self.__r_mark_lAr():
+                                raise lab36()
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            if not self.__r_stem_suffix_chain_before_ki():
+                                raise lab36()
+                            raise lab35()
+                        except lab36: pass
+                        self.cursor = self.limit - v_19
+                        try:
+                            self.ket = self.cursor
+                            try:
+                                v_20 = self.limit - self.cursor
+                                try:
+                                    if not self.__r_mark_possessives():
+                                        raise lab39()
+                                    raise lab38()
+                                except lab39: pass
+                                self.cursor = self.limit - v_20
+                                if not self.__r_mark_sU():
+                                    raise lab37()
+                            except lab38: pass
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            v_21 = self.limit - self.cursor
+                            try:
+                                self.ket = self.cursor
+                                if not self.__r_mark_lAr():
+                                    self.cursor = self.limit - v_21
+                                    raise lab40()
+                                self.bra = self.cursor
+                                if not self.slice_del():
+                                    return False
+
+                                if not self.__r_stem_suffix_chain_before_ki():
+                                    self.cursor = self.limit - v_21
+                                    raise lab40()
+                            except lab40: pass
+                            raise lab35()
+                        except lab37: pass
+                        self.cursor = self.limit - v_19
+                        if not self.__r_stem_suffix_chain_before_ki():
+                            self.cursor = self.limit - v_18
+                            raise lab34()
+                    except lab35: pass
+                except lab34: pass
+                raise lab0()
+            except lab31: pass
+            self.cursor = self.limit - v_1
+            try:
+                self.ket = self.cursor
+                if not self.__r_mark_lArI():
+                    raise lab41()
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+                raise lab0()
+            except lab41: pass
+            self.cursor = self.limit - v_1
+            try:
+                if not self.__r_stem_suffix_chain_before_ki():
+                    raise lab42()
+                raise lab0()
+            except lab42: pass
+            self.cursor = self.limit - v_1
+            try:
+                self.ket = self.cursor
+                try:
+                    v_22 = self.limit - self.cursor
+                    try:
+                        if not self.__r_mark_DA():
+                            raise lab45()
+                        raise lab44()
+                    except lab45: pass
+                    self.cursor = self.limit - v_22
+                    try:
+                        if not self.__r_mark_yU():
+                            raise lab46()
+                        raise lab44()
+                    except lab46: pass
+                    self.cursor = self.limit - v_22
+                    if not self.__r_mark_yA():
+                        raise lab43()
+                except lab44: pass
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+                v_23 = self.limit - self.cursor
+                try:
+                    self.ket = self.cursor
+                    try:
+                        v_24 = self.limit - self.cursor
+                        try:
+                            if not self.__r_mark_possessives():
+                                raise lab49()
+                            self.bra = self.cursor
+                            if not self.slice_del():
+                                return False
+
+                            v_25 = self.limit - self.cursor
+                            try:
+                                self.ket = self.cursor
+                                if not self.__r_mark_lAr():
+                                    self.cursor = self.limit - v_25
+                                    raise lab50()
+                            except lab50: pass
+                            raise lab48()
+                        except lab49: pass
+                        self.cursor = self.limit - v_24
+                        if not self.__r_mark_lAr():
+                            self.cursor = self.limit - v_23
+                            raise lab47()
+                    except lab48: pass
+                    self.bra = self.cursor
+                    if not self.slice_del():
+                        return False
+
+                    self.ket = self.cursor
+                    if not self.__r_stem_suffix_chain_before_ki():
+                        self.cursor = self.limit - v_23
+                        raise lab47()
+                except lab47: pass
+                raise lab0()
+            except lab43: pass
+            self.cursor = self.limit - v_1
+            self.ket = self.cursor
+            try:
+                v_26 = self.limit - self.cursor
+                try:
+                    if not self.__r_mark_possessives():
+                        raise lab52()
+                    raise lab51()
+                except lab52: pass
+                self.cursor = self.limit - v_26
+                if not self.__r_mark_sU():
+                    return False
+            except lab51: pass
+            self.bra = self.cursor
+            if not self.slice_del():
+                return False
+
+            v_27 = self.limit - self.cursor
+            try:
+                self.ket = self.cursor
+                if not self.__r_mark_lAr():
+                    self.cursor = self.limit - v_27
+                    raise lab53()
+                self.bra = self.cursor
+                if not self.slice_del():
+                    return False
+
+                if not self.__r_stem_suffix_chain_before_ki():
+                    self.cursor = self.limit - v_27
+                    raise lab53()
+            except lab53: pass
+        except lab0: pass
+        return True
+
+    def __r_post_process_last_consonants(self):
+        self.ket = self.cursor
+        among_var = self.find_among_b(TurkishStemmer.a_23)
+        if among_var == 0:
+            return False
+        self.bra = self.cursor
+        if among_var == 1:
+            if not self.slice_from(u"p"):
+                return False
+        elif among_var == 2:
+            if not self.slice_from(u"ç"):
+                return False
+        elif among_var == 3:
+            if not self.slice_from(u"t"):
+                return False
+        else:
+            if not self.slice_from(u"k"):
+                return False
+        return True
+
+    def __r_append_U_to_stems_ending_with_d_or_g(self):
+        self.ket = self.cursor
+        self.bra = self.cursor
+        try:
+            v_1 = self.limit - self.cursor
+            try:
+                if not self.eq_s_b(u"d"):
+                    raise lab1()
+                raise lab0()
+            except lab1: pass
+            self.cursor = self.limit - v_1
+            if not self.eq_s_b(u"g"):
+                return False
+        except lab0: pass
+        if not self.go_out_grouping_b(TurkishStemmer.g_vowel):
+            return False
+        try:
+            v_2 = self.limit - self.cursor
+            try:
+                try:
+                    v_3 = self.limit - self.cursor
+                    try:
+                        if not self.eq_s_b(u"a"):
+                            raise lab5()
+                        raise lab4()
+                    except lab5: pass
+                    self.cursor = self.limit - v_3
+                    if not self.eq_s_b(u"ı"):
+                        raise lab3()
+                except lab4: pass
+                if not self.slice_from(u"ı"):
+                    return False
+                raise lab2()
+            except lab3: pass
+            self.cursor = self.limit - v_2
+            try:
+                try:
+                    v_4 = self.limit - self.cursor
+                    try:
+                        if not self.eq_s_b(u"e"):
+                            raise lab8()
+                        raise lab7()
+                    except lab8: pass
+                    self.cursor = self.limit - v_4
+                    if not self.eq_s_b(u"i"):
+                        raise lab6()
+                except lab7: pass
+                if not self.slice_from(u"i"):
+                    return False
+                raise lab2()
+            except lab6: pass
+            self.cursor = self.limit - v_2
+            try:
+                try:
+                    v_5 = self.limit - self.cursor
+                    try:
+                        if not self.eq_s_b(u"o"):
+                            raise lab11()
+                        raise lab10()
+                    except lab11: pass
+                    self.cursor = self.limit - v_5
+                    if not self.eq_s_b(u"u"):
+                        raise lab9()
+                except lab10: pass
+                if not self.slice_from(u"u"):
+                    return False
+                raise lab2()
+            except lab9: pass
+            self.cursor = self.limit - v_2
+            try:
+                v_6 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"ö"):
+                        raise lab13()
+                    raise lab12()
+                except lab13: pass
+                self.cursor = self.limit - v_6
+                if not self.eq_s_b(u"ü"):
+                    return False
+            except lab12: pass
+            if not self.slice_from(u"ü"):
+                return False
+        except lab2: pass
+        return True
+
+    def __r_is_reserved_word(self):
+        if not self.eq_s_b(u"ad"):
+            return False
+        v_1 = self.limit - self.cursor
+        try:
+            if not self.eq_s_b(u"soy"):
+                self.cursor = self.limit - v_1
+                raise lab0()
+        except lab0: pass
+        if self.cursor > self.limit_backward:
+            return False
+        return True
+
+    def __r_remove_proper_noun_suffix(self):
+        v_1 = self.cursor
+        try:
+            self.bra = self.cursor
+            try:
+                while True:
+                    v_2 = self.cursor
+                    try:
+                        v_3 = self.cursor
+                        try:
+                            if not self.eq_s(u"'"):
+                                raise lab3()
+                            raise lab2()
+                        except lab3: pass
+                        self.cursor = v_3
+                        self.cursor = v_2
+                        raise lab1()
+                    except lab2: pass
+                    self.cursor = v_2
+                    if self.cursor >= self.limit:
+                        raise lab0()
+                    self.cursor += 1
+            except lab1: pass
+            self.ket = self.cursor
+            if not self.slice_del():
+                return False
+
+        except lab0: pass
+        self.cursor = v_1
+        v_4 = self.cursor
+        try:
+            c = self.cursor + 2
+            if c > self.limit:
+                raise lab4()
+            self.cursor = c
+            try:
+                while True:
+                    v_5 = self.cursor
+                    try:
+                        if not self.eq_s(u"'"):
+                            raise lab6()
+                        self.cursor = v_5
+                        raise lab5()
+                    except lab6: pass
+                    self.cursor = v_5
+                    if self.cursor >= self.limit:
+                        raise lab4()
+                    self.cursor += 1
+            except lab5: pass
+            self.bra = self.cursor
+            self.cursor = self.limit
+            self.ket = self.cursor
+            if not self.slice_del():
+                return False
+
+        except lab4: pass
+        self.cursor = v_4
+        return True
+
+    def __r_more_than_one_syllable_word(self):
+        v_1 = self.cursor
+        for v_2 in 0, 0:
+
+            if not self.go_out_grouping(TurkishStemmer.g_vowel):
+                return False
+            self.cursor += 1
+        self.cursor = v_1
+        return True
+
+    def __r_postlude(self):
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_1 = self.limit - self.cursor
+        try:
+            if not self.__r_is_reserved_word():
+                raise lab0()
+            return False
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        v_2 = self.limit - self.cursor
+        self.__r_append_U_to_stems_ending_with_d_or_g()
+        self.cursor = self.limit - v_2
+        v_3 = self.limit - self.cursor
+        self.__r_post_process_last_consonants()
+        self.cursor = self.limit - v_3
+        self.cursor = self.limit_backward
+        return True
+
+    def _stem(self):
+        self.__r_remove_proper_noun_suffix()
+        if not self.__r_more_than_one_syllable_word():
+            return False
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        v_2 = self.limit - self.cursor
+        self.__r_stem_nominal_verb_suffixes()
+        self.cursor = self.limit - v_2
+        if not self.B_continue_stemming_noun_suffixes:
+            return False
+        v_3 = self.limit - self.cursor
+        self.__r_stem_noun_suffixes()
+        self.cursor = self.limit - v_3
+        self.cursor = self.limit_backward
+        if not self.__r_postlude():
+            return False
+        return True
+
+    a_0 = [
+        Among(u"m", -1, -1),
+        Among(u"n", -1, -1),
+        Among(u"miz", -1, -1),
+        Among(u"niz", -1, -1),
+        Among(u"muz", -1, -1),
+        Among(u"nuz", -1, -1),
+        Among(u"müz", -1, -1),
+        Among(u"nüz", -1, -1),
+        Among(u"mız", -1, -1),
+        Among(u"nız", -1, -1)
+    ]
+
+    a_1 = [
+        Among(u"leri", -1, -1),
+        Among(u"ları", -1, -1)
+    ]
+
+    a_2 = [
+        Among(u"ni", -1, -1),
+        Among(u"nu", -1, -1),
+        Among(u"nü", -1, -1),
+        Among(u"nı", -1, -1)
+    ]
+
+    a_3 = [
+        Among(u"in", -1, -1),
+        Among(u"un", -1, -1),
+        Among(u"ün", -1, -1),
+        Among(u"ın", -1, -1)
+    ]
+
+    a_4 = [
+        Among(u"a", -1, -1),
+        Among(u"e", -1, -1)
+    ]
+
+    a_5 = [
+        Among(u"na", -1, -1),
+        Among(u"ne", -1, -1)
+    ]
+
+    a_6 = [
+        Among(u"da", -1, -1),
+        Among(u"ta", -1, -1),
+        Among(u"de", -1, -1),
+        Among(u"te", -1, -1)
+    ]
+
+    a_7 = [
+        Among(u"nda", -1, -1),
+        Among(u"nde", -1, -1)
+    ]
+
+    a_8 = [
+        Among(u"dan", -1, -1),
+        Among(u"tan", -1, -1),
+        Among(u"den", -1, -1),
+        Among(u"ten", -1, -1)
+    ]
+
+    a_9 = [
+        Among(u"ndan", -1, -1),
+        Among(u"nden", -1, -1)
+    ]
+
+    a_10 = [
+        Among(u"la", -1, -1),
+        Among(u"le", -1, -1)
+    ]
+
+    a_11 = [
+        Among(u"ca", -1, -1),
+        Among(u"ce", -1, -1)
+    ]
+
+    a_12 = [
+        Among(u"im", -1, -1),
+        Among(u"um", -1, -1),
+        Among(u"üm", -1, -1),
+        Among(u"ım", -1, -1)
+    ]
+
+    a_13 = [
+        Among(u"sin", -1, -1),
+        Among(u"sun", -1, -1),
+        Among(u"sün", -1, -1),
+        Among(u"sın", -1, -1)
+    ]
+
+    a_14 = [
+        Among(u"iz", -1, -1),
+        Among(u"uz", -1, -1),
+        Among(u"üz", -1, -1),
+        Among(u"ız", -1, -1)
+    ]
+
+    a_15 = [
+        Among(u"siniz", -1, -1),
+        Among(u"sunuz", -1, -1),
+        Among(u"sünüz", -1, -1),
+        Among(u"sınız", -1, -1)
+    ]
+
+    a_16 = [
+        Among(u"lar", -1, -1),
+        Among(u"ler", -1, -1)
+    ]
+
+    a_17 = [
+        Among(u"niz", -1, -1),
+        Among(u"nuz", -1, -1),
+        Among(u"nüz", -1, -1),
+        Among(u"nız", -1, -1)
+    ]
+
+    a_18 = [
+        Among(u"dir", -1, -1),
+        Among(u"tir", -1, -1),
+        Among(u"dur", -1, -1),
+        Among(u"tur", -1, -1),
+        Among(u"dür", -1, -1),
+        Among(u"tür", -1, -1),
+        Among(u"dır", -1, -1),
+        Among(u"tır", -1, -1)
+    ]
+
+    a_19 = [
+        Among(u"casına", -1, -1),
+        Among(u"cesine", -1, -1)
+    ]
+
+    a_20 = [
+        Among(u"di", -1, -1),
+        Among(u"ti", -1, -1),
+        Among(u"dik", -1, -1),
+        Among(u"tik", -1, -1),
+        Among(u"duk", -1, -1),
+        Among(u"tuk", -1, -1),
+        Among(u"dük", -1, -1),
+        Among(u"tük", -1, -1),
+        Among(u"dık", -1, -1),
+        Among(u"tık", -1, -1),
+        Among(u"dim", -1, -1),
+        Among(u"tim", -1, -1),
+        Among(u"dum", -1, -1),
+        Among(u"tum", -1, -1),
+        Among(u"düm", -1, -1),
+        Among(u"tüm", -1, -1),
+        Among(u"dım", -1, -1),
+        Among(u"tım", -1, -1),
+        Among(u"din", -1, -1),
+        Among(u"tin", -1, -1),
+        Among(u"dun", -1, -1),
+        Among(u"tun", -1, -1),
+        Among(u"dün", -1, -1),
+        Among(u"tün", -1, -1),
+        Among(u"dın", -1, -1),
+        Among(u"tın", -1, -1),
+        Among(u"du", -1, -1),
+        Among(u"tu", -1, -1),
+        Among(u"dü", -1, -1),
+        Among(u"tü", -1, -1),
+        Among(u"dı", -1, -1),
+        Among(u"tı", -1, -1)
+    ]
+
+    a_21 = [
+        Among(u"sa", -1, -1),
+        Among(u"se", -1, -1),
+        Among(u"sak", -1, -1),
+        Among(u"sek", -1, -1),
+        Among(u"sam", -1, -1),
+        Among(u"sem", -1, -1),
+        Among(u"san", -1, -1),
+        Among(u"sen", -1, -1)
+    ]
+
+    a_22 = [
+        Among(u"miş", -1, -1),
+        Among(u"muş", -1, -1),
+        Among(u"müş", -1, -1),
+        Among(u"mış", -1, -1)
+    ]
+
+    a_23 = [
+        Among(u"b", -1, 1),
+        Among(u"c", -1, 2),
+        Among(u"d", -1, 3),
+        Among(u"ğ", -1, 4)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
+
+
+class lab9(BaseException): pass
+
+
+class lab10(BaseException): pass
+
+
+class lab11(BaseException): pass
+
+
+class lab12(BaseException): pass
+
+
+class lab13(BaseException): pass
+
+
+class lab14(BaseException): pass
+
+
+class lab15(BaseException): pass
+
+
+class lab16(BaseException): pass
+
+
+class lab17(BaseException): pass
+
+
+class lab18(BaseException): pass
+
+
+class lab19(BaseException): pass
+
+
+class lab20(BaseException): pass
+
+
+class lab21(BaseException): pass
+
+
+class lab22(BaseException): pass
+
+
+class lab23(BaseException): pass
+
+
+class lab24(BaseException): pass
+
+
+class lab25(BaseException): pass
+
+
+class lab26(BaseException): pass
+
+
+class lab27(BaseException): pass
+
+
+class lab28(BaseException): pass
+
+
+class lab29(BaseException): pass
+
+
+class lab30(BaseException): pass
+
+
+class lab31(BaseException): pass
+
+
+class lab32(BaseException): pass
+
+
+class lab33(BaseException): pass
+
+
+class lab34(BaseException): pass
+
+
+class lab35(BaseException): pass
+
+
+class lab36(BaseException): pass
+
+
+class lab37(BaseException): pass
+
+
+class lab38(BaseException): pass
+
+
+class lab39(BaseException): pass
+
+
+class lab40(BaseException): pass
+
+
+class lab41(BaseException): pass
+
+
+class lab42(BaseException): pass
+
+
+class lab43(BaseException): pass
+
+
+class lab44(BaseException): pass
+
+
+class lab45(BaseException): pass
+
+
+class lab46(BaseException): pass
+
+
+class lab47(BaseException): pass
+
+
+class lab48(BaseException): pass
+
+
+class lab49(BaseException): pass
+
+
+class lab50(BaseException): pass
+
+
+class lab51(BaseException): pass
+
+
+class lab52(BaseException): pass
+
+
+class lab53(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/yiddish_stemmer.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/yiddish_stemmer.py
new file mode 100644
index 000000000..210bf53dd
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/snowballstemmer/yiddish_stemmer.py
@@ -0,0 +1,854 @@
+#-*- coding: utf-8 -*-
+# Generated from yiddish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+
+from .basestemmer import BaseStemmer
+from .among import Among
+
+
+class YiddishStemmer(BaseStemmer):
+    '''
+    This class implements the stemming algorithm defined by a snowball script.
+    Generated from yiddish.sbl by Snowball 3.0.1 - https://snowballstem.org/
+    '''
+
+    g_niked = {u"\u05B0", u"\u05B4", u"\u05B5", u"\u05B6", u"\u05B1", u"\u05B7", u"\u05B2", u"\u05B8", u"\u05B3", u"\u05C2", u"\u05C1", u"\u05B9", u"\u05BC", u"\u05BB", u"\u05BF"}
+
+    g_vowel = {u"\u05D0", u"\u05D5", u"\u05D9", u"\u05E2", u"\u05F1", u"\u05F2"}
+
+    g_consonant = {u"\u05D1", u"\u05D2", u"\u05D3", u"\u05D4", u"\u05D6", u"\u05D7", u"\u05D8", u"\u05DA", u"\u05DB", u"\u05DC", u"\u05DD", u"\u05DE", u"\u05DF", u"\u05E0", u"\u05E1", u"\u05E3", u"\u05E4", u"\u05E5", u"\u05E6", u"\u05E7", u"\u05E8", u"\u05E9", u"\u05EA", u"\u05F0"}
+
+    I_x = 0
+    I_p1 = 0
+
+    def __r_prelude(self):
+        v_1 = self.cursor
+        try:
+            while True:
+                v_2 = self.cursor
+                try:
+                    try:
+                        while True:
+                            v_3 = self.cursor
+                            try:
+                                self.bra = self.cursor
+                                among_var = self.find_among(YiddishStemmer.a_0)
+                                if among_var == 0:
+                                    raise lab3()
+                                self.ket = self.cursor
+                                if among_var == 1:
+                                    v_4 = self.cursor
+                                    try:
+                                        if not self.eq_s(u"\u05BC"):
+                                            raise lab4()
+                                        raise lab3()
+                                    except lab4: pass
+                                    self.cursor = v_4
+                                    if not self.slice_from(u"\u05F0"):
+                                        return False
+                                elif among_var == 2:
+                                    v_5 = self.cursor
+                                    try:
+                                        if not self.eq_s(u"\u05B4"):
+                                            raise lab5()
+                                        raise lab3()
+                                    except lab5: pass
+                                    self.cursor = v_5
+                                    if not self.slice_from(u"\u05F1"):
+                                        return False
+                                elif among_var == 3:
+                                    v_6 = self.cursor
+                                    try:
+                                        if not self.eq_s(u"\u05B4"):
+                                            raise lab6()
+                                        raise lab3()
+                                    except lab6: pass
+                                    self.cursor = v_6
+                                    if not self.slice_from(u"\u05F2"):
+                                        return False
+                                elif among_var == 4:
+                                    if not self.slice_from(u"\u05DB"):
+                                        return False
+                                elif among_var == 5:
+                                    if not self.slice_from(u"\u05DE"):
+                                        return False
+                                elif among_var == 6:
+                                    if not self.slice_from(u"\u05E0"):
+                                        return False
+                                elif among_var == 7:
+                                    if not self.slice_from(u"\u05E4"):
+                                        return False
+                                else:
+                                    if not self.slice_from(u"\u05E6"):
+                                        return False
+                                self.cursor = v_3
+                                raise lab2()
+                            except lab3: pass
+                            self.cursor = v_3
+                            if self.cursor >= self.limit:
+                                raise lab1()
+                            self.cursor += 1
+                    except lab2: pass
+                    continue
+                except lab1: pass
+                self.cursor = v_2
+                break
+        except lab0: pass
+        self.cursor = v_1
+        v_7 = self.cursor
+        try:
+            while True:
+                v_8 = self.cursor
+                try:
+                    try:
+                        while True:
+                            v_9 = self.cursor
+                            try:
+                                self.bra = self.cursor
+                                if not self.in_grouping(YiddishStemmer.g_niked):
+                                    raise lab10()
+                                self.ket = self.cursor
+                                if not self.slice_del():
+                                    return False
+
+                                self.cursor = v_9
+                                raise lab9()
+                            except lab10: pass
+                            self.cursor = v_9
+                            if self.cursor >= self.limit:
+                                raise lab8()
+                            self.cursor += 1
+                    except lab9: pass
+                    continue
+                except lab8: pass
+                self.cursor = v_8
+                break
+        except lab7: pass
+        self.cursor = v_7
+        return True
+
+    def __r_mark_regions(self):
+        self.I_p1 = self.limit
+        v_1 = self.cursor
+        try:
+            self.bra = self.cursor
+            if not self.eq_s(u"\u05D2\u05E2"):
+                self.cursor = v_1
+                raise lab0()
+            self.ket = self.cursor
+            v_2 = self.cursor
+            try:
+                try:
+                    v_3 = self.cursor
+                    try:
+                        if not self.eq_s(u"\u05DC\u05D8"):
+                            raise lab3()
+                        raise lab2()
+                    except lab3: pass
+                    self.cursor = v_3
+                    try:
+                        if not self.eq_s(u"\u05D1\u05E0"):
+                            raise lab4()
+                        raise lab2()
+                    except lab4: pass
+                    self.cursor = v_3
+                    if self.cursor < self.limit:
+                        raise lab1()
+                except lab2: pass
+                self.cursor = v_1
+                raise lab0()
+            except lab1: pass
+            self.cursor = v_2
+            if not self.slice_from(u"GE"):
+                return False
+        except lab0: pass
+        v_4 = self.cursor
+        try:
+            if self.find_among(YiddishStemmer.a_1) == 0:
+                self.cursor = v_4
+                raise lab5()
+            try:
+                v_5 = self.cursor
+                try:
+                    v_6 = self.cursor
+                    try:
+                        v_7 = self.cursor
+                        try:
+                            if not self.eq_s(u"\u05E6\u05D5\u05D2\u05E0"):
+                                raise lab9()
+                            raise lab8()
+                        except lab9: pass
+                        self.cursor = v_7
+                        try:
+                            if not self.eq_s(u"\u05E6\u05D5\u05E7\u05D8"):
+                                raise lab10()
+                            raise lab8()
+                        except lab10: pass
+                        self.cursor = v_7
+                        if not self.eq_s(u"\u05E6\u05D5\u05E7\u05E0"):
+                            raise lab7()
+                    except lab8: pass
+                    if self.cursor < self.limit:
+                        raise lab7()
+                    self.cursor = v_6
+                    raise lab6()
+                except lab7: pass
+                self.cursor = v_5
+                try:
+                    v_8 = self.cursor
+                    if not self.eq_s(u"\u05D2\u05E2\u05D1\u05E0"):
+                        raise lab11()
+                    self.cursor = v_8
+                    raise lab6()
+                except lab11: pass
+                self.cursor = v_5
+                try:
+                    self.bra = self.cursor
+                    if not self.eq_s(u"\u05D2\u05E2"):
+                        raise lab12()
+                    self.ket = self.cursor
+                    if not self.slice_from(u"GE"):
+                        return False
+                    raise lab6()
+                except lab12: pass
+                self.cursor = v_5
+                self.bra = self.cursor
+                if not self.eq_s(u"\u05E6\u05D5"):
+                    self.cursor = v_4
+                    raise lab5()
+                self.ket = self.cursor
+                if not self.slice_from(u"TSU"):
+                    return False
+            except lab6: pass
+        except lab5: pass
+        v_9 = self.cursor
+        c = self.cursor + 3
+        if c > self.limit:
+            return False
+        self.cursor = c
+        self.I_x = self.cursor
+        self.cursor = v_9
+        v_10 = self.cursor
+        try:
+            if self.find_among(YiddishStemmer.a_2) == 0:
+                self.cursor = v_10
+                raise lab13()
+        except lab13: pass
+        v_11 = self.cursor
+        try:
+            if not self.in_grouping(YiddishStemmer.g_consonant):
+                raise lab14()
+            if not self.in_grouping(YiddishStemmer.g_consonant):
+                raise lab14()
+            if not self.in_grouping(YiddishStemmer.g_consonant):
+                raise lab14()
+            self.I_p1 = self.cursor
+            return False
+        except lab14: pass
+        self.cursor = v_11
+        if not self.go_out_grouping(YiddishStemmer.g_vowel):
+            return False
+        self.cursor += 1
+        if not self.go_in_grouping(YiddishStemmer.g_vowel):
+            return False
+        self.I_p1 = self.cursor
+        try:
+            if self.I_p1 >= self.I_x:
+                raise lab15()
+            self.I_p1 = self.I_x
+        except lab15: pass
+        return True
+
+    def __r_R1(self):
+        return self.I_p1 <= self.cursor
+
+    def __r_R1plus3(self):
+        return self.I_p1 <= (self.cursor + 3)
+
+    def __r_standard_suffix(self):
+        v_1 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            among_var = self.find_among_b(YiddishStemmer.a_4)
+            if among_var == 0:
+                raise lab0()
+            self.bra = self.cursor
+            if among_var == 1:
+                if not self.__r_R1():
+                    raise lab0()
+                if not self.slice_del():
+                    return False
+
+            elif among_var == 2:
+                if not self.__r_R1():
+                    raise lab0()
+                if not self.slice_from(u"\u05D9\u05E2"):
+                    return False
+            elif among_var == 3:
+                if not self.__r_R1():
+                    raise lab0()
+                if not self.slice_del():
+                    return False
+
+                self.ket = self.cursor
+                among_var = self.find_among_b(YiddishStemmer.a_3)
+                if among_var == 0:
+                    raise lab0()
+                self.bra = self.cursor
+                if among_var == 1:
+                    if not self.slice_from(u"\u05D2\u05F2"):
+                        return False
+                elif among_var == 2:
+                    if not self.slice_from(u"\u05E0\u05E2\u05DE"):
+                        return False
+                elif among_var == 3:
+                    if not self.slice_from(u"\u05DE\u05F2\u05D3"):
+                        return False
+                elif among_var == 4:
+                    if not self.slice_from(u"\u05D1\u05F2\u05D8"):
+                        return False
+                elif among_var == 5:
+                    if not self.slice_from(u"\u05D1\u05F2\u05E1"):
+                        return False
+                elif among_var == 6:
+                    if not self.slice_from(u"\u05F0\u05F2\u05D6"):
+                        return False
+                elif among_var == 7:
+                    if not self.slice_from(u"\u05D8\u05E8\u05F2\u05D1"):
+                        return False
+                elif among_var == 8:
+                    if not self.slice_from(u"\u05DC\u05F2\u05D8"):
+                        return False
+                elif among_var == 9:
+                    if not self.slice_from(u"\u05E7\u05DC\u05F2\u05D1"):
+                        return False
+                elif among_var == 10:
+                    if not self.slice_from(u"\u05E8\u05F2\u05D1"):
+                        return False
+                elif among_var == 11:
+                    if not self.slice_from(u"\u05E8\u05F2\u05E1"):
+                        return False
+                elif among_var == 12:
+                    if not self.slice_from(u"\u05E9\u05F0\u05F2\u05D2"):
+                        return False
+                elif among_var == 13:
+                    if not self.slice_from(u"\u05E9\u05DE\u05F2\u05E1"):
+                        return False
+                elif among_var == 14:
+                    if not self.slice_from(u"\u05E9\u05E0\u05F2\u05D3"):
+                        return False
+                elif among_var == 15:
+                    if not self.slice_from(u"\u05E9\u05E8\u05F2\u05D1"):
+                        return False
+                elif among_var == 16:
+                    if not self.slice_from(u"\u05D1\u05D9\u05E0\u05D3"):
+                        return False
+                elif among_var == 17:
+                    if not self.slice_from(u"\u05F0\u05D9\u05D8\u05E9"):
+                        return False
+                elif among_var == 18:
+                    if not self.slice_from(u"\u05D6\u05D9\u05E0\u05D2"):
+                        return False
+                elif among_var == 19:
+                    if not self.slice_from(u"\u05D8\u05E8\u05D9\u05E0\u05E7"):
+                        return False
+                elif among_var == 20:
+                    if not self.slice_from(u"\u05E6\u05F0\u05D9\u05E0\u05D2"):
+                        return False
+                elif among_var == 21:
+                    if not self.slice_from(u"\u05E9\u05DC\u05D9\u05E0\u05D2"):
+                        return False
+                elif among_var == 22:
+                    if not self.slice_from(u"\u05D1\u05F2\u05D2"):
+                        return False
+                elif among_var == 23:
+                    if not self.slice_from(u"\u05D4\u05F2\u05D1"):
+                        return False
+                elif among_var == 24:
+                    if not self.slice_from(u"\u05E4\u05D0\u05E8\u05DC\u05D9\u05E8"):
+                        return False
+                elif among_var == 25:
+                    if not self.slice_from(u"\u05E9\u05D8\u05F2"):
+                        return False
+                else:
+                    if not self.slice_from(u"\u05E9\u05F0\u05E2\u05E8"):
+                        return False
+            elif among_var == 4:
+                try:
+                    v_2 = self.limit - self.cursor
+                    try:
+                        if not self.__r_R1():
+                            raise lab2()
+                        if not self.slice_del():
+                            return False
+
+                        raise lab1()
+                    except lab2: pass
+                    self.cursor = self.limit - v_2
+                    if not self.slice_from(u"\u05D8"):
+                        return False
+                except lab1: pass
+                self.ket = self.cursor
+                if not self.eq_s_b(u"\u05D1\u05E8\u05D0\u05DB"):
+                    raise lab0()
+                v_3 = self.limit - self.cursor
+                try:
+                    if not self.eq_s_b(u"\u05D2\u05E2"):
+                        self.cursor = self.limit - v_3
+                        raise lab3()
+                except lab3: pass
+                self.bra = self.cursor
+                if not self.slice_from(u"\u05D1\u05E8\u05E2\u05E0\u05D2"):
+                    return False
+            elif among_var == 5:
+                if not self.slice_from(u"\u05D2\u05F2"):
+                    return False
+            elif among_var == 6:
+                if not self.slice_from(u"\u05E0\u05E2\u05DE"):
+                    return False
+            elif among_var == 7:
+                if not self.slice_from(u"\u05E9\u05E8\u05F2\u05D1"):
+                    return False
+            elif among_var == 8:
+                if not self.slice_from(u"\u05DE\u05F2\u05D3"):
+                    return False
+            elif among_var == 9:
+                if not self.slice_from(u"\u05D1\u05F2\u05D8"):
+                    return False
+            elif among_var == 10:
+                if not self.slice_from(u"\u05D1\u05F2\u05E1"):
+                    return False
+            elif among_var == 11:
+                if not self.slice_from(u"\u05F0\u05F2\u05D6"):
+                    return False
+            elif among_var == 12:
+                if not self.slice_from(u"\u05D8\u05E8\u05F2\u05D1"):
+                    return False
+            elif among_var == 13:
+                if not self.slice_from(u"\u05DC\u05F2\u05D8"):
+                    return False
+            elif among_var == 14:
+                if not self.slice_from(u"\u05E7\u05DC\u05F2\u05D1"):
+                    return False
+            elif among_var == 15:
+                if not self.slice_from(u"\u05E8\u05F2\u05D1"):
+                    return False
+            elif among_var == 16:
+                if not self.slice_from(u"\u05E8\u05F2\u05E1"):
+                    return False
+            elif among_var == 17:
+                if not self.slice_from(u"\u05E9\u05F0\u05F2\u05D2"):
+                    return False
+            elif among_var == 18:
+                if not self.slice_from(u"\u05E9\u05DE\u05F2\u05E1"):
+                    return False
+            elif among_var == 19:
+                if not self.slice_from(u"\u05E9\u05E0\u05F2\u05D3"):
+                    return False
+            elif among_var == 20:
+                if not self.slice_from(u"\u05D1\u05D9\u05E0\u05D3"):
+                    return False
+            elif among_var == 21:
+                if not self.slice_from(u"\u05F0\u05D9\u05D8\u05E9"):
+                    return False
+            elif among_var == 22:
+                if not self.slice_from(u"\u05D6\u05D9\u05E0\u05D2"):
+                    return False
+            elif among_var == 23:
+                if not self.slice_from(u"\u05D8\u05E8\u05D9\u05E0\u05E7"):
+                    return False
+            elif among_var == 24:
+                if not self.slice_from(u"\u05E6\u05F0\u05D9\u05E0\u05D2"):
+                    return False
+            elif among_var == 25:
+                if not self.slice_from(u"\u05E9\u05DC\u05D9\u05E0\u05D2"):
+                    return False
+            elif among_var == 26:
+                if not self.slice_from(u"\u05D1\u05F2\u05D2"):
+                    return False
+            elif among_var == 27:
+                if not self.slice_from(u"\u05D4\u05F2\u05D1"):
+                    return False
+            elif among_var == 28:
+                if not self.slice_from(u"\u05E4\u05D0\u05E8\u05DC\u05D9\u05E8"):
+                    return False
+            elif among_var == 29:
+                if not self.slice_from(u"\u05E9\u05D8\u05F2"):
+                    return False
+            elif among_var == 30:
+                if not self.slice_from(u"\u05E9\u05F0\u05E2\u05E8"):
+                    return False
+            elif among_var == 31:
+                if not self.slice_from(u"\u05D1\u05E8\u05E2\u05E0\u05D2"):
+                    return False
+            elif among_var == 32:
+                if not self.__r_R1():
+                    raise lab0()
+                if not self.slice_from(u"\u05D4"):
+                    return False
+            elif among_var == 33:
+                try:
+                    v_4 = self.limit - self.cursor
+                    try:
+                        try:
+                            v_5 = self.limit - self.cursor
+                            try:
+                                if not self.eq_s_b(u"\u05D2"):
+                                    raise lab7()
+                                raise lab6()
+                            except lab7: pass
+                            self.cursor = self.limit - v_5
+                            if not self.eq_s_b(u"\u05E9"):
+                                raise lab5()
+                        except lab6: pass
+                        v_6 = self.limit - self.cursor
+                        try:
+                            if not self.__r_R1plus3():
+                                self.cursor = self.limit - v_6
+                                raise lab8()
+                            if not self.slice_from(u"\u05D9\u05E1"):
+                                return False
+                        except lab8: pass
+                        raise lab4()
+                    except lab5: pass
+                    self.cursor = self.limit - v_4
+                    if not self.__r_R1():
+                        raise lab0()
+                    if not self.slice_del():
+                        return False
+
+                except lab4: pass
+        except lab0: pass
+        self.cursor = self.limit - v_1
+        v_7 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            among_var = self.find_among_b(YiddishStemmer.a_5)
+            if among_var == 0:
+                raise lab9()
+            self.bra = self.cursor
+            if among_var == 1:
+                if not self.__r_R1():
+                    raise lab9()
+                if not self.slice_del():
+                    return False
+
+            else:
+                if not self.__r_R1():
+                    raise lab9()
+                if not self.in_grouping_b(YiddishStemmer.g_consonant):
+                    raise lab9()
+                if not self.slice_del():
+                    return False
+
+        except lab9: pass
+        self.cursor = self.limit - v_7
+        v_8 = self.limit - self.cursor
+        try:
+            self.ket = self.cursor
+            among_var = self.find_among_b(YiddishStemmer.a_6)
+            if among_var == 0:
+                raise lab10()
+            self.bra = self.cursor
+            if among_var == 1:
+                if not self.__r_R1():
+                    raise lab10()
+                if not self.slice_del():
+                    return False
+
+        except lab10: pass
+        self.cursor = self.limit - v_8
+        v_9 = self.limit - self.cursor
+        try:
+            while True:
+                v_10 = self.limit - self.cursor
+                try:
+                    try:
+                        while True:
+                            v_11 = self.limit - self.cursor
+                            try:
+                                self.ket = self.cursor
+                                try:
+                                    v_12 = self.limit - self.cursor
+                                    try:
+                                        if not self.eq_s_b(u"GE"):
+                                            raise lab16()
+                                        raise lab15()
+                                    except lab16: pass
+                                    self.cursor = self.limit - v_12
+                                    if not self.eq_s_b(u"TSU"):
+                                        raise lab14()
+                                except lab15: pass
+                                self.bra = self.cursor
+                                if not self.slice_del():
+                                    return False
+
+                                self.cursor = self.limit - v_11
+                                raise lab13()
+                            except lab14: pass
+                            self.cursor = self.limit - v_11
+                            if self.cursor <= self.limit_backward:
+                                raise lab12()
+                            self.cursor -= 1
+                    except lab13: pass
+                    continue
+                except lab12: pass
+                self.cursor = self.limit - v_10
+                break
+        except lab11: pass
+        self.cursor = self.limit - v_9
+        return True
+
+    def _stem(self):
+        self.__r_prelude()
+        v_2 = self.cursor
+        self.__r_mark_regions()
+        self.cursor = v_2
+        self.limit_backward = self.cursor
+        self.cursor = self.limit
+        self.__r_standard_suffix()
+        self.cursor = self.limit_backward
+        return True
+
+    a_0 = [
+        Among(u"\u05D5\u05D5", -1, 1),
+        Among(u"\u05D5\u05D9", -1, 2),
+        Among(u"\u05D9\u05D9", -1, 3),
+        Among(u"\u05DA", -1, 4),
+        Among(u"\u05DD", -1, 5),
+        Among(u"\u05DF", -1, 6),
+        Among(u"\u05E3", -1, 7),
+        Among(u"\u05E5", -1, 8)
+    ]
+
+    a_1 = [
+        Among(u"\u05D0\u05D3\u05D5\u05E8\u05DB", -1, 1),
+        Among(u"\u05D0\u05D4\u05D9\u05E0", -1, 1),
+        Among(u"\u05D0\u05D4\u05E2\u05E8", -1, 1),
+        Among(u"\u05D0\u05D4\u05F2\u05DE", -1, 1),
+        Among(u"\u05D0\u05D5\u05DE", -1, 1),
+        Among(u"\u05D0\u05D5\u05E0\u05D8\u05E2\u05E8", -1, 1),
+        Among(u"\u05D0\u05D9\u05D1\u05E2\u05E8", -1, 1),
+        Among(u"\u05D0\u05E0", -1, 1),
+        Among(u"\u05D0\u05E0\u05D8", 7, 1),
+        Among(u"\u05D0\u05E0\u05D8\u05E7\u05E2\u05D2\u05E0", 8, 1),
+        Among(u"\u05D0\u05E0\u05D9\u05D3\u05E2\u05E8", 7, 1),
+        Among(u"\u05D0\u05E4", -1, 1),
+        Among(u"\u05D0\u05E4\u05D9\u05E8", 11, 1),
+        Among(u"\u05D0\u05E7\u05E2\u05D2\u05E0", -1, 1),
+        Among(u"\u05D0\u05E8\u05D0\u05E4", -1, 1),
+        Among(u"\u05D0\u05E8\u05D5\u05DE", -1, 1),
+        Among(u"\u05D0\u05E8\u05D5\u05E0\u05D8\u05E2\u05E8", -1, 1),
+        Among(u"\u05D0\u05E8\u05D9\u05D1\u05E2\u05E8", -1, 1),
+        Among(u"\u05D0\u05E8\u05F1\u05E1", -1, 1),
+        Among(u"\u05D0\u05E8\u05F1\u05E4", -1, 1),
+        Among(u"\u05D0\u05E8\u05F2\u05E0", -1, 1),
+        Among(u"\u05D0\u05F0\u05E2\u05E7", -1, 1),
+        Among(u"\u05D0\u05F1\u05E1", -1, 1),
+        Among(u"\u05D0\u05F1\u05E4", -1, 1),
+        Among(u"\u05D0\u05F2\u05E0", -1, 1),
+        Among(u"\u05D1\u05D0", -1, 1),
+        Among(u"\u05D1\u05F2", -1, 1),
+        Among(u"\u05D3\u05D5\u05E8\u05DB", -1, 1),
+        Among(u"\u05D3\u05E2\u05E8", -1, 1),
+        Among(u"\u05DE\u05D9\u05D8", -1, 1),
+        Among(u"\u05E0\u05D0\u05DB", -1, 1),
+        Among(u"\u05E4\u05D0\u05E8", -1, 1),
+        Among(u"\u05E4\u05D0\u05E8\u05D1\u05F2", 31, 1),
+        Among(u"\u05E4\u05D0\u05E8\u05F1\u05E1", 31, 1),
+        Among(u"\u05E4\u05D5\u05E0\u05D0\u05E0\u05D3\u05E2\u05E8", -1, 1),
+        Among(u"\u05E6\u05D5", -1, 1),
+        Among(u"\u05E6\u05D5\u05D6\u05D0\u05DE\u05E2\u05E0", 35, 1),
+        Among(u"\u05E6\u05D5\u05E0\u05F1\u05E4", 35, 1),
+        Among(u"\u05E6\u05D5\u05E8\u05D9\u05E7", 35, 1),
+        Among(u"\u05E6\u05E2", -1, 1)
+    ]
+
+    a_2 = [
+        Among(u"\u05D3\u05D6\u05E9", -1, -1),
+        Among(u"\u05E9\u05D8\u05E8", -1, -1),
+        Among(u"\u05E9\u05D8\u05E9", -1, -1),
+        Among(u"\u05E9\u05E4\u05E8", -1, -1)
+    ]
+
+    a_3 = [
+        Among(u"\u05E7\u05DC\u05D9\u05D1", -1, 9),
+        Among(u"\u05E8\u05D9\u05D1", -1, 10),
+        Among(u"\u05D8\u05E8\u05D9\u05D1", 1, 7),
+        Among(u"\u05E9\u05E8\u05D9\u05D1", 1, 15),
+        Among(u"\u05D4\u05F1\u05D1", -1, 23),
+        Among(u"\u05E9\u05F0\u05D9\u05D2", -1, 12),
+        Among(u"\u05D2\u05D0\u05E0\u05D2", -1, 1),
+        Among(u"\u05D6\u05D5\u05E0\u05D2", -1, 18),
+        Among(u"\u05E9\u05DC\u05D5\u05E0\u05D2", -1, 21),
+        Among(u"\u05E6\u05F0\u05D5\u05E0\u05D2", -1, 20),
+        Among(u"\u05D1\u05F1\u05D2", -1, 22),
+        Among(u"\u05D1\u05D5\u05E0\u05D3", -1, 16),
+        Among(u"\u05F0\u05D9\u05D6", -1, 6),
+        Among(u"\u05D1\u05D9\u05D8", -1, 4),
+        Among(u"\u05DC\u05D9\u05D8", -1, 8),
+        Among(u"\u05DE\u05D9\u05D8", -1, 3),
+        Among(u"\u05E9\u05E0\u05D9\u05D8", -1, 14),
+        Among(u"\u05E0\u05D5\u05DE", -1, 2),
+        Among(u"\u05E9\u05D8\u05D0\u05E0", -1, 25),
+        Among(u"\u05D1\u05D9\u05E1", -1, 5),
+        Among(u"\u05E9\u05DE\u05D9\u05E1", -1, 13),
+        Among(u"\u05E8\u05D9\u05E1", -1, 11),
+        Among(u"\u05D8\u05E8\u05D5\u05E0\u05E7", -1, 19),
+        Among(u"\u05E4\u05D0\u05E8\u05DC\u05F1\u05E8", -1, 24),
+        Among(u"\u05E9\u05F0\u05F1\u05E8", -1, 26),
+        Among(u"\u05F0\u05D5\u05D8\u05E9", -1, 17)
+    ]
+
+    a_4 = [
+        Among(u"\u05D5\u05E0\u05D2", -1, 1),
+        Among(u"\u05E1\u05D8\u05D5", -1, 1),
+        Among(u"\u05D8", -1, 1),
+        Among(u"\u05D1\u05E8\u05D0\u05DB\u05D8", 2, 31),
+        Among(u"\u05E1\u05D8", 2, 1),
+        Among(u"\u05D9\u05E1\u05D8", 4, 33),
+        Among(u"\u05E2\u05D8", 2, 1),
+        Among(u"\u05E9\u05D0\u05E4\u05D8", 2, 1),
+        Among(u"\u05D4\u05F2\u05D8", 2, 1),
+        Among(u"\u05E7\u05F2\u05D8", 2, 1),
+        Among(u"\u05D9\u05E7\u05F2\u05D8", 9, 1),
+        Among(u"\u05DC\u05E2\u05DB", -1, 1),
+        Among(u"\u05E2\u05DC\u05E2\u05DB", 11, 1),
+        Among(u"\u05D9\u05D6\u05DE", -1, 1),
+        Among(u"\u05D9\u05DE", -1, 1),
+        Among(u"\u05E2\u05DE", -1, 1),
+        Among(u"\u05E2\u05E0\u05E2\u05DE", 15, 3),
+        Among(u"\u05D8\u05E2\u05E0\u05E2\u05DE", 16, 4),
+        Among(u"\u05E0", -1, 1),
+        Among(u"\u05E7\u05DC\u05D9\u05D1\u05E0", 18, 14),
+        Among(u"\u05E8\u05D9\u05D1\u05E0", 18, 15),
+        Among(u"\u05D8\u05E8\u05D9\u05D1\u05E0", 20, 12),
+        Among(u"\u05E9\u05E8\u05D9\u05D1\u05E0", 20, 7),
+        Among(u"\u05D4\u05F1\u05D1\u05E0", 18, 27),
+        Among(u"\u05E9\u05F0\u05D9\u05D2\u05E0", 18, 17),
+        Among(u"\u05D6\u05D5\u05E0\u05D2\u05E0", 18, 22),
+        Among(u"\u05E9\u05DC\u05D5\u05E0\u05D2\u05E0", 18, 25),
+        Among(u"\u05E6\u05F0\u05D5\u05E0\u05D2\u05E0", 18, 24),
+        Among(u"\u05D1\u05F1\u05D2\u05E0", 18, 26),
+        Among(u"\u05D1\u05D5\u05E0\u05D3\u05E0", 18, 20),
+        Among(u"\u05F0\u05D9\u05D6\u05E0", 18, 11),
+        Among(u"\u05D8\u05E0", 18, 4),
+        Among(u"GE\u05D1\u05D9\u05D8\u05E0", 31, 9),
+        Among(u"GE\u05DC\u05D9\u05D8\u05E0", 31, 13),
+        Among(u"GE\u05DE\u05D9\u05D8\u05E0", 31, 8),
+        Among(u"\u05E9\u05E0\u05D9\u05D8\u05E0", 31, 19),
+        Among(u"\u05E1\u05D8\u05E0", 31, 1),
+        Among(u"\u05D9\u05E1\u05D8\u05E0", 36, 1),
+        Among(u"\u05E2\u05D8\u05E0", 31, 1),
+        Among(u"GE\u05D1\u05D9\u05E1\u05E0", 18, 10),
+        Among(u"\u05E9\u05DE\u05D9\u05E1\u05E0", 18, 18),
+        Among(u"GE\u05E8\u05D9\u05E1\u05E0", 18, 16),
+        Among(u"\u05E2\u05E0", 18, 1),
+        Among(u"\u05D2\u05D0\u05E0\u05D2\u05E2\u05E0", 42, 5),
+        Among(u"\u05E2\u05DC\u05E2\u05E0", 42, 1),
+        Among(u"\u05E0\u05D5\u05DE\u05E2\u05E0", 42, 6),
+        Among(u"\u05D9\u05D6\u05DE\u05E2\u05E0", 42, 1),
+        Among(u"\u05E9\u05D8\u05D0\u05E0\u05E2\u05E0", 42, 29),
+        Among(u"\u05D8\u05E8\u05D5\u05E0\u05E7\u05E0", 18, 23),
+        Among(u"\u05E4\u05D0\u05E8\u05DC\u05F1\u05E8\u05E0", 18, 28),
+        Among(u"\u05E9\u05F0\u05F1\u05E8\u05E0", 18, 30),
+        Among(u"\u05F0\u05D5\u05D8\u05E9\u05E0", 18, 21),
+        Among(u"\u05D2\u05F2\u05E0", 18, 5),
+        Among(u"\u05E1", -1, 1),
+        Among(u"\u05D8\u05E1", 53, 4),
+        Among(u"\u05E2\u05D8\u05E1", 54, 1),
+        Among(u"\u05E0\u05E1", 53, 1),
+        Among(u"\u05D8\u05E0\u05E1", 56, 4),
+        Among(u"\u05E2\u05E0\u05E1", 56, 3),
+        Among(u"\u05E2\u05E1", 53, 1),
+        Among(u"\u05D9\u05E2\u05E1", 59, 2),
+        Among(u"\u05E2\u05DC\u05E2\u05E1", 59, 1),
+        Among(u"\u05E2\u05E8\u05E1", 53, 1),
+        Among(u"\u05E2\u05E0\u05E2\u05E8\u05E1", 62, 1),
+        Among(u"\u05E2", -1, 1),
+        Among(u"\u05D8\u05E2", 64, 4),
+        Among(u"\u05E1\u05D8\u05E2", 65, 1),
+        Among(u"\u05E2\u05D8\u05E2", 65, 1),
+        Among(u"\u05D9\u05E2", 64, -1),
+        Among(u"\u05E2\u05DC\u05E2", 64, 1),
+        Among(u"\u05E2\u05E0\u05E2", 64, 3),
+        Among(u"\u05D8\u05E2\u05E0\u05E2", 70, 4),
+        Among(u"\u05E2\u05E8", -1, 1),
+        Among(u"\u05D8\u05E2\u05E8", 72, 4),
+        Among(u"\u05E1\u05D8\u05E2\u05E8", 73, 1),
+        Among(u"\u05E2\u05D8\u05E2\u05E8", 73, 1),
+        Among(u"\u05E2\u05E0\u05E2\u05E8", 72, 3),
+        Among(u"\u05D8\u05E2\u05E0\u05E2\u05E8", 76, 4),
+        Among(u"\u05D5\u05EA", -1, 32)
+    ]
+
+    a_5 = [
+        Among(u"\u05D5\u05E0\u05D2", -1, 1),
+        Among(u"\u05E9\u05D0\u05E4\u05D8", -1, 1),
+        Among(u"\u05D4\u05F2\u05D8", -1, 1),
+        Among(u"\u05E7\u05F2\u05D8", -1, 1),
+        Among(u"\u05D9\u05E7\u05F2\u05D8", 3, 1),
+        Among(u"\u05DC", -1, 2)
+    ]
+
+    a_6 = [
+        Among(u"\u05D9\u05D2", -1, 1),
+        Among(u"\u05D9\u05E7", -1, 1),
+        Among(u"\u05D3\u05D9\u05E7", 1, 1),
+        Among(u"\u05E0\u05D3\u05D9\u05E7", 2, 1),
+        Among(u"\u05E2\u05E0\u05D3\u05D9\u05E7", 3, 1),
+        Among(u"\u05D1\u05DC\u05D9\u05E7", 1, -1),
+        Among(u"\u05D2\u05DC\u05D9\u05E7", 1, -1),
+        Among(u"\u05E0\u05D9\u05E7", 1, 1),
+        Among(u"\u05D9\u05E9", -1, 1)
+    ]
+
+
+class lab0(BaseException): pass
+
+
+class lab1(BaseException): pass
+
+
+class lab2(BaseException): pass
+
+
+class lab3(BaseException): pass
+
+
+class lab4(BaseException): pass
+
+
+class lab5(BaseException): pass
+
+
+class lab6(BaseException): pass
+
+
+class lab7(BaseException): pass
+
+
+class lab8(BaseException): pass
+
+
+class lab9(BaseException): pass
+
+
+class lab10(BaseException): pass
+
+
+class lab11(BaseException): pass
+
+
+class lab12(BaseException): pass
+
+
+class lab13(BaseException): pass
+
+
+class lab14(BaseException): pass
+
+
+class lab15(BaseException): pass
+
+
+class lab16(BaseException): pass
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/__init__.py
new file mode 100644
index 000000000..82762afc6
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/__init__.py
@@ -0,0 +1,276 @@
+"""Build Apple help books."""
+
+from __future__ import annotations
+
+import plistlib
+import shlex
+import subprocess
+from os import environ, path
+from pathlib import Path
+from subprocess import PIPE, STDOUT, CalledProcessError
+from typing import TYPE_CHECKING
+
+import sphinx
+from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.errors import SphinxError
+from sphinx.locale import get_translation
+from sphinx.util import logging
+from sphinx.util.fileutil import copy_asset, copy_asset_file
+from sphinx.util.matching import Matcher
+from sphinx.util.osutil import ensuredir, make_filename
+
+if TYPE_CHECKING:
+    from typing import Any
+
+    from sphinx.application import Sphinx
+
+if sphinx.version_info[:2] >= (6, 1):
+    from sphinx.util.display import SkipProgressMessage, progress_message
+else:
+    from sphinx.util import (  # type: ignore[no-redef]
+        SkipProgressMessage,
+        progress_message,
+    )
+
+__version__ = '2.0.0'
+__version_info__ = (2, 0, 0)
+
+package_dir = path.abspath(path.dirname(__file__))
+template_dir = path.join(package_dir, 'templates')
+
+__ = get_translation(__name__, 'console')
+logger = logging.getLogger(__name__)
+
+
+class AppleHelpIndexerFailed(SphinxError):
+    category = __('Help indexer failed')
+
+
+class AppleHelpCodeSigningFailed(SphinxError):
+    category = __('Code signing failed')
+
+
+class AppleHelpBuilder(StandaloneHTMLBuilder):
+    """
+    Builder that outputs an Apple help book.  Requires Mac OS X as it relies
+    on the ``hiutil`` command line tool.
+    """
+    name = 'applehelp'
+    epilog = __('The help book is in %(outdir)s.\n'
+                'Note that won\'t be able to view it unless you put it in '
+                '~/Library/Documentation/Help or install it in your application '
+                'bundle.')
+
+    # don't copy the reST source
+    copysource = False
+    supported_image_types = ['image/png', 'image/gif', 'image/jpeg',
+                             'image/tiff', 'image/jp2', 'image/svg+xml']
+
+    # don't add links
+    add_permalinks = False
+
+    # this is an embedded HTML format
+    embedded = True
+
+    # don't generate the search index or include the search page
+    search = False
+
+    def init(self) -> None:
+        super().init()
+        # the output files for HTML help must be .html only
+        self.out_suffix = '.html'
+        self.link_suffix = '.html'
+
+        if self.config.applehelp_bundle_id is None:
+            msg = __('You must set applehelp_bundle_id '
+                     'before building Apple Help output')
+            raise SphinxError(msg)
+
+        self.bundle_path = path.join(self.outdir, self.config.applehelp_bundle_name + '.help')
+        self.outdir = type(self.outdir)(Path(
+            self.bundle_path,
+            'Contents',
+            'Resources',
+            self.config.applehelp_locale + '.lproj',
+        ))
+
+    def handle_finish(self) -> None:
+        super().handle_finish()
+
+        self.finish_tasks.add_task(self.copy_localized_files)
+        self.finish_tasks.add_task(self.build_helpbook)
+
+    @progress_message(__('copying localized files'))
+    def copy_localized_files(self) -> None:
+        source_dir = path.join(self.confdir, self.config.applehelp_locale + '.lproj')
+        target_dir = self.outdir
+
+        if path.isdir(source_dir):
+            excluded = Matcher(self.config.exclude_patterns + ['**/.*'])
+            copy_asset(source_dir, target_dir, excluded,
+                       context=self.globalcontext, renderer=self.templates)
+
+    def build_helpbook(self) -> None:
+        contents_dir = path.join(self.bundle_path, 'Contents')
+        resources_dir = path.join(contents_dir, 'Resources')
+        language_dir = path.join(resources_dir,
+                                 self.config.applehelp_locale + '.lproj')
+        ensuredir(language_dir)
+
+        self.build_info_plist(contents_dir)
+        self.copy_applehelp_icon(resources_dir)
+        self.build_access_page(language_dir)
+        self.build_helpindex(language_dir)
+
+        if self.config.applehelp_codesign_identity:
+            self.do_codesign()
+
+    @progress_message(__('writing Info.plist'))
+    def build_info_plist(self, contents_dir: str) -> None:
+        """Construct the Info.plist file."""
+        info_plist = {
+            'CFBundleDevelopmentRegion': self.config.applehelp_dev_region,
+            'CFBundleIdentifier': self.config.applehelp_bundle_id,
+            'CFBundleInfoDictionaryVersion': '6.0',
+            'CFBundlePackageType': 'BNDL',
+            'CFBundleShortVersionString': self.config.release,
+            'CFBundleSignature': 'hbwr',
+            'CFBundleVersion': self.config.applehelp_bundle_version,
+            'HPDBookAccessPath': '_access.html',
+            'HPDBookIndexPath': 'search.helpindex',
+            'HPDBookTitle': self.config.applehelp_title,
+            'HPDBookType': '3',
+            'HPDBookUsesExternalViewer': False,
+        }
+
+        if self.config.applehelp_icon is not None:
+            info_plist['HPDBookIconPath'] = path.basename(self.config.applehelp_icon)
+
+        if self.config.applehelp_kb_url is not None:
+            info_plist['HPDBookKBProduct'] = self.config.applehelp_kb_product
+            info_plist['HPDBookKBURL'] = self.config.applehelp_kb_url
+
+        if self.config.applehelp_remote_url is not None:
+            info_plist['HPDBookRemoteURL'] = self.config.applehelp_remote_url
+
+        with open(path.join(contents_dir, 'Info.plist'), 'wb') as f:
+            plistlib.dump(info_plist, f)
+
+    def copy_applehelp_icon(self, resources_dir: str) -> None:
+        """Copy the icon, if one is supplied."""
+        if self.config.applehelp_icon:
+
+            try:
+                with progress_message(__('copying icon... ')):
+                    applehelp_icon = path.join(self.srcdir, self.config.applehelp_icon)
+                    copy_asset_file(applehelp_icon, resources_dir)
+            except Exception as err:
+                logger.warning(__('cannot copy icon file %r: %s'), applehelp_icon, err)
+
+    @progress_message(__('building access page'))
+    def build_access_page(self, language_dir: str) -> None:
+        """Build the access page."""
+        context = {
+            'toc': self.config.master_doc + self.out_suffix,
+            'title': self.config.applehelp_title,
+        }
+        copy_asset_file(path.join(template_dir, '_access.html_t'), language_dir, context)
+
+    @progress_message(__('generating help index'))
+    def build_helpindex(self, language_dir: str) -> None:
+        """Generate the help index."""
+        args = [
+            self.config.applehelp_indexer_path,
+            '-Cf',
+            path.join(language_dir, 'search.helpindex'),
+            language_dir,
+        ]
+
+        if self.config.applehelp_index_anchors is not None:
+            args.append('-a')
+
+        if self.config.applehelp_min_term_length is not None:
+            args += ['-m', f'{self.config.applehelp_min_term_length}']
+
+        if self.config.applehelp_stopwords is not None:
+            args += ['-s', self.config.applehelp_stopwords]
+
+        if self.config.applehelp_locale is not None:
+            args += ['-l', self.config.applehelp_locale]
+
+        if self.config.applehelp_disable_external_tools:
+            raise SkipProgressMessage(__('you will need to index this help book with:\n  %s'),
+                                      ' '.join([shlex.quote(arg) for arg in args]))
+        else:
+            try:
+                subprocess.run(args, stdout=PIPE, stderr=STDOUT, check=True)
+            except OSError as err:
+                msg = __('Command not found: %s') % args[0]
+                raise AppleHelpIndexerFailed(msg) from err
+            except CalledProcessError as err:
+                raise AppleHelpIndexerFailed(err.stdout) from err
+
+    @progress_message(__('signing help book'))
+    def do_codesign(self) -> None:
+        """If we've been asked to, sign the bundle."""
+        args = [
+            self.config.applehelp_codesign_path,
+            '-s', self.config.applehelp_codesign_identity,
+            '-f',
+        ]
+
+        args += self.config.applehelp_codesign_flags
+
+        args.append(self.bundle_path)
+
+        if self.config.applehelp_disable_external_tools:
+            raise SkipProgressMessage(__('you will need to sign this help book with:\n  %s'),
+                                      ' '.join([shlex.quote(arg) for arg in args]))
+        else:
+            try:
+                subprocess.run(args, stdout=PIPE, stderr=STDOUT, check=True)
+            except OSError as err:
+                msg = __('Command not found: %s') % args[0]
+                raise AppleHelpCodeSigningFailed(msg) from err
+            except CalledProcessError as err:
+                raise AppleHelpCodeSigningFailed(err.stdout) from err
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+    app.require_sphinx('5.0')
+    app.setup_extension('sphinx.builders.html')
+    app.add_builder(AppleHelpBuilder)
+    app.add_message_catalog(__name__, path.join(package_dir, 'locales'))
+
+    app.add_config_value('applehelp_bundle_name',
+                         lambda self: make_filename(self.project), 'applehelp')
+    app.add_config_value('applehelp_bundle_id', None, 'applehelp', [str])
+    app.add_config_value('applehelp_dev_region', 'en-us', 'applehelp')
+    app.add_config_value('applehelp_bundle_version', '1', 'applehelp')
+    app.add_config_value('applehelp_icon', None, 'applehelp', [str])
+    app.add_config_value('applehelp_kb_product',
+                         lambda self: f'{make_filename(self.project)}-{self.release}',
+                         'applehelp')
+    app.add_config_value('applehelp_kb_url', None, 'applehelp', [str])
+    app.add_config_value('applehelp_remote_url', None, 'applehelp', [str])
+    app.add_config_value('applehelp_index_anchors', False, 'applehelp', [str])
+    app.add_config_value('applehelp_min_term_length', None, 'applehelp', [str])
+    app.add_config_value('applehelp_stopwords',
+                         lambda self: self.language or 'en', 'applehelp')
+    app.add_config_value('applehelp_locale', lambda self: self.language or 'en', 'applehelp')
+    app.add_config_value('applehelp_title', lambda self: self.project + ' Help', 'applehelp')
+    app.add_config_value('applehelp_codesign_identity',
+                         lambda self: environ.get('CODE_SIGN_IDENTITY', None),
+                         'applehelp')
+    app.add_config_value('applehelp_codesign_flags',
+                         lambda self: shlex.split(environ.get('OTHER_CODE_SIGN_FLAGS', '')),
+                         'applehelp')
+    app.add_config_value('applehelp_indexer_path', '/usr/bin/hiutil', 'applehelp')
+    app.add_config_value('applehelp_codesign_path', '/usr/bin/codesign', 'applehelp')
+    app.add_config_value('applehelp_disable_external_tools', False, 'applehelp')
+
+    return {
+        'version': __version__,
+        'parallel_read_safe': True,
+        'parallel_write_safe': True,
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b3830191a832dd65c4bf9f34abc777e4ba227a3b
GIT binary patch
literal 16186
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%0DP
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
OQ6zUyGB(f(AN&_zgyZD^

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/.tx/config b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/.tx/config
new file mode 100644
index 000000000..c9860d6c1
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/.tx/config
@@ -0,0 +1,10 @@
+[main]
+host = https://www.transifex.com
+
+[sphinx-1.sphinxcontrib-applehelp-pot]
+file_filter = /LC_MESSAGES/sphinxcontrib.applehelp.po
+minimum_perc = 0
+source_file = sphinxcontrib.applehelp.pot
+source_lang = en
+type = PO
+
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ar/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ar/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..24bf46f09820f70009a7b527c8b50d52fbaa16aa
GIT binary patch
literal 1881
zcmeH{&5j#I5XT3?hhzl-0h9|Ug~W!eP|t^#b>c}Juy-9;VTaYmMB=pSnQ7Y%d;{}i@G4k=-v3ANP4EeL
z1^fk!!Qa3L{2P1^?+2IKxTBX_zlWgDqXd22AHWfK?Ugoe2KxNhppW|)^l^U%ecWF`
zANP0A$NdxZasL5*-0fHKv!@F|RxXrO3z~CTiUMn^6;}l*?P#uRRiw0KgU>}-kyM2^
z5$04mTMAnG^-Sw;Nm|%x>xQmfA$O_j8girRkH6P0Y`OLKu(95#$1sGxzL2Z=UA)nyP#Pi(eS@DGka;|)Ba$Rjm
z=33Dlb)zlQ)XA^CS&b--T2yYBVn;Zq6obCip6)q2Za#>BiEz%BE4YUav#vca?K-66Sgp
zwP$CA&LamG8}0OZyZwlpXuES*)`pkto;E9+lB$}i9rSKfI~=INAf`_!CRhi91jD2q
zb}{Vw;Z_pIcLzIk{dzmTGf2G0&bci~E*SfL7(a$_w=+GMj?Y_!R&@5zAbc=vwyAJf
zCr(^cm0YUZlrOo#moTW^oZULt`Gd}dVPlnR{}rTkE0eDCS^M`C=;kJ+5zj, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Arabic (https://www.transifex.com/sphinx-doc/teams/36659/ar/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ar\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/bn/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/bn/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..da2e29e5a09ea895ee58b5942f947a62af1c43b6
GIT binary patch
literal 1799
zcmeH{L2ukd6vtf%99E!~0zyI@UZqA&gvRy;HEmpi$R=Be*ey}AAaRPu_S@Z|-Wh9V
z+|6=8>aF*}wMWi;haM4UZhQbv9QXkI$8OT1N_>K@Wc~Kd{O7$l{~7zwt7|_;_+7^H
z5uTqy@WSt{OHuSL;FzfL9Qof**i27}h@m-vOV1
zSHWMw6nqLM;6LDR$aVeouI}G!-MY0my7)sd)Q!Ob_&XTtUU{>tyAFoB12EJ*0YlyU
zV5s{L40Ruaq3$nWsQU*P?VFOxshL)KMpLOOE-|)PNL`XPo~EYJWk%~R`jV@flrH&<
z?YVL?XPSrc+?e~M9Oh|#!!*8BcGJbZd&V>Qx%9L&`i7^RN#+%X3_Vc1B;~2m6+1^O
z(@@>`FoGOECL@(wX;;aCDVhaqFTFB4X?rjh66a-AJyTp#7gMq*LZ7vqaa2ehyeUk*B2^eo
zQ}{;fw)H8DhFoDHj$?|>2P#v@O8vlPD|gY1HCr?cZR=s{ZFGJX?NG2aT3XeL4)xT;
z*rfAOaBHbxfM%qFo9$XSjU%{N2!)?#Jqm~S(t=RtfAmMze9wg!ho$(It%LU&xq7bj
z8FuBZ%0=+IwUhdB8mGNuu8s9#>}IMIgJ$N$#AGxa?;Val-#a)s9-f@^j=r9Vear13
zi3905qph^RBhtRuN~yn{-Q4*&-APjj#W6onq3+AN^j51&p&Lo(#l%YOD(MaUzx&N-
zMECZ_L;CbTr9XpI&l((FM!CKS#DwJ{qXFv~j)peo-q$WmlI3z4`;b;m`7AEXBI!0S
zN>d~rYh3cl_V&%4B-hDi@2G05ti)Yo7cL`Rx1rnJxn$d$8m)Og^GRJvrSDKNmlpSSxA9YP`?)T3HDxP?x-j9+W^_AOzV}6UnHb)$
aupyaqMO*PUD!h8dU%lcNpXe7p3I75j*&smx

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/bn/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/bn/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..6b8025b03
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/bn/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Bengali (https://www.transifex.com/sphinx-doc/teams/36659/bn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: bn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ca/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ca/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..2a6075f779fcde78d8f5d265abb84226cbe36985
GIT binary patch
literal 1799
zcmeH{L2ukd7=}#=J*+^K7E}pw_$m>R2#xIxO4_&tkxjM`vD-$;wi2gk*8X;PTJMZC
zGwxhdf+9DPr$2S1%~y%f**lT
zz{}ttU<&>TCg6YIU#Ru@yRGlPEA6_K_uBENVDOE>9{4vHd@o&WeOJNY+XI8|F&KOw
zfWh|{F!=rk2H)So;QJJe_DsR#)Kn`yrHND}7nqyRr7lPtPZLw?BBNCoea~e@N*8>}
z_DngNG0npK*q8^T9PZQVnyG!E?7E9Pw~c4=GwEqz^cSASOmbXe%Fsi_3sRnHU9xku
zG&NPV4>PFob23n4EA2AbH+em0?WI>nCruB=LgKtE%jasWwIr*mRCyz#F?udJj($YZ
zdF?zo_Kko;vnTEC6IGy}iLng5DvJ=nE{ZUv43~iHPlWlai7tK_NHCkBJhz|6`
z#CS;Oqmb4@App%NhcuhDNE%ykz7PsO%Q_S`@3jTN<_-EoYwmOI#X%wNv31BkBUjCo
zKE+dctHvVa-NZ@VIE~ZJ5m&}~F?3T^h+aK)Vq`Mv4|fj+-|p`3AN7xqJBN2hV$X83
zNn&4m&S)d;Zi}=lHd5+tWt-byrrT)>p*Z4)D)_#xORqP&6uNFC?9lhm{}^S*Lfk}MXB*oU%e!l!X==1KeT
zqA+>lvBo7|ZEbCCC%H`4JBMX$WhrhMJ9ioBsu{YSjhoc|-C5IgZHKz+o#DZ-{~}NX
z*V#jyINoBktk9b0Q=e3&RQe|6Gih;dcWOToH(uyMR};3PuX7X5Y(_W6%6GnN4-+H%
bWkx+Y=8`tzEjYY=#oxZ-=bz}8J_-K=, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Catalan (https://www.transifex.com/sphinx-doc/teams/36659/ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cak/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cak/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..07e66440cad16a5cbda7590a5d1e826fd2f855f6
GIT binary patch
literal 1761
zcmeH{&2AJ&6oorLP&6V+fJE7_xRGK73sra9kqvGjihqX0Vg`^IB1J5$n(jL@757v%
zRn?3qi-;u;kZjpS*}^lh%R~49y!Jkv>c$3y#1k-5>r+*oy65((>N&V@=I;o_!THlwRJYYFEQQ)zX2;S?0*WL2cLl#
zz~^8Jz62BS2>b`NzB}Fe{&%L`cL0Vyj=(LmN6KNH7A~9G7s@WWxO2yNCO?s$W=4PSX~-mpC8i8LRy-r+sn#VsM{`qC
zRr@f58h<7|HMG*slP#0iQ`TO3WpvW?U@Rog%d&i}#$HRZs!EkNG8&@ilH=$%6rI-2
zlVjfqI5fN4F7K)W{fvxd=v7&S0M=22sdcG6`iV}KWS)mUD>>#UmpWvVn`%xfH=0Js
zjTUT^QXc*ci!zSD4_$->K5NkBEsu6ALk%{q=
z&PO4wnL+@XQ4VP~dyzDb;AA5dev)-49Nv2yg3Sl?_pJGyb1$|F@he-0>@#xJMCpCJ
zmA7grLf%cBv=pat+S%dCSTFi+tO~JFkDVBpjJo~x?cPu8TU$Hb`}aHd?heGJ<>rvY
zmh_y_a=Nr8(j~E+($Z?SvUVk1OH&BN4nJ1G_kCS@wb7-}^`!G+V5N4Y^alCgdeH09
zo%Mc~ZoFgtBcys<, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Kaqchikel (https://www.transifex.com/sphinx-doc/teams/36659/cak/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: cak\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cs/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cs/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..d84853d1b1d9607620f6b6cec278e0cb425683e1
GIT binary patch
literal 1877
zcmeH{&uJLSz`5&A7@)X-5-XsVt!-8~h}SlBCMS
zzAy*MQ7$O=<72HKk+hhnrDa{YOqvxNw(e>t$mQJ8T&wRKjRo;>fgw$grI?d+RH;H(
zOAB35Svfy~HGYoyq*oZ@Nf^DOyP1Swa(HmNQb
zBvY+ug1XU?sq5rN{aSt^3_}VI1`3_>LOu~$Ew{l`C}EH=v~>;Z+6D)`sE2%6gSnBl
zXj@Hmh)r4-_-f513ZMj*Lp5t(R2nTfbcDj?NsD~*jyU)*AJFd@{ZOQiZD;I(Fc!5>
z$dvB>%jKjFKD@tt~8``PNSg)E|Hqr_8ha202TN_(jyZw9jT01|F
z*rpM6lh_t_BB4&)USn~abz*9-CRf+KkJsWDLbfX&OCR^BF1}XlV(13kIyN#~*@8Qb
z`rp1k7|`8~VV`dPFZ4R3YFeRr38nVXU?ah232ia9yYqXx_WgjN^P{#+9@i-3wB$ZnN3KQwQ0LoZcy{tT~^fXQkyPaBAgC<
zz=~Js2Z|{nOs;pS(@fs%(v_pKcCGS`7vMN~t|E@h~Lu(Vw!C_&eMTw0%
zvG1a?;8NY7H0K7Vpj){KyZ%n+cR3M;^;N3<2}tPrSi07a&0kZXlZ%9Ud@Ks;gsX_~
Q@xu6cVH{rg?_Dte0ZS|{mjD0&

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cs/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cs/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..f29cc14b9
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cs/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Czech (https://www.transifex.com/sphinx-doc/teams/36659/cs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: cs\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cy/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cy/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..d3a47cfe5ff81ab54eb3d467049bbfbc31aec455
GIT binary patch
literal 1842
zcmeH{PmUW!6vmtIPqIKj2x0+?7l{coLe<@N$YiDm1LGM7M%ZCAF+^F7%H7X)LA$C|
zRUMC6WX%D9Wlq3?6R_a~Tz~_xMu;U}b!R3)kvKtGYXACGef8d}uiE{`fQqf;6GrfyZ2IC_ZSRymtd&-01S11
z0z=)O!BF>CFx34W40SKPjGqHjFgZ2XO3!H~Rmla$mP@G%(#F%w)Vj!M!$qHSS&`BO
zpRqkxP8LjyFg`WrTT%}5w6SSwUnslf;?8a3nfyX}S{ePmrzw-1mKZX0U-62Rr&^cn
z9IZ`FRqewFay&>zYHFojCx<4lm#n??%IKu&!B|L~mu2}#jkT6!Rh24lWHd$3CCAY{
zBwg0dlVjfqI5d0OPM@j*{mhJI=v7$+1NM=GsjX6b^b=i7$vh8zR&vf!E_LuGH`SU{
zZZyr{8*SLer!X3Fg^4(hDLNl0O)g9I9T$z3A6xSc=UyBY;%l}J-e=^h
zh0f9{ma$8hk*=E1^*`LB_OZXI`~B_~eL^W^6oOs|
zx=lb=`?N#Xu8|H;-A2~K%=OOrXgqxEJv{Clz%tahY{gLLCcNGm?M#*LeAd2qjAL47G>}s+sTXgf!n3czv#-I$*ZhgE$G@^$
BD7pXu

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cy/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cy/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..2e6deef33
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/cy/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Welsh (https://www.transifex.com/sphinx-doc/teams/36659/cy/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: cy\n"
+"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/da/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/da/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..4ad17c32517ee20977313291e2bdcfb794392498
GIT binary patch
literal 1798
zcmeH{L66%+7={fk93oJmfDjUguTod+3XSb7>bC2$h-8ztE0VI>1|&|aiTx#+;>=hx
z<7UGFapa8XwYT2+58M#v9{U4&>7_rQ@7UdKQ6+vsBUw*o{Lc4&erN2*7ti01@VkKP
zb6kIh!7IP_-io4+Fn%BW1ibWOd=-3v@poV!d;)$9inrT3eeeT}kHJsD3JmLi2R{TK
zfEU5Pz!dx&Ou%R0Kd5#2T`V-wW@yzL&w^+XI8|5g2^$
zg2DGUF!=rf2H%HZ@O=bE`=(%WYOa-@(@d(83(PH-QWvC+r~VYhSQY4JW-LRm$|3~NLlLIdrS|A2I=dzFJoH(~IY+tFA)DM(Yf`z<
zG(&E*VVj)7Y^W7(#Bof~=|pLAS*l;SXyh)Mvu2Bip=~m3vW-snqL~V@Mk}it(Se?s
z7!T=u6w+EL1fUt^kY=+MNn;Dn7DC|{S%<>ry|y6O{Ez<7n!B8PaZrdK**avOk*gL;
zpWvyyRZ|i2ZsMeFoW^PAh$~~g7`wSDM8BRpF)28`rD317^3cj!F(yNUwg>EFB7ZWSBE2THc|Hcoa
z5#8>MhxGM-tiOR&&ueU6Muj{ZhzZMOMgyspThQjh`^sfWvRbWTAF8SupTxOYChfC}
z!sLm^5|@0nvvXxPDP*$MIV@`{OL4>4rOQZH&Cu;_U#Ir(-lnEYd(_?Pj1R`cmw6($
z&OXw_=@yf9h0Z*m_@pYO($^_pNQ+~;SNoZ`_EHzRnz0o_ottoEGrBfazH_rZON{8(
a8TI9qOWKZi;PB=RfAfZ)eW73ZB0L9Q`X9jn

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/da/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/da/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..2c86efec1
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/da/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Danish (https://www.transifex.com/sphinx-doc/teams/36659/da/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: da\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/de/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/de/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..3d8b520db21566a8b03747d60957971271ed253b
GIT binary patch
literal 1798
zcmeH{L66f$7=}%uJwzZ{+N!F=;X`7@uBx$}tyoyYR!w#TT{WSrB_MHHP3$kpP-n)P
z8Iw&96-Umfy>jcl|AAZ8bC3N2z4X!_(06Qhp+f2}Ad>ZD#_xRZ=Xb{b^U}GWBm6Gn
zx{T|mFnHs4{!A2ojPV8VQ}D{G@eS|=#@~W{@GtNaP`uaH>4P6)d<1?5R$y5F4EzXu
z0bT-s1yk@Pn1KI)zoFLEv#syn=h}5=-*3mCgTYsTeeicM_+I>=^}PxP-yRrz55eI3
z7!1Bo!QlHG48FgB!S@d^+BF4}Q!}mfjHXhRTwrdokh&mkJWWlli;UJ>^bMC4DP8a}
z+Y{w@&NL766Jx$7<#3hxo13+pG!|mqpx|IFv&@YDML>bFG+c-b;-`r
z%G6ZVKFpxTkI7I?thB3S&*b%jwU=HQoisfd3yJfxEMKXy){?BMQss?|Cg{23IC_Ml
zi`sc|>>B}xW{=w2N2)+SQ)3x=RTd$D9*QuvF11HL(djLj=b_I^&N#}Y4%y_UT9L|)
zrYUlxHQVGAW<#xTBaUN=P9{o|%ToQoMI(37j5S*{3~iHPlWlae7tK_NHCkHLi1zi=
z#CS;Oqmb58App%NhcuhDNE%ykx)2IK&pH$~@2v&F=701D);#9ii~T}8Wb2T9My{GG
zeT=8_R!v06yNQ#!aT=$cL#~YVV&rD35dC`Q#Mops81?ptU-$O*4hQ$|cMiTAi(Sjj
zCW$@iIitrRyk+jb)
z3X>-uOI-5h*4Fjyq~K(ub5Pb+mg0`F3zw0unxWg-yhZKbopnuDcBs428SRe-uk%E1
zon54f(=EoU3Y~dA_DNMrrEgI_mlnr%r}k5E^R+H?HDxOXIyd3SW^{9+eCKX^mKf2m
aGV03-m$Vsg!QtH-{_YJw{X)O-Mfewg, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: German (https://www.transifex.com/sphinx-doc/teams/36659/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/el/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/el/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..98baa5f180d8c63eae2ff8ca5427b61d7274408a
GIT binary patch
literal 1797
zcmeH{PjB2r7{*O099H}-MR4HoRuGX0#`Xp^ZCrwyO|~UsQ$o5R^%Tw8@9qwrov~)d
z-7E*Vaz%n`PkaEr11H3pD<6OZCq4kr*iBkgiBHg#tl!S~nfH19%-DZky7*Iq->bOZ
z!S!PtJn?(!xg>c5L*d7=1qk2jK5u^nK;U&i7p~`rZVi?-yY7
zRbce}4vfA(fYJA7F#7%hCVRGG@@i(3nbA}#%@yVr3u!7cHqg{IrYdO7C!eyeNtudI
z*_|oJbEbKmpICdJl*fHqTenT9l-uxW?~V;jVJ-tLt$9Dtgh@^`rYt>Byd)KqyqMR%I)r33}F?CihTu
z(fB}~Lo49e>`8a~L{;c#Y8^wbbQJ^GMG>aXr3vUKIlm>#GWJ=^87HMQF`LrXD^jI3
zG(~Q-=GvU%Y^)V;q-jdY*@U*G)ao0qTDebVY}lb;Xxj|iY?HISXs2SV$PKIH<%|>^!nB$k%ga
zPVrR1sfmbrw{cQG&C|Sh%(Znv9Qv86#GsjZF}4K_4|fknH+T23C?2(>S=Y`I*fAr@6rK21xz$ht=t
zl`XS?6+ZiDYwPNE#yZ>R9qGnNEpA!2@CBK=9r~Tk8`S;XSvPcLhx!}6!-K=&<2Vsp
zZx3POaEtM(Mq`0bLso04%nd5%(&5zZG+`>PKi0*rrtHMfls2B&g04?g=-uv)5+nIl
aK?6BqO`GW!9G<=4&tCBJ5A+isgnt3}z#m}%

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/el/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/el/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..5b5733786
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/el/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Greek (https://www.transifex.com/sphinx-doc/teams/36659/el/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: el\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/eo/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/eo/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..53dcde180e57835bed62d8f55b70d6bc55a3feb7
GIT binary patch
literal 1801
zcmeH{L2uMX7=}%u99FGp)1qEDd`OK*RE_NoA`nBWX0uBhb(cnALFy@*wZGk+);nX(
zjM*#)E?oElaOKRg|Dorq=U(~)daU{b`i@Nk6;gizD_PIZ_?_?l{La{au3dN$;dcqw
z6G0>k=e;HThA
za1HzgOu=8l1pEj54Yj^J-}?T2p{`(W^W00!R$
z7<`|C!S@9id|!dV_YW}IHwBYZGp+QDrc#w$U~aLHx*%;lO--$fjMiQB9hVg;UGNFp
zQ{{NhG!OF=V}2&(aG%yUOzjJ0H(lJhXFQXiOHWIquX&m<$w`SRLyr_MNqMSu$yUj$u9_=-
zf~WFUO+?7MiIci<8mFBju8j3!QhI~@?>-m~
z>E7OGKzIIQ{WYX|R%7!rVskbSW0nha=_>4mMvfbE?<-ut6Xw@d;7*t!Y0}59G10}rMPSC!eykZX6SaeZd3brcSFD!dgrNznJt^HKodZP, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Esperanto (https://www.transifex.com/sphinx-doc/teams/36659/eo/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: eo\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/es/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/es/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..6b98074a2e64b8191a8bf0a64905a14fedab082e
GIT binary patch
literal 1825
zcmeH{L2D#M6vta#1qT;(b&&-RZ_!}FTHQTaHrezN*i163!9+tcEUcGM)BR?;w5O`6
zs?KCQcoX~pdJ^^KM_#Rk;;r#dD
z+u&pH8u&Aqf=|H&{1f~YxjuZQtNYiLD7u08>#ug}55Q1&9UOqqz)<(bYf*FyjKPri
zOEA=(fuZhqV5s}k+5QtS)cpkvb^idPZBsBgHPuQ_X(Cm{1!A+A)CFndX<`~(WVGa>
zPr0f|>4Hz$o-0QsQyJo8W4kA9)%x$#I2{p%cY(
zQl1)Jv2(OA4b_bg5#;zb*;8XH?IPJRc{5|}rB_BLZ4bsm;=HV?Gd0dyl676Fyp_=y
zJy#q@kC1fMI8Tm!E8x)VakqV}3iLBEmZ4Ww5e(Qu5~i+7WPW*C!LRiTXO{iG$S3{Y|p}JT*1XbD14dqC|uqP2SS;D(H~gz73W^;7UCgW
z2k$d-b*c0z{*||CEP~&yoz#!hIPD#BZLAmjZmJ3~Xr@k#Oh&`~t=+x*TRS_4!=t0#
z!51U3ZMnT9u_HZaw3_xeMA{dtDfQQ~I~%vsjWmT&9P)_@bzjt_>#Z(@ZcjQdMpkN9
zNpIl)u$W6*&_j5`Q|ZJ(Q%$8+`s20`^m^Lh1~X!Ju@EDcvy6^vsg)~fx%9qvS(41>
z^Vo;nYQm>+Ze~g6fGA9!c${&`?X|T#8wtB)rFT#@R#xJHu``#EuG^*CT)ju#&&_2`
zH#e!j(%awNA3k>#?)A3eDV}jLTGVLG^QlkjN-BMi@={tnyqk@mh`Y~qp{og7G1R#U
z4{k7FRY1uQZe$T3&68n2, 2019.
+# 
+# Translators:
+# Edward Villegas-Pulgarin, 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Last-Translator: Edward Villegas-Pulgarin, 2019\n"
+"Language-Team: Spanish (https://www.transifex.com/sphinx-doc/teams/36659/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr "copiando ícono..."
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr "no se puede copiar archivo de ícono %r: %s"
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr "Comando no encontrado: %s"
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/et/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/et/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..2e10c82d782dddccda37d1e8d20427da827ae4ec
GIT binary patch
literal 1827
zcmeH{L2nyH6vr1R94soJfXacxDT)6R{-6XA4#Jv)htlz%b|GfA7pLzcM+LiAjd|tu#
zZG68C!4sdCpNpc`5nl!01aF+jcfd!8AAo)E5AY38Jm2Q&gRde!0k4A<81{byz6L%5
zuYo^-DR>4Z;9uac$o1|EZQZ}Gw0W<-*v9XGp>7ZCgTH~H?prTK(M?c*q0U1v)HUbv
z*I=moJs9f#2!^`9fT8Z6V6<%tCa1<)=`oF@D!IVgY$kO<+ISk7S{E6uxabouD^j}P
z1=|bdV8S#B>qBFvq#WMU%Brb-q3oKAJD(cQ~hF02TvSadk#@b7-j82*!jD^H`S(fK&?6oATs#JL+qak`OIgTD8
z>8y619Q#JVq1lu6^@%Fb&&XJYUX?{KU<*l@+A6h2KhfnYndhO;N{%_or4HWYrdpE9
zjiwQNqZQlu6jnp7@FI?5iY^vPlgm(`Gz@LyVdHIdaTd)|ur-=n)rj`=
z$i(=O&PTzmxq<2A6oMT=U(g;;&ZkR-e=^h
ziP8)FDsR=)c`_g$auu{8HdISIW
zPNk*enJICJJ}}d|ypN}P5i@`Iep3ru^ti?$X2kw75CfJobnCp)N@`l2cwf0JN#^r;
z>_dJv;zgXBS<<>73X>-un_P0M*So!uuus-Hhh=SLDLyiG<}%V%6S~dyd(=K|u4=lm
zN!_*1!QR2{V`t%DXB)oao{Pb8*|D%p+d~(#))Zj{lKSqTC
kr^;Z^PtSf, 2019.
+# 
+# Translators:
+# Ivar Smolin , 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Last-Translator: Ivar Smolin , 2019\n"
+"Language-Team: Estonian (https://www.transifex.com/sphinx-doc/teams/36659/et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr "ikooni kopeerimine..."
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr "ikoonifaili %r pole võimalik kopeerida: %s"
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr "Käsku ei leitud: %s"
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/eu/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/eu/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..dd8b60e33e797d89858248c238bbcb0ed9ab184c
GIT binary patch
literal 1798
zcmeH{L5~zg6vrC@4-*ZF8e`(&k+5Mmrn-C9u&@nloY@_8;|y+=frQhhru)rIVNX?4
zRn6>pARIXxy>j!;ckpIBd-MZ%@!|*IU)}72A@LJ1N#{4O>R<1@`d4-Tb@ALU5q=l&
ze2(Ym5WMz#?@SbZg!p~%6Y$c@_!{^O@poV!{2Tlj6z{Zo`rrqMkHAmC3JmL?f**p<
zz>DB>Fa>`D6YyW~cjUT!wypcmxpv*z^KJYY80reJ5B>p$x)s|&!-5wa~9)h9n
z12EKm0*1OjfuZiNV5s{i810&Z$*GxEdPY;JN-i+ASV&!vHlC)Y)@KPRjRy^(F8r097p$&
zbWuA`j(sEG(Ckq=eWVKXGc}f>S7i|l=phMHTc!5sCpw*yc^>+#flXosuii+
zXqv(|TC0|85TQw2E@5WB*#%Y{(4!JVci;eHlEOsq7
zha~o-=ZrSf?zTv~Vl$=gR(5s!i*!3pAry!FNQJs@>e6eCE`@F=ofl&(wJW7J@c-7`
z;gD|kMgzL}pVD7Js%JG0FC(r`12JZ~$fz&f!lvBV``Zf#xNPPk4sItOKKWhrhMyKoulstMiB<_&89?yPINv_svE&S-x$c;zR2
z>+Hf!+-@;mRp`v~u}`W}Dt&|UxwN>pJGGyR>#ua7t0`MC(76d$Hlynk, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Basque (https://www.transifex.com/sphinx-doc/teams/36659/eu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: eu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fa/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fa/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..a508f217c29a95ca6607bbf8c6e023df8e9f3260
GIT binary patch
literal 1798
zcmeH{L2ukd6vquM99E!0DMCmb9#SI`p|QO|O&ga~-A%SMVz)%;g49zqYd`N!@y=K?
z<8HPG#E~6}kKLq2mG}f*$@=Y^`OkZA{xkMpmoNSt;dcqo
zM|ge;!3)2)UW=ml5Wfw+4}SbCz79S?{3SR9{|2vs;`J`i5PS#m3HSk6gJJy-;Je@x
z@G|%-n1a873HT5AJ91sU(A9l$$G#PCX!fL=K2ZhwDUD_5RaFE721vrxRcSo>iO#2Fo`*hbIp-*sI(U=V7@!&H;AXoPPU8s97ee6|S&zcuy|f^d`5*m}H4i!W;;<0kuyyc0BUdk!
zKEhmtJpmDRg7$yqH?4T_wGN|98F~
zkLliEGNRA_Q~DO9dfwphGThzsKulRKGdc=el$tgd-q$WmlGSPz`;bZFwnRJ^M
zg~=0-H7@yVXXn~(Qp#kjcT_c2R^pDaOP7(Z+tBT8-=yyE-lnEo)Zgk&4kx4Me!{oj
zKHS9Z7SnZ&&OD#`q^_jWHz{98i)*{r_)^?>t_w|-Y{f|DCS2K!Zp@VLebL<|hV|==
ZhH}OgZO1#P@aheJ^@g8+p, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Persian (https://www.transifex.com/sphinx-doc/teams/36659/fa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: fa\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fi/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fi/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..7065e15541d20b5e5ca4295302a08b8fce82f6e6
GIT binary patch
literal 1799
zcmeH{PjB2r7{*-)99E!~0zyI@-b#&{2#xIxYTCF2kxjM`v0I{KLE;q6+OKzqdS|Se
zaW~5Wskhz>*B&|Z9ePBZx$yxwao_{+jNPO~mG}f*$@=X(e%?QRX6!$&uKgV0cNy15
zxPA)33%|E6MbW#6-v-|YuRV)zflm;B1rET!!1qA$T32TPUO{{cegM{B$bSUB13m$-
zg1>?(_!LaQf56{R>-y_m-@n(oytOyF_(L%Cjllu)F)5X1e#xwc3^t3ekhNmf$oK{#e^g!{Fl&3~l>>RC3
zLv`cB3TphAjMUUhyGjmB-Yi&q>6Ot*JA<*1I4`T}nHss4WL;M(Z)G&a%oWGccPP4O
zoF~V=6>u2#w7Y$(3d~a)%h0Q;2nOt-2vgUk@t7yNxFz#E%vsABN4eC&o7~hZQn}Go
z!Z%vCtxsV!)CxD^IHu@)p)$Fw)DK*=au>~5v&F#BwjQ?LM(2CcE(KeorB$uyP?sjg
zLpmP?x0VV9Xhu1>+2+D&Y{5k$6n>udC~V$K38BsZ=#Q-Vo^vk_3-K*m2k$d-^<3#Q
zJe9Xi+I-Xu7sb{mtI^a6Ei&D2(gv
z!%iG;FPjkohw{0!IJdivFU9TWx-eDARt$A+!kNwJ_Eh=a7u{iEc)!YM
YAg5f>R=kZ4uU_$2ulU6$`h`!zzjBNqTmS$7

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fi/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fi/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..4ee56f5b5
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fi/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Finnish (https://www.transifex.com/sphinx-doc/teams/36659/fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fr/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fr/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..8286dd982c84b019c2aaf5482a15f68694bcb368
GIT binary patch
literal 1910
zcmcIkO>Z1E7&cI-v;qO82qKVpi-?j4W@eMBX)`5N^VJfOv{AAR;uLvjJiCTjd$2vb
zNe_r4KcF1A^d2E3{s5;H|A7++E=ZiYa6sa*C&?BCdSj*0v$mi2!_WKr{pHeyZy0_r
z<9i$5Bfog!_u?~*y@vHmz}JCSPS)3fkFow3xC;Coco`Ty+xS@pzJm1u@C{%E^!8r^
zUj;q}UIP9AYy-!@1o#K=XZU*WImX_?`mYO&O#!E#XY5_zRp5`nec&qa@(WGePk=L6
zm%ulHkAObz_rNQ_pMXB@Z@_nee*z=m)J4W(;9VeF)43okdrGPv6_KyUAamqXXd}RvW$p!7ffGSZl-eO5c6P+G
z%;#D0o?sbQUYkr;M1=
z$Xv9UNBhE9XrGd;`cfU@R?f(7Y!VtQ@q{q|D34Pvw_hSJA9&ud=~
zyf%1S+`6b^xUwa88v1XoJlNg1*P&fr_4)X_l0GbXZO}irr4o5um|Gu&kg!y}8nsNR
zFlURXBlsYtJ21%lG~0KsvT2fxMx)sIAhHmLai#}JBSnkGUeUYJ2!@C#gCTDa#3{N%mbU70mta)9qDQCC@@L;Ly@v&fAf-p2{M9P~(
zi)Ze=AQG~CaxBokt}R-ZDm+{x9^z418fs}M16dd)F<~56j=rb`4jM9E*g!aULJvNl
zJ|^mkxz9gL3<+~S6q&!lWMKS{lR{TANL|RR@2?fcg&b7cTIna@WN4h{VS4=c@E9Mf
z@v$Et7(byR%?LOv&c6&2lo_Msr1obCO{PjvIu}D|6r3Sl6y%>(4dR8KIA!|+`f1Xz
TOF8tt_3KyPHXY)%4)nhP$zD-k

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fr/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fr/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..86d254d7c
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/fr/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,95 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+# Translators:
+# LAURENT Raphaël , 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Last-Translator: LAURENT Raphaël , 2019\n"
+"Language-Team: French (https://www.transifex.com/sphinx-doc/teams/36659/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr "l'indexation de l'aide a échouée"
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr "Signature du code en échec"
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+"Le manuel d'aide se trouve dans %(outdir)s. Vous ne pourrez pas voir ce "
+"dernier tant que vous ne le mettez pas dans ~/Library/Documentation/Help ou "
+"que vous l'installiez avec l'application."
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr "écriture du fichier info.plist"
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr "copie du fichier icon..."
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr "copie du fichier icon impossible %r: %s"
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr "génération de l'index de l'aide"
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr "vous devez indexer ce manuel d'aide avec : %s"
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr "commande introuvable : %s"
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr "vous devrez signer ce livre d’aide avec : %s"
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/he/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/he/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..3c8b92bbc7c7fc0bfa62a69f1bf902d3444cd2b6
GIT binary patch
literal 1892
zcmeH{&u$z=5XJ|>A87>w0*DKTLW+Y8>Y3S1;>43|z-w>7VmDaMCK4yBccyl?VYYkJ
z-IMil;J^uqD_p}X^B=N-Hs
z=@Lkx);74EuhV{RI?}3lN
zi{N801^)yS@LzBf@1+ZE-0|z}Ithk6R$z$xD>wi@d!voJ1VjEmgCXu8V2Jw|3~~Pg
zL)<4|i2Dy1;$C>Oje8Z0_DsR#)Lbh)rN*8>>
z_Eb4pFfGFP)R-SgIn2|>rm20Q?3Rl=ca3NA3+ZWP^rxPtOmbRc$k0Q@D^i|nU9xku
zHZ@hX4nCru8!`oGpaHFR~7W=ABy*!u*f^(3_(yj4>X>fMx+x^Wt(og=P{^KvA}m8H02?9yeVtHyNwt2e3r>~Cu7_o+*lFB6UjK47I=
z^aZ7qQ9Ic?KiO^OAWs|pi-Oj=jmhAr2R~OjAuSF?zxFe6, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Hebrew (https://www.transifex.com/sphinx-doc/teams/36659/he/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: he\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..e7a9e1b6ff7b4bee88d06064a2436c2ea0bab49e
GIT binary patch
literal 1797
zcmeH{L2ukd7>3j9&w;{tO&|e}k7nalWfF0N=p)7yQ)9j%<#3hyJtL;FQuoY(I0r4GRbL$DMJqxFG+c7bj8lm
z$~06rKFpxTcgaXit+cCT-{j4LwU=HQowPj|3yJfxs-CE^){?C2O69GLrs%oiIQj}j
z7mf4e*tY@>%^r8Rk5z$wX2vq~swzSNyC}lcxilXAL}#~To`*hbIp-*sI%JcZdPOQX
znr6t2)@++om<_eUjW~`eI-RIYE-Upd7p>eybJlFpFtlxkZMM~3K
z6XPMBk3w2Yg#a|89MWvpB57>F*+M9Mne`}a-g66r&Hv~Rt@)aBFAfUvC0mE=GjesQ
z^a-BITQwCS?>0{A$7!7Qj<`0~i?N%lLJXR@6BCosaJ+jky0yE%e>8mXpm+HBMC@5^
zH%aVE&lzo|{cVx<#b!$Vt?b(Nhv{~jLMV>-p$fjw>(cA3E`@F+ofi`;wX38z$p7{i
zqY>TP9S`Y~|5$$tsh&63yo^e9HV_k*i;V6fK1J)L_qEHCWVu|%J``0mK8bU)NV-QC
zg~=0-6)yRBYwOx}QmSO5cUU!6R^qm?3zw0u+o9Xpyh+{PopnuDcc{P78y}2^Pvb;v
zy*-49!!0JO8jX2A@kw1trEgMRN{dsw)A*UV@l+SOnz0o_ottoCGrBQVzIUfPN{r-J
a84cu=E82{=;PB!FfANB!eW0KDAp8sR;vZiC

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..b4f3ece45
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Hindi (https://www.transifex.com/sphinx-doc/teams/36659/hi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: hi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..0cf2364fe40f558a4f6a4c7110f71f06437801a0
GIT binary patch
literal 1811
zcmeH{L66%+6vtgC93oIl0deW!RqDd7(AdtRZo4j9vDr;&M6#^5DH5k>V!tE<&WtrP
zZZ;fx?xnYKEnflg75ET{3m0yjIdb4Xc6VD;iBC{V&M$A~Kkq&NXY4<&T>LS@bqV)X
z+)qRB()G@TD0(09yWof5wde6o@EPK-z#jM)_yH*1X!G>I%ZMl7M_>hp^^d{#z-QnU
z@Mkaue+3ipZ}2zdy8dQc_n(XHy3231@yB4On}I#>cQDkw`gU8l3x>K!V5mC*L){e^
z>OKKO-Jifv_ZKkK{S%B1Ou^*TTq`}NnN%eg7+Wr-E=U_sGgIp#qYW3`93qECg
zrW`Mr7GZp9%=e@m=4oTo)V@%5%f+1|>RC4
zO;zo~2y#41hH7f1T_=Youa~U7^vdX@>A_e?oR?+!T#dDsWL1?aZ)7w@&n3svw@A9I
zohQe>5pZaB(oRoQfqrJjGW4n}f&u$T!qir&J^G2xr(~XoJ}WurD3>~TlbdQyDmR*D
z@QpTX<5L(7xxz#o#}u6nlqQ#@`hkl^?xHzswrCjI#>2+j=xi^VpbVnRlTm-PKNxfA%CR?53vbM4mca2@TjC9q6Zg2ZGwSV_EHC@}I?p9|s
z81-M63llpBuog#MjMo*~^nB`*s+3CKrhFkS&hTFCXX4fiU1)5^R`hjl!uieU)>Qe<
hm+iq~?87>vo}6+?+wl%6ynfwZzwYOs>z6(c{{k(FBy#`&

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..4c215c0b3
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Hindi (India) (https://www.transifex.com/sphinx-doc/teams/36659/hi_IN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: hi_IN\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hr/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hr/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..460b27838dc358f1cd67aad449ec5ed63fac2d69
GIT binary patch
literal 1872
zcmeH{&5qPY5XYTQq*0H1|&|a9=m7U!P9MZ
zx0#&?<&4BNxkWrf4tayz@(hRv$R(FNK>lsB3lUPD0894I)%~xo>MFZmoPPh80M{qD
zzrg*oH(t9wdM5}zhy5{l7QFD%z6L&n{T(;}{{qi|?A>;q0r)BGL-0IUf!_ZK_!;;N
zJPrN^#^4`d1pWh_!F}<)Hg4~O)^7~@JTlP7U4jGf+=p%42cXYifj;h2(8v81^l^U&
zecV4mANM)vAckJf$@od@IU|q{_vS
zFvrSCA*k@`D8w3w&0bzQq$nhhIv?r0~-72MHMt1lf*1@UQ#Ax)2@Sdw&9t5R4?
zD_v7nJ3oRoeu_qNYPeZNyE>~ELOJfFR#B6KHjr4y%krffzJ_>Jl`?B&G)2y(2!jV$
zbWvMJR=7qWe6ok_^r6g=&rBNuy)1KIfNd-ysEtxP1eY
zqIUNz*IDG?WTVTQn^${LVWN%Bepwq{vfJ7$Y)YzXOxwSFgWA`=T1(=7KcP#P$iK!H
z`bk1xQ%q39zS-{{Pi^(D_}BGDww1*6_;Kq3O}qi01U}u)cyBy>)fsf4vxC0iKVg$q
zg*`fPW
THxc3OS@HI)I63QIJ6rw*MFlU*

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hr/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hr/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..e6593426d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hr/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Croatian (https://www.transifex.com/sphinx-doc/teams/36659/hr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: hr\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hu/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hu/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..71138557fdee54010032ea2d0b78f225ffe17a60
GIT binary patch
literal 1801
zcmeH{L2ukd7={g$9#&L9DB{w?SBa>J(AeHoO&hmCWV2fuv0I{ai^M6KwZB~tcxSAc
zaW~6>3m1L>z4pwJ|G*h>=E4u)i1-1#V>fA0C4NCyvYwssJKy{How5Jixb!r_?_FHi
zaQzepFa6$mBZ@x2_zL(Tc>VeKHuwzVFTer#7kCvEZ+3MC;CmRKf**l37}oy?z7IYF
zH^5)O6#NxTz<2rz*S937ktL{
zTsbY7$}m4O=37z@_i1y>G`>)F+r_&`7`mE)Gqg?8cO>XKnsoZFq
zBRAT#ZBAh})CxD^IHu@)qB6Ox)OTF8au+RFvqi(uwi&kBM(2CcPK8*bl~t|iNY71-
zhjcy)X{{6j(2R0Ovt5g%u>}_kq3~taqp*3eEC@FLqd&Ih8_vBrD#TZ89kS2J)uqyB
zcq(tzOoY7KIH@0}aoRiK+E_0pZlMY>XckUPO-7^1!O{4$gW>RG^ypFV_{*s{wA^lz
z7)s9>?WFxZk@m$-O8wpJ*4`)SUYbHEPWXumzOU-i+pR8zZY-S_Q!BNrq&LX_{^RkO
z9v)0abnidbpF*k^4K^>Mvbh+DDa&O>4;sCYR!L1;rT4YVl4P}7#Xb~Pb3Ti6vrM|j
z7lp|ak5w+Yxx0I7FDaX3yLVhQR#xJ^u}hbcuG^v8-?>ZO-~BC3*Y~Nv-J2XuMlT{o
zbiG3aiUTgD>l)2@KJ!UkNu}>nUP_CTyWjY^xbs36x|*{UBb}RYYBRbsQ@;0kcbpjM
buQM9R8CSFu@515rOaA&LzxYVM^ilX167?Zu

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hu/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hu/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..16bef0e91
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/hu/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Hungarian (https://www.transifex.com/sphinx-doc/teams/36659/hu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: hu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/id/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/id/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..b5315151456477def5eab689bc8a415a3bad2baa
GIT binary patch
literal 1856
zcmcIk%WfP+6m1}YG$H~5Q8p|t5>^sHKgK9d+>s?bwi8C!VA&%iR#tU)O;2U2t6KHQ
zcvv8od;mzS@(GAfK=29dvqfUfiWR52$BvUgc8oN0rmD_;)VX!<<13ebi12w6-}mtS
zJ}fSL-gqgB-og4Z@G9{A)%rH@5!RmpN5DUU?*ikOdp{%KTUeg}uK`TJDHt-Sf
z3h-xO2K)_}0{;U33SS?*(x3lvsrUCcFxX#v6*j;acm#Y53~`6AMbUNOJz(&!fFbU;
zz+m^|YX2u-i2Dn06ZkuD9eDY5{Ost8lNGfRs-`Iul2_Pk8m1~z+R;>dRpqp1qffbP
zNvMjSa&yL<%s9=$exdc8gvB|n-O%1u!rZjU;B)Obxfye`(CWIQf)gtwwlqByd_lsI
zSCU&xOYN!kF6_X^H|f483^U7gSC_uw$}uOjO1m7i0mV8d<%$hkL#%D3C_5Sz$XW6v
z`U*}PZyj0gIsy;Lp7h5jqC!4XZ8-QsRzZMmIN{Vs@ecV!=SQq8L!K?Gc~mkLv?+DF
zBvEQbQ|Lx(rqe0x24CSINfL_AHl!|@6kqeIquZ$FiW?*hZl__VZFE+PZY#(dEsW?$
zV>Q(YE@@p9)LIA#pg7z?&CV7|qXg%MV7OU6pisQ$3__R}@DGiCz)Kg8tN2T9EVR$b
zwlkqlaVuv;5eL0HIcb<=Nj5m*tu`(`u(hb-k*{q$(K+oMY>)Rp+1}kf+B-fT9DXs0
zcMR`}6z?*}b6U@an{hUb*E1S!(O#Q2Cm6d~^OyzF+z%fQ=b*2NRUl$FeB
z=s)pI%Ou_B4VO}U)VT*s)gE=rNmS>Hc*0qe(^yqnaVwaj8#Cuxo2Thwu}EBSDyIB2
zDRqDN&}qt6C6z%dRfl@cEmXQtK%oRx
TK@~--!SJkQHy8fHW@YjZb38lE

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/id/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/id/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..701401fe2
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/id/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,100 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+# Translators:
+# Tumpal Gemelli, 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Last-Translator: Tumpal Gemelli, 2019\n"
+"Language-Team: Indonesian (https://www.transifex.com/sphinx-doc/teams/36659/id/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: id\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr "indexer Bantuan gagal"
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr "Signing kode gagal"
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+"Buku bantuan terdapat di %(outdir)s.\n"
+"Catatan bahwa tidak dapat melihatnya kecuali anda menyimpannya di  ~/Library/Documentation/Help atau memasangnya pada bundle aplikasi anda."
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+"Anda harus mengatur applehelp_bundle_id sebelum dapat membagun keluaran "
+"Apple Help"
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr "menyalin icon... "
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr "tidak dapat menyalin berkas icon %r: %s"
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+"anda akan perlu mengindeks buku bantuan ini dengan :\n"
+"  %s"
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr "Tidak ditemukan perintah: %s"
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
+"anda akan perlu sign buku bantuan ini dengan:\n"
+"  %s"
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/it/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/it/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..4b4dfa318f5d3fd74dc2fe6123ca6eaf9393e32f
GIT binary patch
literal 1799
zcmeH{L2nyH6vr0`9IRH9LWNXuc$J8n2+i&~RnunMAmYTO7IujegTyHs?>^f@*E6e`
z**fNc#I5(jwMWi;haM4UZhQbvJ@5he&u)_zRpJxW((30o^Pl(L{AYImy1e#Fgx~vk
zKEd;I2wwSJcq@uNM0^pv0$zI&-vXZ^{tE1Ye}f-^;_Wt154?o<1pFARz_9)?_yPD7
zybS&ZrraS!vYRgMJTRWg&!wlO(bqjqnB=6ykfBG4m!v$^x@6~Q
zWooKwA4ZVl$7HA`R@zl^VDfsw+DosDPMRK!g~WMTmM_#;Ye`mBsq#if6ZBki9DRqR
zi`sc|>>B}xW>4Db6IGy}sj&>bDvMyi9+EJ%RceoZqVp-4=b_I^&N#}Y4&LOZT9L|)
zrYU@*b=&w9MnkSJ5yvq_X9K0lWvPDPqLI63#+oe}hPLsr@isa;i)JX;8ZE7AL<2oF
zF*fOZ6x>=W7@!&H;AXQHPU8s97ee9ZS%<>my|y5f`5*nEHQ#gY#h?)1vUTu2BUjCp
zKENB!gD&f(W%v2VFK
zByk`;XS9`ecSPD1TPbz7vzt4gr8{W~p*Z44D%5>lm)>f0DRe{Wyck=lT`9eR|M$Kb
z4(Y+(s84tQQ~GmA^{mF>Ww)eDpo6+qFcJyU?nHb)$
aGU~|*m$Vgcqr#h4{LL$V{)v9&lkhK`>>z6Z

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/it/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/it/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..3176fad12
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/it/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Italian (https://www.transifex.com/sphinx-doc/teams/36659/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ja/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ja/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..200fc7ddebe0352ba5da0c209d6ba61c2ff4b925
GIT binary patch
literal 1793
zcmeH{L2ukd7={fk9IPUswCbf29}*F%sSpNikAAAa4
z1b+oH@Ha38{|0|Yt&h)jzR%8g>;3^lAD7nO1s6Q>iL0F}GMqU6MAQrl!$lPHQgulB=4OF8PG*
zsd7ALnuqy`F%L;O+^4m5)A&-^Yc7fJ8_(qD($muDPdrVSDjCI#d%Y?JC_fMYCY-rB_C$Z4bsm;=HV?=W49AB_eG~2aE8e4F-5DGufV+x!1%7S3?Kl%e}j=At+zZBoHb;v#^SI?C`
z!BcswCL-kB#!0;-OS1ToYh%3_xtS_OznM8PHaQJOJNv`WclP!U2M->^2ValHuH|-<
z#Gdq=(?-_Y5?N1dWYpWtZ){!9wz3RDambHU@O@R6-E4IkbVKR97+a}bCA~rZcfT19
z>Hf}WKzIIQ{TZZs)?o8;I+kYxF=n~Q=_^@F&5mh(?tSg@G+i#2i4S$vluwevEYj}j
zMQMuEW06Zg-Q2vfl^)CVT6|D7R#xJ!u?v@zuG^v8?%k&D?{*fC_D6#kQ6jQ<7eV4+
zi}9*PQ=U(JT31r(+f>Y@#fjZ+{8Zd}p$qLy*@}TKOgODM-I^#Lf6*NyM(V4a`f|b*
VZ6up;c>Qv}e!0&+&M$oo{snmKAMyYI

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ja/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ja/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..a158d0e90
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ja/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Japanese (https://www.transifex.com/sphinx-doc/teams/36659/ja/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ja\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ko/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ko/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..82af6197864bddf5b24b225493d9af5c1369e2e9
GIT binary patch
literal 1992
zcma)+?{5@E7{^CNO)eT0H708GA)yhXyLZJ<=wTK518Jbzz{RAmn!UTZyOq72%kCW4
z`oc7Dm`bbC&iyH;bKnxV9b5$y;BR0Y{0ICUv35Qd#ru03V_lfP2fhsMe4MeL!S}!v_%HYh
zIQj%*Nzegxz7_Cw@K^9P@K10Dcn{R)q$e3W4EBKoU=?HoBFo9Q^RDgYDQDRZ&tk4v
zwA?JYLQ+nY-E5M&e0GF8C9>TtpWt3gnJRE9==rn|C&~7)PF=f1S!Qi-w{ONi5R#KD
zSduEjeM3^3la+QbCFqpRD`ZP5yAJn#niOR!m8G6Rj8Ego?6hZjlkq{3DHpjbEolok
z9@Zc{NPKBI&ZZiBJ+ewA$IgT@N~30nn`{h0i)CMu&t)j!y4dk(dECyTo}BPF^tO}L
z1{^{VPEnS!L_Ms%WMwkC&XSeqEMvLan~W$;lARGQ<=`82d7)2wR>#r{rfCvuO*kTB
zIrb+!8_Io_=Pvh9FtnkEp|`Ac7vYq)l~p`D6b-vMVd9X!WZJEY4Fg<`aBwr+3#V}f
z?Tt{#LNZ4B@*dcr(>z2!>WPneMjFFe<0J0*@IFa?sbISkIFF=$Diq&`72}PjYYXn~B~;0z%_BKV|E@59$*8LR|v7W0o(ClxMlVV@U!3$5M2J-pTS)2W5ee
zrA(L0ci#$=K
z$cju{Vv8StyQgPwZ~UZ)?~aW+WzTYq!@?{2Npef!(C_O$K+$7gA~rHSGSqPrj>QJx
zBl_A%O_orSYJ<7oUaC#7B_C)4wkM^aD6(s&3NNp#I)n>q=9-#WR0|E0Meld}aN+Tn=2UeJvW?rT*jm+F+r8cS
zR0Q844N@=HqSVx^U5)%=YI$zs);cx6T)=77$`l26W<%c_b4=B$dh+f9HD_m4eH|YO
zB;AE*yHWW~b^6Ct*{*lYoD%lb>|wS
z&eU;89bxOTzCN@;*d8z-^bU&7ccv9xU07``!edp3>rodiuH%Z3=LT)bx*7J&=V%?2
VdB0y#fBo+;o7L&-?sy)?_z!H89ryqM

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ko/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ko/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..beb3bef90
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ko/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,94 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+# Translators:
+# YT H , 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Last-Translator: YT H , 2019\n"
+"Language-Team: Korean (https://www.transifex.com/sphinx-doc/teams/36659/ko/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ko\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr "도움말 인덱서 실패"
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr "코드 서명 실패"
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+"도움말 책은 %(outdir)s에 있습니다.\n"
+"이것을 ~/Library/Documentation/Help에 넣거나 응용 프로그램 번들에 설치해야만 볼 수 있다는 점에 주의하십시오."
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr "Apple 도움말을 작성하기 전에 applehelp_bundle_id를 설정해야 합니다"
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr "지역화 된 파일 복사 중"
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr "Info.plist 파일 쓰는 중"
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr "아이콘 복사 중…"
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr "아이콘 파일 %r을(를) 복사할 수 없습니다: %s"
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr "접근 페이지 빌드 중"
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr "도움말 인덱스 생성 중"
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr "다음 명령으로 이 도움말 책을 색인화해야 합니다: %s"
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr "명령을 찾을 수 없습니다: %s"
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr "도움말 책을 서명하는 중"
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr "다음 명령으로 이 도움말 책을 서명해야 합니다: %s"
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lt/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lt/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..9e1f425526cd32130c7626ff01e5c379875667f6
GIT binary patch
literal 1933
zcmeH|O>Y}T9LAT|N)`wxAXJINzY;02VD`nOX}yh8;>0Zxb_t0=;((&@?%1BPo>|Sz
z#xbfmBhJ9F;?9Kw-+&8WfeRmiTO~dK&+H~?Q6@z#-KQBK2LxAfQ
z+;8Ll-VYwTUV0`7UdQ-l@J;aY>G(SM0OOCrKKK{-2FRXm^7O%1F+Kv{0!z@xe+#|_
zJ^(L*zko6L8yJCqgP-Dl=eeft@e57dccAa%C(zgZ73_nDFE(|51bzQMgTC(Xps)J}
z=<7ZNeccNen!1-jU-x~`*ZmR#lZ!+?+dFYW1$8i6A~HFs12OiX}-$
zl`4d_w9*xomGd*m@l7<86T{6a+SOUL5Xx~UwTkKbAd@Xa1I%SSRtKT~Z4^s>mk0ozC-sHsvp^b?#f@htOwmV73Hj4SU=
zrppz{Oe>ngH(E2bPkz?t@(W=YQgAj==!_TgYmwJ-8_a|f1`R`7dsurLob5$D3Kz9o`$c7V!ES4_uqmms9@^dqH>vsATgSnmB&J@E
z61sAQPRB8AQPQRR_o-QrX_JzqO}8kf^h`usJ?i+N(;S<Lz7#Zg6^fm7B5~k96LcsW5DyGVM=J
nN;f9bweB>pw7?s%N~zB$qM%N=feKGQG*3S?=YJHBeVG0Mv^+a5

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lt/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lt/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..9aa3e3a97
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lt/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Lithuanian (https://www.transifex.com/sphinx-doc/teams/36659/lt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: lt\n"
+"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lv/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lv/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..f83c97ca243aa0e6e9e3b3d52de86e16d8c33924
GIT binary patch
literal 1834
zcmeH{Pj4GV7{<3yI9ODL7Q}_a8;P`u(CnW?O`B~^i4&Jb*d?Sc5~paqJGKYLGpm_d
zJLb?cCr)tfsUM&xz5pk_1RsC{;=qX$&+Im7Q6)Y>Evmyu0g~3a|cP>QHRg5ozAAoDm$2Y+z7=Howz(2tELH0&lrw6`^@d@}LSb<^v58!*?
z6YvW73{1ga!36vp{1df4ezWzx`c}K{IvD!sg2DGIum}DH2H)+sTi^R&@D*V2U4X&&
zM=(Y`4KIXTr*PiexX5+&y5bFNF$#?!>qy3A?aMfZiONa|9Y
z3VWs;%>>QD{MeZ9NIE>H^$k<|Qrb-ycODoo$j`W^rP0?tjRo@i-aCvE_D^9GIe>3+=g=Mkh@V#zNveSL(SMYc27rQnF}dG)B)##L+h>
zIKKOtm6e
z7)=x8M(ei8Da?ji;Xxe76rD{dQ*b4}7iA-N(Nt(*(J-`4hE2B7*HOz+2~T}2HbfzvRpgGy+Qu>
z9t{TcU~kx`JO8o%6jD8{v3WVE#rc4Z1fS;wrj42RmCKW4xm?CRl$8^48W(1s
zv@g#}QzRa1T(Z5hb7MDAi)6ENq-x6*yJzg&<)o`-=(^jtslDxP==Ch^b~CzmjlylZ
z*3B}yODRE4YhB#jr3{0u&Cc*}*ng2ZvhD06ar^_=XjP$mFHU_@DK7PGDrVf`)9%)O
z!fw6Lg~lhsvc4`%_^flfHI}~fdHcNyY|kpE9v=%uTk#GYUY`Q5Pl5AO{H0UlU-l9x
ABme*a

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lv/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lv/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..e15929118
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/lv/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Latvian (https://www.transifex.com/sphinx-doc/teams/36659/lv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: lv\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/mk/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/mk/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..481d33ce9ec6de80ea9dbb78dbbf4ad1981a7f21
GIT binary patch
literal 1832
zcmeH{&2Ah;6os4L#RvomAT}&+Bphs^>K~&xahm}=_82T?63ZEoSXnjQcV-IrRJE$A
zGaeSKS+Im{7CZq9-hc&f!2=+~iUmtfb;nLnB%UBGwZ6Gkr|!Lds-}Lw{^E}jp4afc
zgZGCJJn_8pTok>5_*L*N@W!L~Huw)_8|3jPWv;NRe%$o1|EUEOOhb?Y|3(8nGa>fQqf;9p>iz>p2c~3lYOa-@(@d(0ON=d-QkSHSrtEn-Ewj7uJKHMAw8{(e$UgCNlq&a8G4|2Maom7D|U|7
zrlGp=VFWq8O-5>JrCle7rf8O|z4XfHr0v02NSv2d^+=7imSkO5s%T|2Mb8z-(N{>i
zY@8>@z7=q2_N<#eQziPD8OzYCstg9~BMDPirSa$|x|)(j5&Ep0kZ==h-XorHW(aNe;bgXA4
z#z#6I1-DiT253e)xY@3S)7XNmg;4lK-lMR2Pb~;#{zrde&DUIbaa@Wo**bWildBg>
zU*M~}RZ|iCZtbKjPUEz9%C)gxjNM$7V$jT;n3$Y~28`rC{Fo-3U!~>rMFvM3f)LLFD6!MS4nT+|Irtt
z5#8M%59!1Il>P`(J#VmiIW5nx0x@B^%xNqOE{#@F)8@ka+T}^ITCHLqGOHP1#D!TV
z-S>;q6p6<&mwd3Zb89zQo+n$qld7?@5=X`^T~4}gL)YKlqwZ&a6MqcKQtJ09qnkIW
z3sbs*INPF+DW#mU-uQSteC#-!?H#~xoPRM{*XZ5zg-_~AD!oU=LRuW`e&c82&SPEZ
udB#=@bz#Dx&gsrn`QE49X=7~8I;Vl0az)$m4k|pm1D@RhS9kamcgDZVFDI%1

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/mk/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/mk/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..b12fc4f46
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/mk/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Macedonian (https://www.transifex.com/sphinx-doc/teams/36659/mk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: mk\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..4eebff2b66c799c0d37900bb876faa676a088756
GIT binary patch
literal 1824
zcmeH{PjA#l7{=Yd6024%6x2&Ay+}mO3XSazA`sJ{W|M_R?1m`WR;oBeV|#XY%Iu6a
zGiI|r^wdK?K)Lk5t+yWd1|0YvJykvQ)I&c2&)6h@koW{xvVJ?`XWr-CXU6{P-1`qB
zT%X|n0{3rW@Y40sJ5lr*#vg+hz>Ckv*T6>@-vRsJzuyotbG%>XoD>i02AZh8{?r
zN;pSLQ&Uy@FoPODCqtQAZkNf9DeAeN6B#kXNT?mDrWgQBe_u7JB^9KFCH9v~Nv)z(?FRVlM
z8M$gE^)ddHw=!oT?)F+f%jrg%LdXup0~vf@*QM7QT?*ZhJI}_JYp1w3
z$p6-N!y)Z$jRy4fE7mt5)zccAmyyno_U@jJ*;w#-MtjCC#8h%keRF^Q^bbX=VTv!i
zv^w*?a#@lr7K_*iGdU5*abf038wo2-k$9AG$(8l>s~btY
zHrH-Y`*U+u)5T5dbvvWo(cneWNVKz!oN?~icv+!mFOGduDK7O5DrVf`KyTK5!mhv2
wg~lervVks4ILsMc&!z9&ZcmxOrYtk+^IRxei`U`s_T7K`?w@|UU;0)&1C, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Norwegian Bokmål (Norway) (https://www.transifex.com/sphinx-doc/teams/36659/nb_NO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: nb_NO\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ne/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ne/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..ccc5ee9e096d6dd8d332c04cce66c746ed53dd23
GIT binary patch
literal 1798
zcmeH{L2ukd7=~S1IIO5z3J4)__$oDOA~d!)sA=Pps=LV+B6dTRE=ZiBS^L}FDc%`t
zX57v8Q1#d|f@^Qw`yYBkoH_CXxNzYI@Q&T2MV0skUCDZO#_xRZ=Xb{b^U8%^BK$7l
z`V804Ves1T{c}t92UG9`n1KI)zoFK(^R4gS7ut2_-)+aAg27jSeeicM_+EOi^}PlL-yRrzkHFyj
z01UoQz~K867<_*PgYO?;v}+0`r)FB|8BL`sxxn0FA$398c$%787a6U&=xZ)3Qo7(1
zwx`PRoM|5BC&v6p%Hck(t()2x%5J#0b6`A^pG!|mqpy3KFv&@YDMJqxFG+c-b;-`r
z%G6ZVKFpxT<7B8NR@zmvXYzW%+DosDPMRK!g~WMTmM_&>B}xW{=z3$ErX-Q)3x=RTd$D9*QuvF11HL(b+AT=b_I^&N#}Y4%y_UT9L|)
zrYUlxHQVGAW<#xTBaUN=PA5u}%Thh!qLI63#+oe}hPKJD$u>IOi)Jds8ZE7AMEiPb
zVmzetQAlg45P)WsLz>N6B#kXNTL^`pXB`Tg_r`)?^FR7SYaVd!#eN~aXX}uCMy{GG
zeS)X*R!v06yNQ#!aT=$cBd(0~V&rD35dC`Q#Mops81?ptcYAw#M}zzKJBQzn#jfRM
zlf<6%oY7|5-4$9yHa|C{O^4?
z9MVB=G@vj4V|@owJ*%;K88SN?h%w7WMh9GBXJ~!yedV$wSuU5c4^`EaPvYDxlJ?m}
zVe-UdiA%oN+PblwXihddhh=SLDef7&aHw82L$|Yeo7%rS>zc0aP, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Nepali (https://www.transifex.com/sphinx-doc/teams/36659/ne/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ne\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/nl/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/nl/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..05a1051b03b5be114e8a2e83c0de1b2c49fbe1ab
GIT binary patch
literal 1797
zcmeH{Pj3@P7{<30daz3Q(^loc;YB4P5uM$2Dgs%Wia0hU!lr33NIga4-LXAoJhPga
z#c>bql`B$v<-`ZzJ8(jrx$*%xaOwx(nOzbI)
zEUtgT;Jx3MpGDEv7#|0}1<$=5Uj`pxd=u<|ufT6WcBHA(0Z(GQ2Yv^ZU|9bEJOw@i
zPlHdu6nqLM;D6vV)H?rpXy*TCTW8yI{g
z7<~T*gYQEy_&x@M?+Y;6GKC-~CtB(Wjk#2!z}#%cbwS#A8kHkB`=U2$>imhpo8lzW;ReZkX65FaT_8M-gUoTR5pE8!e1
zOhsko!whQtmGtGva=S>nCa-2fd+w#tN!^37kT}nkdaK4-OS~+V%xf8q(6bV8^gD{q
zD(A@wUkgNNcCWd;Ckym5Hda6{RS^Q%L=i!aOXbl|ba;#BdFZp`6A|THhir0FE=cA^
z(-^tYlC5(Jv!PbF5yvq_2NTNVT**I0QOjL45n5O@3~ilZoo#fm7xh$#HJV#li?;RH
z#CS;Oqmb5IA^)Eyz4lr9j9^H+7+d-o(_bsG7W;8-W=Zqt
ztT1`vvBD)kuB}~KPqa!_T05$;T(RrM&K!!D_0VmsUZv*m#DQTZ{u@=h1J8Vk#MIyd3OW^`pFee0LzC, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Dutch (https://www.transifex.com/sphinx-doc/teams/36659/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pl/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pl/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..0b637b490b10875bb57badff0c2f021d1ea8f8bf
GIT binary patch
literal 1966
zcmeHHzi%8x6kdKyClFwQXeeGJ9PR}B>k>P;jn9eCHelfkmUBW%WzFr*-A!(GX4#p|
z`K%~44IQ+R_zx(kX{c!V11Kq|si^p7*Y+U=AzCC>T75fjzW2Vj-`kyE)?WO^!}U7u
zcX5C17Js>3ea`dV!umDf+rX>m>zlx*Sbqu}0Dl8s0s7B3bq2sUus#9411x|p|4ZPT
zz^A}9;CH|X_#-d`{tlese(!}w_p6thdfx(FA3p${?$5vh@Qarl-S2^}|DS-4_bbrp
z{sDBlYp*oAZJ^UlfKGP^bh=M~-mcC#88KBtO=-e}5#gW>1>!6Oo~xi7q+#LT1i@9Tefzs8kmHc$Zr&OYwD3~udV?X7n)i#p_N^%kY5
zNe6181H7cMo^xvr|G+;g^+TRo{~+@}=cR%7
z37KLh)G6M|mSXHXziT@w4x%7x9rHq$)*qUw$oxSyHU3B^v_ITAIJ~>Fw|BgM|9S}Ngr$PdX)Aa5FwkDo1Nk6Zm49rs+vqpi40j~~|?(RPfTI}{^HT}A!{X}ce-
zlH-o!pBLR&#e1tb)KK+Y4th=5F3Mi-w1x-6{nfNF)z&U%jepM{Eem*M`KiTQGNEo$
zI%6e%s(xiB{;d_y`846Bzpqm5eyD_QjfHJ}+, 2019.
+# 
+# Translators:
+# Tawez, 2019
+# m_aciek , 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Last-Translator: m_aciek , 2019\n"
+"Language-Team: Polish (https://www.transifex.com/sphinx-doc/teams/36659/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: pl\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr "kopiowanie ikony..."
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr "Nie znaleziono polecenia: %s"
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..4b54ee9ef96210c0dd690207fac2622be27a6c0d
GIT binary patch
literal 1802
zcmeH{L2uMX7=}$ti?jlj0#z?X`j8qmQ8l(Vh(JtJkxiBob(cnALE;q6+TZR@>z%P?
z#%z`YCl37qEl2L$`X73)dhVe=pjY?-ea9w&3aP(k>B!B4^G
z;05qEFa>`H6Yv%I2Wox!Ve9+ybi3}%NA37B7<{{65Bw7hz861keOJNY+XsX112Fh%
zF!(+NgYPpi_`U#x?_XfFV+tmxrdsJKO{6Nhz}$Q;bwS#AnwVM_8LhbJ4wn@vUGNdx
zW94YZGz;@%V}2s#aGzFIP3;S1*IeAWYdn*mNly!-zw$I@lH(Fnh8`(ikn&XPlAWWa
zsi~@cm_dyv$v};*w991IZFIaB%~XgrT3FSH_VmQW
zcu41?kk&#W0L>_eG@G?Z8e4F(5DGubIuthVodv<>fAss-{K&Z%dxdzw)*<_hTs2er
z2v6m$8jFy36DM`!G)_AQTp8=d&`nh#diB(ak;$k(+}<19+TPtg=-<27+5cfAb}ToW
zBzC3ejMmfcrbxSDJ*DnOc5Ubjd>GejJLN}1ki;f9{wy|@Uk*=Dd+giU#?cc3cO;@(4yVe=*4f}60
zMRuJXB#IL*M#~D_c|P(E_5|vEBZP&;n-$$W2}7VyY@UW
c;$LRelVdJvJ>G!B`?vi4TYmDDe(S67FK*K!7XSbN

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..ad2a12826
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Portuguese (https://www.transifex.com/sphinx-doc/teams/36659/pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: pt\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..a428bda958b1848123cd9a8f477f1fdd3a250615
GIT binary patch
literal 1816
zcmeH{L2ukd7=~R699FG>(uzwDUnL?ERbzXDx^3L1C7Wy^Vz)%eg49zqYk#{t;GMB%
z#@%dH^~@Q;wI_Z+Z~X!M4b(H@%n#rlyGe^G@e69ndUnR|eDAmKjQ#S``@coFKEiz!
z_pf2_#&zLb6n%>EMequE?bY}u_zdH3!9Msmco`J$wRQU7#~2@jpMez^*8dEC0zLyT
zfzQDd`~ytDf51Oc>+|!i@3{}!byvX9$8|9H-UIvKOECCe`>^%xfx-6(488>ze4l{9
z_ZKku{tgD;7hv%H3ygM6!Q|9TD?OvBR3#UfTP&n5NE=U6Q|lt5H5YxuWkpICe8Tor
zIi54k!~DdUpGY}8r?quc`$E|b7k3^Q&*bOQ)6(cKJWZJ7q{Nh=M~auEJk`2n=V)bW
zs%jr*P~&MbR1+)hD%mr6yLj1tiA^VJ6HCOrs
z|H@l65h3p;PU^;KoOTYmGS-Wco2f$d>zNZ{lhI(bvp@W5XK(LtaCFo;_--tAEjODa
z_N3>GHq-8wNV{S)rEV{~v2{J&N>d2MAwN>V_ibHzv(cr{4W;v9Y^8Rk^alCg|9&{6
z2Rowy-T9C8T}bt;#^z;I`Q!fK*;tHOE;2em^YyG|$F$zJ^06v6XnpQ|<+3DME|;+n
zE^5jrac&k#n}sM$o_MTx$(Oy}jjg09oosXt%G%0O+&6aNGSXEublaP^sr|XVuIVmy
zH#(#J(cpE$NV2nwd~x2zcvYcS&nG^qN~!d1%IDJJAaB=xDsH{jg}$b2#X#pK9O8^_
kO_c9^-JUMSW~?&m%L$jX8Ta7u?wx=4&Yyj=-}pxS3s7h#g#Z8m

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..9a2772174
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sphinx-doc/teams/36659/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..599fa3de75339f0e9a8b1549af42e4ec5daccbfb
GIT binary patch
literal 1819
zcmeH{L2ukd7={fk99AHp6v3f~uTmotp|QQGns!}+$R=Be*e$Dcsl+LowZHWacxSAc
zaW~5WuKWOc?UgHMuKW)WSGe*6c*kziqDuUNTCyI`_?_?l{EqG4uUvi{;dl$@HJm?%
z!E?tOuSC(i7{3X=2VQ?Vz70OX_zQ3d{smqI#j9PNA^0}Nr{Mcw4TkkUg71J&z$@S{
zU<&>QCg4BdAEB`
zFoPQ3Cu23Y(r%I?lQ%2YUV3G8()M61B+kpKdaA}+OR}yjmA5jQqvwj_=xY>RHO`Y`
z-wHT1d)nPTRR#K47|YPBst5rbpa@gv(s=X}UEGp+9{Q|h$x$wK$R;=ShE#4eEsz^+
z**2#z8)}6caU4^0K2e!mR_Z%0TDgl#)@;!*v~7lMw$b@sv{ND0Xl+$1I@Svl;~|}o
zLRxEu05qc<(rnivX>7s8LMZ$)>rvRe7ZwDY|Itsa`G#{ZjtlXStwZ)1xq7Me8J@~p
zH5Vc8HcsltX`J>>xHi^{i7QnhhE3_j%w#m092}27Jvcf#89jK=n|?VHhnCw-5=YW=
zM!RW$Akx0rO{u?^-5Pw94$>4tal(&O@O@F2-fnd%bYtnfm|3Y^CA~rZ_r4mB>HfiF
zL?8dh`V&ZX*AD@d{oT9NUG8sdy1q~So!;bl
zGI|y=!t5O)V!ZNVwyDvs=QE$wl~npJ
gtb4&2`?1MrDCb, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Portuguese (Portugal) (https://www.transifex.com/sphinx-doc/teams/36659/pt_PT/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: pt_PT\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ro/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ro/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..edfb224bfe849cc8c6558960758780601881ac7d
GIT binary patch
literal 1841
zcmeH{-;NtK6vn6gm7*e`1tC?vIF;Cv2zh3*RkzKQv}`shtVr6`HXyiKIWtaT>ewUO
z(`-=Tng^h_eF1KG0j_ufo`4778pJK1XLh$mm3V?in*4I?&*z-^?D&rhuRV$Ic^l7V
zJU@ltxzG7?QFIaUTj2ZPm6P}e_!RLM-~jv+d=F%=Gwg5_1)qW!
zz+b=={0&UNzreqd>%&)@x|d#W*2Q4xV+e-2UxNeiA28I--e~IH2SZ&2hPvN_q3#nf
z)cqL@b$r7D5}yGSCasZx3L6P-=*JP&=Ad?BKo>)=gp$_>ff
zXqv+}+OoAzVKn3l6LB0^dr=PsTcfp=wP;_@
zO^laxJ_>HFB@EC4>ELF)7EWUe&K5%9msyL#=Dn~Wl=&b1fi>TX+_U|HeI=}e_Zhiz
zDfKbl%3C>O!SC8m>c(lDwhl#UtY;IqkOdo53&*A=qtRq{fBfn0aCkU+@St^Yf6Df(
zs5glXxfdC2r`;Y)yKFn9?oM{S_i@@wQwZ6icqBvJ7j@~4T9-mM=FYRJ<=QFk4gA0R
z<#9QnQuh+2;dF5Oj$GKT0
z&D*oW^>tDM?&Ch;Y_xs&DY1VGH^;S1c
zZ+Cm0$B$2fen0J8z1r4Sz)t7RcGm55T9f_B=$ZAfxU~o4@ke0OO^KKA;@Bsp;!@wD
ze90|Nc)#*CWipO#0Sm&9M{MrA, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Romanian (https://www.transifex.com/sphinx-doc/teams/36659/ro/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ro\n"
+"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ru/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ru/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..20bb5d3ec0cbdfb837a4e6c0b44daddfd35563d7
GIT binary patch
literal 1937
zcmeHI%Z?jG6m8y;0RaKT2BaH_31gvtIWv>EGd*EEc0iP1$+#=
z1pEaU0e=IAz`ucaaenwhqx-)BP3L1KxYN(ftwV=KmS!bbkjr-9La%
z_aC6sef5<__XD8Qjet&<0lfp2b24Hog`CoaiGt_I&F4(!B$cI!s$`zfhVee*MM*;D
z{EX`rb2Q^LbNR7SUz0Fcr;SZj*<9$h30k+6UdE*JCR62-
zM5ZK7;2Uk|+9#KFz1%_&1mvv}h00hV9`d}V8*j=b*BBVw+QZsgZ?zY7%Gv5Iw5Ul(
za-sssmOCEm#+VVP{E;+~z%1;AH-Xf2`G4JhT2$?tjU(f%gfS
zawg;%?#gO0_MP9gofHRA5VcNtskHTnW-4;OS51vSQVI2k`$vOM_74wF`giWMj=vcB
z2b$NLoZd@CM9Sf25f-1+xnN
z-?}>((Cz(UpLYKvy$7nCR@l6RbhQrr5ohy+PAX#rle9Urwlql?E*6Wxy0&7%&w@}+>KU4`w|aZzbj__vgvn}lRphbG;+LCs~lDL3LMO=G%ph1_Ly
zIgMkwNfCjLcrWd&mUh!EcUf0NyK#peJ!(q!;;lAH;`5R;joebr+e^1E%De4#9(^IR
z(%ena;U;y^;A*=yJR0^dwia91I>5%_Me|3?5++%GX2Y^zLf)Wk#x&lbw6YWb`UTJV
vGvV6r%S^eqC!yADd?%oAuA)iI3C2R)s#M

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ru/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ru/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..1ad421620
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ru/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Russian (https://www.transifex.com/sphinx-doc/teams/36659/ru/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ru\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/si/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/si/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..167444b92907479d41a4bf4b3cd16bb2e57b6084
GIT binary patch
literal 1799
zcmeH{L2n#26vqb$99AGo0U;p{uM!c7kY{Ftnl@8{$R=Be*ey}AAaRPkGjDfIz4plV
zbh8|gxN!%rJ#ywda73KB@c}q--~;gYOp_K>;uCbG(Qlvq_j}KOd*;vU8$TuZy^7}@
zJU_m}z8u$>r
z4*mk>;ICi?{saDoT<^Zn)%|;;TetCI7rzb0x+ypSe+OgTYcF+mH^EqU0LHp!V61x|
zjCH>QW8ELXSodcz*8Kxa4sFHc)!ZmErDJkiEt@5qAcL|dYkRN`5+9`2kJMP}NY=GhWh6Ql&LC
zgKxCyTA$)*%oQinG^ONnK-*Gk^$l08+$VE3?9ec@t%t3*$>mwJL($e`HC?4KZ3u2l7(VsZ`HJ3pgSK>={9^Mz^>xD8G
z*i~?9Dx%-5ozzeBH1C~qZCwy!KUb9)G;=Q|wxHqo;CS@$!O_v_@a(L2^7%v@I&Ke1
z9Lc~1?d1JEk@v+;PW|2D=HC1HUYBIk&{s>YtZ*X|nhq?;HgypiJGi4T1OWIn5Q2QdwR;yJSVp=uhi?p=MtlPY(
zY?%eD@!1EvyEpeTud?mliEfa!c5$LtczXE*omPjZM?Gu-JYt@`=q-}4DZ(k
Z4dj$H?WDV?@az?T_KIJ9qM!IA{0otaAZGvo

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/si/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/si/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..396c7d98e
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/si/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Sinhala (https://www.transifex.com/sphinx-doc/teams/36659/si/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: si\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sk/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sk/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..fbc3a3800ea383accb782cf6aaf4ea8f51122f8b
GIT binary patch
literal 1873
zcmeH{&u<$=6vvm}k_7?^RWBS~BvKNg*&WJ{s2xK_yhRPZsQgz@fUQZ-Os+6@0<7Lz1{ia%F91SxZcG5
z9_}B4@znMD3sLkA>^H!x;KpP7Huwnkr(h5K6MPqBFE;D+z_(zZf!Dwi4F2DNZ-bA(
zE8x#y3jPWv;NRd?-0#2C#LZr5{EonoM*)VoORxuCd$o!C6&Uh2V2JxY7~=i}hPc0g
zA?|Nri2FMj;{FAOxErtGv2O}NPENJdQ<`w8M1isSoa=(L@iZ}&E;8D5(I-NcBy}N{
z!d@yzGeNU3J~rl@q{BRIZkfs#(r&xBb!5CCKjWSjMt|UGEQpU4h74Uuu^{QG(n>f-
zD^pQf`7nYtzD)*lY`I+}2PUuPLVNC|(Mg?yv5+{=m3pj(uO(iVO6IkU#>iQTIQkNc
z&MW813116DNcOCmK9dFVnHVdem#PQ_*ux@%nkbb=KGAxL=XuDpyYg0!S*UkiPHM+#oVHFxX{={MHZI*mmbO_ZrS?vCYxl!+H%%dAC*neexX?4LSZ{sC01E-U~5

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sk/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sk/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..bdd06b8ca
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sk/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Slovak (https://www.transifex.com/sphinx-doc/teams/36659/sk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: sk\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sl/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sl/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..07ee5e1c893b6582b785439a467bcc5aa782668a
GIT binary patch
literal 1853
zcmeH{(QX?>6o$97fMm4-S`atAI7kE%q1jzKZQ5)x5GM{q*dHS|>(6KApE+m#v!1`MU->!0=Pf)p
z@jMN|3!kf(qUZ+VYv6m}2hZa>;4{QugFWzX@LiC-*6h;*-$r}_z7LjQSpO6F4)_eb
z4*m+J;O}4p{sUgZ^Wo(t??oPFZaR`RI1=s^GztQB~2Sfeefg$e_40)e`A@46>
z$om@@^8Nvaynlir@3lAawQCANPENJdQ<`w8M1isSoa=(L@iZ}&E;3qk(N{v1By}N{
z!k#HdGeNU3J~rkDk`D8`6asbpTuXpEYbh@)?@
z>AZ5Doba_kgkn#c=@VI?o{6yndZ~(Fzz#MM)MTkV>WR*$c%FwkOFk7*&UNr6H|2_C
zZZu8c8?D*er!X4!3KMZ0Q*<_3uZ7cS!TCZc{48rxXx>W;LYn{4A6oOh$UQqK*h66*ywAv$
zGpUz2mA7)tg5R~B)Q;0QZ5@fySkH!TDht-DrjCtFM*ZQ=!QhLXy}hIU@p0?$n-SZ!
zqHYq~<6dOcN!!~jZL>~F?XB$g_9y9fnnK8q#HkEUKb4m%4
zChQ<=Uxb_V`0?4)ElhPVwYkw69t`^zZGhdaT{HoI3N~7mIFJ`hpOlJAeUI`Pw|LvT
zm7lP?7rJngiLk7%a}(b5jP8!5Z++Rkf&v{|Wz^$ip{NsYA;YVS;nl@(ezCuBk^Bpv
CsVjN_

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sl/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sl/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..f4914bf58
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sl/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Slovenian (https://www.transifex.com/sphinx-doc/teams/36659/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sphinxcontrib.applehelp.pot b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sphinxcontrib.applehelp.pot
new file mode 100644
index 000000000..5797cc435
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sphinxcontrib.applehelp.pot
@@ -0,0 +1,89 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-26 12:47+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in "
+"~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
+
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sr/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sr/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..f75d3a76214bb1c9e5cbddfd6f9aef97f123f827
GIT binary patch
literal 1873
zcmeH{&2Ah;5XT3?hqM9(0#PnGlqDQ&p`MQoapH+L;I%hkv1=@QL4u3bGt;}<$!zzi
zyC=JgBF-FgOpfFkxbOrVc?Ng@P8@gu{yh^rL6LZZj5PC`>i$<(b=6G&dFhQO0j`U<
zui}2}jTf$WUJHT`V807q2G^e1H^HZ{zXJQ?!Y
zUIKpsWAHaH0{;Oo|{okQ&exfyq~(CTAHnIN8(7}E4WiUmnWwJL?R
zw9++Iweurbpd?wlm=w(^>0_PG9Psgob|Yx#*V3@JDpD0R+D`GY7Lxeca534?^8ZED!mHaP1=Gvvz}ER1YK
z2Wp~2Y|^^GS8E|r041;-s@eFW(rCfCBNT3ycE~sHB?lkofAmL2-xIlG2L=097>nAc
zWUHA}OYF)SnK57Qrks?7aTs@wMWu~nBRiD^>(^7u#yX|JX!l_F`R@My@!;g7bM*C?
z?HSQDiS2VIQtHOZHj5M1jVakmZ)|@OZ^to&>{vXIKJLr9_-3Pvp&N4R*w}DoOYSu4
zfA^c=kPdf81KRmd=sS?AX^rM#ALiU(W5MSsod}aju4rTCTxHWJS}Yc!^UKPKScbWt
zNA2cWq4UVW$41w;wr*@k)&Ci`>#KxTbXp7FWS#ipo^=N`aBaQ
Vb;B)0cy(C3IxNl)`xg$Ee*x4WFVp}4

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sr/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sr/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..d2039f968
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sr/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Serbian (https://www.transifex.com/sphinx-doc/teams/36659/sr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: sr\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..e68633b9a72319885021ffc6bde2783fb252011a
GIT binary patch
literal 1895
zcmeH|&5j#I6os3=AXy+F31Y+IM#5pNsQSlAW-^^|$auzq5q22O7^JL5)!k*gpk39f
zs*cA|#14rSE7)ei6Cm*jEO`ecwrt@6IMtn*1V!Qr(o*Z|syesst#jS&KQ6xhQ-JFo
z+#llp(GQ-x-g+enE@AvO_&#{$>39o#g7N3z5c~_g46;|-eTLw>7@vS2fEDQDzX#s~
zpMV#^U%(jr4UE8lz-zcadaccS_(mI7fWD4LpwIgQI0V^+Hg5&``o9Bx-k(9A_gB#8
z{T=jq{{(&Bzd@h(!kca0Eil;Ag&-^EN~$@{xGY71x#g0pf|PbN)3qv6>e}ElQC1{X
zAx?!kQ%)Cx7Jfd{`WuoK>(t%QwJW6Q*|2k8J3(&29j&zb*ij~kXCwv5uGJQ#E1@@v16i-pD9J&7}x~
z2iSC3TSr#7Mj(8#C++fyEKtu(8v(s63va+KHWAcjsU7MG&X;(e`#LK=7eUUI_a@iX
znq;mO&EOk#P2-cF^?Uh+FbpX;n<#b8OZi9?job!vp@c!f&^8`6-UesAXr{ca!OF-+
zbf9KB#38K?1C+paaI=Yp(`dnYAQWzqcE~sHg#e%CfAoh&e=Tyy4hr^_Fc#jY
zWUGZ#r#O`}GGpHF#!gDYIE*_-qSD5(iJi-W4ePmOQ=QUivU@PTySu-CG&(-+9DXrn
zdqy-(V*A{Ql=^Y9&EkahV@fvDo7>mo?Kp;z9f^n1=Y3HZZ#B9Yx-qwoO$}GJ, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Serbian (Latin) (https://www.transifex.com/sphinx-doc/teams/36659/sr%40latin/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: sr@latin\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sv/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sv/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..b7a5069b631eb407eca7f8c53251ada748c75367
GIT binary patch
literal 1799
zcmeH{L2nyH6vwv^I9OCIr3eXec$FHF2+i&~sA;opD&oY22)jgyLFy?Q?>^f@*E6e`
z**NY2skhz>*B&|Z9XKM+z4Zfd;=l*sKf6s@REbYeORJyX%zxf{^Pky$ab@L~2)|2s
zKEv~K2wwYra3P95LVOYY7`*l}z6m}<{4Ll6{{pXq;+-~654?={82kjRz_9)a_#yZV
zyaN6Prr_^j0{#R3fn3+$ZR`HM(ym*1uZ=$iL){qcfq#Ob?&bH}x~pKQ+XF-0BQVr`
z2!^_k!BF=p80!8ChPuzeXx9`>PEEDaQ<_Lsa)Gh=TX*G%mTW!GKYxo>B}xW{=zHV^yG^iLng5DvMyi4w5jnRceoZqVp-4=b_I^PC3e@4&LOZT9V3*
zrU`tbRonO!MnkSJ5yvq_X9K0lWvL!<(a2piWz7~1L)&=RcpIIaMKcs^jTTllqJ2Fv
zF*fOZ6x>=U7@!&H;AXQHPU8s97ee7@S%<>my|Eya`5*m(H9vCh#eN}vVC&$0My{GE
zeTrRqtHvVu-PlRpIE~ZJAy>wFF?3T^h+aK)Vq`Mv4|nzlU+wJe9rlloItSm4#IEJ$
zki?$!oY6+w-4bb6Y^2oP%x-Lbk#40agyN7-RH*x=F1^|4Qs@TKc`>q5yHa`s|L=W2
z7|{KlVV~~&r}SM&^|Z#}VIL>wff%uzXLPjSLb(~O&AhK%mL!YCBK9Gzn(%3yn|ac1
zUKA!zJl446%gxOjTZubK);kAfZDlF$89R3w>8c6c_Qq{$|8B2oy0%T-_0DjA*nedx
zjO*;ePF!y>T2^Sy^Qlj&QYw9$@|m=_x7)R!h+D68p{og7(bu^NcQ&J2W92(vx0i|G
c{W7DT9CJw<@g^#~eZ}9t;^&{}*FFjV0w4b%m;e9(

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sv/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sv/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..4a84da0ad
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/sv/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Swedish (https://www.transifex.com/sphinx-doc/teams/36659/sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ta/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ta/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..c05545b3a2c5ec2d33c43dd9ae8b6b78fbf7cba4
GIT binary patch
literal 1797
zcmeH{PjB2r7{*O099H}-AUJS%D~L!0V|#;|HZDQUCR>QuEg@ZyI7PGeySoFkGuF(w
zo8(;_1hUg^FFVi8T-#Gmw!s|dlA>0
zxPFX-M}E&el_alV{5<#?c=f^fI(Q%BPrw2A7x*eDE_HPV;7b^vg0F)$7}tLfz6{<6
zuYkXRIruA>f&YNNq1M|^cfNmL?$%v;rW?NjM&I|q0r)!@eP4LC^L-19zPG^W`xzL0
z6&QWL1EcQ`VD$YNjJ|(>$$_nyyqX(j<}{N^bA`F(Qksg44K%ZjsS4Wg$;Yf~Ql{cF
zcIV2;f@u-wr`CQ=%Huw5Y}zJN%5C|ycgF^%u#kaP*1QvF$|R>6Qj!GAbtLOrtFo2R6g_KBlP^(p
z+4w-7Lo49e>}hxVR8{C_W*tMXbQJ^GM-isZr3vUKxws|EGWJ=^IVYtwF`LrXYf_~(
zG(&E*;o6+yY^)V;q-jdY`GmHm)ao0qTDec=Y}lb;Xxj|iY?Jf7Xs2SV$;zo#bYx~W
z#Y6g##I#ll0T@O(q}i@T(%6EFg;0b=(WAI|k1dEc|D!*4_A4%fII6@K>^!nB$kz*H
z&hS*hsi}y0w{cQG&C|Sh!nJiljQw0yV$jUJnAn1bdxBR%@xuO)3}C;neOmVJ2=o)Wxo5?8MNNHlEmmZcJ6^ebgN#M)K=|
Z26D=pw$mLrJbA&Nyx, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Tamil (https://www.transifex.com/sphinx-doc/teams/36659/ta/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ta\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/tr/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/tr/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..d353623b97b8f4fe77a396d3b9ba68fa6e565c66
GIT binary patch
literal 1798
zcmeH{L66f$7=}%uJw!!N+N!G5!-vF*T~%W{Td}aFi<<0)cGZNgmVm@*HL<@W1I~;!
zGbWoJ5J%2cd*#+U|AAZ8bC3N2z4X!_(06Qhp+f2}Ad>ZD#_xRZ=Xb{b^U}FrBK$7k
z`U2O_VerQ9!!uFzF~;Y?Pr=Kt#@E5;7=I7;!N0&yK=EE%rw?Al_z3(AtiZ7T8Tb+S
z9J~a+08{WKn1KI)zoFKZv#syn=h}5=-*3mCgTYsTeeicM_+I#+^}PZH-yRrz55eI3
z5DdOg!QlH77<_*PgYO?;v}+0`r)FB|8BL`sxxn0FA$398c$%787a6U&=sPYeQo7({
zwkOK*oM|5BC&oM?<#3hxnn$&pG!|mqpy0JFv&@YDMODHFG+c-b;-`r
z%G6ZVKFpxTlVqqSR@zmvXYzW%+DosDPMRK!g~WMTmao)UYe`mBsq#if6ZBki96dnM
zMeRH}_Kko;vq$aiBUPZEsj&>bDvJ<64@H<-m)fJB==7G%^U!A{XB_2Hhir0Ftw`lY
z(-gVUnr(6lv!PbF5yvq_CljT~WvPDTqLI63#+oe}hPKJD$u>IKi)Jds8ZE7AMEiPb
zVmzetQAlg45P)WsLz>N6B#kXNT?mDrXB`Tg_tt`7^FR6nYaVj$#eN~~vvtTmBUjCp
zKE_jdt0p4k-NZ@VIE~ZJAy>wFF>*6ih<-hDVr()RjC%XSZ+d%shl9I!I|o0E#jfRM
zlf<6%oY7|5-4#F1_C9Qs{=#c`>$9yHa|C{BPeI
z4(U#BG@!5lV|@!!J*%;K8F_m;5M!2$jK;Nnq}-g==iXN?OOoYs8T(LHP5C&^%_36?_#rNyz`sr^*kc&!UfP1%Zp&P_P78QqvD-}$yZON{7O
a8TI9aOWKUL;PCDZfA@x;excv^BK!+mMj&, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Turkish (https://www.transifex.com/sphinx-doc/teams/36659/tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: tr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..fb2dc1f5026660965d077b196994a8a2e79891cd
GIT binary patch
literal 2039
zcmeHI-EJF27+wA)3j`D@ZV>t^krE5-pPQuhHV)W{3lVl3r4AC}A{y_G?IG)#WoEXH
zQN;~6JOFUnXW$-j#RYGHxaPVKz?t2|NfpEsbfwkVZ{~d8`S#4r?qAnl{@KIzChqrf
z|Kx&8*Xu8M-aClj0A2^)IE!xspCJAM*aQ9pd>81ySl8(R-$Hy0d=FRvUH*^2w}DT9
z*MPqQBj6vv5cm}M8}1KZs&)T>j
zehqZG-vXWP4?w5;3()EQ3G{YV#>t4O6mm)vCUTx(Y(8f)BdIJ+R4KEB){OT#&kGVV
zV$;BJgu#((q=+8P0+ZnEGIi-mKI8WWNFNajdKhsdL;OQgr!pE
z+!$J_l8Vy05!CoT9Eh=IdKvDiw48HknH5TgRS!yoVl2z^Gd6NHv7*RDTG42Xo^u{}
zU!mx{G?omv6@j~EkL&4Uk)fZ7(j0t|XU>2wig2n`N{fEH)f7up*Jr_|+)J5s-lVEn
zl1P=L34Eh9UHRljT`e~e1Oa*H1G!3BF23VgMK|7*ORmu{xRr;Mx8C_$R71{IZ=pp+
z+Lsd*;3bXqoLdV410+W|xLM`GX)M7i5ez#^8srx5N`jO5AO3+>-|*D>`
z|M!jt1G?WG_G$YW=^aqzw8Y{iRGu6kbyu-J;%uJK(TQe43MOg2e&kJBpIKX&Bn%ge
zMPQwZnDEmeRr9d+!p~G1TI8GX*4EZ$JFH5F&Bj4qYL@%=l%AV}WKo5tvvHT|$Id#=
z3B}auP((LxQWZrmj4#57ZXk~76L3)EzY=yj)VfHZ?GA0Yu&y3Ov`uk~9zQ;-AJGoQ
z8%-39uM|8>K?{*fI1hI^o6pp5H!sbiUI+cH`iEX8-k_#aXeD&3*%O*}
z?Std&kCp|N!tzra7CD^1OX-YhoYPKeC;puap0jaj7;sTFKN;rS=+`6q4lOS<$4{1, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Ukrainian (Ukraine) (https://www.transifex.com/sphinx-doc/teams/36659/uk_UA/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: uk_UA\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ur/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ur/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..251703cb92274a2b0e4b5ce62dec56cc4f933b28
GIT binary patch
literal 1796
zcmeH{PjA#l7{(2y99Bi;Pb)4xyi|>v2#xJcMIfeWn@yGybr+(rRO%_3wcp*H);nX(
zjM;1toO|p6u3Y*B`W<>foH_FWkb3I}=rcA6AS6BkD_Ost@iXu9`kAp`Ts-qQ!tYaD
zU*LKa25Y2H&e-4}1m&-*abM-!H-7`#l(Z_rc&h
z1B35FF!=rn2H(HH;QJhmc1*$K)Kn`yrHND}7nqyRr7lPtPZLw?BBK=--R80)r3*e{
zd#oJIm}X&qY|L+@9PZP~s;PaU?3#-^cZ_H9GwEqz^w*xoOmbXe%FqMF3sRnHU9xku
zG&NPV4>PFoFd3+^m3Eozn!KK~_R=e(lcon_A#q-o&s=SfW7(JI9N57!x
zymp=(`$oW_*~9ksp(@bN#8`%2l|=|(8%3B}m)fJB=;W5n^U!A{ryS){hir0FElK4@
z(*(KEifwWVv!PbF5yvq_#}lQ=WvPDWqLI63%9<@2hPKJD$u>IPi)Jds8ZE49M0N6B#kXNSqO!nWgQBe_s)V~^B(=aHNSH1#agSA8zjre%RjKJ?P)N*V(^25<8Zg
zO%l7(b4KfFcT=QYv7SQ6t|3>yNq>x{=Z82I_=*#nwPpVQXeUtK;v^ca|wV#L^uXUlT30u+Exd{h0qZ?!8J3qE3i4puV
aqn;ddN$c?j96r3?AKvei@ADhqgZ}{<%O5ZR

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ur/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ur/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..4858f710b
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/ur/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Urdu (https://www.transifex.com/sphinx-doc/teams/36659/ur/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ur\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/vi/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/vi/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..d9a4566c71a175fcf6be2cbddb3f764e90ef8fd4
GIT binary patch
literal 1795
zcmeH{L2uMX7=}$tdsu;Jp|qDCKBPv4qOrX}1Y!tkHd$!YU5LVh)KfHTf4e)acgC6-
zXS0>sb8lSel|z3)|3eRmGk1Of>ajnd@7N@OkoX0xWIa3McfR-YJ7d2%d-Bf+zcaYL
z#`QQ1-uRt55k==PJ`J7+FT5IG1D|00BiI99f?t5*qqa^D{0!rL@GGza!}>qK&%r0)
zS@3T#1^)pP@IUY=YJKx@>-+D?c3t#IJN^<3zTbg8@EI6
zBjsquGz;@%V}2p!aGzE#n%Wo2UUG5guJKHMCOs{T{?^l&NsdcQ89GqBAmypnB|Aq;
zQ&Uy@FoPPuCj&LM(k_#2lh
zjE8hS3TZ7A0?>?dNV8dsq_G9Z3!(6{tV3b*-dPZA-lN~O=4Z~m*eS$Awhq~6eW(r*YcZE377b7dRE2THc|Mr8y
zfbMP%`*iay>syfOX^qXxaPp1^V#IQu(L=>v%Q-uyi!<*lmnF$!v50-BtR{RI=VqR?
z&o2s-CmzdOa%FAp>UwgZl1rW4vbM4mw~d{ue!P
z9BnaLR%pxfp--w(Dt&|UnY1{w8?~Q^>#ud8oe5jf*SQJjHKXfer{@#p!C&%ysQjvyld

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/vi/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/vi/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..155be2482
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/vi/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Vietnamese (https://www.transifex.com/sphinx-doc/teams/36659/vi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..bd6c26a19e07851ac2f8bc2223676c7c4a6e5403
GIT binary patch
literal 1817
zcmcIk&2Jk;6kk5d!2$sV1P6qs5)p}Dz3ZT+^|nFH7Z8z@kXlGRMdRJEJ+Pix?aszY
z4=AM#NdqZVB&8xH3N)>PL`+bkDvFbEK>QD!5CZSo<r@(#;@EO2E4f_b-BG_*Mb_4zi_%xvUU|gpg
z@CmR-0G|bP0A>C(;FExhfCmBB0Cm8h05!nB0Dps8FFq8<4;+Z=J_q;$#8trW00#iO
z0sn5qk3XU)2<&$NWnC9g_MHTjeZK;feb*cDp8*en{R^P1`wyVf!!3e5nrD>dQ4Uj^
zSl}xbF|!ck0_C{RECaQ8%A3S?5M>q_BkmqEQy{1y{aMc6N7REjYH8)Zu&CSSB@-vP
zAV?IjKqbyz5-3X$&f4JOXq1u?q5}EMCZ31JxsM!QNDtKbKpUW07rWzHFE{-nVFC-v
znHJ5!U7&aZ+jfHuxh}$vV^cGtp)Aa7lcaJQiWYrOAdiTMK;*C^ad?DUFi(!V1o+gp
zqySw|grK;KFJK;JKZH$F>MhQB2IFHYRt*5j8nOInWKYxRFlMD{IL>GMPlmp2OxQ
zw&@vSMRZTe6GmJZ7`Ty!k+#a-E+UtdRVleNBK5NzPr@NRp-8n#6a-)d%7L0uE+`Ev
z*iQt8C>RMOmv>i!Y;zy}kjvjArcnDW^;6zt%?{MF#Q;DIsGir}Zq9v)lSP%oX>#4M=r_^>G
zr86i7it^-jWCZkmLy_=^WiFi8j2Cyg8jEk9PW5GfH)09!nP!CLsj>8(jNTt*5
zCu}-Ok|r;{_Da+d5?S7dRT}6_VWj8ezO7~mE*eoj@d#>_g>V~cEePRwhNhKDrKFJk
zXpW4@f?BMKYH?E&kn3r$c61z0Yf)LPEiq*KF1FRzxm)xM#GJ_VI#b6`{BNh880;VH
zyQ4CwndkwH;m)g>aR(+8WK3v|jVU{Z%mQ}dGI#nSryjk-lN05LtM)OI%ZqHFqgg5v
zZ^So@z(U3i)Qz*mM(xQC=%7?9*J?{=Ypc7#XS2cb5A}`fN^ohXT3N1c&IYSjf~zaH
zx4(po6E2<)DqF#3Ihgr2ygXH{+^lVU6Kv1#H0O8iviTaJR;mizpWVz|J`@aUY
zg>tYnU)}sToW2}h`93ILs9&3etYB*n%7(Ka)hd_bAsT0C{K%V+RNwtPnA!?1%mzPB
z-uk*yFYnfN%J+IO?)@CZrwNv4gXx>W!fv=U6)OcVLM&o)==X^m@b`Z_3h`pX)#c`+
S#d5+J30P)h-Az0DPxxOoK%s#E

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..110e1ed70
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,98 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+# Translators:
+# Yinian Chin , 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Last-Translator: Yinian Chin , 2019\n"
+"Language-Team: Chinese (China) (https://www.transifex.com/sphinx-doc/teams/36659/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr "构建帮助文件索引失败"
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr "代码签名失败"
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+"帮助文件存放在 %(outdir)s 中。\n"
+"注意你现在无法直接调用它,你需要把它放到 ~/Library/Documentation/Help 目录下或是安装到应用捆绑中。"
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr "构建 Apple 帮助文件输出前必须设置 applehelp_bundle_id"
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr "复制图标……"
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr "无法复制图标文件 %r:%s"
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+"索引此帮助文件需要:\n"
+"%s"
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr "命令不存在:%s"
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
+"签名帮助文件需要:\n"
+"%s"
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.applehelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.applehelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..67a77c0fa609cc141a9c6c0004fb080b1ccf70a3
GIT binary patch
literal 1807
zcmeH{L66%+7={hB9HOGq0)hjFkBSw$LSs9Nns!|lvDr=Ag`}*uDF|^`P3$kpw9bq*
zGj29LaE3dakopr4|AC)?dTsALbKuB3c6VD;iC@r2){_~(^Sz(n8T;|YGrvaooyYYd
zu3y67h2Oc?qUarr-vZwQKYBL40zSm}Yp@SK1>Xh5>usGr_%_Bz;QL?&hV?&z7r=+$
zMeq+W1^)yS@Ne)h)cW|1*7u(??YeVk+wmnZ`1Zg)_y`QXAH3Q63NZM71qR>RC3
zO;zo~3~KzC4AsO+yGr&6Ot*(}S^)I4{fcnHp;?$*L+<-pFWzo=c9S?@@G7
zJ5P>%BjC{NQG5GH73gPbEJLr#A_TC5B22AI?a@zkdQ0Yc=(CbDj&i9(Ho2)*q;jKa
ziri?;HaUgaP%GSs@30kN&`#yPSKmUx;tnI%J=btL91{
z{@JNv^gclP!U2e)r`4!#+SUCYfT
zi9P8#qs_FtCDN|gOsU(;E^mFBZlx)N;*jsF;QO*Jz0&AX=!VjHF}6~>QhI~@uiqIC
z>DJC@K%f7|`U^<)tj6YL^k9B8{_b=v#w-^Z?c&+kF|CiKT1ve^>vQibmnF$^xr}|V
zP*XmRbF)a=AVgvE#AC5bKI`=^ZzWCLWTSIX)>f9{y0HtFk*=Dd+wNYY_V0Gu8SRe-
z&x1vPon6F=V=l(43N3m*_DNMrrLR#wmlo%DyY^FY^|>x|G-WFWIyd3$W^{F;eCI}c
es2F>&%BU|VT+(LTgTt#={ne{}`l){5)9^2bmn3um

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.applehelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.applehelp.po
new file mode 100644
index 000000000..d2bb0f35e
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.applehelp.po
@@ -0,0 +1,88 @@
+# Translations template for sphinxcontrib-applehelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-applehelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-applehelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 16:59+0900\n"
+"PO-Revision-Date: 2019-01-20 07:59+0000\n"
+"Language-Team: Chinese (Taiwan) (https://www.transifex.com/sphinx-doc/teams/36659/zh_TW/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: zh_TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/applehelp/__init__.py:39
+msgid "Help indexer failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:43
+msgid "Code signing failed"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:52
+#, python-format
+msgid ""
+"The help book is in %(outdir)s.\n"
+"Note that won't be able to view it unless you put it in ~/Library/Documentation/Help or install it in your application bundle."
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:79
+msgid "You must set applehelp_bundle_id before building Apple Help output"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:96
+msgid "copying localized files"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:123
+msgid "writing Info.plist"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:161
+msgid "copying icon... "
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:165
+#, python-format
+msgid "cannot copy icon file %r: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:167
+msgid "building access page"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:177
+msgid "generating help index"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:201
+#, python-format
+msgid ""
+"you will need to index this help book with:\n"
+"  %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:207
+#: sphinxcontrib/applehelp/__init__.py:232
+#, python-format
+msgid "Command not found: %s"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:211
+msgid "signing help book"
+msgstr ""
+
+#: sphinxcontrib/applehelp/__init__.py:226
+#, python-format
+msgid ""
+"you will need to sign this help book with:\n"
+"  %s"
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/py.typed b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/py.typed
new file mode 100644
index 000000000..e69de29bb
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/templates/_access.html_t b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/templates/_access.html_t
new file mode 100644
index 000000000..aa6b2dcc4
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/applehelp/templates/_access.html_t
@@ -0,0 +1,12 @@
+
+
+  
+    {{ title|e }}
+    
+    
+    
+  
+  
+  
+
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/__init__.py
new file mode 100644
index 000000000..aaefaec09
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/__init__.py
@@ -0,0 +1,143 @@
+"""Build HTML documentation and Devhelp_ support files.
+
+.. _Devhelp: https://wiki.gnome.org/Apps/Devhelp
+"""
+
+from __future__ import annotations
+
+import gzip
+import os
+import re
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from docutils import nodes
+from sphinx import addnodes
+from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.environment.adapters.indexentries import IndexEntries
+from sphinx.locale import get_translation
+from sphinx.util import logging
+from sphinx.util.nodes import NodeMatcher
+from sphinx.util.osutil import make_filename
+
+if TYPE_CHECKING:
+    from sphinx.application import Sphinx
+
+import xml.etree.ElementTree as etree
+
+__version__ = '2.0.0'
+__version_info__ = (2, 0, 0)
+
+logger = logging.getLogger(__name__)
+__ = get_translation(__name__, 'console')
+
+package_dir = path.abspath(path.dirname(__file__))
+
+
+class DevhelpBuilder(StandaloneHTMLBuilder):
+    """
+    Builder that also outputs GNOME Devhelp file.
+    """
+    name = 'devhelp'
+    epilog = __('To view the help file:\n'
+                '$ mkdir -p $HOME/.local/share/devhelp/books\n'
+                '$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n'
+                '$ devhelp')
+
+    # don't copy the reST source
+    copysource = False
+    supported_image_types = ['image/png', 'image/gif', 'image/jpeg']
+
+    # don't add links
+    add_permalinks = False
+    # don't add sidebar etc.
+    embedded = True
+
+    def init(self) -> None:
+        super().init()
+        self.out_suffix = '.html'
+        self.link_suffix = '.html'
+
+    def handle_finish(self) -> None:
+        self.build_devhelp(self.outdir, self.config.devhelp_basename)
+
+    def build_devhelp(self, outdir: str | os.PathLike[str], outname: str) -> None:
+        logger.info(__('dumping devhelp index...'))
+
+        # Basic info
+        root = etree.Element('book',
+                             title=self.config.html_title,
+                             name=self.config.project,
+                             link="index.html",
+                             version=self.config.version)
+        tree = etree.ElementTree(root)
+
+        # TOC
+        chapters = etree.SubElement(root, 'chapters')
+
+        tocdoc = self.env.get_and_resolve_doctree(
+            self.config.master_doc, self, prune_toctrees=False)
+
+        def write_toc(node: nodes.Node, parent: etree.Element) -> None:
+            if isinstance(node, (addnodes.compact_paragraph, nodes.bullet_list)):
+                for subnode in node:
+                    write_toc(subnode, parent)
+            elif isinstance(node, nodes.list_item):
+                item = etree.SubElement(parent, 'sub')
+                for subnode in node:
+                    write_toc(subnode, item)
+            elif isinstance(node, nodes.reference):
+                parent.attrib['link'] = node['refuri']
+                parent.attrib['name'] = node.astext()
+
+        matcher = NodeMatcher(addnodes.compact_paragraph, toctree=Any)
+        for node in tocdoc.findall(matcher):
+            write_toc(node, chapters)
+
+        # Index
+        functions = etree.SubElement(root, 'functions')
+        index = IndexEntries(self.env).create_index(self)
+
+        def write_index(title: str, refs: list[Any], subitems: Any) -> None:
+            if len(refs) == 0:
+                pass
+            elif len(refs) == 1:
+                etree.SubElement(functions, 'function',
+                                 name=title, link=refs[0][1])
+            else:
+                for i, ref in enumerate(refs):
+                    etree.SubElement(functions, 'function',
+                                     name="[%d] %s" % (i, title),
+                                     link=ref[1])
+
+            if subitems:
+                parent_title = re.sub(r'\s*\(.*\)\s*$', '', title)
+                for subitem in subitems:
+                    write_index(f'{parent_title} {subitem[0]}',
+                                subitem[1], [])
+
+        for (_group_key, group) in index:
+            for title, (refs, subitems, _category_key) in group:
+                write_index(title, refs, subitems)
+
+        # Dump the XML file
+        xmlfile = path.join(outdir, outname + '.devhelp.gz')
+        with gzip.GzipFile(filename=xmlfile, mode='w', mtime=0) as f:
+            tree.write(f, 'utf-8')
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+    app.require_sphinx('5.0')
+    app.setup_extension('sphinx.builders.html')
+    app.add_builder(DevhelpBuilder)
+    app.add_message_catalog(__name__, path.join(package_dir, 'locales'))
+
+    app.add_config_value('devhelp_basename',
+                         lambda self: make_filename(self.project),
+                         'devhelp')
+
+    return {
+        'version': __version__,
+        'parallel_read_safe': True,
+        'parallel_write_safe': True,
+    }
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..de018666f9a0dd024abad777e16b84238107bdba
GIT binary patch
literal 7361
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
ts7-6LM/LC_MESSAGES/sphinxcontrib.devhelp.po
+minimum_perc = 0
+source_file = sphinxcontrib.devhelp.pot
+source_lang = en
+type = PO
+
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ar/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ar/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..a0914790d18ef285bbaf5f25a9c742c75b6458aa
GIT binary patch
literal 959
zcmdT?!EO^V5RHJ-9uWs5ILslf8dY9m+VB_R97q>1S}@
z7x*mr4UWu`LJAkojP&F;o;NcZkH0>B^0|ig81WL(uAB!pME(hpAf6+>AznPH)xP6d
z-9N*`>i$brV4`6q#Twi~z(V8&%w#S?uMW%GOd22s)ZbnuG4*qu@|@ZQH-ctjRcYx|
z>syQ3Tmi9AAARi8y#rl3%xs|lk3`fKM&F3kHL4=_MQd5PETo$M@oFI~`u;3#aj4;h*_v`g
zXZRSYUefL4B-1H%m||(G(>dx=ZfL_B<)z^{xzuK9Lr}#}*G8Qa*wRQv5rbF20HaY9
zAPu&(iL_bKy@0W^s0I7`TYee^RYq$U3xWs1ZWn`X3?6yOAc=Pi!c}+|xE`VKS?&rP
z)`^XyMb4!j2!QD)u1zBNUTzw;a>>hcq*OuMkrx$N4U+q5YG8j, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Arabic (https://www.transifex.com/sphinx-doc/teams/36659/ar/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ar\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/bn/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/bn/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..570300ff541ff1a744a724bf231eaa1e8f4798a4
GIT binary patch
literal 877
zcmdT?O^?$s5G^049652|Fi1sewQ`(vyVcf95#4PTDm84?4RCf6H}!66N4C>;e+CEs
z5I6n={0)vw=)wXQ&W!YAkM-t_=h4|U@1$%yf&<_b7_E7(0+XpN7OHM#!G5f+z6VBO~a+B
z*4Gxfr2=B1J%2x;&pNtxSlPw=ABD)RjJ^_?>oy{{qOH7MS5g%}bC4<*JKy(P^F5hN
zbMj6YE45-^tCdu{Oe<$(N^T_}^aDTe7NXL|k=Pb8C#Q8`Nun7<@pw9WIi5@w(dDH#
zzevcL5!|5~nQ$i<^n!3mf{^qA2m;nWJP3wCfJCwo8`*UIix&?RTVWauw|-#B_t7i&EQn1f|n9HE9WZ9DBW(izH4OV
z65Yu3n(jv@xz4D=8cPocgQFo$743TSvNpUV=i00-16BPoQn!H

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/bn/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/bn/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..af93c511c
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/bn/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Bengali (https://www.transifex.com/sphinx-doc/teams/36659/bn/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: bn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ca/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ca/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..bea11962e0970b1b9153d4945939ae6107deb57e
GIT binary patch
literal 877
zcmdT?%We}f6b+BnELpK&aglzAJks=-=z9K%~Yc#&$
zx8DDBf4`sA2AP446kG5s0V|j4#(q*Hg}ZFgf+u-D$5l)Gj{D5=<)}3gU$);mxGpurvr%FK{`p3
zyErkpV1!``jhDD7@n~M`JS`QM`UG-(d?);%@(Xf&r>jr35SAo5HwC^NgX6jM!7HJK
W#Y8dt8wRI*E);aa9!~h5e!A~`whA5q

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ca/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ca/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..efd895c40
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ca/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Catalan (https://www.transifex.com/sphinx-doc/teams/36659/ca/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ca\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/cs/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/cs/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..bc25ea36ffb7722e3fd702e888b3a1a9fde9599b
GIT binary patch
literal 955
zcmdT?&2AGh5RQP;o)8x}a2TYtN>q96P12}wyM;7KAySq`X@K))*U6f0?3L~Ol(*o(
z3-Dm@8XTEz3gzd(nUOwu#{Rw;jc2|*dhn@&b|3K+(JF&qY=r(tM1**P_=%P#wSP)4iHrIaJm${)Z5`h0*Ut;_79R+oY9rwJfAs{D?uSRBV0UuZ(wO
zGEB)^VXV}OgDok)NzaJbVK&l_o#4=5L5Hw_G#D_(Tg?O3VGN06BG$63`UfxQKyb)gtpkSUjbiJ_
z)Wpi>vD1db`J2%QUU#Dbocvb$6sc;liWgWiu|ESc74eco?}JD(sAbL-mQ%XfY=yL@(*CagyqUI#gKNY_|_PG_kbqjq{a>b8@cD(sEG6O=!c`G3?y1rXUO(co@4I0mnWqY(, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Czech (https://www.transifex.com/sphinx-doc/teams/36659/cs/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: cs\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/cy/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/cy/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..2cabbfed50d121a0513511a54b8a5cb438830f7f
GIT binary patch
literal 920
zcmdT?O>fgc5DgzEA31U0Fi4?lRIS%e(kR*1K-#zvDW*{x=-IJ1@lt2k+Fj@4#Bboh
z--BPkjRQxNtCo&%*d?;_^#)A&V(0ATN0UtNXc2bFl4G2gi(Judf6WgCgIhU
zGrpXXbIoImZe$Q!&YvPK>4E35cI(LNc^(SMgs()^^)H>@1OJ${+eaRTGm4ER
zQyoi_$5v?u7jH)+c+-zUIQ^sbbCk+O885J9vi(KKl*da3*E}~F9A?%QhEcj+uU%W2
ziaG8gQA@fXoTMtD7Ap*GbvnmAnrvyq8Rw;rb8?~d(lC(4j+&r-0{b*LltJJ(;01WV
zpd!tR_&Wkm1L(rR0mv%zcd{n_X*tm_3hy?LJ9f@-?_A=%+XAPsd}C>m$3mV!g73s|
w8, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Welsh (https://www.transifex.com/sphinx-doc/teams/36659/cy/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: cy\n"
+"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/da/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/da/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..2254d70607a152e3e1341b46bfa3140fbb9f2143
GIT binary patch
literal 876
zcmdT?%We}f6b+BnELpK&aglq4Iksux;z9K%~Yc#&$
zx8DDBf4@Jg4dw}(_dM%QkKSglDL)1$Z555WNtXb$#6V*IUJ2HeEcnb}%g}D++RM?AmeA, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Danish (https://www.transifex.com/sphinx-doc/teams/36659/da/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: da\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/de/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/de/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..332cb86ac60bd8838ac9c89b34aa05e06c02ca5a
GIT binary patch
literal 876
zcmdT?O>Yx15Dg!vJ#yl}VUU89sPfvIrcvV(MA~diq%4h^0B2{{NlbU`mF-Q^pTU72
z#EoA8e}f~lq)_0(nUS9CvEIC~-}uX;haVdl4-iif-8%U#Cb<8ANDz+^UlE`0H5%V=
zt, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: German (https://www.transifex.com/sphinx-doc/teams/36659/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/el/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/el/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..8757ffe04cd7a6c135060b25b6194849940e74e2
GIT binary patch
literal 875
zcmdT?%We}f6b+BnELpK&agl=5sPcFwO`~Q?5NR_lkuo$&1FW5yo5aMiN4E3mXRzRZ
z*zp(e8!Wj)3I#T-xzf@2Sm&N=AJ3OZ4?otZ9uS@oS{3=NhP3`b$Ow-KUkRV@)oS19
zTkU_kzuzBM1``7tiCgdsgaxV+W>R4i)M2$Oqy<(&{nb^L@=%#vDDD=*A}?@LY5CNc
zr6aAr!>AKQBxGaU$ZG0ey0`=JanfoXMpVI2IL{_l
zXs3iXHi3&b!y&xxWhp%WWAqD>>iJsCX(Xy&giTPa61cR8OE_3~U%G_z?RFdb%2duM
zi`=aE{^G1KIrr4z_))uk+~KHrBN(Z*6^dOLyK)KW@&|R@<|*u#-2)9zyAU^mY>=gQ
zVNz_tIYo(@u5eS*!94CfFO`t`6moichrYY^Gj?*Pt4=jT%Tk@2g5E8Gld1H, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Greek (https://www.transifex.com/sphinx-doc/teams/36659/el/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: el\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/eo/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/eo/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..705428ce85f847b60b522f0130ad4939e7a0342b
GIT binary patch
literal 879
zcmdT?%Wl&^6b+A+m#kQ@xJW@tRE@_@)2ML?B5hoV6w@dTWj(QPlA-pDH8W1q&tSnH
zvEv`$H&}8_3I#T-xzds6jLtpxG5+%C;l~EW1HuzRwEgw7ub3E?r}E8+9KM&lcO
z>-$gl_xD$|!Cb>e;uhQ*VU2kSOPOQjHKDl9qybh!^Yuj%b3fOq$hln$gFM4ct>p`?
zuPteF1nbKqG7R0bw+O&!SO;m?-eQ<
W!Xa({CW2G3z#KY$k1G66zuk9If(t, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Esperanto (https://www.transifex.com/sphinx-doc/teams/36659/eo/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: eo\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/es/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/es/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..03dfe8634bafb6233ac59cff33662b2a9e49783b
GIT binary patch
literal 877
zcmdT?L2uJA7%hxbj+{8`@F5kc)#Nzox@z?(qFXbl)Uc`zaCQ^7@s`?=?X=y`;J_c^
z#-D({!I3X?FyO+OPkM@<^}hGn&-wEB(Z>eX0pbwRt;ugS!Sx43jCg|hiunAX(fEen
zdjHeI{eDs#BpNnSY{BIMa#579l!ahk6V^AGG(bvdzP^eh>K8iY1+_Uhf@WeduSM$GwaJ}nBdgY>RI8sHq{_t3_x;9nFDB!R
zyc5Pstr*xcmui=4<&0dAI|~T?zz@8cD7A4Uwkw&D^J-;Dq8UW-a6EZA9F1nteC|!J
z5^`Y#cj!h&+zAGqAncPMB%J_)fOU_Lf_@O7kj%tJ)>Hq|g?$K5Shsr=V0ja69Z3vV
zw%|@12A6Lq6L>R>BY6JD=octetBS91q_DpTNd#Xrn3r5hn?oyiuC$EO?RM+C+Ey+x
zja0Ac{^}&tDRtOm>2a@j(x<}Gwl^&*!wYh$&Dt_h, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Spanish (https://www.transifex.com/sphinx-doc/teams/36659/es/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: es\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/et/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/et/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..200b4047776eca07ca590f50d9a9b70e70d48069
GIT binary patch
literal 885
zcmd5)O^*^m5XFzv96fpPP$rl_)}9_%mMpVkmR(RuAWMMg#Y;0&Kub^eq`L>$f1w9|
zl{bHY{tb`TEURn0c(sz3shYfcRsFiZJ$m@LLh*p`gwQIBKVn4rC&HNUnDCwO^iA!Z@fxwn?Q0mP7T;)p)=|WfGydTMLUk#cj#u
z3u88pxJm!i^!xO^@3J~7%`xnQ>v&)F_?WXdjzm1A=g!(iMSj?R1i{&X;#
z1(T~eyR;}gsjZXF**ohTwAo8nfMQ~%;MI?yyJFx(0Yv&<-|;f2{0>YTD-A0obdelv?&^r{dm8jb#U!R9D3+SYlarO;4Y
zd!M_Q^WAP2`chvm$(F=q{NMpgO~O4jIey%3pL95SUJoX!utKp{#%3-Co!^wM+dP9q
z+O27L+J#0v7!SvTJ73Ac;F4TLO{cleX*Z91&vPZDK7)i_fkWRd{F0sC@ye~1XxTs~
xCZ#Kk;dCK=@ESE*vX(C4I))3eKn2aPO%p1;g, 2019.
+# 
+# Translators:
+# Ivar Smolin , 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Last-Translator: Ivar Smolin , 2019\n"
+"Language-Team: Estonian (https://www.transifex.com/sphinx-doc/teams/36659/et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+"Abifaili vaatamiseks:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/eu/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/eu/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..dd5466c9551e12b9d995ba8cb12eb2c8b865c74d
GIT binary patch
literal 876
zcmdT?O>Yx15Dg!vJ#yl}VUU89sPcL@O`~Q@5NWf8NZB?@0-T-QNn*OO7u%bpKZ655
zh#S8G{su>8NlSqXXGVIm$9nU|^X#vW9)7A(JRm$Fw5#N|7}5SCAt5{_d?S3hSF3%e
zwL1TNe}6u$1ZEmG61U)12rJABSjZeBuMX?0Od4PX)L&mFG52$wik#b(Fvv69R9rsS
z`pObFSHLXP$L|LGSwokODw~x5qma0T(eE*J%}V4(w3e0YLaOC$4pL>f^L@WI-jmrd
zV{g$|sZ|8FSV^@@wQ@$z*^LB*e&7e*1Pg5(OYBl+?6h23Hq#NrNq;zc*&hrh@pS5q
zFK6t`pm3zd2Et(ktsv~OAY`oof*@)i9t7PWAR?RKMpj+_;)PuZkD_+_AfWI@!a6oH
zLfKq6Z6Y{-GaA7~KZ)V_AFW>yRV_=gq?TCzO4tm=I)YPSKa>cKm2-uSINxr!zN=K_
zg3L(un(rrPnNGQ*63Y)eoue+tk~h6^UK)|Jb8Xf(0#*D>ZLf6#`)#kG;As!Srk4zp
z_|8r8%{wD6QPB+71>MZy&ha7_Qk_6bZ*S4{O1EIgcf9IW3p6ZNsm|!(A~>E)=e28N&;0, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Basque (https://www.transifex.com/sphinx-doc/teams/36659/eu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: eu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fa/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fa/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..d1413652452777f8df6c8989f5dfdaff0b75aaab
GIT binary patch
literal 876
zcmdT?O>Yx15Dg!vJ#yl}VGcn`RC(=9)2MMt)wJ0{q%4in0B2{{o0x9wmF-Q^pTU72
z#EoA8e}f~lq)_0(nUS9CvEID#Jp0R&#~&LQj}Xrg-8%U#Cb<8ANDxmEUlE@lG#cM<
zt~P(AyABD&*t$8m~->yaOL>pPPE|p&X%t7f)?!qu^O!s6m
z&d6J7oidt(D_2VIQlq_93vwp`QOH6T%w%b-Cy86CjGR|XN9Kk@oD9d4v*Bnoi?6SP
z>D8QESSdWJk&*C{Lx)9u!XnaPz!>iy9z^gv_N_bC}ix3JtB5_od^MZnxXe*Rm={
zH&U~v`_V~eQtGkB(ZgQvs84f2+rhM`tSHE(v1`Xcmp@WB=$ycQJ7{S*g{U1Q<0QU!
z6MYLV&`YUthT9Tv=H<@QvJgt2K#Fhgq#sm1C&%}^`ck>HB-W|P@ZmTdFO&~nN-ZrK
Viq_w9I2Q|9Kqu^BhyUr%eFxhO3LgLf

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fa/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fa/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..db12615eb
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fa/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Persian (https://www.transifex.com/sphinx-doc/teams/36659/fa/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: fa\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fi/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fi/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..6957117e9a1d307e8ecbd4568acf4aef82ff277c
GIT binary patch
literal 877
zcmdT?%Z}496fKWcmaJH?xJX56HFBJEI@Q!e5uIrUDm6^i39xn(r}0c`N4C>;K7$26
z#EzeU-(blN9T;H4nkyZ}$2#|1`#4`7J^a|hdVqL>=r`oIn&J8bB1Sw$d_{b|*J^#k
zZ?pgD{(e7c3=$0+DYoDW0fi_l$Ym***M{|VCJm4Z+OIF-i29{Yc}Z=-ji8y>G+MgU
z`r4wlR6s1W=kF)aAYoj5t0bL#xALpv;}ku=PJu6-EOzOYiwnX
zX{35h_g5#GPN~BlOAiNwqan>D?RxXFHoPR~+N>=DRsEoL)H{Lwa@0}qbOd47i>GmP
z7bgbione?l;U#V=Jem_bN2`)cbpk0qz7=j%yPO=~>6%mJ!jMR%I>VP^aJ-bxdnJ@G
Wm?&m{!{C%JMF~BBfD`_wpYA)w+6qqq

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fi/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fi/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..a636afb1c
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fi/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Finnish (https://www.transifex.com/sphinx-doc/teams/36659/fi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: fi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fr/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fr/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..2daf3a948218b9fdb537c2c2ba2bfe72eab17fd8
GIT binary patch
literal 901
zcmb_a%Wl&^6b+A+m#kQ@xQiefmGL-fS~XKr^$`~$B{WJ6tS9z3o^~>0&5WD$Ggz?W
z5BLl|fE`Qt4VGLtg(5b9#FdVGuXXN2XU>-g_un-z?jar_x^?kOj4*$T7$Y7cz9K%~
zX*9m!_dVj%-SvM}4@eALO0fiA2q=UqA(u+9pb3kMOj;l%G+&&KV;U-xaz$Oit)Q8>
zthsb%%!Na)(m)(ECvOJy@rJ29cDAtoLnCraYtBXLTlJ8ep^dCslv2-s)F5>xR$&-6
zCTlVoX5_W7P8!X?m4(!+)M#(zjNFWXb{K_GFcqb-o{ZgGX5^@vJCYa%@%V5!Iyf8*
zrt#TXFgZ=gu@&6oG&0~`Fz7_>9*Nqd6G0TQ?$&11iy|bFskoH&*57#T9<;Yvx4Ri(
z1S9S|Ni5e+ac?Yx(c!CU{4#+lFAM(hgMw#@S5|0$AhpQC-0nZUUWuK0Uhz3zklUXH
zNd#XoIKhUrfQ`cY(lJVx%Vp^6B{D~CQnR3IAxLIY>aoSqt(~3i9?dOn1rt?SuE>e8
z3&%j0*QM)s_F$d%H#F=+yA_OwuvR53V4W${*$T$Om37b{Oo#iibZ6rJFN?^ix2
zySKdhs9abQ>(pfUj0|>X(g)9l78d2jhqz*J#AiZ5C)~jejftr&deBu|Nhd5QfgVf?
ViD~wP%S-@+f3V~KaN}Q?@jL#?6|DdO

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fr/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fr/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..0597c19fa
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/fr/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,40 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+# Translators:
+# LAURENT Raphaël , 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Last-Translator: LAURENT Raphaël , 2019\n"
+"Language-Team: French (https://www.transifex.com/sphinx-doc/teams/36659/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+"Pour visualiser le fichier d'aide : $ mkdir -p "
+"$HOME/.local/share/devhelp/books$ ln -s $PWD/%(outdir)s "
+"$HOME/.local/share/devhelp/books/%(project)s$ devhelp"
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/he/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/he/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..f255c01cd76a015d6a64080e8aa45824395c603f
GIT binary patch
literal 970
zcmdT?!EO^V5RHJ-9yxJ9Vh(APsPfvIq*3FNLfWJ>QkF((fb(Y8$(nBLmF-Q^&)~p^
z@I&w$9GOiDrEuWPNF&elym_PX`0LXrpDSpO(VwHYOYobGG5&-eqCZ3bhF*JAseH$?
zynlg(<^7jZV5VU$#Rgm|AQf2-3z-S-Rbh3LNCPB?>g829q<*I3D5ExwjG&2Fms~p6
z`o(%S~(-<&VPR
z%4U(%hQr0X@fhCr!y&wU(E1dqYFR`}Y?+E*fXqa+;&3VE2DegAoy#q!bhFv`u2hu^
ze2iGH=zemN=$JYzv9#6c9Cc|bXv3Rig^4n9q0P#2Q27qpUi$?0VXv;B*Mk6RHBfMX
z0V39bSHOV7KH2;`8SHXMXFL8w!XBMsveap!PRk2N;qZP}xE1dlHzgFl&~1)$JF#^%
z&myT#AjY3%h3ge=L5}Zv<;)9V$WX;P!EeFgcrKmyMkrx$UAWj=4rkF^WYF|G*x`Tr
G(LVrKCmI3(

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/he/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/he/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..5789ecb32
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/he/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Hebrew (https://www.transifex.com/sphinx-doc/teams/36659/he/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: he\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hi/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hi/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..ec2e14360a2f4a427140229f3e287e001c880d6f
GIT binary patch
literal 875
zcmdT?O>Yx15Dg!vJ#yl}VUU89sPfvIrcvV(MA~d=q%4in0B2{{$(nBLmF-Q^pTU9u
z!;OCde}f~lq)_0(nUS9CvEID#Jp0R|haVdl4-iif-8%U#Cb<8ANDz+^UlE`0H5%V=
ztXm2J%bQHb2qn)fpG?ONnkw2@WoQt8#t9F)%FE)2uQbWbMZ
zjJ%cBDWf^KGFN(+8ttuGkXs3eLKd=MCQD;IN!&_h!Q*={Tj^?Kbqas9K^I
zsaezg;3P9C^;qHPVXt@8r@5l-U|LjG6y)64wd0`6AE_I3PGG+sv@|>&K-3PBaT4E|
ziM9o2Xr@|a4HtEfKJ%M4*%1a`wmV532FcU

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hi/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hi/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..f2b8ea1b1
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hi/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Hindi (https://www.transifex.com/sphinx-doc/teams/36659/hi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: hi\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..87ca6db4c4dba27a4c3bfd2e9bd58bb4c643ace3
GIT binary patch
literal 889
zcmdT?O>Yx15Dg!vJ#yl}VUU89sPcL@O{2yoh_u<#NZB?@102EGb+V?r_R97q>CfQ6
z-{Qs<{su>8n?ivLXGVIq$9nU|e)iW#4?i_99w43|x^?nfOmO`X5hETWz9GKcYc#&&
zT5fds
zDS0D|m0B^dWhT`&(aIUQAh!|_`hg#KGf`^eNNiU!CCAmulDTFO#l!LB<#05bMVFV}
z^kPm&XPphj9eY|7iUJscKd66}HUeyYcz2oXiC;7@Xn7CA7vk@;0, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Hindi (India) (https://www.transifex.com/sphinx-doc/teams/36659/hi_IN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: hi_IN\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hr/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hr/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..6357ea480c6d39f701989b42796dded372bd11cd
GIT binary patch
literal 950
zcmdT?!EO^V5RHJ-a_fl$he1lKMwQpzG_4vpTWFIMDrISu1~@yrPS)+lUfE8QO8p5A
z9Qif)4UWt3k}3UefX(IH@D5gqq2eVKZM9Ft+|w`Z&XR{lh(4uyi|Jj5QEa0T!mp+8?MRZ
zEF&MKb;@WCuFREQrAB+JCgeT^L?H`VFp{OQo+NIjGIFw*IWjgJ`pNOx;LUNbH|k$p
z1jF+&=~^i~W+Oe}C5I-9+Jr@<$$&B5+TCGo#*j!x@>*3@|Kde$i1v7^wZqVYfpDIT
ztf1LE8^GE3;r0Us1%&=r`e+6VL#hgRe8oZOxu$_BfI!@_wxeR@k
zS55IbQZuLP-brRs>QUtA?*9H>o931_f?=_+q9CWn&K(C`-i0pSJ%qIz>&=M8aRggi
zP`T_?97XUN7$6(tqqzC-s}r{>cl(aki5T48t|iD}4b()aX$Hwz(tn%_P9W&wRHVk&
zxGAwmFIS$Hg;4qsQrsdZeZ25fa`4Ejx|>Q%`Z_fkt^kLFiSof)sinoy;1F*(oQR1m
Npc(FCh5u=Le*)#97*GHJ

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hr/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hr/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..bc5038e96
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hr/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Croatian (https://www.transifex.com/sphinx-doc/teams/36659/hr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: hr\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hu/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hu/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..edb7d27d5903d9ca8988f37715e691ead81d379a
GIT binary patch
literal 879
zcmdT?L2uJA7%hxbj+{8`@F5kc)#Nzox@z?(qFXaosbN)D#@S8W#9L}dw$pY$g9HDF
z8~*|R21mZo!GH^AKItib*8ARPKj+KSCm$PFdx(8RwU1lJ!BG2$8GE8_E`M&lcP
z>-|rUcl+11!Cb>yiVe72KrV_Bma-7cYr^U_l?F%&&5O%8qJE(hUQnBJBWNntwU#cl
zzO|?=6c7u|>H86V(bAQ}&NlLYG@`aN`bH$KU7OsSHqvTUN|pWOAXO^1zVA1tJ24rj
z%r&VUjTr-H`;dt_TI2z5Ot1EAM
zIVWdEaEESW#GPQ!3Bo=JLedE!2w3;li_96#vlQ!RxdkxF!mZ^z(xA)WU|
YC}A*DO#hC-DPM>JI(`o){7=8#cTRi@KL7v#

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hu/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hu/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..8a945e3e5
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/hu/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Hungarian (https://www.transifex.com/sphinx-doc/teams/36659/hu/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: hu\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/id/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/id/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..4128f8e3aba509b4828a6d2116c558f5d7c9dcc6
GIT binary patch
literal 877
zcmc&yO>Yx15M4e_d*p-=hdBhPQSo}WO`~S3Nc~7Cks38h1Dw6Plf=YpuWWD9{tOOC
z{1tBe68IY&nN3@YxNyYMlReg(H{<8|{_N@JfYuYjOG2j!{#X}u{zMoPo)dl$zC8+p
zpR|7=e0>}QFKC}O0y6_^i5u`sge9s9=2BrAwxC=U(gLfX_4aZ+OfAPevEVCxgLs
zcy$#{E@$k_qVS}~2Et`Bn22nOYuQx&iL5-I!K*
zA)IG3E3{L>8=Jz6o+A{TV~I-1*IRjF=|wFTR81DY12#iZrZCcl(deYmu(R~Oaw+GV
z%_j1VsGO4*xheVW!&zZ+?kUaj{ciW5$7R9W;Y8I|DE7wK(xsrQZRq;R5!@d8aX220
zhYv22U*Q>fh?;u8si-ZF*Pd5ONPPr3{kcQmul<}IKJc1$=4jba=cb?!OW`n+K0HT_
zmW(9JZ&ElF87kO|x>O-}r+vKw@, 2019.
+# 
+# Translators:
+# Tumpal Gemelli, 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Last-Translator: Tumpal Gemelli, 2019\n"
+"Language-Team: Indonesian (https://www.transifex.com/sphinx-doc/teams/36659/id/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: id\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+"Untuk melihat berkas bantuan:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr "membuang indeks devhelp..."
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/it/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/it/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..4df06c1b362531aedde280a7ba29ad6537e323a7
GIT binary patch
literal 877
zcmdT?O>Yx15Dg!vJ#yl}VUU89sPfvIrcvV(MA~d2QkF*P0%vE}N!)JimF-Q^pTU7Y
z#Em}ze}f~lq)_0(nUS9CvEID#Jp0R|haVdl4-iif-8%U#Cb<8ANDz+^UlE`0H5%V=
zt7Go+
zIe90oQ$}-e
z*@?ylXK1F>IK)kfSMze`X;}!RPawm`chV0kzaYnVy!uuPX-TXzljF;AIG*D~ucVe1
W9YybNIGl>PET9wiu*3iK>AnNn<_cZ_

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/it/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/it/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..f686dc9f1
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/it/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Italian (https://www.transifex.com/sphinx-doc/teams/36659/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ja/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ja/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..1bc3c01ad429615afa741e49823f2140ff00e353
GIT binary patch
literal 871
zcmdT?!EO^V5Dk>m9yxK~Foz&Ds=W55Y1Fu+B5k%1lx?Flz}eY#5~mw`WqXtKGdT2b
zxbYwG8yuM>g#s7OjPzuW_2$j^*FIVrSPam`oc>NO%`Sj(=O=P+o35Epnms38eV!PWo=?XXN;SSB*21mc%+W8NL~Z, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Japanese (https://www.transifex.com/sphinx-doc/teams/36659/ja/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ja\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ko/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ko/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..cf920384ba8875fe50bacd29e4ef875de40d214a
GIT binary patch
literal 869
zcmdT?O>Yx15Dg!vJ#yl}VGcoRRC(=9)2ML?B5k%1u}h;gz}eY#5;q%rWqXtKXK>)p
zaO01_-{8nBDHOPHW~3*3tT%7Q&;Ii0;l~EX1H=Sq9xdp$Ju#`m!b5%$lG-18Ul?75l^VMY<)37j^D5zTsD`_q_HJ8qe
zSvlku8i<4D`2CPRJusEW$`hl3&XH6-jm5F
zC-0da#k%InHmmpIv6D{2E*YbzPbv=
zms4_XrSPamhQdn@Z5H(ii%6RRW4v>8$a;(+kxb-9)m{JMMLmd)d8c#8FoHxlPo`FA
zR|sz`hl{sK0&fOs4A1^({T!)!QHce%T$x`9nM$$d@Y>)|8V;7;myT1q-EKo)tExGg
zk(o8!-<;$oqaI5fJ?eIkdvs-JD;O7*6$QC4cI`Om@<;0W(JAb=eHNsnG`_PD4GYfE
zM5%H3n-WLza_4DT2&GRU!$)`0_bWdqCwIJhoVm0l)|tui#W, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Korean (https://www.transifex.com/sphinx-doc/teams/36659/ko/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ko\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lt/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lt/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..91ed7955d4d456d3f7801d4ae73cdea920909899
GIT binary patch
literal 1011
zcmdT?!EO^V5RHJ-9yxK~Fi36HsPfvIq*dc~TiPb2k+L*u1Du^*Co$dFE8Cl-Qh$O2
zKgR)ngCny|N`VVp8R=;~-uK?fGxPQNv(Gh*r-+w`R+an`eLR0cB#0M?Z-~n$wc2<5
zR`(YutnR;5215gLB^ThQ5~eaQV61YC!MasmQ6D3M*+Q=M|TZ
zjJa{h%{34Q8-ouWy18vikIFjce-R?Lu;!yoeZ4YSo7S>&RwzAr$U*5$F2gXa4OV2*
z%gB3aoidt(E2c^>Q=`3ABeJ%DC}bfEu4G}XCyAS=jGUGeM}~$&H#zC`U!Qb3SKaID
zU~oAkXI2W2Zloi;?jpcCuuHT2ZCrK9$e=B{2R6Qxh1WV@rXF`Tj%sBLwpO!)^p<#RKec?Ezi^U@J
zm9rXSLsB!NtJjmvq|~F#(dORXZky(w)`LM_T9K1;V`q+oF78tow+>)+jJGvxLc}1B
zA%d+fSmz9m0H1Vs2dn=K4k3!_a10Fi0||~|XjG!L$6?&A|C2|A9`_n}6{F!XG&nTt
zLDEaQk3+@r1!p)?sj-!}1vbdbrKd$MlsqQ&0k<4Z#YpDR2=}nU|Frr)03{G3)Bpeg

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lt/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lt/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..7cc0ef32d
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lt/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Lithuanian (https://www.transifex.com/sphinx-doc/teams/36659/lt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: lt\n"
+"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lv/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lv/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..1fec81e5f4bf40bfaa65a1ea3892e355fea55bec
GIT binary patch
literal 912
zcmdT?O>Yx15Dg!vJ#yl}VJf9nqRMM;l19z8OG%q8M9R`A4RCgLoy2rwuWVae=WqybVu{nb?xQ$N=!H73Q=1a{a&Q5S()6K*0S}gkZSRhgH)N=`o3Qq@5E%7
zk+;HFsZ|KJSW2}`wQ@$z$ejfQKJ%G35rsC6Bz7S)a=u&Vn_
zWpnPd3E}e1XaukONeridw0@3KwOI27w#>_4giHlrg)ri-lw3h$>0Dt$N;jL0?0yqN(D2KfWlQRgAw3=QrOyc{A<7~YPoVQST&)Wh|@5I*8BIi<_K#Kpv3Ky;2
uoE+cls)NskA+btzhL0P<@k~1JrBK4)(D8Y0LpbL%kweSxVu%0fUw#Lr$`Nt^

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lv/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lv/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..144c52470
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/lv/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Latvian (https://www.transifex.com/sphinx-doc/teams/36659/lv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: lv\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/mk/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/mk/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..784e7efa9662812d910aae26bc36ba599ab7481c
GIT binary patch
literal 910
zcmdT?O>Yx15Dg!vJ#yl}VUW_QQRTHaO{2zbfV4>=QkF((fU~pfBqqD|%JwGd&)~q{
zg9A5y0Y_#@p}>VRBRzSZ_2!K|_NPY=Kh`iFAf6yv75Objn14XTh{uS}h_Cl*wQsmq
z`(N(w_RGp(YGAG82K-XOQf39rRVH~*hkTVP3#5ShtE+fG!^|Wiqi!jzq^Vq2S~@dk
zoA5wGLdUlb^S{hbs#$Ct=1vK2u8wrGPOdx
zOn75CT)r8N;B_w^z}X+IpP^JQO0mF}`RW%TQz>!|u}EZUv=SN)mfjbRQ@Yt~LSH$n
zISwQ-Io;i!q$Z&r%N#vww~sqCU(rS|&PppXa%pVtIOyUBb=~GE?9%RmhCPTFbh{A2
z{yyv|gQv)&20RA_9HJl|#)G?g<79&ioVL_>%bNnv?&a3gA`?oVLV~};N#8B~oSfY0
qsx!}}B?Fz96rYyE$xQj+rPR{m$nkM*IGl@_%%B;zvBUrLE58HG=@AeB

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/mk/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/mk/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..4d1e7133c
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/mk/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Macedonian (https://www.transifex.com/sphinx-doc/teams/36659/mk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: mk\n"
+"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..e3eae3b0275242abea7db852badf0d8d18748aeb
GIT binary patch
literal 902
zcmdT?%Z}496fKWcmaJH?xJZN4YUDWSbgF5FBHC#NDm87@DX>It;-;pF9obGFpTUAp
z;7j-nB#`(DmfTDS2H3FXN=Na%IzGoa_Lm3uKh&`9As!)GRr6boaQz+;As!;WBEH?J
z)xP7mnt#4~nCF$iT){^0E!Y)@70(J-ii`)&5#;McXdnd~y_`fLbu$&SjG7hGoF;rz
zap^*-wLxwsffzWNz8TObbyZs2*}(oE8ek$RzmJ#C9M_$#pY6fV?a}_`s^@gM8y}@7>
zUR^oU$(&qh&Mc~t0kb@SrssEv=aZ%fo)@%Ej=hfOA(71ZMpUkU@%#?>r$MWA>|r@0
zW-OU&CQZhy(g9q)8jWDwi$Zw%hxIe0%CuxDTFS-S@#I%e=A7jLjFsNQlDBW(iuC2_(5;KZbP7i^QM8(vijG-s(_GyP+JJ5zR%}UKOa;bD~
z(6_j5O}BXthh?`e;c*xIh7%2=@HS^m)VaWvxx~NQ7kFmNca|0z6Y?Bld=-Y7-2eap

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..64a48a094
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Norwegian Bokmål (Norway) (https://www.transifex.com/sphinx-doc/teams/36659/nb_NO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: nb_NO\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ne/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ne/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..89667530a744798f5d0649be4f381b5e4989f978
GIT binary patch
literal 876
zcmdT?O>fgc5DgzEA31U8VUU89s9LX`rcvV(MB2CzDQ=@AzJj09(5}dDHKO$`At5{^d?kE-P^*2T
zZ?*sF;eLNw8O$_nByPd25LTEMu#h=MULDrgnKZx(sK2>NV(#ZU6*;#nVUTCIskD5q
z^|d8!u7FvnkKYgY^M)=RbvB9rqmi_Q(H}5%&C2A?w3e0YLaOCY4pL>f^L@WI-iz5V
zWAD&dsZ|8FSV^@@wQ@$z*_{Q1e&7e*1Pg5(OYBl+?5tc`Hq#NrNq;zc)gKHd@pS5q
zuV(Drpm5~I2Et(ktsv~OAY`oof*@)i9R}SXAR(LJMpje*(uG|JkE3?`Fre~A!a6oH
zLfKq6Z6dgMI~u`dKZ)VRAERHAR4q%fq>&1L5jI1yj^GjtkxOW-oGWa^`F6YYUF9kl
z6h^Aoe1CJ6>6ANavHYmhIqq_Wyy=be(uka0XtTEDUi_f8*E)s$ve!`XtOsG!ONL2&
zpC;wzol};m=ngjpoy_6R@gf&eokB`)Z_)Kiw_qpty6RL5G%QxB&gkJHIGIc5y+(zG
W0;TA0A~+Ls%%SCXXu|*W&wU4runFD(

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ne/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ne/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..e755949fa
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ne/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Nepali (https://www.transifex.com/sphinx-doc/teams/36659/ne/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ne\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/nl/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/nl/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..9a767c38e9f5eb194c3780852446f3c53dfc7066
GIT binary patch
literal 875
zcmdT?%We}f6b+BnELpK&aglq4Iks=-=z9K%~Yc#&$
zx8DDBf4@Jg4dwW(1i7ME-jD}ny)X?goeswTv1nWD`+k@wU#c7
zxpt^k8i<4D^!Eb@bN37dDh_HeQcb?2G
z*G_S7EQ9m6lL@>TrU^X%WAqD@>Q%*8I8v)$gvQk*~JD94, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Dutch (https://www.transifex.com/sphinx-doc/teams/36659/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pl/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pl/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..26aa24acb859fc8c401624e273460c9f302b3227
GIT binary patch
literal 1012
zcmd5)O>Yx15RHJ-9yxK~Fi35csCd_#q*dc~Q`#m#r9_R|2+q!~lepQ~E89t$s&~#D
z_(%K;B={Q~87C=0T)1Ls8;L&u%?tE3%%xa>8w(hVynvz11q*gyI?1E~Qozppt8P0AbDi=$vSV&Ul!>{=
zMgy%U7O}YkVqvHEu@&u>^~@o&g7H6yh%Jo16{)Luk&S36n@tO;MvpN_m5IAB3`@N=
zm|SM$gD_TV#lRM0sqRv(oRI^vk$^a)Aq}oYp^YP5JCYeWpN%Z(YX, 2019.
+# 
+# Translators:
+# Tawez, 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Last-Translator: Tawez, 2019\n"
+"Language-Team: Polish (https://www.transifex.com/sphinx-doc/teams/36659/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: pl\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+"Aby obejrzeć plik pomocy:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..27fb43d2f49c4c0df7a7263635eef679f3e3025a
GIT binary patch
literal 880
zcmdT?O>Yx15Dg!vJ#yl}VUU89sPcL@O{2yoh_u;4q%4inK+n#uvoYP+mhDZ_pTU8j
z#Estoe}f~lq)_0(nUS9CvEIBHKl{t0haVdl4-iif-8%U#Cb<8AND+?_UlE`0H5%V=
zt3lu#}}>K@-;3xwJqGG+$q&2@Ok~@shd~w}R$kQ*-G;
z>uZPHQUP($oL-ISvzD$rR<<$!Mb;>CT4k65>R5Mcxp?mU@W
zu3X8zwhYeSPA2eXm?rT2kJc}cs)~vi*wXl437HGNW-!IctD+K4Kx^f_ag5UKb{qOy
zSuW9#Ot0zw_9WLC^;qWUVXt@8r^eHEFfA*~OLDI5+A&b(N9qQh6WDJDEd@^p5VwPL
zoF;dUqIba=`Y9CN, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Portuguese (https://www.transifex.com/sphinx-doc/teams/36659/pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: pt\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..a204ed78685f4e3ee3b282cdf240e0ba95f9ea9b
GIT binary patch
literal 894
zcmdT?O>Yx15Dg!vJ#yl}VGcn`RC&Fdrctvc6-l#&NLd=C0glMoog}6kdu4l*lz+j2
zU&f6C{0)xGHiZHg&W!YAkM-uw_}O0{J^WOoctChUXjjQ^F{b@TLPB^<_(u40uU7j`
zYjytl{{9>*ftiMl#4WfL!V2>O7Ba`ktHb&#lLlA;^_Le(%>7)aBIkA`4Dt*&6_?Mo
zzOuy46)+3+$=e}++R&w=$|mLiC?sxS^m|NQvl6)#t!3r9kZSoe2dOgL`MzJ9?8$7D
zu{UU})G7j7tfbndS~(-<>{bFoKkx%@iiI|gC3Yz@HYk^t&2$8D(jSeV_lLu2e0k|j
zE@te^pm3zdhQeV4tsv~OAY`oof*@)i9t7PWAR?RMMpj+_;)PuZkD_+_AfWKZ!a6oH
zLfKq6Z6Y{-Js!iWeiFm8KU$v>RV_=gq?UzyH<@E=#lsje!v#WZs0v
z%DKWuoNu>V-&I}Yg3L+vn(v)pnNGQ*ddm+xoue+lk>*Wrl9xv0>|C3*jX)JQsqM8+
zV887(6r4iX^pa5$-}y^UdS~P=D!SEmL9;sCIbP&KsuM`*H&}GN(k, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sphinx-doc/teams/36659/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..b6dbcd866dbf39efb3dc4cc279f156a64bebb120
GIT binary patch
literal 897
zcmdT?O>Yx15Dg!vJ#yl}VUUWHsPcL@O{2yoh_u;4q%2*f3mlQN>ulU^?3L|J(x1VB
zzs3#t8yuN!3I#5l8R^M0*7KY3v%fxi_^E~Q0PzITYl`1uiup%GjChRrhWK)?)%uQW
zv;X=2ZhzSbq#D*zY``rAEJaztLY9Jgd$797r2$gG-s|%?qJF6}UQ)Z{M$lZW8!nw|
zePxkbDj*j2lJ{f!tgUN@Cp%dG;~;V?qc26~I*rJ!Xe+N*l~l#g8l=j_*7yBZvLlm8
zPTmP)rB)1VwUla`Y2}QZlUoT0{lE{rnW(gJB({aj$w^&Ul4=G~Jeo{jj>h9zbaCM&
z=P5Zgf;&_rW9|flZV(Pg5Rz^HLBM(k`@tXxkVs}?Et{@?@xlRwhpgAz4=}tbw~nNS
zD_e4>4TH0{(h#BRPYsp1c$GST37+?UCzr6w3p6R
zmQlLdY<$=BkqfjZ(<{33g5)}*4izjt==To?^hTU^yrirRFUgrUE6YGtH>DkRk71V%
z+X|izA?$eZB#!PZMl-!rG*~FS*mZ^DI, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Portuguese (Portugal) (https://www.transifex.com/sphinx-doc/teams/36659/pt_PT/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: pt_PT\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ro/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ro/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..ba2cb762c5de7c6a4366a80b447acff4187e8098
GIT binary patch
literal 919
zcmdT?O>Yx15Dg!vJ#yl}VUW^lSC!Y^G_4w!ZE2enDrISu1~@yrPGY*TSGLo%QpJDZ
zz~6&Ez>Nz>W=WvHg)<{P+0T0O#xwS(M-M+XFdiVDAlfzgE&90sfXEP!5uXuX?=>3V
zaIMe3++Ur)uMI{9u9RGYpGla>vVw^!B@db~zbupmQbF_OdDf$GX>w6gHxpLULSEHc
zIyUCgp|;dO95e@SyL2No3y+x*@_!_vwzB4(%zadwtW6umVqPgd{mDV;LSDyl+!(CH
z#`z
zTm*yj5jn9^cyuFO;U$L_OFD!lq{VFQg1&H`
zjI7YE6y8`4r?2~ccy*NZ;MpIg4^XP73o*r#*8C!5B*mP=(9DHaLPI$7zH*$><#HMO
z+E-0*9J!g(Rqv!QIrW(2==SdJPKR1UqhL@jtSHH;v2({kS3jsrxA$SSO+%fg$syxm
z80w9Lv4f-&-QKQAnzCqfGt^IUjiSRAPogNu&a&R!;Bmyk365QAZ1<+ZCcM1%v?_(t
z`;g-|anh#?KOuW}y88MPX-QA#rocDmus2pdcp, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Romanian (https://www.transifex.com/sphinx-doc/teams/36659/ro/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ro\n"
+"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ru/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ru/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..be5b79f7ea5f5e9762e5eab278f8e0a0aa050972
GIT binary patch
literal 1015
zcmdT?!A{#i5RKZNeC(-*9;Q-2L}dx_oZ2}zf@b2T!qSP>
z*A}t40%D;)_}ZmgJGykpY+(KmB4P`puSDt^mB?DOmX(V_s@Wz7sWNfv`+jY(0+Wl3
zd=bVZIPrBV6AL;Sh{y`u-~Glqz!M7mxkx$T$_cBKoyUvjl&~Yh4GHs3RoNmu)Pgc
z$lk?40LQ=p;h1;g=H{s#hgJB&?jktl6OlvHKfn(E)A|1bc?u^S

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ru/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ru/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..bbd9642e9
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ru/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Russian (https://www.transifex.com/sphinx-doc/teams/36659/ru/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ru\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/si/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/si/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..24dfb1a93caa991d29d2200ac9a1137171ef1981
GIT binary patch
literal 877
zcmdT?L2uJA7%hxbj+{8`@F5kc)#Nzox@z?(qFXbl)Uc`zaCQ^7@s`?=?X=y`;J_c^
z#-D({!I3X?FyO+OPkM@<^}hGn&-wEB(Z>eX0pbwRt;ugS!Sx43jCg|hiunAX(fEen
zdjHeI{eDs#BpNnSY{BIMa#579l!ahk6V^AGG(bvdzP^eh>K8iY1+_Uhf@WeduSM$GwaJ}nBdgY>RI8sHq{_t3_x;9nFDB!R
zyc5Pstr*xcmui=4<&0dAI|~T?zz@8cD7A4Uwkw&D^J-;Dq8UW-a6EZA9F1nteC|!J
z5^`Y#cj!h&+zAGqAncPMB%J_)fOU_Lf_@O7kj%tJ)>Hq|g?$K5Shsr=V0ja69Z3vV
zw%|@12A6Lq6L>R>BY6JD=octetBS91q?Nx2Nd#Xrm`j!Of2a@j(x+C^wl^&*!wYh$&Dt_h, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Sinhala (https://www.transifex.com/sphinx-doc/teams/36659/si/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: si\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sk/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sk/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..49d581e40c68a50f347497779bd8d87c1b8b9054
GIT binary patch
literal 951
zcmdT?!EO^V5RHJ-iW6Koa2TYtN>q8ho1|6ac3aXWg-BT%B>~RPu9KK-?3L|J($C<)
zl~04;;K(c~E%d?}OHVt``{s?tGvA&)`BK6281WL(D#;&bfbnNUjCg_gj(Gm4Qu%@3
z^8P6%miJ#vgNcT<6dQ000Sl4kFq4^JUKLi$R2m>TRNr35J?dvV;Tg3HZUjxmy42FC
z)=P`pOaZY_9e(W6y_zl@X4aAaBN4T^(Vs-(>ZQr8X(cUIxm5Gt9HdIc*7yC&a3?1H
zlzb4zO05{!d?D2~(aIS)CASt3`hg#KBav(4NNndaB^Slql8I)}i#z?n>rS^j>W#;^5`?4?KoGE2^B`yk0Sd`TtYumCfi7%Ac*t6^{a^s^I&lw9|0;ckQZ+C59822e9U&9JR}99PUh^f?7S83CQM%b|d{?^4
z89qj$S9I4oNp(UUrdZlMIy!7qyQFn*m=%U+h!V3S>
G`u+rNj~1l>

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sk/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sk/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..86467c8ca
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sk/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Slovak (https://www.transifex.com/sphinx-doc/teams/36659/sk/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: sk\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sl/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sl/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..8f22dbc8d5619cccfd5fa7b6bfb623f7bdc9748d
GIT binary patch
literal 931
zcmdT?O>Yx15Dg!vJ#yl}VGgO3sPfvIq*1daK-z2}QkF((fU~pfB&LqNvYn4g{RP}O
z@b}KKCMq28%j`MWn%ivAESdWF5v(NXB9<%c_6rq7FnyajSL6a0Nr|JegRo
zo#Niu7|!1fhw!$SCh+`^(l1b|=PN$Pl1}|1WFq)7hD&AELQAfpw(!1iF{PW$CiJDT
zoZ)+9W=VI=liXy~W0s@McKfJ9ouc(%q*j(Ia&GL>#h{Cy)OA}Yuse2Z`XFMg+l}BQ
zFhI$UHjqYp+Ju{%`%nu*4GcBwK{`m2{SffEgEJg~(AfHQfem@F^|Vl2>J!ND%Q)e?
vD?cO0dtKSdOjwfW%;Y%l7>=jX2d{+|7UzHyyN=-84l

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sl/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sl/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..9d8a3afdd
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sl/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Slovenian (https://www.transifex.com/sphinx-doc/teams/36659/sl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: sl\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sphinxcontrib.devhelp.pot b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sphinxcontrib.devhelp.pot
new file mode 100644
index 000000000..2abce6fa4
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sphinxcontrib.devhelp.pot
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
+
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sr/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sr/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..503cde8e2c5759aa128b7c1f90499242a82fc08d
GIT binary patch
literal 951
zcmdT?O>Yx15RHJ-iW6Koa2TYtN>q96P12~@W(#SPLZmE>k^pCC*Gb%N?3L|&RO+AL
zz?Gi{e}f~lO-q3bXDmJKJnwrm8qa)t_T)3T1Ed(q?mcvYDBJ|3zyh^13l0*63Mcku)rW2k~yWmF9RICdv
zooan$QJX0s7Rtj3xdP2(KujuyaBh4
zObk~x<4&6p&OZzW@V*oGp#4Yb6O^j?iqEm6HNOa%2)+zqEX-7L1(k(!xeY1ZY&O0t
z(#jdWMxvK=*E&gcLLGW6tv8#8Eou#|dc$mGct*~(S=ta(eoJjsKZacxRn%UoF&B)P%uIO(j4C$#vr?>+l98IP3-U=lQ&IYG=9l|M}
OiVSLg6D#~r>-!Uv1sF{L

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sr/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sr/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..ff3b77545
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sr/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Serbian (https://www.transifex.com/sphinx-doc/teams/36659/sr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: sr\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..3f004dfe52b08b39905a4a5a0f093735af510991
GIT binary patch
literal 973
zcmdT?&2AGh5RQP;9yxK~FrcQ&s`A>KY@=q|E&WLfm3C>=1UNgpPU3cBuWYAjrM?6Q
z-h}6Y*Wk!((^BBV8B3o$Gyc9Ad1k&nfA*z;=PBYPBC4I=PKx$tM22{Q_>S}|l}vXBNy1sm_qvH=ZBo%52~IX8k9;;QD-
ziPo1ExupVPVPp8IPn#{hbg1;v|A!E{mC+X>cYdAZK53&^E-I;J4?aj$i0dE-8pAc2
zoEGGxFji_6gRSOLUFTXkBPZlO1%v?$n0GEJZ5+w$Ocvy5IkRM}V;E$Ir|H3Azkfa$
zjlAL6m>e6y9cCka?nDf27WN1WNt*#Q{)21z*H45@sT~f>v6;`p}v?
zSJ{}-)oK;Ex`>=&Z*sk$>qd}5=hUIr(oVO#-J{ktBX*aY`rfcy8eWnUZ5B2LRo%HZ
z>FmPVOj@cLvLp#%a}#Qly-LCm-T(unqracDAD;G-s5b8uY%gSRd%Kn(hxw=pQPcLl
z>@*uZjtd9l9pkWs!Y18R_;n|)9j!_()h^_?TvoVb>851okyrn7DhwH@To, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Serbian (Latin) (https://www.transifex.com/sphinx-doc/teams/36659/sr%40latin/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: sr@latin\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sv/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sv/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..b8c1002e2198869ab34d03676e3c7fe6ce00e66d
GIT binary patch
literal 877
zcmdT?L2uJA7%hxbj+{8`@F5kc)#Nzox@z?(qFXbl)Uc`zaCQ^7@s`?=?X=y`;J_c^
z#-D({!I3X?FyO+OPkM@<^}hGn&-wEB(Z>eX0pbwRt;ugS!Sx43jCg|hiunAX(fEen
zdjHeI{eDs#BpNnSY{BIMa#579l!ahk6V^AGG(bvdzP^eh>K8iY1+_Uhf@WeduSM$GwaJ}nBdgY>RI8sHq{_t3_x;9nFDB!R
zyc5Pstr*xcmui=4<&0dAI|~T?zz@8cD7A4Uwkw&D^J-;Dq8UW-a6EZA9F1nteC|!J
z5^`Y#cj!h&+zAGqAncPMB%J_)fOU_Lf_@O7kj%tJ)>Hq|g?$K5Shsr=V0ja69Z3vV
zw%|@12A6Lq6L>R>BY6JD=octetBS91q}}`?BoTbgV7?WZv^lhL=Ss^c-EOzOt8L{H
z(@6E2?ypWVol=KAmLB(dCw*!+wCzoc%J70*YO}TsRQZG2LFWwi%Rx)Q(*cBSFCNFy
zeViDacY$FFg_pQ3@n}x$94!kj)fuGt_*S?<<(B01URR%LDGZ5Jsxy2!2B!<@yjMaA
XgNb7Hw+zntLKM*PdpO~L`suy{9sLT6

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sv/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sv/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..94b2f5188
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/sv/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Swedish (https://www.transifex.com/sphinx-doc/teams/36659/sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ta/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/ta/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..a894091971159a83e75ddc528dd6146c29264c97
GIT binary patch
literal 875
zcmdT?%Z}496fKWcmaJH?xJX56HFBJEI@Q!e5uIrUDkV(S39xn(xAjb7N4C>;K7$4S
z!;Zgz-(blN9T;H4nkyZ}$2#|1`#4`7J^a|hdVqL>=r`oIigEn`ksux;z9K%~Yqh@N
zx7q)6f4@I(3{njnDYoF&0@k9aU?~g1yf&2Aximm3XurNlBI*}9;{~;AZUoK6rqR-c
z*4Gxbg#u!sJ$pZ)&pNtx*x5z?k4Ds1Mqi1{bsLjg(^g)Wl~k*r9Hh#{&iDP+Y%eC$
zoV*jpO05{!YAw|+)5;mSAh#9}`hg#Kb5UvINMctqC#Utwl2kK@lJPWtIi5`B(dDH#
zyGY5I5!|60nQ$i<^n!3mf{^qA2m;nWJP3wCfI>1C8`(_#OBW6yJYxO+L4f7O+&YpP
zu57`bHVn?+#xcAZClNgVWAqD@s#VQbIMVT7grtI(3{qao0y=BwD$6L{ZnwT`Oyv@@
z$aG2f7bm&SsKX9R4+n#zA$6Q~y;)HkUXXKbO3Of1Kd2q`PGG+rbrd`uLD=<@X%gLq
ziLrTS7^P5ng`285nAka56, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Tamil (https://www.transifex.com/sphinx-doc/teams/36659/ta/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: ta\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/tr/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/tr/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..6ae8723bda0c745bf5f839c02fd50c16d8c510d4
GIT binary patch
literal 876
zcmdT?%Z}496fKWcmaJH?xQimS8aYlnooec#qv=dDP^n?6Ho)3V+{QGuBim^^pTU9;
zV#im&Z?NQs4h*ni&6SSgW1V}heVi{(9)E0LJwiM~bZhckO>q4I5hI==z9K$9Xf(dz
zx8DEs@UTCx4H6AoDR$s;0l6qjSjs{$uL+xVCJm4hny+r+i28+2c|mQ?ji8y>)>^vI
zdTmi#C?FP^(|05KyrnCLoo(d*Xhdyk^m~!Ic5QNJ+Q_O+Db?yH2dOf#_kF)HJ&4IT
zBX5PVQY!|w%%$3=S~(*Zl4u4|JRDChhNICen$NxI
zO+v1W;11o$h&#cc6NG&dgrpNd5U}p?QP2+p6q1?P%6jTwy08!73F~%`0xWOBts{xy
z$`;&d!{GYOWCE{;aRe{^7=4aXwW|0EM>_M1kVNnegQPNRX>(}h&Xtx?y4&r1SKG=Z
zrjhCmJzSk+I;9SKEIsb^PWsdt+V-YJWq3iZwb@t(s{BFipmPR?<)EeD9KyC2kK^b*
zP0Y=^!YqZtJKUD_$;95#vfxskL5gp0g&S0ENlx!|^`Vx+kVvIE!-r#Vx{%I$DU>i6
VC`NzF;F2#y0Uf`G6aJ@v?mJne3UvSg

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/tr/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/tr/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..6a40836d3
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/tr/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Turkish (https://www.transifex.com/sphinx-doc/teams/36659/tr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: tr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..0ce6166645c3b9672c8a766729dbc4ae2b3b3775
GIT binary patch
literal 1117
zcmdT@!EVz)5RITGA31U0Fi33`t6F=Vx>d8S18I{&rIT688>Ou0upCd8hhUQy*I1b@%LwIUuw9XV!XfzEAU|TF#n7ZV?4+Bf${B0
zt@ab&)&5r$R{Nbbd<+y^3O)xr;V|KO0V9!f=B&ePnh6c0fc3Yhao6{9l_t4wCW+>L
z#xE&2G;u@I{rpol@^sQ;(rK{TWIx(r`D}ZmZr6=oE1Wj?=T3N@hi{s
zYW)S7oMhxZ*G4GGz!Vc9uTmwg7DKYMfWV_3bx>t*VF-HYZgxf6)n&snoZqH~#kS?oQLcwf0@7pO-qx$+6Ni!$20d
z&_v-rEYhehVFLn)BA~Fj3Acz=FjzqfFA)du3OQ)8vUMUI`{hZKk1a2u6&MD|v^s_i4LNmr&S!%1bZHx$-+!zI@^
WK{#vI3=Wea&!OS%Vuk, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Ukrainian (Ukraine) (https://www.transifex.com/sphinx-doc/teams/36659/uk_UA/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: uk_UA\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/vi/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/vi/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..63b08174fca6ea4d23d82d67b95273896844ed09
GIT binary patch
literal 873
zcmdT?O>@&Q5DgzEA31U0u!k_yOh=ZIrkTd29n!{y%)~U4hH_TyO(JSb9!XBppTU8@
z!;QZIe}f}yQYdiY%+9>Ap62aa>B(Q7JpS0AdPI0e=+@-78q@j%At5{^d?kE-&}e+4
zZ@vHN;ckCY8_W!>6>h+<5LTF%uuwThK@*CbOj%$hG+$pPF%NT-%AC8Ew8%4D*IGU|
z=EjjW*T5V!C+~**`JSmfb+(BAqmi_wHSaO?t=i*AL^m>PVzE->yO!CUgoLv}OxCnIlgSwOUG3=HnB1lF_d>QRDQvZ?sfHX7HC4*Cc7kCOr

literal 0
HcmV?d00001

diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/vi/LC_MESSAGES/sphinxcontrib.devhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/vi/LC_MESSAGES/sphinxcontrib.devhelp.po
new file mode 100644
index 000000000..97630404a
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/vi/LC_MESSAGES/sphinxcontrib.devhelp.po
@@ -0,0 +1,33 @@
+# Translations template for sphinxcontrib-devhelp.
+# Copyright (C) 2019 ORGANIZATION
+# This file is distributed under the same license as the
+# sphinxcontrib-devhelp project.
+# FIRST AUTHOR , 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Vietnamese (https://www.transifex.com/sphinx-doc/teams/36659/vi/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: vi\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..d7e98e4e7922c1ca9814a3c1a2eefcaa69a7e800
GIT binary patch
literal 930
zcmc&z&rcIU6kdOv_UOq(5AT2p4bJ{3h0sL|&{iR#(m6y?_U!MC#w+4HHA5p16ACZ9y?!Jo>UC;BcHA_OwN#q6`h=iWPt*m*eSJV|&CNTd;A#%e=+@+pM
z#3IL{nqRMlj8}f;z_?H64a3k1M`SYTlbbY>OmGKeSY>?P6I?~CM2;oEHY~%^XJ{xQ
zMe?%3d@^3INKzCI`ZQURxeB!NhYGMLN$_g6?GtK*=b_gBx!+VIjR0W
zD{WawBr~+Z;;w)3>@?T|PAb)BVdzt?RHPWWTn4TZkps6GXD){f&Iwl*x`~}mCr1O;
zpoS-ES1)%vVj-{8-3ktHuX-nQ<9AMq)U7$)dMYXO#zJladaFu>(lO0uvuUWfA1k9x
zC}, 2019.
+# 
+# Translators:
+# Yinian Chin , 2019
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Last-Translator: Yinian Chin , 2019\n"
+"Language-Team: Chinese (China) (https://www.transifex.com/sphinx-doc/teams/36659/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+"要调用帮助文件,请执行下面的命令:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr "导出 DevHelp 索引……"
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.devhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/devhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.devhelp.mo
new file mode 100644
index 0000000000000000000000000000000000000000..2e1b173e4ee1bb04fb39e141099f138e31fbc9ec
GIT binary patch
literal 885
zcmdT?O>Yx15Dg!vJ#yl}VGcn`RC(=9)2P`}M4D_NQkF*PLN7?j*>$pRH}=Z*CMo}d
z1AmGee*pdlM`oKsfeU9wdh(3*=8gUAua6#nYG6D-JVA8p;R-H|55Ym$?d~xQZ^Er3
ziQ&o?+-VcS>6^&}UJv33p8YZUIa1ZK;!7O)A%CA-{HjSJ_$q`U-b`2lt%S=BS8ZtJ
z&XqQ#bhFv`t{x#5=uE0tbY}y}bV?mITe{!t9rWpqE^T|$qB6W7r`oJ+2&%j(?Qw7f
zyY!fO@i>m|Y()dTA(|=_Ugo;QBRa8lv@Ez(N08ztu)-ZzZb1(3c=d@E!jMR%I>Q$X
f;czaU_fjZf&{=$g>kv-(TolmpdpO~L`g}hCgXs, 2019.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: sphinxcontrib-devhelp 1.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2019-01-20 00:43+0900\n"
+"PO-Revision-Date: 2019-01-19 15:44+0000\n"
+"Language-Team: Chinese (Taiwan) (https://www.transifex.com/sphinx-doc/teams/36659/zh_TW/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.6.0\n"
+"Language: zh_TW\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: sphinxcontrib/devhelp/__init__.py:52
+#, python-format
+msgid ""
+"To view the help file:\n"
+"$ mkdir -p $HOME/.local/share/devhelp/books\n"
+"$ ln -s $PWD/%(outdir)s $HOME/.local/share/devhelp/books/%(project)s\n"
+"$ devhelp"
+msgstr ""
+
+#: sphinxcontrib/devhelp/__init__.py:78
+msgid "dumping devhelp index..."
+msgstr ""
diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/__init__.py
new file mode 100644
index 000000000..312755420
--- /dev/null
+++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/__init__.py
@@ -0,0 +1,340 @@
+"""Build HTML help support files."""
+
+from __future__ import annotations
+
+import html
+import os
+import re
+from html.entities import codepoint2name
+from os import path
+from pathlib import Path
+from typing import TYPE_CHECKING, Any
+
+import sphinx
+from docutils import nodes
+from sphinx import addnodes
+from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.environment.adapters.indexentries import IndexEntries
+from sphinx.locale import get_translation
+from sphinx.util import logging
+from sphinx.util.fileutil import copy_asset_file
+from sphinx.util.nodes import NodeMatcher
+from sphinx.util.osutil import make_filename_from_project, relpath
+from sphinx.util.template import SphinxRenderer
+
+if TYPE_CHECKING:
+    from docutils.nodes import Element, Node
+    from sphinx.application import Sphinx
+    from sphinx.config import Config
+
+if sphinx.version_info[:2] >= (6, 1):
+    from sphinx.util.display import progress_message
+else:
+    from sphinx.util import progress_message  # type: ignore[no-redef]
+
+__version__ = '2.1.0'
+__version_info__ = (2, 1, 0)
+
+logger = logging.getLogger(__name__)
+__ = get_translation(__name__, 'console')
+
+package_dir = path.abspath(path.dirname(__file__))
+template_dir = path.join(package_dir, 'templates')
+
+
+# The following list includes only languages supported by Sphinx. See
+# https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms930130(v=msdn.10)
+# for more.
+chm_locales = {
+    # lang:   LCID,  encoding
+    'ca':    (0x403, 'cp1252'),
+    'cs':    (0x405, 'cp1250'),
+    'da':    (0x406, 'cp1252'),
+    'de':    (0x407, 'cp1252'),
+    'en':    (0x409, 'cp1252'),
+    'es':    (0x40a, 'cp1252'),
+    'et':    (0x425, 'cp1257'),
+    'fa':    (0x429, 'cp1256'),
+    'fi':    (0x40b, 'cp1252'),
+    'fr':    (0x40c, 'cp1252'),
+    'hr':    (0x41a, 'cp1250'),
+    'hu':    (0x40e, 'cp1250'),
+    'it':    (0x410, 'cp1252'),
+    'ja':    (0x411, 'cp932'),
+    'ko':    (0x412, 'cp949'),
+    'lt':    (0x427, 'cp1257'),
+    'lv':    (0x426, 'cp1257'),
+    'nl':    (0x413, 'cp1252'),
+    'no_NB': (0x414, 'cp1252'),
+    'pl':    (0x415, 'cp1250'),
+    'pt_BR': (0x416, 'cp1252'),
+    'ru':    (0x419, 'windows-1251'),  # emit as 
+    'sk':    (0x41b, 'cp1250'),
+    'sl':    (0x424, 'cp1250'),
+    'sv':    (0x41d, 'cp1252'),
+    'tr':    (0x41f, 'cp1254'),
+    'uk_UA': (0x422, 'cp1251'),
+    'zh_CN': (0x804, 'cp936'),
+    'zh_TW': (0x404, 'cp950'),
+}
+
+
+def chm_htmlescape(s: str, quote: bool = True) -> str:
+    """
+    chm_htmlescape() is a wrapper of html.escape().
+    .hhc/.hhk files don't recognize hex escaping, we need convert
+    hex escaping to decimal escaping. for example: ``'`` -> ``'``
+    html.escape() may generates a hex escaping ``'`` for single
+    quote ``'``, this wrapper fixes this.
+    """
+    s = html.escape(s, quote)
+    s = s.replace(''', ''')    # re-escape as decimal
+    return s
+
+
+class ToCTreeVisitor(nodes.NodeVisitor):
+    def __init__(self, document: nodes.document) -> None:
+        super().__init__(document)
+        self.body: list[str] = []
+        self.depth = 0
+
+    def append(self, text: str) -> None:
+        self.body.append(text)
+
+    def astext(self) -> str:
+        return '\n'.join(self.body)
+
+    def unknown_visit(self, node: Node) -> None:
+        pass
+
+    def unknown_departure(self, node: Node) -> None:
+        pass
+
+    def visit_bullet_list(self, node: Element) -> None:
+        if self.depth > 0:
+            self.append('
    ') + + self.depth += 1 + + def depart_bullet_list(self, node: Element) -> None: + self.depth -= 1 + if self.depth > 0: + self.append('
') + + def visit_list_item(self, node: Element) -> None: + self.append('
  • ') + self.depth += 1 + + def depart_list_item(self, node: Element) -> None: + self.depth -= 1 + + def visit_reference(self, node: Element) -> None: + title = chm_htmlescape(node.astext(), True) + self.append(f' ') + self.append(f' ') + self.append('') + raise nodes.SkipNode + + +class HTMLHelpBuilder(StandaloneHTMLBuilder): + """ + Builder that also outputs Windows HTML help project, contents and + index files. Adapted from the original Doc/tools/prechm.py. + """ + name = 'htmlhelp' + epilog = __('You can now run HTML Help Workshop with the .htp file in ' + '%(outdir)s.') + + # don't copy the reST source + copysource = False + supported_image_types = ['image/png', 'image/gif', 'image/jpeg'] + + # don't add links + add_permalinks = False + # don't add sidebar etc. + embedded = True + + # don't generate search index or include search page + search = False + + lcid = 0x409 + encoding = 'cp1252' + + def init(self) -> None: + # the output files for HTML help is .html by default + self.out_suffix = '.html' + self.link_suffix = '.html' + super().init() + # determine the correct locale setting + locale = chm_locales.get(self.config.language) + if locale is not None: + self.lcid, self.encoding = locale + + def prepare_writing(self, docnames: set[str]) -> None: + super().prepare_writing(docnames) + self.globalcontext['html5_doctype'] = False + + def update_page_context( + self, + pagename: str, + templatename: str, + ctx: dict[str, Any], + event_arg: str, + ) -> None: + ctx['encoding'] = self.encoding + + # escape the `body` part to 7-bit ASCII + body = ctx.get("body") + if body is not None: + ctx["body"] = re.sub(r"[^\x00-\x7F]", self._escape, body) + + @staticmethod + def _escape(match: re.Match[str]) -> str: + codepoint = ord(match.group(0)) + if codepoint in codepoint2name: + return f"&{codepoint2name[codepoint]};" + return f"&#{codepoint};" + + def handle_finish(self) -> None: + self.copy_stopword_list() + self.build_project_file() + self.build_toc_file() + self.build_hhx(self.outdir, self.config.htmlhelp_basename) + + def write_doc(self, docname: str, doctree: nodes.document) -> None: + for node in doctree.findall(nodes.reference): + # add ``target=_blank`` attributes to external links + if node.get('internal') is None and 'refuri' in node: + node['target'] = '_blank' + + super().write_doc(docname, doctree) + + def render(self, name: str, context: dict[str, Any]) -> str: + template = SphinxRenderer(template_dir) + return template.render(name, context) + + @progress_message(__('copying stopword list')) + def copy_stopword_list(self) -> None: + """Copy a stopword list (.stp) to outdir. + + The stopword list contains a list of words the full text search facility + shouldn't index. Note that this list must be pretty small. Different + versions of the MS docs claim the file has a maximum size of 256 or 512 + bytes (including \r\n at the end of each line). Note that "and", "or", + "not" and "near" are operators in the search language, so no point + indexing them even if we wanted to. + """ + template = path.join(template_dir, 'project.stp') + filename = path.join(self.outdir, self.config.htmlhelp_basename + '.stp') + copy_asset_file(template, filename) + + @progress_message(__('writing project file')) + def build_project_file(self) -> None: + """Create a project file (.hhp) on outdir.""" + # scan project files + project_files: list[str] = [] + for root, dirs, files in os.walk(self.outdir): + dirs.sort() + files.sort() + in_staticdir = root.startswith(path.join(self.outdir, '_static')) + for fn in sorted(files): + if (in_staticdir and not fn.endswith('.js')) or fn.endswith('.html'): + fn = relpath(path.join(root, fn), self.outdir) + project_files.append(fn.replace(os.sep, '\\')) + + context = { + 'outname': self.config.htmlhelp_basename, + 'title': self.config.html_title, + 'version': self.config.version, + 'project': self.config.project, + 'lcid': self.lcid, + 'master_doc': self.config.master_doc + self.out_suffix, + 'files': project_files, + } + body = self.render('project.hhp', context) + filename = Path(self.outdir, f'{self.config.htmlhelp_basename}.hhp') + filename.write_text(body, encoding=self.encoding, errors='xmlcharrefreplace') + + @progress_message(__('writing TOC file')) + def build_toc_file(self) -> None: + """Create a ToC file (.hhp) on outdir.""" + toctree = self.env.get_and_resolve_doctree(self.config.master_doc, self, + prune_toctrees=False) + visitor = ToCTreeVisitor(toctree) + matcher = NodeMatcher(addnodes.compact_paragraph, toctree=True) + for node in toctree.findall(matcher): + node.walkabout(visitor) + + context = { + 'body': visitor.astext(), + 'suffix': self.out_suffix, + 'short_title': self.config.html_short_title, + 'master_doc': self.config.master_doc, + 'domain_indices': self.domain_indices, + } + body = self.render('project.hhc', context) + filename = Path(self.outdir, f'{self.config.htmlhelp_basename}.hhc') + filename.write_text(body, encoding=self.encoding, errors='xmlcharrefreplace') + + def build_hhx(self, outdir: str | os.PathLike[str], outname: str) -> None: + logger.info(__('writing index file...')) + index = IndexEntries(self.env).create_index(self) + filename = Path(outdir, outname + '.hhk') + with open(filename, 'w', encoding=self.encoding, errors='xmlcharrefreplace') as f: + f.write('
      \n') + + def write_index( + title: str, + refs: list[tuple[str, str]], + subitems: list[tuple[str, list[tuple[str, str]]]], + ) -> None: + def write_param(name: str, value: str) -> None: + item = f' \n' + f.write(item) + title = chm_htmlescape(title, True) + f.write('
    • \n') + write_param('Keyword', title) + if len(refs) == 0: + write_param('See Also', title) + elif len(refs) == 1: + write_param('Local', refs[0][1]) + else: + for i, ref in enumerate(refs): + # XXX: better title? + write_param('Name', '[%d] %s' % (i, ref[1])) + write_param('Local', ref[1]) + f.write('\n') + if subitems: + f.write('
        ') + for subitem in subitems: + write_index(subitem[0], subitem[1], []) + f.write('
      ') + for (_group_key, group) in index: + for title, (refs, subitems, _category_key) in group: + write_index(title, refs, subitems) + f.write('
    \n') + # Fixup keywords (HTML escapes in keywords file) + content = filename.read_bytes().replace(b''', b''') + filename.write_bytes(content) + + +def default_htmlhelp_basename(config: Config) -> str: + """Better default htmlhelp_basename setting.""" + return make_filename_from_project(config.project) + 'doc' + + +def setup(app: Sphinx) -> dict[str, Any]: + app.require_sphinx('5.0') + app.setup_extension('sphinx.builders.html') + app.add_builder(HTMLHelpBuilder) + app.add_message_catalog(__name__, path.join(package_dir, 'locales')) + + app.add_config_value('htmlhelp_basename', default_htmlhelp_basename, '') + app.add_config_value('htmlhelp_file_suffix', None, 'html', [str]) + app.add_config_value('htmlhelp_link_suffix', None, 'html', [str]) + + return { + 'version': __version__, + 'parallel_read_safe': True, + 'parallel_write_safe': True, + } diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03953001a4bf127719090c106f76cf7cc3fb7fea GIT binary patch literal 18442 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/LC_MESSAGES/sphinxcontrib.htmlhelp.po +minimum_perc = 0 +source_file = sphinxcontrib.htmlhelp.pot +source_lang = en +type = PO + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ar/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ar/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..866212f344de8fce59d53a807b6532ad4086dea8 GIT binary patch literal 1025 zcmZuvO>fgc5H%m-kP||1<1j*^P{H~mO-kcpXxao?sZpyEfjDmLO}y0EwbpBrN^mH& zrRu%E0Eq$zBvd5CfeXLFz96pr3K%D-t$>xD-kY5_vun?Ozi@Wnz;zCB8L?ahC)P96 z4a9TACB!$xc|`Un{)v1M@e5&{Mt#aKCQvud7{(;>I`TE-edH_1Uy%X%2eR>4rr=Wn zLJmNs0v6k?WmsfU43DH*PeK{Pfa?%+$iNJB3|$^E-~z5*m#Gf8noLZ?m+=M{JxH{S z2T}zP@kAQ~#dWdUURfAb9c^$Cu;FOSG|i*kSji{M*JJDII3P;_dB{}4rEnpMLoSBC z6k72P33WdTi+ehzZQ7+Z7E7f`E9voo%%{DCw51EpR()xCuHI;@H6J`Et**4mf?`x- zJJO(u!pq;r;>OSR>=}R+RzjG6hEf>|Im(m{If~uo{v>EMVBSkyh zhwGu%apGFmU@$OsaS-paA-3sT02605^HLDx>~cSvL;KbQL1P}?n%{8ToCan zOuXq?7)wuho(*@w2F!Y%gVGtxGRkrxuR6AU$D4wQiLt)zIYq_Pan5m0Bx^NHRxnvD zwU%1Vy1IJNuM<%y+Xd#&7;5V0Zuk literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ar/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ar/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..ba61fdd0d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ar/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,45 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Abdullah ahmed , 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Abdullah ahmed , 2020\n" +"Language-Team: Arabic (https://www.transifex.com/sphinx-doc/teams/36659/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "تستطيع الأن في %(outdir)s" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "نسخ قائمة كلمات الوقوف" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "كتابة ملف المشروع" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "كتابة ملف فهرس الكتاب" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "كتابة ملف الفهرس ..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bg/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bg/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..6cc9c5d4de30e30cd072c6c063bc4133e23c246a GIT binary patch literal 506 zcmZ8dO>fgc5G@iXA366hNE}+VW3NL}nk_-3jf*115T&8_wX?AoIlI>Gn4~|1f5mU$ zw=kv>Ej($YncX)Z@BMo9^2ZV51;;VRo4$C4bIyPAC-!ek@4o4haK6EN?SpYvLTGDa z52dr@O@TG-np!t4q_K!aw9>8fgn6jU2Cus+;Mz&Z^67l>aXOo=vb(!z`DKkaUMu2p zI8&r03`9CcF~D>LLdfChOpJwKBChmz)35!XH-vN~hwsh=BU-3Hxc171Mv?OpZoe)T z@OheN@cy6GADC*ZPF1|JsQwnX)@mo=x@#)sjk0i36SYAm$$r0&sUK{%`Vg0HmprP+ zjVlx4u8_RFxEPI-qDoGqWz%`p;H~q!Ai=hO$}kyR!DBi(vG95V>1mYD^X$n{wl2D1 zKec5U4=o=@`antBC}Xdntd$R%CLL|@@`=}9wbdRoTe^+0m4wT}Q1nS#?b%ay|A8f` NLN_po$8j1R{RY;jm7xFt literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bg/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bg/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..73a9e4709 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bg/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Bulgarian (https://www.transifex.com/sphinx-doc/teams/36659/bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bn/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bn/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..b93f9f680e965ede9b8a3ab325a8130078d934c0 GIT binary patch literal 504 zcmZ8dO;6iE5T#O2KK9(hAoT#EW3NL(${X#1p*W_I6vy!ZRv+s6aO8;ffj3b=F(&2$x>j&?s_V!u7Y= z3~tAH2A}^~{e`Kv+Nz3I7WSpUrB)jWm)cgUF>q89wLvDyZnul68*A2jAD3>EJZs05 zD-+_Lker^K4Tec!ljCUKY`tpm+WAe8VB0@s81*jTIUOBYI2=KG9OctId-aozi>}yB zZCS)a%cqgvQ_?od*b69Y<%6ctmezRw%ImILYmb>N-OAWX!g*mRy3tm9c9gw;U_q+T L4fNt+oJI#vg0Ym! literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bn/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bn/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..c0cc89a8d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/bn/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Bengali (https://www.transifex.com/sphinx-doc/teams/36659/bn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ca/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ca/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..3c858379f366f955450d863bc5026b97a0c21974 GIT binary patch literal 504 zcmZ8d!A{#i5Cy3xA31ZFNPpuQq_K!aG}n#ugn1~<3U9V$z=e~L<-^JJ%WyoNXLone?E3;oUMu2p zI98-3bVS-m(ZRF_Ldb6KO!S3dBF^q6R--HS895lvMfTzF+et;l%^xA)U2 zd>iH&T>m5enW?tis*)uO^%vkmtBr(_B2_C3Clyf>WRmQ5yO`RsX07*e;Wo+3?YMG9 zLfjLQPv_^oep0C9G@8|0uWGz?eiJ0v<_`>m&K10rgA)ty2aujd`6SO?{bb{!5xc1^ zAMx1mYNYp+G_^AJ3W`ekplPtBHD12*+O5{wV`dAtGPaa(xil1g)mD3Ul)ZnHaHE#G LhECj%)9BzgagLO< literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ca/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ca/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..7a8075461 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ca/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Catalan (https://www.transifex.com/sphinx-doc/teams/36659/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cak/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cak/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..b5960e08bd195d469ffed3aaded306894d2999c0 GIT binary patch literal 466 zcmZ8d%TB{E5Cn-+j+{C8zySoCIHd(@9-^fIRWyJ~;qInxVo2>^Z)y1u{($e|Ti6JR z*GMaQ?b(_2e5|j%tq@kJHmEl1<`;J9{7#Qh-`zUc5YVx_v$ug5q-yMvUoC$U%pR+%CTFifV~bRZ4A+SXM~q6`ss-3WqaHwTPbp literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cak/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cak/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..6d64ffda5 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cak/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Kaqchikel (https://www.transifex.com/sphinx-doc/teams/36659/cak/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: cak\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cs/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cs/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..04cef2c662075b9f34cbcc8cc6a3b2471881f283 GIT binary patch literal 582 zcmZWmQBT`25bh?P^0=ox?BOPD2*jK?A!XDMMri}8)NEDh_U^iFVwBpE?XHFY!Qb0& z*@a4DY$u&`pYQwbbpC$5*?a6@yuy5k`Jn}W#V4%azV38L`!=!WP6|&(3-Uu+r;KLc zno8-dFxp!+CzW5-m8=_xLmJXxDjQ=xDO{-*E|Pg5sbO>WM;W`HTT9c zxc)vK!`FV1!}*KV7f99RnwPjzxIci*BwsNYJV;T&LFIkpSQKqGo6xsI)lzOlVOG)Z za~29tVic}=d3T{#B2d4euW&tO+(2O6>rV%XmY4Ii;UL=WK$ zP+)+~iwu%o^E`v}e_H&+YK8An2(2_OvH&Wx5+&6frms=k-HCOr! yM8&O>K3n@GIeq4}S1zR`xfW)jbjjd!u6%GKwY2CDI(g6FiqB;YN!SbHpz|C40-@Oe literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cs/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cs/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..1c817d1a2 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cs/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Czech (https://www.transifex.com/sphinx-doc/teams/36659/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cy/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cy/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..1fc4dd4d64a7fe48d703d4a677dd794003ad1396 GIT binary patch literal 547 zcmZ8e!EW0y4DEoPeB5~l4j76S9c|f7x#7C-sQxn^_i8W8M@HkrFgS1W=&A~O5 z(%ZslZ`B+tzp5))HxP#`WWiK6#(KDOAZN(`^XZEyTBOlbWd5IF(Tqr{!s1N|9KsVyS(%1lu-m@;XKZ)(5@EVSPpmJ z$7A?9$TPTnb^3~^x?GErP8Per0B2IHI6TVQRd8H+-#8vco6RQl?NYUr+psXJ=vg@~ zOc8mSaM9WMdAA=GyXYjC)N3nhyfb#?IOt{%UD~;T=Q2IkX&RrvH89}Nf}{oU9>Dt) zdT?|Ex~<|pEuqd?kdN~0#d`8MxFzGICcV3cRCu}dQBw=0FQBM|b<(G6zr@}Pua&Tr k7BgL#h0-O5-dy?Mi`3GR`SeXY4mV;hYe>R=7zYP`0J$%m=Kufz literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cy/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cy/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..48c307108 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/cy/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Welsh (https://www.transifex.com/sphinx-doc/teams/36659/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/da/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/da/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..b031a953b3760df4ec83cf5333186450ca6488e6 GIT binary patch literal 894 zcmZuvO>fgc5H%m-;0ve%ap5o=kW!VkozRrVC8!?>v?x)lHh?&8?Mb|~vuo|H>qLT| z!5`vBAWqy7KLTbGNCC0Z)0;P%@vLXx*R`7;Jvz4t4+sM%{y6U`?h!r^?h!r_?hwBG z(%*>h5`GXqU!$0?NAdUTo_C*^-SE8I#C>Ad|C)G>I4AbrsR|MD-7B&N$Aq1H%VJr#+A>mO&RW=oR-2`5u%DIpeFjked(kT?eSg+Q?y6ouq zV9~Wo2$|w+kqUxfl`XZpz{D;~PnLomrR)uABb1E6l$nsTL`kc~Im_&{$lN`fK@>#( zDV9oGHZ&8Fvi)je*ht0DAMPCucK3R{)Bf3+e{wux2O7Dh&#@l27(**+c39M6%{D|) zyxHD}I#EQ0>=ZAB8~bnFCN$ge=F^Rcjz8eWvXSP}6x=Eu!z+bwND?JHyHJ?&!YbL? zo%2koAkCjYUJRr@IjQ)B=BIom*a-PFh8~x~WYEa0ElnJTbzKM6jSyp;1&Nx5%RR7E zC84Dj6F%A6YInkvhwJ`HQE6VV7fMe}46Xp}+^BQ_4*W!}W YWH#5g(#~tSp$s^${jOSgEw`@lCx3Gaw*UYD literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/da/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/da/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..11b3f03dd --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/da/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,45 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Joe Hansen , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Joe Hansen , 2019\n" +"Language-Team: Danish (https://www.transifex.com/sphinx-doc/teams/36659/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "Du kan nu afvikle HTML Help Workshop med .htp-filen i %(outdir)s." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "kopierer stopword-liste" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "skriver projektfil" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "skriver TOC-fil" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "skriver indeksfil ..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/de/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/de/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..4a7ac2c7f2822ac543da978ca1a3ee2c36867626 GIT binary patch literal 503 zcmZ8d!EVz)5G@iXA31XvBo3|0*z1s#W=l}h#;qd75T$|p#-7-V>|JYjLedZENA)N8 z7S>dvz(^y_+kG={=KXy2^5H1Ni;%BFzU{$Z@h;Sl;S>9}rL*6uV4RoujhxrkNbp^) z&7rV{o!(&0ZBtXzK^lu#L@Vm7W6XV}OT5}u9@kbvmQUx4%js;k%I@x><(D;HJ5n6R z;Y=|}7>IO?Vu0xggpkA0sTd0ph`6F3x|jW*H-vN~haXNwh-jfaao`E485p K2JtvfqoZHm!jxkG literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/de/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/de/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..8daacfdae --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/de/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: German (https://www.transifex.com/sphinx-doc/teams/36659/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/el/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/el/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..61229e47d830160fee25401163fdff0fe0b8360d GIT binary patch literal 1050 zcmah{J8u&~5I!EFaD@+g!qIwkNA9Se?xf@@e}d&6zYf$>OW2!MjB;s#xTZEzCxKpd4MwUe@AKD z6A{#04qUWBMjRHal`$KB%nWj1P22$LoH8lub85m@#PVP_{GQk}P z1CQ}eO>iaII`LG?_mVy{rfu4(RT>DXNF{8tI+=@_A*l)nN|o8A^2}_pxLR6UORX$d z$-JblLON1(6?GtMXY$0(l1vV4+nLNw*m>K=K(b07u%zstag&hAIg{5XY&@y58!A$j zE)RWI3F&}(D593TfgO*kH&5K1nP$snzF8BkTUYzlk%TuRw~5VAe`t^@bz2TBNJ=*# z?I{(6j%BsmZBr%XSc7&F4r?$IQWrH#VMb_Oo0`hyE$Un2sTDtxu1{_Y*$N%tLEj7u z*=ZQ4g*1n;0%XQhm8DAQWX?Fy)I3g^a=hGTfQ>2IQC8r)j88+&b7e?XAyN%;<0LNW zszD_w@tUaPt2=OGovG9Uu4_PyBW>SWJ9Y4`W@s{rCy?96WAl`{z zpxFg|n0$KrL*mv4`c1s8d&eRA=x-~kKlbzSr|!mE@$-ZejsC(W$-ix@?&?Eid$0GC zYVkAu7O==(yp7Io{B*d*2D0pr28~e1yUAMrCjy(^P40)h?@(e#@ouv5|K`Q(Zed-F GHGTm!sE|GY literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/el/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/el/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..b63caf36a --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/el/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,47 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +# Translators: +# tzoumakers tzoumakers , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: tzoumakers tzoumakers , 2019\n" +"Language-Team: Greek (https://www.transifex.com/sphinx-doc/teams/36659/el/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" +"Μπορείτε τώρα να εκτελέσετε το HTML Help Workshop με το αρχείο .htp σε " +"%(outdir)s." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "αντιγραφή λίστας stopword" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "εγγραφή αρχείου έργου" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "εγγραφή αρχείου TOC" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "εγγραφή αρχείου ευρετηρίου..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eo/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eo/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..1f19bf63fc37c39720df71f9adbfafdade0a6296 GIT binary patch literal 506 zcmZ8d!EVz)5N#z+KK9IEkT|p|W3NL}nk_-3jf*115T$|p#+leg&aSmPA?b(kS9}BC z!k9{wcBGMJcHhi<^M0Sa_<1C8EcsIMb=UkCZ>0VupV+<4z57lD<8+PR$cNfl4WX@S zdnlY`U$3y@ZBtRxLK>@BMGI=3XUs!cukm_U23$G~Sw5c5K8`1oMRs==&A%-1#*<-L zhZDo3p{LRzsvf2TP)hd)=W3{w0C7P->W=m~t`F%z_uri>iD+g5{}l|L>L4 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eo/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eo/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..e21f80628 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eo/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Esperanto (https://www.transifex.com/sphinx-doc/teams/36659/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/es/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/es/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..92054219bde84ec3c3211e39570c22df24e701e5 GIT binary patch literal 962 zcmZuv&2AGh5MF-7VNVEw5E6&sP^ne%?j|(QYzb6KbeVps!F&R4@-3tIyz&+Cr_U?njzY7%|Dif;gY@7W@2Md`P{Xw`W7tA)~bR> zEvT*e{eyn@a^y5yzfA*2Mem&D)SAPo3v&AqT3NbIFH>TR7v%w=dj!XcN+qz$)>g8p-s^_*|_QJ7$?)l{I=siq+m9 DS6(FG literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/es/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/es/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..a9d429f12 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/es/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,47 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Edward Villegas-Pulgarin , 2019 +# Leonardo J. Caballero G. , 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Leonardo J. Caballero G. , 2020\n" +"Language-Team: Spanish (https://www.transifex.com/sphinx-doc/teams/36659/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" +"Ahora puede ejecutar HTML Help Workshop con el archivo .htp en %(outdir)s." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "copiando la lista de palabras vacías" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "escribir archivo de proyecto" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "escribiendo archivo TOC" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "escribiendo archivo index" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/et/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/et/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..85e8df14a4dce372838e117421636f5298cc4cb7 GIT binary patch literal 866 zcmZuv&2G~`5H^1opHKw{5QpJ_)T*rQgr;p=g4!m5L~7KkjfyyK?Tx*)y=(1`oAg0= z1D*hhTTkQ>IC0?-cm~D^YJsxSr}^1$cV@qxA1n7iIlLO zF=0-4MEFklcE@pkl077Rz3Vtn$*$a6T1NH>#RIa=2VFtL6(~IgQz;mXM+Yzvc?s{e z$!w}im`Y3mQvqIzB}`;4Kq`2#sw<48S+kxqH4>#tV0_qJ>|ZCOip6Y^^1K^bY4o{> za7jH{25cC!Q(>&sDg;}mQq3Z*(8x2EVv(nHM-4CV0{2*y+8`U*M8<5tN-P`e5c;FN z;lb`+uXo%(IdP8;$E<4vN4k#nIEoOOL8HxrCTp}H2*Qolde9C6BC=y~A?vdL@;0E+ z3OBaa16u9@x5&nZE1PrFCWPSyH*iwuoTPZIvnt;uubO#6ym`5(MMqRp@q|hXybjn{ z@PfLvsFftyS5w5&hQ2?YPCcyemlHAbB3<}P5m>AvAL)?wUu|x-+P*-4%{|I1!*ljl zo5F^m%0*~9%^g^}omBJ7yV{W9lL?Ld@rV+D39 zoUrX1UftD17}i&jj_I32*gli!z7t9ql9oQ+t%trKbgnlCGDm1$%6q~<{;&3T2qkV-i9gk|, 2019. +# +# Translators: +# Ivar Smolin , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Ivar Smolin , 2019\n" +"Language-Team: Estonian (https://www.transifex.com/sphinx-doc/teams/36659/et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" +"Võid nüüd käivitada HTML Help Workshopi .htp failiga kataloogis %(outdir)s." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "projektifaili kirjutamine" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "sisukorrafaili kirjutamine" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "indeksfaili kirjutamine..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eu/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eu/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..c6166e5b2cde56eeaa6da4e997d3b41470f654e0 GIT binary patch literal 503 zcmZ8dO>fgc5G@iXA31Xvq#jz8vDYCf&6c31jax;EAxZ=HjWe+qIlE?eP0}C2kLsW3 zZ|S&|DDb3_W_I6vy!Y_t_3s15D~`7uhh6a(-gAD>pV+<4o&7;Y!08&llk?gd3BIYc z*%#IXr&m~oZCz2_KpKl!Li;riQb z24BW`2A}>}{h6tzY*ooCsr^&nlGIkhrSd;pf}<*g#>*tx?RIhKrs@stVSa+sOIuC*y8oUL?-Zpe^hL)rSfPS1*J L=*7c0jSe0G|3j3F literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eu/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eu/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..b27af9cb7 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/eu/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Basque (https://www.transifex.com/sphinx-doc/teams/36659/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fa/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fa/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..f24393bc52f6f97560487ac4ac778202011853c4 GIT binary patch literal 1036 zcmZuv%}*0S6kk8$p(kVXX3XRmCDG)7`AI0OMu4)(zRVeHM+Rcu9TLqb~LwGFK+gsEnE5 zF2qs5_?j=cl5CX(sul*O&y4NZPHKrpLMl>>tE^0>>eZN(gbRh@y=VS^#u7;jNng-6J#==u!r0dl3a^{;`tW$$I!!VipNd{c f)nB^=JOW_3_T}`GLnJNp+Al45WcusuBrWS7^kt9% literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fa/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fa/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..d148099ed --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fa/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,47 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Hadi F , 2021 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Hadi F , 2021\n" +"Language-Team: Persian (https://www.transifex.com/sphinx-doc/teams/36659/fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" +"هم اکنون می توانید کارگاه راهنمای HTML را با فایل .htp در %(outdir)s اجرا " +"کنید." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "رونوشت از فهرست واژگان پالایشی" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "نوشتن فایل پروژه" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "نوشتن فایل فهرست عنوان ها" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "نوشتن فایل نمایه..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..47670758fcbaaf172521ede850da2a63534cf86e GIT binary patch literal 504 zcmZ8d!EW0y4DEoOeB5~l7TBRhM_W#lwo#j5Y2yw7;w?zi-4#c+RXCC%F-!U({i%J# zzGd_ZwA%;};FBKt$oK2r+ouDLH=OS|KXl-)_{jB7{>1KW?%jhf2&ZfOu6;1hN(gOj z?7nc8yjfvQo2J%H3u!E35iNA#Y!WcheH`#hdZ7TMihH2=258?P1d zIGiZb5_%#XqUd2d03l?5a3Y36FcBB}hv{Vh=k*~S$o~0>;D}}_5H7v4p;6?#gxmYs z48D%@46go>{=`&UZB@mRrFj9k)M~?B##$3F|&nR8(T@ZSQ(1GXsbOt%HBUpxK=CO LKrbG~X>{-#nfH|C literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fi/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fi/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..86b896841 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fi/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Finnish (https://www.transifex.com/sphinx-doc/teams/36659/fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..0301845ed3e09cd36975b81230cb1c58ae38d9f3 GIT binary patch literal 994 zcmaJ<&2G~`5H>&J;1fb{<1i8+T9vh((3HldRof)}krK6PqXNgRJ&qTgU2At;rxiQ~ z2i}0b1PA&OaN*8{SAemDQb4FHefnlr^S86#w>vlAJ9KUl?i2cz^T&Bhc9-yuaF6hr zaGUVuxBs2^F5xHP>ou|oFUkIK-En|;`-bBL#3}JZ;t#|Rh(8fKuT%jMmmpOMx{$Cl z9Q0uavm9P1{l=s!hf>%SY>MEeHitxH2tvZ6IaSzL=y~Hgk;+en9D%VaFO`lV6UI8F z7Ph(_?se*{*@ciXPUN- z&W0CwfqQ_t(v}U(NW^Tj7#TKHA@l|tyZ!ZzZug*fca&LDkUeAHJb QJgzld$@j{twWh7}3kOLwC;$Ke literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fr/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fr/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..25a894527 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/fr/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,49 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +# Translators: +# LAURENT Raphaël , 2019 +# Jean-François B. , 2019 +# Denis Bitouzé , 2021 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Denis Bitouzé , 2021\n" +"Language-Team: French (https://www.transifex.com/sphinx-doc/teams/36659/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" +"Vous pouvez maintenant exécuter HTML Help Workshop sur le fichier .htp dans " +"%(outdir)s." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "Copie de la liste des mots vides" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "enregistrement du fichier de projet" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "enregistrement du fichier de table des matières" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "enregistrement du fichier d'index..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/he/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/he/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..029341683a465b482392a2ddad9c62f412990e66 GIT binary patch literal 597 zcmZWmU2oGc6fKCSJo3!LeSooPIB~LetR5M3YsM-yP<4fOH@!`aQaiF;+Wipz9=~Nb zt+WrglBIimj?dNg`TP3SpAOXvI&bK_ZNZcJK>hodoepd7Cf5AI!n4tW{Y2}O(E?mk zDZMR>_EybVoztkkZS-dF+G zKgMJDHpnyh^lbD6Np-oFC5^1`0k9d$m4F+ZTin25<$dEs6m2$}(6_E?iQBL+t7yME zTbLs9^u$Fcr>DJsRAF=!OzO3jHM=%;T?KNsxL1(B^!LOv%!KFYJluqc(_ilRbIKXlj7-X6C;YHF$UITV$& v4t=`zOLq3CYj<9vWtlF_Lg`Y#*, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Hebrew (https://www.transifex.com/sphinx-doc/teams/36659/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: he\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..422180b37ebee0664804899ad6b2a408475e555e GIT binary patch literal 1313 zcmbVKO>1367(UwK;;y9V&c!RCkWlB`bJL_Yr$(A4(L{4;NG=tZC-+Y7nR@QbVb0v% z1QfNPMnqiIg$OR3TT2aX3HSwK!GGXF=}Km+f1-V6PD!KULJz$2ew^oh-jA8zPaMA% z;d=t|3}nqaN4_^N~gU>E4(P_HKpIEa#hkun4C<`Db7tv+oIqk zB%Pd8L(>y_s*0noDtCqKQ)N^+Qo2Wls7y4{!uV+C;$p};3<%ldJ0TRu@nN*o>N4+| z8oFLPY_-QOaa{=|Q>w~b$epf|MvE<$n?aHLK3j1TCyfnWDs5Q1>Wdz`Fzi>Xqf%OK zFRZSeUszh&Sl--htY7S~Ma?qCE$|5`2xdtTL>lGg%dxQ97lC%h@h%V(6S+$Y59gINu*+qKLa{@Zxi!Ao65? znDtRV7l#h(@NAIM3brF?GB>8I(q?ls8pXy}5Zipmb2RHUu%7BR4Kk|c=`&|$=bE`_ zPBqqxq0S2SlG1}JC0Pcynx8&LwK+d2>DhT|O*Pu9?d3?*N69Cj7&j0O)IHe{vSM12{LG zy#p1{, 2019. +# +# Translators: +# Ajay Singh , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Ajay Singh , 2019\n" +"Language-Team: Hindi (https://www.transifex.com/sphinx-doc/teams/36659/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" +"अब आप %(outdir)s में .एचटीपी #.htp# फाइल पर एच्.टी.एम्.एल. हेल्प वर्कशॉप " +"#HTML Help Workshop# चला सकते हैं." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "निषिद्धशब्द सूची की प्रतिलिपि बनाई जा रही है" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "परियोजना फाइल लिखी जा रही है" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "विषय-सूची फाइल लिखी जा रही है" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "अनुक्रमाणिका फाइल लिखी जा रही है" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..3ef0cf2a139aac94e0413f4f4baceb802bc3f6ee GIT binary patch literal 516 zcmZ8e!A=`75Cw_T9yxOuq#hE%?0VA#h-nakEbU5J8imknuT{A+~!nYktVwV_M)hX`M2fgKH|K zce&BtswGx_U01ShAP!l`g1Kyr^_aO*6?n5L9WD%qBpavG>+xhVPaYnE+1CZ$S}8oq z;Y4`Jp~vDOvL40*V2t+%Cv3|EX|Tv zZ^^{qmYkKE9`w}Em|pID)YL-hOUNr>o%ExPU*W|ouN`b9EhaiQh0-O5i>30xXQ`zn Ucj+IVINXS(tf3bU!#LRc3qoa>Q~&?~ literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..df7221711 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Hindi (India) (https://www.transifex.com/sphinx-doc/teams/36659/hi_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hi_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..4a7b2c907bb3ea521fa0ebf9c2d765044208f02d GIT binary patch literal 577 zcmZ8eQE$^Q5H5(PJi;pvhXm86afzL^WA&Or*Jh|v165aecT+bBO6|yYX(#P(@b~yF zTvow=lTNzN{=Pe(zn{;a{pe6Up?pdCx&?p5TdH3??R2m`n_2TsCq$K!c=dmGF?FK}d) z^wbW=(klTm<9%c?@*XfIy1i4@XN-tASKq64?Ekzj@SfJ{m&~1S7IVY5I-3hIaI7@1v%c zmA-_$l-4PqZ2cN99(nC{Yh^Ljxmi`Z5OA@qeDG0eWyu;c@lL?CT&f!4upjcE^9#cC Bqf-C? literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hr/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hr/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..ba033a4ae --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hr/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Croatian (https://www.transifex.com/sphinx-doc/teams/36659/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hu/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/hu/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..60df290ea3b9586f7b52a8bc3ab91051c08a3859 GIT binary patch literal 943 zcmZuvJ8u&~5I!EFaD@vmC6d^XNVXCs7Ko0uz4onr-aYNk`6ZAj z_yZI)>D(ZtprGLgaO6KgLqW%{fH^zL1F_PldE7U%bKlO-Th~80bZ!vt66$Gi;k+il zN_a!KL-KHrHRw%cLPg|SjAA8ZszHEC;w zMz&ah!!StaEV!QQWe!B74YG#q$qw6!dzLk|54FbTZvDw-wR%uHJk0FxHQBZi9H||v zauhxky+WCJMOG+*=lQFp6|d}hL}UkIB-3mE<*h=YczZAR|WA|z?y;&eb|Xrj~hwqX9L8@`uY5LJa#c{D7#|fw)HT- z{AoX=(U!`SeUJ=JDteNfRNw3XrpEZs_0!Tkypa+$_%qjs(& zNtW3r9fhLtrx6W@VuJZ7*u_5s;)4srrNqg@9M*POJe4kP{NRw zr1~@!pd~^mx@EVJaT?kp43oKmZj8t=;MnKD|FdHnfoEsA3rhuq, 2019. +# +# Translators: +# Balázs Úr, 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Balázs Úr, 2020\n" +"Language-Team: Hungarian (https://www.transifex.com/sphinx-doc/teams/36659/hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" +"Most már futtathatja a HTML Help Workshopot a(z) %(outdir)s könyvtárban lévő" +" .htp fájllal." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "kiszűrendő szavak listájának másolása" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "projektfájl írása" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "tartalomjegyzékfájl írása" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "indexfájl írása…" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/id/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/id/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..52250ebb5872ddb5946c959ac6391aacaadddec5 GIT binary patch literal 929 zcmZuv%Wl&^6g3aA@CsERA;jWtkXn_oozg(#Qq)HRjg+WWYk^py8_&d^#+k8Z#yFAS z3t00*d<9~`o)w<}*9oLhG1Ad}%ze$B^KI?sCy&l8!UMvfG5$L5N$(Oq5bhE_6K)f} z{Iz;R?WcP;Wt&x07@*YV;vZ?ctr1wTwkfH*mYcQ39<77C1 zV^NgwTAPW@bqTd}Ik;Rvkh>DbvJfB@JY3h66=?xscF%-IT} zAo9;dsf}Ypn@P?NtIV=Q$Iu%d^auL~-R@cM{MckRKU(yqbd^<@(HN4i43-F-#?V(>D`BY;tmn>^HV(tOt^?O}lVdS!3Wdv+ zFs{?kQJM`OKY7ybgp!9F{%KJeEZ7TerZxsuE=;@E+J&XM7x}~fuy?s%TBLtO+ZBo) zH7{u_CuS}z3zTXX(j1KyZm)7jaOX_A1Aiq;+0sU, 2019. +# +# Translators: +# Tumpal Gemelli, 2019 +# oon arfiandwi , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: oon arfiandwi , 2019\n" +"Language-Team: Indonesian (https://www.transifex.com/sphinx-doc/teams/36659/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" +"Anda sekarang dapat menjalankan HTML Help Workshop dengan berkas .htp di " +"%(outdir)s." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "menyalin daftar kata henti" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "menulis berkas proyek" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "menulis berkas TOC" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "menulis berkas indeks..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/it/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/it/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..907989afec83aefcfeb667afaa4c32fbb25dbe12 GIT binary patch literal 504 zcmZ8dO;6iE5T#O2KK9IEka_^Y*z1r0SxD7DOcg0^qY$`noQ=K6*|l~jP52@Fss4!m zmX3=Av`-poX7|moD$4h+BJ{V^ugr+if zS2#=FEU=<=UFo`kG#0UlX1Z~nFb}0!;`OEsICm1Vd^nzb9gaq`?Cvg_{+Q#9*NS)? zjudGL9g+4?bTI9K5VG4l7JVU@h%^1uv}^z8bs_D^?)kA`L=zPV=U&-RD{@}K?fql| z--meySO2X3!c<#sRLLt1y%spvYAs<*sy52PVMWvgnIzloHl}v0S?OI|xOMWP9ha_1 zhH$troh5 KPTY^vXzvfC{*?3p literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/it/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/it/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..3cbb110fa --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/it/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Italian (https://www.transifex.com/sphinx-doc/teams/36659/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ja/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ja/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..6b814db05ad53d251544c2c97745d6c906c447b5 GIT binary patch literal 1004 zcmaJ<-Affg6yHAR;XXywThzP+ip}1=rlxC#pQYhV(Mu6MjrWdsNB7PwGqYWd0(bX8 z9}*%IiGm0s11TSRu}FjdieBnv%<8p&pw8YK8U_yh_?_S3eC^ru^~BL-3*IrnX~1wQ z{(1Mn?g!iloC16T90z>qji>EN}(b0bT^gz+1r9 zEfJz3;fRYWk|9Tfh5RrYq<(;I3OTJj5uhs59?~8~wx5A{AbLMQvb~0l$5K`m3Dzg&q4a*7_go_69JwwCYJ^lS-1LNbF z(UAh~lay#Ehx>`9E^2mi9oT8cxmM&jZcA&E)8RM}h{xz1mbTp=*Mf4bZp+0c2VQ2F zD2)q}aOD#%q>Bnxt>SmXd$q(fR_ErqL%=E#6DTnWx4PYouXLL633FDop=n<)? z?h5rJZr_Vb$C;!O5AdQW!4G#)`vlXOtCUj-ONQSu>!MyVL4DM0ci6d%wRbxvTHD@y zy0h@mM9U_AV4`RBD>Dhm=O%t(k~I@Q`u{3Tw7R|d@%z#%Fif;)qAe3WHgmDHdxIu= zv%N9*n478Ky-S(CRs7b RYZGsn7&@(+WZ{4W>kqhka?Ah# literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ja/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ja/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..9a9f28000 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ja/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,45 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Takayuki Shimizukawa , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Takayuki Shimizukawa , 2019\n" +"Language-Team: Japanese (https://www.transifex.com/sphinx-doc/teams/36659/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "%(outdir)sに作成された .htp ファイルをHTML Help Workshopで使用できます。" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "stopword の一覧をコピー" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "プロジェクトファイルを書き出し" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "TOC ファイルを書き出し" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "インデックスファイルを書き出し..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ko/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ko/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..ff08a83e6902d341f2dcdb96639ac42f532cf4d3 GIT binary patch literal 942 zcmZuv&1(}u6kk8^kduglpvb!jEp;}V+SF#Xr5}m5*wE50O1*72lkD2f%rZM^Qcw`> zA^iXq`-L>pLJ=!H6l}$VC;caS^59J}`5W{lk+x_De*E5h^Lz8&zI{I~oL$!NoI_ki z4A-4w=LyEqBYbt zhX*qr%Rwl4P~;*5z86ZZC_Gt@S|bCEtiyoEGPKkP>AHRx4FrEo9odwQHXSmQArGhs zJN#e@9@7DW_>4t7Z#%REWBV{>, 2019. +# +# Translators: +# YT H , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: YT H , 2019\n" +"Language-Team: Korean (https://www.transifex.com/sphinx-doc/teams/36659/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "이제 %(outdir)s에서 .htp 파일을 이용하여 HTML Help Workshop을 실행할 수 있습니다." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "불용어 목록 복사 중" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "프로젝트 파일 쓰는 중" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "목차 파일 쓰는 중" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "색인 파일 쓰는 중…" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lt/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lt/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..9d5870de2a23b306c3aa3209d9cd463ceedf0afe GIT binary patch literal 638 zcma)4QE$^Q5H5(PJo3!LA;Gk2II**KEMC*mtr@D6K-CrA-PCP7rA}mD)=t{r*x%!~ z;H-lIPn>kpefD?X$@lrk>sJpQ7cX4Carv$Vf5Zn@PhWOAq&=IO>PF^BCQI^N8mlVJ z!PbS+yS&n9)PfYaDGOQFzXGLBAFYZZ7Hxa z9In2lDSR1a2@L)kJ#@3ULe!4i4Z6 zQy2n^;Qk)=_Y?-eSQpNL0{=yVVGLp0^rSI}qwarcFsJd@18-v|cn%?lVCi-hYPWgC4_$DGq3X#RKl)Z literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lt/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lt/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..70d370cd1 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lt/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Lithuanian (https://www.transifex.com/sphinx-doc/teams/36659/lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lv/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lv/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..1d23967338fdfa7f9b7b6143a78ca3a1dabb23f2 GIT binary patch literal 539 zcmZ8eU2oGc6de*zdE}XgJ84Xt#!c+59jiwe-I}3F2~=I--A&!ZD77Qo{n!uT@9_`z zAGl!>1Fm$XbL`{$as2bu%O3|6FDPGA9(ClecuV+^F0nhCI{RIf0VhlRrkvN-2=HyK z&AzlIIK99+teaXjE%2DdESjm-x`2hR^b&72mB+aikQJjz{&6%O&$9dbX!>Q2w@%4G z;GK1AFTk|FsZY-)F&fyvu zkQ@$E0@uKa^iHE3bdo+{lG$pcfBg9v%Dwm5iIh literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lv/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lv/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..543b17226 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/lv/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Latvian (https://www.transifex.com/sphinx-doc/teams/36659/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/mk/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/mk/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..ae62bebc6c7d92edd505b03149fc11188357fc2d GIT binary patch literal 537 zcmZ8eQE$^Q5FQdwdE}XgLxO43xWq2)SUm!CYlbQ{P<4fOH*piQ#Exv2c0Yu_#~|L=RNo_P2A(lt_>ODJmTyb9?yZ1CcN*U!9B4l`5O gQkzP^#af5xgEGpI<@7oC0pF literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/mk/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/mk/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..8fb1a2a6e --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/mk/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Macedonian (https://www.transifex.com/sphinx-doc/teams/36659/mk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: mk\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..962b6124893aa3b4d451f12a6a42ffddf367af36 GIT binary patch literal 529 zcmZ8e!EV|>5KX0?e9XCrsni1~9eYh74VzL0f>R-3f(Y%kTFhc^YwudSOMwr`C*(`= zAG!2LI!>gf%}687n|+!$^Y-ER_3aVGE6O*N?;7w=yr=p%Jz~?FTk}I^9w%%3CaqIO zb8vN`^gc7%TeZT%S7jl~8sd# zIb406PGL4o6ZrI>^k<^#d@FL2)T{5a>%SP6QdAsf#_nXUgocs%S>4~2&}v%Z(1upw zeeHM@?RLA+H)3id_hDwL=*baWn=JA)#zh}aPka67Q6Xvv^KxrNiC4x}j&$os=mwp0 zcq#`i4Q~e!w}W(&CeKEbqroNFEHzzssA*>}_dcpiq4YUqg|JTg!Pal^?3vdrwviSS iotd@LIft{A^1&CWr6sHBQw|(PVkJxHg#9oMj{X3lXr4g; literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..1da7b28d0 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Norwegian Bokmål (Norway) (https://www.transifex.com/sphinx-doc/teams/36659/nb_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: nb_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ne/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ne/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..26382ef3ac2ded269e325f581d0659f4175eef2e GIT binary patch literal 503 zcmZ8d!A{#i5T#O2KK9IEka_^Y*z1r`vXF{EOcg1nQAm5=I1_u3vuo{cNca#wil6AW zbX=rD`=pU(cHhjKdA~k=eBNVx;MnK*+!pU}!ubn-V*56A_JN9k<0bwi=e0Ewd{b$& zE364lFR%*hx}v&)G#0UlX4F_0F!!Zi;`OHVIJXkAd^nz54M(F{c7GpDzt8c;kqSHx zM=Fqnj!63`I+*rA2-)o&i@p#{#2G#6R`!2h7t)^WemNG5Xrg?;xl_j1Dp)7s_Qzxb zcf&k`%YUT5GS!qDRkEa^zXi@ottH%1qiPL@RS1ojNwVE;-n?Rk3hr}Tr)1-zz%Ljwl`NROg?oM&%#vTxB1n@NUm zcxrgFK)aAMwbJGSib^?8VXz4+Jb&Z0Tdl}pW(vF1rj&5L&>{Lph8!Ep);~$ORtu`3 K6ZhjZ+WQUdxRiDP literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ne/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ne/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..704477304 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ne/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Nepali (https://www.transifex.com/sphinx-doc/teams/36659/ne/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ne\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/nl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/nl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..df3b8a10fecf9bc224906cef99dbbe5c1b58ae0c GIT binary patch literal 502 zcmZ8d!EO^V5G@j?J#ywSNE}*~+4Y8`G%i7;%@#$I^E6#uLC-!g4;J@mMaK6PaIz;20gxEI5 z9V_oBm<=|xw~e+f!!q2z;hI, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Dutch (https://www.transifex.com/sphinx-doc/teams/36659/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..9fe5a7c6f11b54d4943c306331a7e9748d875cce GIT binary patch literal 649 zcmZ8fO>Y`85T#X5d+fP~iPT1*)Vua(NrS_ZlCY_ephblC(vw*X>u9l8wh2Va-{{}# zZ|N*aOWTnw&BvSfG&BDB`qhsH+6#Pd@V%{rzwABw-(NNwq|QyOxs$mk!v*;!ty4yG za8;r7E;rg+H7A8%mxU}VU?B}@FqM_Do{Zf}Ey&eo<;cu%$j1HQ=wp8{m}a-P!Q{(~ zTw5tT(vgAil0!^chtQa?Hc-lw_6hA!ia;`z_o|ltAC~}Y^W?(`MGHp4c`~y?yHa># zIoy05jo@>CoI&>==^jG$Y9m%CS(SeRGLvG>VPZ<<3TPJISB^)~cDoII&8n7i7v^Ri zJ&jHlCXYO}xajoktlf#KGHL~ra$`kFZj4dBdFl^FC*#8^UOX;DRwQBq`Y5S1x9P+4!tj}_& z_e2{b?P)6*569Wzz<9~v8qX^=ZuOzUU3t0lIHgef0`fvwCw;o{OLBg|)q7e>OER6C gh0-ey=X2$QPf|;ZC&th4z~M^FWeIWE30cti1%Ah}nE(I) literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pl/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pl/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..e1980f794 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pl/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Polish (https://www.transifex.com/sphinx-doc/teams/36659/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..2284db90d58f6ea9e95fd22729cf33b9a19bc4af GIT binary patch literal 507 zcmZ8d!EO^V5G@j?J#ywSNE})f?|MU08kZo_W{VI^E6#uLr|937!F|Pw#C$8hV2H+91<^Og z9xG=ln2l&?-!|BK$WxihWQE=Z5@oE-R$O;=6l!*<)^i{38;z3 ziJ2x;Fp&9J$bra5Af+0P&gEE2CW;k)GrjEpydmTxHGFd}8OcIN66>ICY&E%{;P&%k z0UxJj0dN12e#cZ>ce-XtPk#!rM!i?C~J`w)K4}$Jf@Y~XAkF# zt*bKPwwS%XxEPHyPuW?rY`dUaaqGf9DzN@{87G4)ct|Iw7G6vsKTFDaSv*?G-X%9| zC|bVb-t%^ZN6LJwjlF`Z(IFyDI@*cLM_#|x4udFc<+jGw3NAN>k`HJxu&HeSy@G4K M!4?MTIL(ujU)V90b^rhX literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..02a03b04f --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Portuguese (https://www.transifex.com/sphinx-doc/teams/36659/pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..d9ecc7c0c1f307489da8c4523fbec7772e9e53dc GIT binary patch literal 973 zcmZuv!EVz)5H$jUp(%|^t2RwaDqe z;KolNA^w5>1SjrX`2iRwB}G+NdYXBonc3O5^YhM)&kmlOhzE#%MgBV<(C;EXBJLr+ zBW@#pobz93?;`#neqTc$@dEu@*BuAY9;3aFwmj#b&^|=|4XyJ^77$SZLYANl0sG@Y zANEx)R`V`_x!6)>N3BTB$=A(S))b_HaffSdL0P z(@C;q+v$Yz+>7L7>+$?*>>$#DrZ|bRuREh9Cu2q@Aq??NMOrY!pw`j!J6dJzHJQ6E>@w`U{0fEF<4yz44!{t+m?zytQ9-y|&kIonslDeE}t71~iqL0-Ld@uvA~QllWSYK=r$V zPvv4U+2rz0aw=ju-$e@8RneSIH8n6rA*sVmq}h~JDgXN5rd}1s+Ow}B<`Jv*^@_Tx Kd9|=sI)4F~MJi?h literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..46146f48c --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,47 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Rafael Fontenelle , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Rafael Fontenelle , 2019\n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sphinx-doc/teams/36659/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" +"Você pode agora executar HTML Help Workshop com o arquivo .htp em " +"%(outdir)s." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "copiando lista de palavras vazia" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "escrevendo arquivo de projeto" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "escrevendo arquivo TOC" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "escrevendo arquivo de índice..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..599c2ddc1f89cff3d9c37fd275c2d00fbc9977ae GIT binary patch literal 524 zcmZ8e!EVz)5G@iXA31XvBo2wn*z1s#W=jxhDT>&)Ysua~}F_rqU!}3n~Iti;!uPlSW{~(W9rI!i`QN0FgFsCbiQ1DoG%vZsDGc12B4WS6MQ<-ICe!F~c{B{Nrn9QSTVwZ5f^Hv2Hyd5SshtfpyqZBg4ANzq zJZ0>|3~qeFr2WJ0TW^=?$Why, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Portuguese (Portugal) (https://www.transifex.com/sphinx-doc/teams/36659/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ro/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ro/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..b8ff0956f366b1c961e2ed6d54597a8be3f979e8 GIT binary patch literal 546 zcmZ8e(QeZ)6de*zdE}V~BaJE1xQX4hWAVsFw`QnP165aecT+bpO6MU?V~)AC8V`N+}XyA-}19?EkzWVIw|#drUEcnQ$JKR%q7L-gPL#%e_y!Mksww%34?_eYW)* rID6vt&)-N3xh~CG>57xHmGZ#{sij5l@t5v6xe_bckU^ZrEI9ZHY_XoZ literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ro/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ro/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..a1e7b611d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ro/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Romanian (https://www.transifex.com/sphinx-doc/teams/36659/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ru/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ru/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..df8a7f9a8d444a451c5056e07757521338a4fcd8 GIT binary patch literal 642 zcmZ8fUvJtl5NFe#^0?YUhV(iIoe(UML`WJ8qg-2?-vf)m+Jp;Es_zurE} zF0htuCt12X|Nh8#{`L0FQw!r2o_BaYG{s->3G?aeR*N*fu_^CV=E!hPekx=0Qgg7? zD%abr)XwBHvU2NUrHTrePkri5R8<;BQoGFOj;GA%hIX@5BS(jN>a$?dH-{yrtw zMoEWqWFVd55K`75G$bqrN_iBY&<>>tBolR?H@5%dB49C(KA%twZzQcFQzNx4q$>@F zn;)YQeCwwPbpNsLAyhAGxkO7-zZ7Ju<6%S>TXkgVVFKxD%KI76#j*a#s1OW}j-W~Dd%+l7 z0tJL)-4o&SRaZn!x?|8T3*qr`PwBC!jTH8WA_Q%&cDSC15A;s^rH{I3^X%CbsBj4( z3Y@mRbeJZG&Eg8ZYuu~SIL?O(hvd}O1yvz)eF51@8mpYB-GZDSaLs%c%8*27, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Russian (https://www.transifex.com/sphinx-doc/teams/36659/ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/si/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/si/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..c86768e85f6e0e8a7f42d527c29841f54a945dbc GIT binary patch literal 504 zcmZ8d!A{#i5T#O2KK9IEkT`(o*y}W*WFb`pF;%3vjgqwYjkB>AIlI>GqzNCwPw^3a zOUED;+L1<@xBF(^%zOIq{^5Y*9p@qEaSPtWN3I|F6Wh0`cXzrV9Ix<~_Q5zSAvBe- z`@&iBW{DMT>PpuQq_K!aG}Ddqgn1~<3a__iz=e~L<-_sh>u@xhW%GG7{jtCsuNCn) z94XQgIwI|(=wR9dA!N6ACi+4!5oh|hX=VTCbs_D^?&mYX5lvJeTzF+et;l%^w?8Kn z_&&@txcW!>3sY^mRV7OX^B3SktBr)Yv6ZS7oK!?jkV&%J?P6-jnzi1?h1(=Ax8uqc z32{$IKAoTU`bjX!X*8|3Ue$Q({3b}S%`*&x&LzB*gA)r!14vJ!e4J;mezI}V4ZEo= zA93ICYNYp+G_^AJ5{gRsplPtBHD0{(+O5{wV`dAtGPaa(u{0EY(^h+Sl)b-~aIKcQ LhECj%)9Bz2q4<>W literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/si/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/si/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..a20fc1e64 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/si/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Sinhala (https://www.transifex.com/sphinx-doc/teams/36659/si/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: si\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sk/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sk/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..57a51e9444ae3c1169226930dc67d82458843719 GIT binary patch literal 1009 zcmZuvyKWOf6kQ&oaD@;w2+*Y?aSz2vaAOB&K1kLhjxtiF4}je_A}ai&Udud3zFytl#6Ed(vlR}Tj47h*?i!w7^u9mcI1u`9T(Fbj0I+Usl zG1tZ#DsJ*@dw+M@HBWHSWus}zw(WT~Rq`bZ%#3<43rM3&o-w7l6h7!Q z&?Iq~f2U`=wp%!4sZ@rvbf0(0PS)3?Eq$oBwj0f@?ON@yesokg*l&|v#i+sSNR1li zL(%mr#4Qr946f^!%FAxWb&*I8*?{L`&+|&)mHpD=WfxDONwpzuMTL&3k;;dom<}Qd z>oFJEXbZCgE~KrajfXg?=wXBCXS9!lbu-{VVrWdNea9INhqlS@<~=sD z1DQCp2OwP;I0jp^^JrzITyb>dEENvoOwpJ;kt)$Xh;$n2YH1B-Zgmk?1|C$a;KITJ zh}`pF6CZ$iWEa)q!)k|{!c!)g!VTdr$3E=P4vV2^S8T6f z87xd7IsSC=l^KSr$h6@n?=MoWmY|Qnbfl8WOuU2tWE;u!_@lyC7o5RFP6SP|sfI!0 kF02VnxjwDVuE8qEj;5hZF04+4o&9?A;lk=v;E~C!zm0$~x&QzG literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sk/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sk/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..84698165c --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sk/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,45 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Slavko , 2021 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Slavko , 2021\n" +"Language-Team: Slovak (https://www.transifex.com/sphinx-doc/teams/36659/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "teraz môžete spustiť HTML Help Workshop so súborom .htp v %(outdir)s." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "kopírovanie zoznamu stop slov" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "zapisovanie súboru projektu" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "zapisovanie súboru s obsahom" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "zapisovanie súboru indexu…" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..1754715203540a5ab94187c980f69c2bdc14aa95 GIT binary patch literal 558 zcmZ8e!EW0y49$w2eB8MQ9yXvwCtG%$wo&J;Y2yw7;w?zB-W5l&H7JrHDNPFWH~M@1 zmeLEhY$HI34}2u?^j_Y*eePhq!92!%--5s5V_P3}I;4Fk*8CKuC!-~~7uHFm8MvmF zdRH3ltz3}WuT?En193=08caoFtS5!5gPAf9LQAgUr1rjXEQ+?, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Slovenian (https://www.transifex.com/sphinx-doc/teams/36659/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sphinxcontrib.htmlhelp.pot b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sphinxcontrib.htmlhelp.pot new file mode 100644 index 000000000..0b3ed6ce3 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sphinxcontrib.htmlhelp.pot @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sq/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sq/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..ed5439ee22696182c0d4d076e325c6c3ccb450e6 GIT binary patch literal 953 zcmZuv&2G~`5H>&J;1fb14uCWqkW!VkozRxXB~^bCXrx4~iUs1hu{ZWM_O81-CaDDC zDLC>3eGB>$oZ!rzJB$-(0d=KM-^}bcyR) z+$4PY?SCh}P54Rpc7<$0pX?u39j8IOdChU|5~suuh(8eDBmP9}ywMfJT!GS4FqMM6 zXgGj9k(cmVn~BYI2~&v~U?#xJu!OP91xN*t8oI(nnkDNwu`W-fO2MKor`jZtON-9b zNUWpL{_Z^MJRnsfX7iBedFRp6=pzy1LVB=pSU+K}gt1bq5Nw%AHH)=EBS$R5BG2kN zn_l1r?x85PK{m9hOxRA9S{CULdc*DhU~9YEJ?y=F=^pGyY}W{mbR6q)6d|;NW}5{q z)?9@k2v=5@gLV**kR6J*vcC3z-3l~U!y5k`vg;1#);c zntNOHu+;EE*z8!Ao;K;`W4gChr>nH$DV1T5&m9&CUWBlnkGPWbF^vqdw4v`$r&AB> zyX08RyjU0hq9H8Nv5%Bw{U>W{t8L#N`%CUYUKyUV=h_rD1Xa#m+i7jU!t68@JnTSo z$sP8Gy^AJOH{D%ou~77~lagvfF+;!1xl|hvXWUqUoeIZn{X$n)H5P{TRIC&F@(|WX z65SU<2}5nB4>_UU@R7)&<+Z)0>qPW8C@Pfzo}I!hlSWhElHn@^Ot?XjpPj130HXM3 z_DT&CT^{L7;C$@pxbYDuxuu~cM, 2019. +# +# Translators: +# Besnik Bleta , 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Besnik Bleta , 2020\n" +"Language-Team: Albanian (https://www.transifex.com/sphinx-doc/teams/36659/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" +"Tani mund të xhironi HTML Help Workshop me kartelën .htp te %(outdir)s." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "po kopjohet listë fjalësh të ndaluara" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "po shkruhet kartelë ndihme" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "po shkruhet kartelë TL" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "po shkruhet kartelë treguesi" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..c23e253c09c4b0395e4d4e9aa76ad1bc0a82cccf GIT binary patch literal 578 zcmZ8e(QeZ)6fKCSJR%->xRYR7HJsR4J65k5>(*?l)Iil1-rdwqj8Z$Y-L;eU8~h&M z!p*9&!IdnXW1n-cuFvncZ+^9~Ug3F<=R-qY)F;I6UbkALxtmz?Q|6wGmgI-DP8rR? z)uqzA+-Psrf|Pz;m9naVg*2qWRMy6NlDR@H$|a9WQmi@5q+KYX;i&Y!c07u<+imEZwrVAJVQ$vZ zes{7odF0XKqLb6pZZC2+Y6p{QV?{-7j9ohpx_+cCIXQzfU(kC0gB4^LKX1|rRB-OcDDqV0mTPPpgN-ZsBgDKu~xDpFlK^*o%7PS5V DFTkTt literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..b49090ac1 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Serbian (https://www.transifex.com/sphinx-doc/teams/36659/sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..be5d593a98c48f14b2f6fafe076a1e351087fb35 GIT binary patch literal 598 zcmZ8eO>f#j5T#X4KK9(hL~0{Yy7sOEY1rU2Bsdk4-6Ej9FJ>_tnO$plDMZTO=-=ya z={P7&+mS|^kN0LY^M1WK`q@Hzh5i=(U6cG}A24peZna2Ln^JH`~&Yx#5uJ!*O;!9F3;wY!*zu&dIHn z!s9qH5?*qMDeDs&6V?MtdAD~;`;;P(Oyv*Nto{>=Iy*n_^`qy>Q74#GTPrGZXY9st(DhU5lCw)Vgh^Y!XEaF| zoSZ-t(&L0N_yiOXj`>v*Keq-+w+WvZbigP)J{~BDp&jHf, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Serbian (Latin) (https://www.transifex.com/sphinx-doc/teams/36659/sr@latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr_RS/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sr_RS/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..553439883d579b9f5ea5f5e07637605fe5f3840c GIT binary patch literal 593 zcmZ8eQE$^Q5H5(PJo3!LAz*4XoY+}AR<9X!YlbQ{P_>0u_-dZ3FZsT*G=(PyhZ%#X{$w=x2ZLEGWTS>B44F-%4iO* zE|uQrMtiH4r1YDrlvNEZq#+GvvNqO}%oS=yuD69F3&SDJhU3YH;b=5V=ks9tc|mTh z6dv1=k?@j3Oj)1Mn6MsD%DcT&+NTtWWG26>X6*mGF0dZ&zB{ED!9+Mu7FK9i32!Wi z+b@#|d>Upc4E`B?g;ZT^MS&xo{WhEbsmVf$4Trh3OC>b4kDvqX()-%+DBA6Ip>Ia0 zwcLlf*+j=Xkd?_Jk75^{ouBvm(V=hD38vN7ii+GCyKx+JeJEXWb_qwAwDlWClZ3&^ z2{e$tOc;arKmqAkUnTMHuR+pn;6XtLjKagiQGy)WK@CGq+zGOAmOdJVjs!Polhk;f z`x, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Serbian (Serbia) (https://www.transifex.com/sphinx-doc/teams/36659/sr_RS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sr_RS\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sv/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/sv/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..44e6750eb50eb9f4e6b54b47aa1e120484c3c125 GIT binary patch literal 504 zcmZ8dO>fgc5G@iXA31XvBo3|0*z1s#W=l}h#zm20h?2m4V^8cw&aSn)`REVfPxVLi zw=kv>1x6Za-tL=uGw<=$%bzD4FF0RwzU{zY@s8^U{>1KW?(7dL0!~Z(PR?s1-0 z=2%!0oL*xcwoOe<3u!E35iO{-E@18}UEq9z_{SW7YBbq56aOITojSALDxcfGn z!IyEK!N-53KQYx*J5{ly-~R!)BDIyUJW#294X1Sot(Qr1I2_{8jnx}E#)aJ`Pq$-f zizIN5Pu^c#42Fr{Cuh;T**VqVopoC;!L+}jAN8)_sT`decr$|ZEXt>O_UtDc7u~X( zWcY~tmRAdO3`yH4ZLXlGmGcxvyRgB_XI{6}h8$+5u%$MYgv+%K(PuK`*irWWUc!x9 MQv, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Swedish (https://www.transifex.com/sphinx-doc/teams/36659/sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ta/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ta/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..9bff9aad80c2b3c4947b63fe0f0ecd6377943cca GIT binary patch literal 502 zcmZ8d!A{#i5Cy3xA31ZFN*q98>~)$@vNTl#F;%3vje^U4<817$>|JYj+=LJ5Kk*fO zOV=PZz(^y_+kG={<~<#K_Nj$SUuwaFv$ z9WMHGaWNc4B%-rmQMFc7cx!C!IOygXx^e#sUdr*QhL2;2&w_N8CVMx%ZNZKAQfhy~ zL(?rLcN8_1Q2Gk;QdlQx+|mXw_q=YajkK8P+^m%@I9#q21>dEX*8Az5f8cN}R, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Tamil (https://www.transifex.com/sphinx-doc/teams/36659/ta/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/te/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/te/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..210e5a36345b9e56ccc76a82472d79870a127760 GIT binary patch literal 503 zcmZ8dO>fgc5G@iXA31XvBo3|0*z1s#W=l}h#zm20h*HCS<816j&aSmPCg~69kLsV` zw=ixc3Os3~H@k1X-mh0L?~fQSI9_wS?UTRoj`;(BV*j@E?uRZ3=NtU4eK5{S2yJcb zp>&qKSz}GRrq)dhX)Iz9t#s==VIC^8!Kqktc;oyoNU-f=8YY7ac%qYI3vVWno<#XP&z|jM-=b?aQ(L~_ zu6^9>KuOyuV=thrl@FRG9c}UaS=Vp1)gCijx{a}wg!8qb=(D!kv!QJLorEj3)(s5e Jahyg+zX1>Cl%D_q literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/te/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/te/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..a12356494 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/te/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Telugu (https://www.transifex.com/sphinx-doc/teams/36659/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/tr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/tr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..4deb0ff530117082d5be1deba735e0f539784622 GIT binary patch literal 939 zcmZuvO>fgc5H%m-;1fb1Aq3J~Dq5AbowO;9t0K}S&`OC~r4gt%Huff7?Ce^*YaB=L zAGmPl*mEx2xX|ziIC0|6uYhra(h7B@r#CY@J3Bl3e%-nG$-;FD@et82olEOI+D*g< z#683}#BIdSfBtXeyNExCuh-BiAz(fq3$fPjf2?H)*WmRS-$u(_E?$ z60VJvD{jhY?`VI1Y8l`nWaD|rahzo|Rq`zh%p&!8;gG|SykbgoDSXgr#Kky}!YJM+ zkr^dX*=NP^9MA5uR4PL{ddNevmkl-PNgrCB#$o$;quK1XPEPFOqaN8;j2bLQn$$2K zs$Qi|yeg^G!1Mgg+PYWwJWM2A_Kug={-3uAm72f#blt;cx2ZOyr>M{gHB$MoC$p{$ z;wMyP7#;c0%T&yD1gnuTsrFqr&vVC=rTBo2oj{J<#d}F81J~dg z?QU#s)#|QM?wWm^WQr!_g;XQ$gGlGD-mUJy!rWaI@C+(zcIU9ux)>qO%HGETGJ$;; zY1tVY8#hfT7dsF{RB2{*GczFD7kOn<1Exqz1Tw@A^oH%5D3rROdNzepOmoSdQWegoBWRfOFG;~Pe=InhpV4GC z{r(xNDca`=M, 2019. +# +# Translators: +# BouRock, 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: BouRock, 2020\n" +"Language-Team: Turkish (https://www.transifex.com/sphinx-doc/teams/36659/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" +"Artık %(outdir)s içindeki .htp dosyası ile HTML Yardım Atölyesi'ni " +"çalıştırabilirsiniz." + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "gereksiz kelime listesi kopyalanıyor" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "proje dosyası yazılıyor" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "TOC dosyası yazılıyor" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "dizin dosyası yazılıyor..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..3f3475f03ea09dcf168d303bd0b3d57038745bfb GIT binary patch literal 744 zcmZuv(Qeu>6lGJN^0?kL^xp)V;oT zhF`|yQcGb`j&y{T90JNBLIc7YKq(I!$26i83&}`+&nnx$>q1}+9=<=O7*1apOU7C# zlM7pD4p)CGAk0_BH#EYr>Bj`-%9(gGt5_7F;r%ov}fdz1X|DaEy1uS$? zko_b0K*1JhMfd|-apReO>vGN7J^$j1RPFWXV4pT_xpp3;#}hPNQIwv zSK?P#xv_qkUjaPO~&h~ZH*ymD{u1bnorcw@P)66=bq>>sp2zTv{!-bg2 L90D)$m{a==7>mT4 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..ad8c0c754 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Ukrainian (Ukraine) (https://www.transifex.com/sphinx-doc/teams/36659/uk_UA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: uk_UA\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ur/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ur/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..f5251e66611fc230058be6260eea5ddd1878461e GIT binary patch literal 501 zcmZ8d!EVz)5G@iXA31XvBo3|0*z1s#W=l}h#zm20h|-k%#@^VAoLy^oOwteOH}x<0 z7RFSfz(^y_+kG={=KXy2^5KZ%1?Owdw>|hP-f{iNpV+@Gz5A{U!g-0`v=7Ev38Afx zJrvH8Hyf;J*VMXcA&o^WqLpr)C(J`-O1$c-fNLiq%ct|j<#aY%Ww*D{^6MI}y;j8I zaHdF07>IO?Vu0xggpkA0sTd2vL|o|~rkDMnH-vN~haXM_N3>9ZaP5^1jUwkI+}te| z@MW53@bMq%PfWE{rz)20{2zd8t#%UbeA&TqP1FXNB>Vk7rhcZ`>O)+(UGj7|maa&M z8$$B_>})hnI-i_G%ck?H!5imyL4s|6!!Q|Kz*9Lnw(w>G=}DB&^X%D7b}hPQE4Aed z?pxlA^nsGLQN~_CQ7a!bO*-1*`7^KIYO6hFws57fm4x$+q3E-=+OwT({Jn%Lwb2a> K;&GftN525nP?O^T literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ur/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ur/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..aee7fbed5 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/ur/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Urdu (https://www.transifex.com/sphinx-doc/teams/36659/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/vi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/vi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..e82b3623877d8b69c5792e3ce3aea84d4edde3b5 GIT binary patch literal 500 zcmZ8dO>f&U4DEoOeB5~l9(q{O(U!BMZPaC0+PFi2cni|3cg10B4Yp)R%twF7{?dL% ze@o>RXuA<0z$ZQOk?-N%+uuha-h_M~^0))9;$x`)giq|==Fa}2f^oXWJ91uIBf+olZ`odA)V2#vAJzFTu2bp&zA}@KlaOluz^Q#mit?bRC=|6Arj< z!&*!SPTE>&a|uPIoF^V_d4m@(yl$NhIm}F9*V>d4E>@bOZ)C^?H-qo@60X#WYUsto IIE{`T0sBCd, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Vietnamese (https://www.transifex.com/sphinx-doc/teams/36659/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..0e3b8bd95745d9e1abdcd1042cae7c519c057a0d GIT binary patch literal 917 zcmZuv&rcIU6kdPCLr+RH@!(-DCJ>z6Z3U!@7@)0!X@x)|@nn|WX?JkDv&>9wF`6Jz z(8OPfL8EdI5)2o_gE5L26aNZN9<)o#!M{P@wha*DWWT)kef#FUnK$o8%fST&)*-+N zKsqFQ)=lt}fLnlLfNy}qfbUJd4fZJDPpIt!A20^~@BNMV{sW3~1o$}E<6tS+7O=Bm zl`E`>EYm|CDke;#7ueb~sVrwIfi^Cgr-Ms_KsFb2dpV*$5qJ5Ikh#%Y+Nc zJOc^epp;;?qvK4w4l9y2 zg~VBIdcrj&;|97&p_NIKqO-P1CxJx!rlwSj70#W4Qn7G{moJ)msC>h@nz*#Xah8|` z10~>wL=e;(I%XScb)@u#p=qU3NtIzCnj_^fq1NaIwwa|#*ekTtU0t1Vt)5nEi;TEM zZo2q9;{{ZUJtSylM5ny zi!z71cjLknSE1y5qzCNifJ^0^bRyO8-&CDvn`erb{ z5!_zfT3fEIKMd|YuPv=A!Q6}B?n-_78hM&Z_5E_NxzLb)&b)!I`D1(OQ}xx`X6#?w ClscyX literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.htmlhelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.htmlhelp.po new file mode 100644 index 000000000..a96636d8f --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.htmlhelp.po @@ -0,0 +1,46 @@ +# Translations template for sphinxcontrib-htmlhelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-htmlhelp project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Yinian Chin , 2019 +# Jian Dai , 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Last-Translator: Jian Dai , 2020\n" +"Language-Team: Chinese (China) (https://www.transifex.com/sphinx-doc/teams/36659/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "你现在可以打开 %(outdir)s 中的 .hlp 文件运行 HTML Help Workshop 了。" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "导出停止词列表" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "写入项目文件" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "写入 TOC 文件" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "写入索引文件……" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.htmlhelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.htmlhelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..5acd1c5228f5a0e3028907919e12325a5c9946d1 GIT binary patch literal 512 zcmZ8e!EO^V5G@j?J#ywS2M(>u?0Q2|8kZo_WQ!tYAxalGB4;z%HQLxK+i6n%qd(RU z;9Hn&B?^o*(meZl-puo_7timGIG%C7@O>laJb=WpFH7%sEh()xd*1CYXuk;!(ca_J&O33o@Z2n<9oi4NM>uB-0z=koJ5Oe=Tw7N)@{86(>_2yN-yBC9Em8O<=K<3 zY+y8DSIO`)w=Itt=n#^&QQBNUSu5u$jCNsz=TE$Dq76CBOljBJR1(ftIz%7IkYi{0 S4{jw~sueZRi-&O<9sLH!!, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-htmlhelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-15 00:45+0900\n" +"PO-Revision-Date: 2019-02-14 15:47+0000\n" +"Language-Team: Chinese (Taiwan) (https://www.transifex.com/sphinx-doc/teams/36659/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/htmlhelp/__init__.py:147 +#, python-format +msgid "You can now run HTML Help Workshop with the .htp file in %(outdir)s." +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:203 +msgid "copying stopword list" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:218 +msgid "writing project file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:246 +msgid "writing TOC file" +msgstr "" + +#: sphinxcontrib/htmlhelp/__init__.py:268 +msgid "writing index file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/py.typed b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.hhc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.hhc new file mode 100644 index 000000000..49410e378 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.hhc @@ -0,0 +1,24 @@ +{%- macro sitemap(name, docname) -%} + + + + +{%- endmacro -%} + + + + + + + + + + + +
      +
    • {{ sitemap(short_title, master_doc) }} +{%- for indexname, indexcls, content, collapse in domain_indices %} +
    • {{ sitemap(indexcls.localname, indexname) }} +{%- endfor %} +{{ body }} +
    diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.hhp b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.hhp new file mode 100644 index 000000000..88b736e5d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.hhp @@ -0,0 +1,53 @@ +[OPTIONS] +Binary TOC=No +Binary Index=No +Compiled file={{ outname }}.chm +Contents file={{ outname }}.hhc +Default Window={{ outname }} +Default topic={{ master_doc }} +Display compile progress=No +Full text search stop list file={{ outname }}.stp +Full-text search=Yes +Index file={{ outname }}.hhk +Language={{ "%#x"|format(lcid) }} +Title={{ title }} + +{# +# The magical numbers in the long line under [WINDOWS] set most of the +# user-visible features (visible buttons, tabs, etc). +# About 0x10384e: This defines the buttons in the help viewer. The +# following defns are taken from htmlhelp.h. Not all possibilities +# actually work, and not all those that work are available from the Help +# Workshop GUI. In particular, the Zoom/Font button works and is not +# available from the GUI. The ones we're using are marked with 'x': +# +# 0x000002 Hide/Show x +# 0x000004 Back x +# 0x000008 Forward x +# 0x000010 Stop +# 0x000020 Refresh +# 0x000040 Home x +# 0x000080 Forward +# 0x000100 Back +# 0x000200 Notes +# 0x000400 Contents +# 0x000800 Locate x +# 0x001000 Options x +# 0x002000 Print x +# 0x004000 Index +# 0x008000 Search +# 0x010000 History +# 0x020000 Favorites +# 0x040000 Jump 1 +# 0x080000 Jump 2 +# 0x100000 Zoom/Font x +# 0x200000 TOC Next +# 0x400000 TOC Prev +-#} +[WINDOWS] +{{ outname }}="{{ title }}","{{ outname }}.hhc","{{ outname }}.hhk","{{ master_doc }}","{{ master_doc }}",,,,,0x63520,220,0x10384e,[0,0,1024,768],,,,,,,0 + +[FILES] +{%- for filename in files %} +{{ filename }} +{%- endfor %} diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.stp b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.stp new file mode 100644 index 000000000..16c49b01d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/htmlhelp/templates/project.stp @@ -0,0 +1,33 @@ +a +and +are +as +at +be +but +by +for +if +in +into +is +it +near +no +not +of +on +or +such +that +the +their +then +there +these +they +this +to +was +will +with diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/__init__.py new file mode 100644 index 000000000..1ce675db6 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/__init__.py @@ -0,0 +1,92 @@ +""" + sphinxcontrib.jsmath + ~~~~~~~~~~~~~~~~~~~~ + + Set up everything for use of JSMath to display math in HTML + via JavaScript. + + :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from os import path +from typing import Any, Dict, cast + +from docutils import nodes +from sphinx.application import Sphinx +from sphinx.builders.html import StandaloneHTMLBuilder +from sphinx.domains.math import MathDomain +from sphinx.environment import BuildEnvironment +from sphinx.errors import ExtensionError +from sphinx.locale import get_translation +from sphinx.util.math import get_node_equation_number +from sphinx.writers.html import HTMLTranslator + +from sphinxcontrib.jsmath.version import __version__ + +package_dir = path.abspath(path.dirname(__file__)) + +_ = get_translation(__name__) + + +def html_visit_math(self: HTMLTranslator, node: nodes.math) -> None: + self.body.append(self.starttag(node, 'span', '', CLASS='math notranslate nohighlight')) + self.body.append(self.encode(node.astext()) + '') + raise nodes.SkipNode + + +def html_visit_displaymath(self: HTMLTranslator, node: nodes.math_block) -> None: + if node['nowrap']: + self.body.append(self.starttag(node, 'div', CLASS='math notranslate nohighlight')) + self.body.append(self.encode(node.astext())) + self.body.append('
  • ') + raise nodes.SkipNode + for i, part in enumerate(node.astext().split('\n\n')): + part = self.encode(part) + if i == 0: + # necessary to e.g. set the id property correctly + if node['number']: + number = get_node_equation_number(self, node) + self.body.append('(%s)' % number) + self.add_permalink_ref(node, _('Permalink to this equation')) + self.body.append('') + self.body.append(self.starttag(node, 'div', CLASS='math notranslate nohighlight')) + else: + # but only once! + self.body.append('
    ') + if '&' in part or '\\\\' in part: + self.body.append('\\begin{split}' + part + '\\end{split}') + else: + self.body.append(part) + self.body.append('
    \n') + raise nodes.SkipNode + + +def install_jsmath(app: Sphinx, env: BuildEnvironment) -> None: + if app.builder.format != 'html' or app.builder.math_renderer_name != 'jsmath': # type: ignore # NOQA + return + if not app.config.jsmath_path: + raise ExtensionError('jsmath_path config value must be set for the ' + 'jsmath extension to work') + + builder = cast(StandaloneHTMLBuilder, app.builder) + domain = cast(MathDomain, env.get_domain('math')) + if domain.has_equations(): + # Enable jsmath only if equations exists + builder.add_js_file(app.config.jsmath_path) + + +def setup(app: Sphinx) -> Dict[str, Any]: + app.require_sphinx('2.0') + app.add_message_catalog(__name__, path.join(package_dir, 'locales')) + app.add_html_math_renderer('jsmath', + (html_visit_math, None), + (html_visit_displaymath, None)) + + app.add_config_value('jsmath_path', '', False) + app.connect('env-updated', install_jsmath) + return { + 'version': __version__, + 'parallel_read_safe': True, + 'parallel_write_safe': True, + } diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1a29cfcd1fad0a1108ea32e16c504cd957eb4c9 GIT binary patch literal 5543 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/__pycache__/version.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/__pycache__/version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27ea731eb09c0e657fef41310f80e7eabec19022 GIT binary patch literal 584 zcmaJ<&x;c=6izzr?$S~$6hv>K;9=1w{c+GOB4|6}f?JlITQ4D<$?l{(GZ`kS>?|n$ z7wXNc?8SpO{SQ1XJ&1GlA6VI2PiESwix)pg-uKA&ULIfayZgKuA%e-8riD^E7q zDaiE;L*4-oOn?U`umpI?EQ^;poYgkso9LA;Os5Vx(R8{ z!Usrkj*jf7qXQeSdj!Jek>UgN%o(kZU+xd>v16lSnIMmACIW@4=anw*;O-LQ@$PoE zO{phcO0ycJ#mpwD=y@FQ%nDhYSt8O|Ma6;8S>r||qGL(vCvcrRvwTf_8FIn`ent+` z!$i)ws}-@G!}eHue9iVp&*_nzN=@`!%S5n%;J+*oQxd1zmr);gdqfG%+c9%b*@>zC z$6~U!m=xpUI9={M4y88__>-h=rpX^kVY6LX5W?T(Em*#4fLpiU)_ykcd}zLRKHmS) Z>R-0{pNEUqqs865MRRZo8cF^I{s8}Jt@;1} literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/version.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/version.py new file mode 100644 index 000000000..24586d533 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/jsmath/version.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +""" + sphinxcontrib.jsmath.version + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + :copyright: Copyright 2007-2019 by the Sphinx team, see README. + :license: BSD, see LICENSE for details. +""" + +__version__ = '1.0.1' +__version_info__ = tuple(map(int, __version__.split('.'))) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/__init__.py new file mode 100644 index 000000000..bbc1e3bce --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/__init__.py @@ -0,0 +1,266 @@ +"""Build input files for the Qt collection generator.""" + +from __future__ import annotations + +import html +import os +import posixpath +import re +from collections.abc import Iterable +from os import path +from pathlib import Path +from typing import TYPE_CHECKING, Any, cast + +from docutils import nodes +from sphinx import addnodes +from sphinx.builders.html import StandaloneHTMLBuilder +from sphinx.environment.adapters.indexentries import IndexEntries +from sphinx.locale import get_translation +from sphinx.util import logging +from sphinx.util.nodes import NodeMatcher +from sphinx.util.osutil import canon_path, make_filename +from sphinx.util.template import SphinxRenderer + +if TYPE_CHECKING: + from docutils.nodes import Node + from sphinx.application import Sphinx + +__version__ = '2.0.0' +__version_info__ = (2, 0, 0) + +logger = logging.getLogger(__name__) +package_dir = path.abspath(path.dirname(__file__)) + +__ = get_translation(__name__, 'console') + + +_idpattern = re.compile( + r'(?P.+) (\((class in )?(?P<id>[\w\.]+)( (?P<descr>\w+))?\))$') + + +section_template = '<section title="%(title)s" ref="%(ref)s"/>' + + +def render_file(filename: str, **kwargs: Any) -> str: + pathname = path.join(package_dir, 'templates', filename) + return SphinxRenderer.render_from_file(pathname, kwargs) + + +class QtHelpBuilder(StandaloneHTMLBuilder): + """ + Builder that also outputs Qt help project, contents and index files. + """ + name = 'qthelp' + epilog = __('You can now run "qcollectiongenerator" with the .qhcp ' + 'project file in %(outdir)s, like this:\n' + '$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n' + 'To view the help file:\n' + '$ assistant -collectionFile %(outdir)s/%(project)s.qhc') + + # don't copy the reST source + copysource = False + supported_image_types = ['image/svg+xml', 'image/png', 'image/gif', + 'image/jpeg'] + + # don't add links + add_permalinks = False + + # don't add sidebar etc. + embedded = True + # disable download role + download_support = False + + # don't generate the search index or include the search page + search = False + + def init(self) -> None: + super().init() + # the output files for HTML help must be .html only + self.out_suffix = '.html' + self.link_suffix = '.html' + # self.config.html_style = 'traditional.css' + + def get_theme_config(self) -> tuple[str, dict[str, str | int | bool]]: + return self.config.qthelp_theme, self.config.qthelp_theme_options + + def handle_finish(self) -> None: + self.epilog = self.epilog % { + 'outdir': '%(outdir)s', + 'project': self.config.qthelp_basename, + } + self.build_qhp(self.outdir, self.config.qthelp_basename) + + def build_qhp(self, outdir: str | os.PathLike[str], outname: str) -> None: + logger.info(__('writing project file...')) + + # sections + tocdoc = self.env.get_and_resolve_doctree(self.config.master_doc, self, + prune_toctrees=False) + + sections = [] + matcher = NodeMatcher(addnodes.compact_paragraph, toctree=True) + for node in tocdoc.findall(matcher): + sections.extend(self.write_toc(node)) + + for indexname, indexcls, _content, _collapse in self.domain_indices: + item = section_template % {'title': indexcls.localname, + 'ref': indexname + self.out_suffix} + sections.append(' ' * 4 * 4 + item) + sections = '\n'.join(sections) # type: ignore[assignment] + + # keywords + keywords = [] + index = IndexEntries(self.env).create_index(self, group_entries=False) + for (_group_key, group) in index: + for title, (refs, subitems, _category_key) in group: + keywords.extend(self.build_keywords(title, refs, subitems)) + keywords = '\n'.join(keywords) # type: ignore[assignment] + + # it seems that the "namespace" may not contain non-alphanumeric + # characters, and more than one successive dot, or leading/trailing + # dots, are also forbidden + if self.config.qthelp_namespace: + nspace = self.config.qthelp_namespace + else: + nspace = f'org.sphinx.{outname}.{self.config.version}' + + nspace = re.sub(r'[^a-zA-Z0-9.\-]', '', nspace) + nspace = re.sub(r'\.+', '.', nspace).strip('.') + nspace = nspace.lower() + + # write the project file + body = render_file('project.qhp', outname=outname, + title=self.config.html_title, version=self.config.version, + project=self.config.project, namespace=nspace, + master_doc=self.config.master_doc, + sections=sections, keywords=keywords, + files=self.get_project_files(outdir)) + filename = Path(outdir, f'{outname}.qhp') + filename.write_text(body, encoding='utf-8') + + homepage = 'qthelp://' + posixpath.join( + nspace, 'doc', self.get_target_uri(self.config.master_doc)) + startpage = 'qthelp://' + posixpath.join(nspace, 'doc', f'index{self.link_suffix}') + + logger.info(__('writing collection project file...')) + body = render_file('project.qhcp', outname=outname, + title=self.config.html_short_title, + homepage=homepage, startpage=startpage) + filename = Path(outdir, f'{outname}.qhcp') + filename.write_text(body, encoding='utf-8') + + def isdocnode(self, node: Node) -> bool: + if not isinstance(node, nodes.list_item): + return False + if len(node.children) != 2: + return False + if not isinstance(node[0], addnodes.compact_paragraph): + return False + if not isinstance(node[0][0], nodes.reference): + return False + return isinstance(node[1], nodes.bullet_list) + + def write_toc(self, node: Node, indentlevel: int = 4) -> list[str]: + parts: list[str] = [] + if isinstance(node, nodes.list_item) and self.isdocnode(node): + compact_paragraph = cast(addnodes.compact_paragraph, node[0]) + reference = cast(nodes.reference, compact_paragraph[0]) + link = reference['refuri'] + title = html.escape(reference.astext()).replace('"', '"') + item = f'<section title="{title}" ref="{link}">' + parts.append(' ' * 4 * indentlevel + item) + + bullet_list = cast(nodes.bullet_list, node[1]) + list_items = cast(Iterable[nodes.list_item], bullet_list) + for list_item in list_items: + parts.extend(self.write_toc(list_item, indentlevel + 1)) + parts.append(' ' * 4 * indentlevel + '</section>') + elif isinstance(node, nodes.list_item): + for subnode in node: + parts.extend(self.write_toc(subnode, indentlevel)) + elif isinstance(node, nodes.reference): + link = node['refuri'] + title = html.escape(node.astext()).replace('"', '"') + item = section_template % {'title': title, 'ref': link} + item = ' ' * 4 * indentlevel + item + parts.append(item.encode('ascii', 'xmlcharrefreplace').decode()) + elif isinstance(node, (nodes.bullet_list, addnodes.compact_paragraph)): + for subnode in node: + parts.extend(self.write_toc(subnode, indentlevel)) + + return parts + + def keyword_item(self, name: str, ref: Any) -> str: + matchobj = _idpattern.match(name) + if matchobj: + groupdict = matchobj.groupdict() + shortname = groupdict['title'] + id = groupdict.get('id') + # descr = groupdict.get('descr') + if shortname.endswith('()'): + shortname = shortname[:-2] + id = html.escape(f'{id}.{shortname}', True) + else: + id = None + + nameattr = html.escape(name, quote=True) + refattr = html.escape(ref[1], quote=True) + if id: + item = ' ' * 12 + f'<keyword name="{nameattr}" id="{id}" ref="{refattr}"/>' + else: + item = ' ' * 12 + f'<keyword name="{nameattr}" ref="{refattr}"/>' + item.encode('ascii', 'xmlcharrefreplace') + return item + + def build_keywords(self, title: str, refs: list[Any], subitems: Any) -> list[str]: + keywords: list[str] = [] + + # if len(refs) == 0: # XXX + # write_param('See Also', title) + if len(refs) == 1: + keywords.append(self.keyword_item(title, refs[0])) + elif len(refs) > 1: + for _i, ref in enumerate(refs): # XXX # NoQA: FURB148 + # item = (' '*12 + + # '<keyword name="%s [%d]" ref="%s"/>' % ( + # title, i, ref)) + # item.encode('ascii', 'xmlcharrefreplace') + # keywords.append(item) + keywords.append(self.keyword_item(title, ref)) + + if subitems: + for subitem in subitems: + keywords.extend(self.build_keywords(subitem[0], subitem[1], [])) + + return keywords + + def get_project_files(self, outdir: str | os.PathLike[str]) -> list[str]: + project_files = [] + staticdir = path.join(outdir, '_static') + imagesdir = path.join(outdir, self.imagedir) + for root, _dirs, files in os.walk(outdir): + resourcedir = root.startswith((staticdir, imagesdir)) + for fn in sorted(files): + if (resourcedir and not fn.endswith('.js')) or fn.endswith('.html'): + filename = path.relpath(path.join(root, fn), outdir) + project_files.append(canon_path(filename)) + + return project_files + + +def setup(app: Sphinx) -> dict[str, Any]: + app.require_sphinx('5.0') + app.setup_extension('sphinx.builders.html') + app.add_builder(QtHelpBuilder) + app.add_message_catalog(__name__, path.join(package_dir, 'locales')) + + app.add_config_value('qthelp_basename', lambda self: make_filename(self.project), 'html') + app.add_config_value('qthelp_namespace', None, 'html', [str]) + app.add_config_value('qthelp_theme', 'nonav', 'html') + app.add_config_value('qthelp_theme_options', {}, 'html') + + return { + 'version': __version__, + 'parallel_read_safe': True, + 'parallel_write_safe': True, + } diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06f3cb1b28665890e086f2c034bdebcdcd7be41d GIT binary patch literal 14421 zcmcJ0ZBScTme_mJ)3<~K5(p4r8L&bA5Fh?-V{B|}L*u4D%yzqFdo)7t0mAyg?>+n> ziyd~iD<ft)F=S^KT;q;$##P3#D@|8z)i9f>44psYO8%e~j?{1MT5s)aD*YoBcjHvH zoT^ODxld05TJG*iC70sf`|dsW+^=)aJ?Gr3|75WkDG0y*cYzV7hob%gKa`-6GxXYH znxbYYmhw?7&8ot5MCDV_m{*6@J~c@hA45`&PeW3zPYWp%)<yI_J%QDPnTWw>AbD-r z7%}-wB(DpbBNm?}QsOI#SbbJfrVra9rM^;<H-yU~cAuT(jbTTm+*eNWrf@~X>2s32 zIb0d3@>P+%C0reG`CKGl60V8V`f5qu8m^0M@okB?eQxq?3vZ3o`|4?mv+!mZYiYP4 z(&%d>b!Fjgk?p?ikhlAqSck7!MRBgt_mqVxq}+~&ur?TcI|0TpdQSdYACq$5`Vu+M zd6l+G>T3bmDsBf`{!k^u_*$VvJ39Ey)@((-RXgkS?O|)!%8wY|UKMqkVyix)*lMo) zp*n|UA6v`1pmzUtwWluLetbL>X5FFa*tqB(3WYhrJrv{J;t1z{S9Aws;V>5zL$RoP zn2U0JK#cL;FA<T4mP~<YG$sbHR_KRseXj@*gJBNx%veAi!So$W)ski4!*@>lPxPET z(bwC5T2gmKuS-lYAcz2?iN;t?Km-AnRr2L$#Xyt|gkw>zXW*?fWRx5aK<3^k%UwGe z75NZpWF6*2zsLuoLYNE%Ky=~Q@Ng(P3|Uh@;C?G021lT=N-_om(OA@vgOe<gz$MO) zQ;r5AIOdYGV<VyHwf8vafG2%1*cxiIa!p**?rrt9demRyj_~<N(gk4&Vqq?Ry!q%m z9b!lfbDiFu9(VJF=H_5HAPBI&ZqHGy46&W(FI>Igy|~lU?8X9^dXVqDaCN80bM%78 z(-_~;A>@{vAUaaNt(jyzLcN>khVUB__-g44=ID*=EOMxcqUbdiGP9JJuN%$L4}r=> zBBOk<bb?Z7V?rhBl=4x%k}ISMRf1Ni@hs(0^-Bhki;Tg-!&Yc`9D&4)#zIlaG!_V6 z3Ji08HpKIGEVuDwUHwCREJ9Wts6wx-zNEc$HNX!Gk{-7P_d`H(b-UfK{<vi%7U5a~ zVeVSXTi4&=W23M-Ld(gs@9f6ik#oJ>r~L2524iB2I1VHl3WQs{`CK?O*fMrq9EnBu zc-z`rgpkPX&J9m!5y+my{sBD=wp<3f50AC@{h??`^!vSI*CmrOZXgtXD-3EE{0mJG zO;S&-_M6wIuHSaeUs^nvwsuVRJT+BiOgmDh9Sa8+-%p!5R+x@80HuN$DIv#+^x9uS z$&X>LILb$ZL{+ggNKloJ0Y2BT>O4<tS;nUurdZ9trhR(I8(6K+2&oDF&8#g+4biOb zBeT!Kma_Vf7+(o%V-1j6*)rA$sg1R>CP+(J2V2gXKhpTh*b3GHC3e=ymO$!YD_JX~ z<w@!q?W=&jt&%M7iaoFxInIms8(}xxxi63p0nr@@3o&<WTm;b}ptQiXbC1b8v<qZM zROF&i1AGkh4@@h|7cW61Y2~$!Kl?B??gqAWM`Ksr{CLz|f4Lxa@<ONHeKjPG5V7RF zJQB=zLr@}jZEJ>s0I_+5UG8w`5(l6m;SFP>yBM~0&@J1Vb0hW$1ha7<=Drf*u9CjU zjF3nX6Yz0J0I4LpcNa!@3M#(^-6;<fw}c|V2`$2v;hona;kZHm9E%Ps+2PPo+$fih zj&Z{S8`v6&1^(%^PRRTP4UDaj5j6#@`_F;t9_C8$xJpp|JiC*x9I;W<b!6CA8t;f0 z340hxBaDx6yu=`-OGa2czc4;D6uKsv!lCG;+y{tEM&QCjlELpMg3Rw15WRbncSFL1 zmO#bJHV}#z5uSl^!3EJj0h8!0Q@Sbh$0g6Jw<ej7tyx!nl6j)9<m;h+!&DJ7nJONT zvs8i_g>-W$Ce2<0nU`?|97C$J)C0O7WRDi;b0{<{nPock1LsFL$+7;+9~&cw+XI>> zOpg-PO(rhc$f<)({4$<+-NseeTz?kY3Mf7%sVqp18&fwj)~1xTX~FTS>wzod=}mch zSFF7&`rdD@3(kYA%U?t0b?btgU2JVei>v~xx~+<9DOh1YV3Y&2&dYwK3?Yi11K+zR z<+PxY{M7w%V}VbBwzM+ON;-uFHIkMa3&HWtx55}CYi>6N0|GguCBq<UEB?zPWBh&q z;P*fztlJjL2nd@np6bz%FcNod+>;HJ?_<-G5W$92RL@?Txs<J_&pKVRH)d{Rob4%R z`&SzEHse>6+Gzx`HNDVN2FuNosgh|CLFT*f_ucKwG#*Vg9(|%eCU07v*8pt^{F6;v zg@s<vwWI5y00@JKM<)p^t%!XkrEwDg$L26<*jz%ki>UA$Yevl*zws+Uv8qSv{K2mt zrY0ECs=$dhB{y28<O(UvJklr|JE2LaN6QO!N-m*M#@|g{1WupOCYVvDQd>x2ZdHXZ zC6~}Dt(BCfK5k@iC8`yeLJB>AaJ&G7KB1e?PZ%bQVvSOp(2v$B`9hk|0Va3hTgk;C z!)j&bm@vVJ8<d(t%IXp(gj+YVV+_UWN4FJVlw5*Qpe7htVY7&O0|~|VRDm8v!MZ7s z9W&(D-IB1ty!XMpL2OQxOjr|E_}-cOwp{=!n<$+qo3JO$uUU71-5e6OL}{W-p$cU* zu=cwd>f-~iouyfUoG`<@icuiS&rN}Met*~rN3@1DCR9JCSkr4-c{ibl&!1DDFcS{3 zO{p1eS8|1vHM5q4Lz(e+LYF}QdFWAC{mp?j<=4WIaEu<<Twge?p|3+qEo%kUy7<by zp}-W<*FY9of!9EG6mTiIgyS`^#bgJQz<oZdv@N7y9-uUa@W}QsM+Xz-VwYS7Qimpc zSo(=7PsbIBiqR8FeIZShvt^I$3KVEI4iSYl38Rflu8<}`wS_UAE|e&_?>{eP><Tp? zmrppqPtR-x^wOjBSV(~aRU5EX7PPnTI0u~h(d1T?rq<C*<!kBX%|h==F5yg6KB{_{ zJ7bFMNA(}RA8?$z`s2>4d`JXKThaQ7I_~v)PoX(I2HHI57h^$@=Qv>iigdY;2P#QJ zY+6YTrfl4Xmc{z;iZ%kYWtfkRkNLrdKvO?%it)o<*<AC!qP=nJ`5y#!$Gdj>T6Z7v zUf6w6qT=cc-kot%PMH90e#~Q#bf9CPLCGJ3<&bn&I9>pU1&@p=8Hl9`wjd`NBjAkS zct0BpO8T4u4(8}3?)udj&kB+TtpFj;AlA5MTpZec5QeDdqQMvo3lKNRs>&NJEs`2> zXo$rVuU8hRU@>f7tGKx^;NX~t;ZMQP<k9NU^c@4^K{9~h!HbxUYlxZR*)D0(%^|Ds zLorF^_e*LndPQ=g>IrI)pXb0QaRp3pc?XC}#rGm|Jl%N{u0Uxp7J>PT;1b~j!+c<D zMACus1df+5sAAW^fMX>C&Vg*CRKmt0flw68V>T4z1j&|LDZk<dkPP8iFc2mSz5_eZ z2FAt!315v}TCl_%<T-E{AP(-DR3dA1`E|DCRKEPq@W|4VisvM?Fg^%o3sA$DqzT8a zay+reB_moienL<3wwB@w<QA2<8U!BoC&`$b2+T_|jKze|HR1>=A-X!aAE4DZAL8*` zlxzg4FcRazyMzuMPZco&WW5u&NYVl|!`kx5agr_~JDDT~Jy?=~%nm0Z=}9&i25LfE z0c~P1r;r{3V*&>T7_1%N2RQh*5s}d^lRd16q#;?E78u|ZKmluj4Ft*J55g)A$N1}h z1l2|bLdVQtjJ?j+BD!}ldKV%AHLUggwIMHCa(K+dog4M#ys~`}kyL|5f!18fP1BU= zXUA8Zt!YQws=ob&mMW{5t(>XMl(wZx+ZG#tx%0D~nf9Jkd(Y#>Y}ct5YO1V#jiSqX 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 SyW;S?q%iYxKx?IC-uORM!<g3q literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/.tx/config b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/.tx/config new file mode 100644 index 000000000..7d3b64753 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/.tx/config @@ -0,0 +1,10 @@ +[main] +host = https://www.transifex.com + +[sphinx-1.sphinxcontrib-qthelp-pot] +file_filter = <lang>/LC_MESSAGES/sphinxcontrib.qthelp.po +minimum_perc = 0 +source_file = sphinxcontrib.qthelp.pot +source_lang = en +type = PO + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ar/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ar/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..b7f67d423503288dbf1aa5fb792df5900cc8d333 GIT binary patch literal 1194 zcmeHG(QeZ)6fLl)Jo18sc(|I_)Crt8EiG%h47#mDlUkUzf`kM}Zt6B3nVs2A(|ra= zd>(uY*A1-Q#3vBx%GWu^=lJ^CzaDP<sNuJP@dRVfP1e3onE%B1jIoK)y;rL}!to1^ zkMGxNa~vK1?Lmbr6ms}?C-_knkT3~Sm7og=n^%d-GM-qW<cv$MnN@ldN?}v5DF^>5 zO>)S!x<C$0MaDr$*s80-PK4eu&mj|EIZ}m*yr=LlwKaCIRsSQkW0uO^NWon2a_N=w zEMHnUC1#8;mPrd_wZmiQzcRloS1Yx!Le5~d;?~xE-@l=(m*oDRRwa^?3HiXa!Q+U) z<f)L0L`kc~m|Wp`;08mV`qVq)xzd&l%}h+lK`}FAq$21Kdnbd}y`!VE{`t9g`ffxH zHD~T@$q}<Wf(8vcgoY&C1xll4>ly7(ibQh8=fauZ<-LTkwd7Ic4VbZHq?t6CYf}Wr z?*{{T+Z*;_@0RsGQst~*Gqhy-W<o}sT}IH;Y%CI}r`F~s3WBmMed|=klrQ{5T?SR* zWTKM5;t~@y+wE2-U^>|GPP0O@j2tU{X(EvMa%$ps7pgRtaZKSAP(U<}LrlXeZD87P z=~hVTe%yrZ?JD1kL${*2!oqM3>~s)(fnduUo(%h|{$MM-L+lQhcr4dB7Hj#!26@JW z>_U<<ZMcmKJ0-g-o-1_9HR;PlP4KcrusaskdsAJ0j@`VD;DC*J1`WTB4*%cG-)D9A G&HM%wwQq$0 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ar/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ar/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..18666d9cc --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ar/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Arabic (https://www.transifex.com/sphinx-doc/teams/36659/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/bn/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/bn/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..abd3052716a1ad06232aaea24d40f3007fc7c7e7 GIT binary patch literal 1112 zcmeHG(T)-^6vent^XQ8&np}ySK(sRh8xV#?mtDY+fD#r>Ow^<dWv1)U4sC~FKg56X zC-hsq1zlL;C)nhq?ez4VdvEXjdUW!=fa3)51aWRR2jerYe<Hphiip;OLg6vaUvd6{ zSR?HDn}@serzm94FRb7vnL$Ve2$_S*1Qb`HOcE9vE=9xyQ`AURgq)igOw7Pt#bFAm zk~heK1y2}o0jDLInK@Tw{Sp%XjUkomz<Cb;QafOKr=>qqWxZ8)rV`ei<y)_qCF$0} zDp9SuHdGiO`w08ie{X&)SI8ANTtu+HaW8b&b?+#LDcSGiU5aEdCm)&8SdIX68gsD; zr7()m$O`L$0aje!^_>Yzr7~osBR(gWS)|ES2GARI2E&U^w>#-wUpwRXQ*xykwY4Q( zYFGeOztSXrg;W~g`@vc5h2QjjB$5eRb8C9cdj*x+mgggHNVOqTMTJi6GX>E9FdV|W z&Zr0H_pDzdRYVz$&~hg3He|}^GJs1aBARe0#m1yM@Vq?FU1MeWf^FPTF1=mmWG+L` z;2rIq)$6sUHxpjj87G;d3F%9<)B%WeyVdP#3wFzPNx-u<RLah1FzW5AiG_2nu$D|< z61ORaX4uAfX+pVZK^Rk|nQ3QcK^l9WjcUOZ>4{Lz@o58S%(!vh?pl>$?Qbz5I%5e` Q-8wq_@9@7r!EuNG28yFz;Q#;t literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/bn/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/bn/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..4148ca3c9 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/bn/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Bengali (https://www.transifex.com/sphinx-doc/teams/36659/bn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ca/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ca/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..56c41fa4850964cbaf8d8d2bc172d1279fd4bdcd GIT binary patch literal 1112 zcmeHG?T!*L6veo|=BI!Bqsf)H2}C<HumRa&(PjBCB%p*v6B9KlLz(G1v_sor*az{Q zd<lIPZ$TH9_y{&RX*)eV=ib{pzaE`@FW@*qJV9L8&B6GL>z{}(h$5o-pip>>^H-dI zAl3+b{^sHC{3#0A^GhrENoEjI0Yc`WG6BU^D3gSRhD#AK!4x%86(Q#)1`{)IS8<p^ zs^krFV8IgxT)=5bW@gS+S-*sYe`84HI&hxDztj%c-f8KNR9SD8ovDO1XZhAEW=XoW zuu4>Gt_>9i$Uefp_1~Kx%N26P4HpsYZ`=#rb=^D4VM_M<c$Xp>%*jWlG?pU(oyJ^j zLMe>mGqS>ZV1O0ZcYSBVQmG6X>4?wCRTgP7l>zid?ZNP}-R(|#*VoSY{giYRqqerB zOAQO4>Q~N*Um=wS_<nF!d*Pq^J`%}<t+_Ql=DmVSZOikKH>BE-siHzB_L&0ce;5wo zU3=7ni+k3ukt(8$Mraw*yA7E#x(uL04Nb5IO0hAi4m>Z<bJti|zF-?SluK`yIho7Q zGk8aPXZ3pR+zY8!cE(AjXhQl@Ep-4Q-EMWO+JxP*RTA*51(mWh8jO1TYGUD>4%U(h zOyV}h&<xucFHI;HO$cMEG&8NtEJ$O|vr#RWB0UkxIX-OwjTtx2+g+<Nto>~OS9Hb_ RsJeA@_}}4we}dx<{|#YUUdsRg literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ca/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ca/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..798bbd818 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ca/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Catalan (https://www.transifex.com/sphinx-doc/teams/36659/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cs/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cs/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..a72209946c6cc3bc58628dc0e81cda9bce4f22da GIT binary patch literal 1190 zcmeHG&2AGh5Dw7O9y!2;!%)#G5qN*nACgVBkfsTWlt9%6BqTs`Hcr-bV{dG4Hsu}Q z#^b@WFixOp3y;7`BYSqf`99B#{qz3T_Y!_vXphjE*17h5!2J)jk7(OyjXR~%LtH=M z`rvM<w7}KIzusHNFObN_zgfcfGKZK75V8Q33)r5=GEG@*xD-<+n4(6iZ78@&z$6UZ zc@k%kDft;OFySc!E?}oDb2H|uqMt#^FBn3(4xK0PFScuFZ>Rj5s-joS&QQXFvtp%{ zurymqSSG49*M<rMWOKr<)!&HUrYjYS8!o1>$+&TJ*LANT*GsbhPuC@q-k7{&N@F`h z&{@L8GM2(9J|c7M2OcnReb;x+SSFPr13l$qa-2^!8OjhkgI2HqvUPHD);T|SPTvek zTQO>TOHQa^AyoaKPW*rbHSqm#@8GFl_k9GCGq&JX^fvA}1P3dekGMY7h71)II<;d8 zq5HPqhu5t^2bwpej}R)RIh~?ptgjq0WONon`wNQ`C@02bI`q7vC|qMn`GhUqSkAn4 z-DE6d&tQi3_6`pZ>Rzn9igTLgil(G1)l7#VvX!f&{RXVJQCUC~K>)kEfENWf==l|R z0X~F)!J`PO>tHj2{l8(s3S|=?V<OnhDrW9EgWjOCnGKG?Y2##=z?NKQSg2u3<7Fx3 zq5*M2m1ZW&&4ko8I9ug}Dbf+K9OFd^p*G^id9}Xy3@3RR!Z97O6sqnaD*S&hf1cFs G_wozX-E7(b literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cs/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cs/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..8305be535 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cs/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Czech (https://www.transifex.com/sphinx-doc/teams/36659/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cy/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cy/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..c588f6ac748a45b39aa969f09d60acefbba85ccc GIT binary patch literal 1155 zcmeHG-EPw`6fR;{x#Wf$E)El$T7mP^($Z!Nu&o_TYN6T+2nmqf)NQ<Fc4|9K`yf0X zyaX@6aSH2J@d!lvWS^YR-{*5||9r6Xy@KBk;t}G|2DiR1IRAn8ir7UQ+^bX`;`j~6 zUx)?5<}dHB^KVhe=C7>aXPHAx1qfMy$_4DsW0|HbHe8As6HHMf)h-m=Bw!K-?mUSz z$dtT94orE<fD72G%G^x2s_AEt@+*c^u0!Vu{7dZ?+uN)Dk*euZ*%?V#a8{IF2}`rm z!YWa%xi(Z7Ae$YYTK|ptwp^u9+;B02&5Ao)cU|{}a=Rq^f4DA@oK46_rZl!A1f3;Z zEMqB*;$t$$e&7ZJ*LQvAoMloOGSD+VA;<YllaUOeH#j=$zdq`A&wCda&hY(+oG3<Z zZ%LOL7DC+*I>Zl1&<5WR8_lPF$M=y)&e?)n({0`h2%06&M_!+5Lq>`Uo!Vmx;q*hl z5ATi!Jvh8${Sv8SmeUzp#;covj2OKR;S)=B0@cKrOoyIV6oqT7D4(*W8_R2NT{oG? z*fY37dyQ7B+416)S96AGu4qb5rMlK3h^!2C^!xzU)2J$<D5$|J@F4^n)NK%y0X&YN z4g32b>?|m0b<8xJ!P%g<X*~AWIl;Cwf%UF3tirIR@v@Y1aR6~bm1ZW&&6Kn^JX^w) qDbf?MoZu}8p*`ltd9%LN43B9Q!Z97Q6zXmZ9sWOtzwc%HG5iKUuxEb& literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cy/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cy/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..58141b6f9 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/cy/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Welsh (https://www.transifex.com/sphinx-doc/teams/36659/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/da/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/da/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..2a8f2e131f841a647d0947dc89c4cdae43626e55 GIT binary patch literal 1111 zcmeHG-HsA56vnt$bLovYdvPRg0$DphY(N;6RdxYG0!mmkF;SB;Q)a3|JG32!eGs3? zr_g8d4CulVAHgPH+D^ZI-#Mpeemyz)UczyLI7M6*n}hKQ*FO=T5oJXCQK|G4=Px+_ zK&%nP`PJjy`6&t&=dTLEk1~UR3J@{}l?f=X0+}Q%FkFg=38tu#sth?dF_@Tvy^4br zQYF742NpbGzy+LDWM)FHs`>>a{2N0m*S_@}{-t)ncFrn)q^f$WY|SLBIm@?RF-y{| zMWIBs=GstUfb1h26#jejW4ThUxZxs#{f!5q+qQjAIZUbeKG~&6h9UXDl*V%SpwpO( zO(2C)d`?za4-C+=UE8&$ES1WTv5t61uCqv!ne?GQ?hZ$<yS?7De|u|9-p$C3Vzj6& z=~2UcsJUK?xE}GE;JW@r{oHN2E)vO<t$AU3%zFu5eamx^H=^2*nW91`#WVRZct0A! z+wQmzmk+G3kSd~#Mraw*`wf{fy7Zw(1=lfDVq;S6J5HYGwkcHkf^F<TE}dQCB$R<; z@QQXW8jX6(38_=HCP}7fLIzSTwGSfQZgr>DhTXDL5%8=7Uey{8$NhaVv2NB4mXZm~ z;V#9<4BHqdO(+*_2x6)<Go8#VNOR9CqFOLT`XZ1azN`<;IXBjuU8gcE{hbfjbj}i} Q*$s5~-{61$f#U}M4eW(pYybcN literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/da/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/da/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..45b157b99 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/da/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Danish (https://www.transifex.com/sphinx-doc/teams/36659/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/de/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/de/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..d37d6dec1d4c71f0239550f10ab9169a51213119 GIT binary patch literal 1111 zcmeHG-HsA56vnt$bLovYdvPRg0@2P78xV$Nm0e&%0!mmkF;SB;Q)a3|JG32!eGs3? zr_g8d4CulVAHgPH+D^ZI-#Mpeemyz)UczyLI7M6(n}hKQ*FO=T5oJXCQK|G4=Px+_ zK&%nP`Q_u?`6&t&=dTOFk1~UR3J@{}l?f=X0+}Q%FkFg=38tu#sth?dF_@Tvy^4br zQYF742NpbGzy+LDWM)FHs`@1){2N0m*S_@}{-t)ncFrn)q^f$WY|SLBIm@?RF-y{| zMWIBs=GstUfb1h26#jejW4ThUxZxs#{f!5q+qQjAIZUbeKG~&6h9UXDl*V%SpwpO( zO(2C)d`?za4-C+=UE8&$ES1WTv5t61uChpzne?GQ?hZ$9y1m}Ce|u|9-p$ChVzj6& z=~2UcsJUK?xE}GE;JW^K{e|0dT_lnzTl2#7nD+|2`j+P+Z$z~rGew0?if8g+@P0Ic zx7~3cE*@B4B2`2gjnFb=_Zu=}bm_wlQ%h`tN^DH3eaFf3+%|<OU$BiG$fdJOoP;uP z3|`UBd81KpIU#eZ)+EUkO~^p1rS?Ij+pX@@+OS)8DgvH$z^hv0;kdsqCf3cm#!@nY zIozcfnPD5_qzUDs4M9wmW~P&w1!?YiMN|u>NM8gp#FzD<Ip@Z@*>x(z(%<=TMdvJm Qn%zK${|)~4A2@FC-vN|fcK`qY literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/de/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/de/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..1e8251fdd --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/de/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: German (https://www.transifex.com/sphinx-doc/teams/36659/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/el/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/el/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..ec659c76e7c7433bb39f4183e84a3212da95f662 GIT binary patch literal 1110 zcmeHG(QeZ)6fI&;dE|u$c(_bVY6VWxO)YD>PHbyCO=@B43K9|^x#?|U=GvL<G~I{r zOZ)|V3pXvS-NYwg>Bx3`e9pbsH@}|je6P^hAv`A>m7A^cnbtoEUkJN|_M=MWDa~JL z{y|s}%Ja_S_4zXrD$kEg!B0Aem@81a0Fx`&y@|Dy7(1a=f(i|H+U!ChTna8l@Nd#M zgUsk}#DSTR2tvVLRp)LhOwGOqDXx*I!baXp_?OxiJJ_rKk*e91vNzVS5Lm3dQk2=s zqEzD63hTIXz%~)~OaG1eL%B*}gcB-(&5e7Z`@Vli*-okaez{JOT};_WG?vN{fz48( zma$gOhzYx)dQgCMKlDRygqb#u4Q(Q(>@-g-8|w&q!;_1_+mmj0)VsR!F5i#YnL%FG zmUX$q2=>Ezi-mPoKZG!h4jQk*Ru~eIjc_4K(}%n_P;abwA@K&>IyN?3Sy?_)1pN<# z0lYgI_TcEA^)XRZlJkTtQQmFX82LPcbAxyd)zrDnMnO;%h3`sHF~g-F>v^!wn@x2b zIJ#kjgJ!eQ3Qz_$?^5Q5OV-zBZX;0HYHK_DZCEcmRRu3PP_KEzi(zk5ODdapMwLWG zDcoihn8T$DGRcK%L!5GB(RFe+V}~1F8PyC8>#0~z>0u){oCxQguNxJq^0yJ3@(D`V Q_nYMKzrX+f0uTH9H;P4G7XSbN literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/el/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/el/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..45bbedc91 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/el/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Greek (https://www.transifex.com/sphinx-doc/teams/36659/el/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eo/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eo/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..314602262af22815f464c361b6f51babfcf8bdeb GIT binary patch literal 1114 zcmeHG(T)-^6vent^XQ8&CSHk~K(sRh8xV%Y2n!ezP{N{#iJFw5%yb>vq3tm2hxk+e zgMN#*pbJa<1e=_+ot~a^@9mvmkIudqaGW8YATI6ZXne-?PsA5Q5z%^3C_KjbE6zU< z8-zXYJlvl@MIn3MwSu2y1|bz7WDY75P+W&HNmyvO6cH0lQ6p6ma&BTUF#~rUhbg2= z-XI5-JYm2EoR?%~7F?C}OGx-PhE%Qt=Q;dK?TGE2m;OkV^-kHDN!W0f@4RA`q&o|% zM78GHP+@=^A{<!%gZZgkAy?dR5y9ccz0h6Py`vnbWWP`LDU#uWd}K;vIRemW%*8g8 z!YDo`Ype$bSaE&Vccv_r%8;>+_=0q^NRycipg-;mM{hd4-n4&x?M&X!$dzK$)|T|B zVF6VAN|X2%QfYwi2N$&$e$)4nNTzJVt?4Q66;x_Fo{zi{)rQOz6*{rc6u{uaXaw&% z<33#8vwn?K5oI(&OD69&WX9+Uqtq$BvoI1$u`#I*JTK34*H~e`WLr0sD{r4WS;){c zcuRX1^?I%8G3k|^Ns=j=kbzVy9e_x8Tivd<V83ja1Uzd)rR<D{<Nl$ZSUTqltH}hW zahqarhHZ_PCX|a7gfUf`nRaHDq;cTcsFqBTz6j+4A2)!;oEzuuzF8So|2BXwowEe0 QZXF%|_xRu6;Izko0}~@(@Bjb+ literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eo/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eo/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..005143ed2 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eo/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Esperanto (https://www.transifex.com/sphinx-doc/teams/36659/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/es/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/es/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..115125c02ac5e2b5fc8ecb56f6848b7722e3b0f2 GIT binary patch literal 1128 zcmeHG-EPw`6fR;{x#Wf$E)ErwS~2Hm)5@AsiEZsrrBzgGH3<ojyyP@7q;_UI&H5lb z7LNeW!f}e$G4TjkI`ZG=?>m3~^=$8Zi^d+=3$nLv^I&|U^-r?TWNos+lUD0F&0lE# zLAEAy_oJuV`!*3d+}II*R23v#f>br=N<#ZKQAL4?6-s6(QFE(w8){*5usMQ%n<pid zT74x9EJcAJB<y!oWmBQM<^T%u4GAht?7f12u{}Ts`<*{jUDGgo3k7R|b)%JIQ8p5e zi5nw~<<bJ%d3fRUcjAxfTD2Bd$P9Kb{&L;-{d>s6klguf8zP&e>>9P9bi`oFT*$jb zNvp*TyQO@PgOMNlp?8I)(w0q4CQ^1*Wri(O4CCqP<nrC=XmmB6&%N1)1v}TsU2fTk zTa4i_jQT8$Sabqm7#|(K4*Ow9Kz4;|;Y1(f-avHR;6lP(a%0&-b7=}!Cell5u2Z-c zRKkoKHmiz^YatIBA;Qb7;u-0px!<q_@>LA;l1pK7=;YRxCJutSu6^sc#S-uQM6H5t z_$*aPVCjtsj(WZ0et;(Edb6U^ykHkfuS^WGY_?{2IDqYP*pcvZ2vOIYPNw5sN-2BZ zIVBV&MY1W$HH&vPC<`v+0Fs<*gLYWiB|F*SoL5WKY%CL%Qhj4Mxe?ZTzwK9~0&HS9 l<2P8qq2D8g|80&Yp`H~eQw3ZnxmYVm(fx)EePrc2{x^MvX5#<= literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/es/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/es/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..c8088759a --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/es/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +# Translators: +# Edward Villegas-Pulgarin, 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Last-Translator: Edward Villegas-Pulgarin, 2019\n" +"Language-Team: Spanish (https://www.transifex.com/sphinx-doc/teams/36659/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "escribiendo archivo de proyecto..." + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/et/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/et/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..704cf24072d00a440b9a01c48ebf02c46443fd1d GIT binary patch literal 1134 zcmds0-EPw`6fR;{x#Wf$E)EkzEzC)}X=BS)w7(82tzv8y5)vSJ>1pFNwKMyq=^lg! z;{o7VI8M<z5WE1Ej%>%Dzwh`vCqEvod~NVp;dsKa?>G0xCtiQ&_{_1&vG<_Sc+B$` zp1*O-IQ;qBhmFPyo}V+3=Xvi5KbjI!sX?0xY^h=OCN+7EDJi4JsL@I?b`>f`8Bm50 z-ehS3g*DfVfsx7)l!mpYDQT!|%dJDMCdg3blHeKqjqM&fT5JBIYPp&@7#Nr-tZJ<c z^P-mUOwu{!NNNJH%<$CfFU9|)YgAT|(qmZO_$~D?4DTTKpX9%vFP<oRL-7HvV>=RX zMW*yTHJYrt5;yDzC)f_-Fb*!TFqTB$jnz;bm18FcCV_7Muy=NFcye;ly}S(0-wnjE zMd`g2Cz3FMjkvul;<jk-KpZEVTQB3?IA)-@z?t%*f8t(2d#lF9j60K##K21Ja$lwd zdNXO^a%ys}$-bGC`2nxWd5HLWz1HF@dR)peOC#NF!~o@#vvp*&;$~=OM1@PDsH&=v zJii*@JWS0rT38^4CXI+MxoC5HduumBidw;WURs%pQ)8zt0bSHv*V)*E#j?}X@U#Q% zR?zSDyGvWy!QhxpMa{3dEjTyAIYmV-mEMCilhz@1N*alsCC+CxLMysDHAAj(0y|fV zf;WqvMJ~c^0!Q)+bJz&CS>Zo#^@;y&C&WF&HC%N0gw#l?T){-y>yqSDY4ojKxB9;h Fe*zt;Y5f2I literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/et/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/et/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..e80dec5da --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/et/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +# Translators: +# Ivar Smolin <okul@linux.ee>, 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Last-Translator: Ivar Smolin <okul@linux.ee>, 2019\n" +"Language-Team: Estonian (https://www.transifex.com/sphinx-doc/teams/36659/et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "projektifaili kirjutamine..." + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "kollektsiooni projektifaili kirjutamine..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eu/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eu/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..402dab65fc837e97ed990cd92943ec6b51494256 GIT binary patch literal 1111 zcmeHG-HsA56vnt$bLovYdvPRg0$DphY(N;6RdxYG0!mmkF;SB;6s9_~L)&542l1JF z3Vjw&K^K<z2sZiBcKY@E&N)5v>&eOY0*({JDdN&@4#p>3|3rL76cNowg~C&uzu^1> zu}0YQtH-<ZQxvl2udLulnL$Ja2$_S*1Qb`1OcE9uF2#Zgrl^ss2st+~n3#dPilY=# zCBGsE<~(7*1)P;+W@cQK^$SS&H-=QML+3gCOYMN|ot6GbmGxHHnMhc3mT$dcmZVz? zt3<Wt+E8JD>?7=1|GoLKTp?H7aIt{>jR&E-u6s{8Ov!#9?NTKD8Tr7J#&U$9)0m4* zB!y9YN>*483@~tg*LTJ&mCBHzUho;Y&K8<XWC-11yFYl{?sUf8+goS!ZbEJpqqerB zLk$a|;s*`l2PCM2?}r!FbHCyHNF-yn=GOF>_Y#8YmgggHK(!$gMTJi6GlkH5KN!H< z_OJ_=53H|{Di#@Cpe4)hH)O)-GK6cYR~ds+Y)q;{&&%`NHCC0+*~X3J(%U6YW-{^& zUeVq~tyXP#Ec43FD9IE}NKdMz4nd^bt!`DCuv@lD0-m)XC_BUcu)8lN*3G%WQZj)# z+@%<qVH@M63FV>*QB0L)rj?mFsqc9<syS1nD<V0=mkpsl<;Hol>r{rNzq9#FSppTe Ph7SK5{O><-+~B_fPZnOF literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eu/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eu/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..f71319922 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/eu/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Basque (https://www.transifex.com/sphinx-doc/teams/36659/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fa/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fa/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..c62eadc392b0509abf8afbce41ecb172e2259329 GIT binary patch literal 1111 zcmeHG(T)-^6vent^XQ8&`*1_t1frc8*nluBD7%0m0VOP&n5an^%1m`=hqlA8AL2Lp z75XjSf-Wra6KrzQc6xfwy|;IMJvsYcz;T8+M_k#>(fEYxpNP+hBBJ%EP<V>-7o2|} zHVAv(dAvVAM<ILu$_jpz8H7}TkU6MKKye+)Bw?Z9QbbHJMU7NN$hnEZ#0=bZ9Hx*e z`4u^^<Ou^V;G!fmv*4<%UqHgYF{E-GIM3i;YDaAEqVz|qtar-JOu~k<eCHLjB;8q9 zC8{;oh6)4Z5aGc3AIwkX3c2EjiwF)k9)#|??mgu=CHsA{Pmv54<O5S0%MpN1V=lI# z6h`qmSz|pgz>4d;zB6U1RECUo#24f`i!_<Z0Q%$ZaP+#{>rMN&x6b6<jNB+jZEZ=9 z8Wup+uQZ8YA(aOBesEcP?l*lOiDb$)+?t;9UP7g|<N3%NQEkXfQK1w2OaTnuk4Ese zJMP2P1M3b_MU>G9Etm9uLuQPw0+`tRum?)9F{utbFVAz=SXsVgTQ`&|Z=X3?$j~!* zM|+p`dada#saJL;Nv3E*22!nb03zLOb-UVv{jyyW(1A+X84t((Lou;#&JC853C!Ux z#mEfX8ZS*K7cB^5sx&k0%q&Ucz_URunIe4=$_2h`0F5~}&YOLwGA#XF0M~TR5~#X$ Obok%kfB%8g2LBC^uwKgm literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fa/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fa/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..394c1efc0 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fa/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Persian (https://www.transifex.com/sphinx-doc/teams/36659/fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fi/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fi/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..1f83bc3a7580529532547caf110e7e961decdb76 GIT binary patch literal 1112 zcmeHG?T!*L6veo|=BI!Bqsf)H2}C;|Y(N+mU3LLO0!mmkF;SB;bY{8^?a+1@_Cb6n zUqYY7JD>|od<2`Ew4I)wbMNh)Uyn|{mvEdQo*>SP&B6GL>z{}(h%%!6pj3K{^H-dI zAl8WD{LRDN`BM}s&MykVPcnmm3J@{}l?f=X0+}Q%FkFg=38tu#sth?dF_@Tvy^4br zQYCMY10hcsZ~><knVAJwRs9kY{*57(Yu|bf|57_(JExUDQdPZGwq_F6oaI}um?i1f zqEMn*b8V<FK=u(13je+Nv0N!v+;9=W{>Ht~ZQH)19Hvx!pX^d3!v*=sl*V%SpwpO( zO(2C)d`?za4-C+=UE8&$ES1WTv5xqHTxO9bGwDNr+#QZCy1m}Ce|>FD-p|ODVzj6& z=~2UcsJUK?xE}GE;JW@<{e|0dT_lnzTl2#7nD+|2`j+P+Z$z~rGew0?if8g+@L@E9 zcinLx&hJ^jMyiN18lh##?>1z{=n`*nA-ImA5*w3h-*NIhw@o3-L$<L4xpa1!lZ6Z% zgLkxZ)@amQPRO0AHAyl>6Ecu$seKUXcB?zJHtd$2ihySw@T%5$IPUMOiG{PSu$D|< z61ORaX4u9!X+pVZLl9G?ndxLEB+Wgqh$>`?^hF>S__RJW=iFFtcdg2>_P0J<(m6|@ QW;f8`e~175364AbH@}Qt`~Uy| literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fi/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fi/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..ee3d6a5ae --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fi/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Finnish (https://www.transifex.com/sphinx-doc/teams/36659/fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fr/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fr/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..da69f2b317fc4455c1fe243d751d357e62879761 GIT binary patch literal 1140 zcmeHG(QeZ)6fI&;dE|u`9<C;aT9}h`Q^%HW)4H`qlUk^{fP@4{ZgP_tQaiJqruz`S zg3sU^c!Y1^rbX+R_yi(d**8A-p5tTt*Q2ek4f?hyo=_au$(`>5&3{sSq}ZnDK4>%^ z)A)(T9~29UdVTb8z5bjUJ)?YFH+-*3h`0o)D$u2b?dwS8IYw3}nW99^t<u|237dh< z5Zvo5DxlEnGhrYRIf9U|(^RF6g>IQ$$i){Vs4#)^6#mui4%*vk{%O@RtIkfSU?H$t zab=hnD~h@kH%1uCr3JQ8IIQ_M<oDY(DlM##DQqhKlJ2_hE#&T&>i?7V7TIOY-k~;R zM*ybCgj_~SS}kVmn*1PvZP#~wXNrZ=mW@p+Vs>7phJ`AC!MJxhI_vfO)4|o1GkFuT z3yr+?mi4*C0QUU$5%b%ueF(lE>~~)HN4`%$HpPXgN$=xcLc6oV`GgyBV_B%VG<khY z0gQTYr-RoaOnH&<@85Db&UvX(+A|?Bb`yQNyP~8@nU*{y1&O{*ScrTcz>o@}44Rp> zg$X>bsw&skBqG738>zXs_JPGJ@+_4YZ~x$+bL1u3YdMp=)I4WHrROF9S*%iXve$+6 z^rR`_6xuCkd^sL$tR)wn3o@3pvhb!LVHTIxD{?Mm7ov=7gZ8Af2|L{2YEcPlHjt5u z>6`;NoC)i^THjlwgSZLcoX;?aJ@<eZ{$F>L8dG{m8s}s+#3enjC=;k5#`W8<_3i%+ D>HBLj literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fr/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fr/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..2f00636d0 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/fr/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +# Translators: +# LAURENT Raphaël <laurent@ined.fr>, 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Last-Translator: LAURENT Raphaël <laurent@ined.fr>, 2019\n" +"Language-Team: French (https://www.transifex.com/sphinx-doc/teams/36659/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "enregistrement du fichier de projet..." + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/he/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/he/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..563b5e50469bb4ab1a5d9c5b0eb83359549760de GIT binary patch literal 1205 zcmeHGQE$^Q5H7H%Jo3T|52uMut-y)XvazM>pj$hr)WWnCBqTs`Q@8QR?9_IajsL+L z{51G2oD*2P!A~I4$-dm@@AKXHe%@dETElM*?IGHpb5_0&xc`Cn5p5l<eWzA?fa@n* zH}2MI7r46kw|iCm3lh2bcSrbM<q$IoQWc<c3G0hkr74fCP;$;C*UT!t4u!A@*o1?> zNa74Kt<DewGm&x-5;p28w^N}T<_V<YGe@W}k@pDx#kPVDHtN5r8m46S#tJS3FG{V1 zr&%fCn3yrbSSBry<qeOV{!;ulU9Hf<3OR@6i5pk<eg7J=nv(l}T%||`Q}T{$gXM_8 zWQmZMv65Dc30Yu0@PeUFed?X?OleC-W-g}WAfFpDRuS|^-NEohx7R!ApPqWhZ^q<M zbLMJGdd%_&nl#)cG$i2;P#U$i9@AY)5lBw>g>a&`anB&!DsdEXLuM=)YbH(V+7!Xj z+u;yicSn8LyCJ=gP&v=p93>Ne?T|5N=MlW(6OARWC)Q>r3WB02eCt@nj9>b(IuEME z$yCLG#UmzYZEtVw1_=)u-f^01mXaf-&rJj}D_zrh+J<V|sY~c|AcW0Lz?Xs>^k@T~ z1BD2xVDs-_SjG@eOZ-hh<?Un8@idXA<&6fT{<2lr74Hxm#U)ngD#N@jzqCP?G9lX# zCrle|JGq^aoh8oYJmZ@5Wvr(7ZX(#32<yG9=73{kuOc{L6P`lT-$sT1<MU_2Zja9| D?@w?G literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/he/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/he/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..6c505b74f --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/he/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Hebrew (https://www.transifex.com/sphinx-doc/teams/36659/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: he\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..7bb68b0e21eaa3adde54831d4e30db4bae14302e GIT binary patch literal 1110 zcmeHG-HsA56vnt$bLov2dT}If0@2P78xV$NBfEf-fD#r>Ow^>zl$owWJG32!eGp&C zx6o(t4CulVAHgPH+D^ZI-#Mpeemy$*UczyLc#1eLHV5M~u74uFAj*jLgHq`+&R=o< zfmkDo^UlNF`4bc>&MykVPcnmm3J@{}l?f=X0+}Q%FkFg=38tu#sth?dF_@Tvy^4br zQYCMY0}Gxo-~vu7GBY7pRs9kY{*57(Yu|bf|57_(JExUDQdPZGwq_F6oaI}um?i1f zqEMn*b8V<FK=u(13je+Nv0N!v+;9=W{>Ht~ZQH)19Hvx!pX^d3!;pMrN@F>E&}q!Y zCXm7?J|`=z2L|ZbuI*Y=mP%#FSVuf0mszCAO#09tcZZ|b-Cl3nzrMC6?`PynF<R7? z^r&Gz)LgGcT#tB7a9#hb{=#j!E)vO<t$AU3%zFi1eamx^H=^2*nW91`#WVRZ_%Is5 zyY9FT=l85HkSd~#MraxHyA7E!y7b{K7a@mAY)q<s$I0{DHial(u#FwarL)VMgfegp z-q6ljqfu`;F?XugB*_#_$Uv&4_CciEt?ty?uv>O20-klit6JmXxWBI@md(1tN-}{d z+@=_qVH@M53FV><K}?lqrjwZkY3_MNR12m^Uj#D5hxMU3=f--oYgC4nzxCmg&RGIA QyMYe>`}^-NaNOU&0fu8<6#xJL literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..010386b66 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Hindi (https://www.transifex.com/sphinx-doc/teams/36659/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..e783fd477f2ed036894611571be6af12a0b2ba52 GIT binary patch literal 1124 zcmeHG-Hy^g7{$0(z4XQ#FFuKzKy=!|286O0*#(pcD`C;Z#Gef9(2kawGBc&@gZO6N z>a+N@=)w{o!6v6O(>Zg_H)p259-MqH;d6p`ggDO!2hT_B|3rL3lo6eKrP4!eKV$m? zu|eeXZ|?8rt0<Juk8{BfG6kOs5HbUm3Mj9A8OO{wT#Aqhrl^ss3>h~On23SBj{F1? zCBGsEmON&_1)Nr7Y67mR`WeLh8$&ABp7jL&rFOt}PAh+;s=83N<`OoXWrbJ7;-s+1 zm8jNS8!8NteTBo^e{X&)SIQJOT!gS+ai?_Kwr?qiTgtyrcUvT*fV^i)V;mmnB;sQ0 zOJNjWkTvFk1=eiWcC8spq%vfpLmrTeG}L4+Js3=Sqw&jLzdsvXUt80+b8@K|&9fza zYM2Lgx7H?ZjnrD;y53pisoQp4B$651@Z9v6_Z(`Cg6AS{Otm3%MTL&@WAb45Zajvo z-edshcdTC^RfH)G(K6y+Mpw6EGG}z<!D}u84wVtUX%#AwF^TpZC(AP1<obNcwze-< z&MpEHNZ&EIQafkOW~1#CqE6MC#;Kw)8A`R%9*CqE>TbOQyKc84;BgmfRckVu4ED)l zh}I?M$^>rcCc!cd+Zrc{DHk2^BdRnr-P9~eYtPFITQWrk!j}Oavj?pOH`c4&wPkn? XHy&Kj1&g6>H__q$ZU6g29N+fepZH>r literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..9fbbc7b3c --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Hindi (India) (https://www.transifex.com/sphinx-doc/teams/36659/hi_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hi_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hr/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hr/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..722d8d208d71bf7e8b549235dcc9188b2ee3945b GIT binary patch literal 1185 zcmeHG&2AGh5Dw7O-spu3hoPcXBJi#^rKR0w3u%5(qy(xqARz&gyK%CHjlHqG-B#)Y zzyt7j@GOiI+N2eaz)B;}?0hrd{Mf(O*M3&;TSIw_(s0Jg_X+i1D4$U_P!8@@Dv$8| zg6G5gmC8Au&j0<v!av4D&i}(D{HO{@m;|Xx(1nDJS)#IxCsrsq;gV}+mEM3-*c5Ea z!Jnl`4!Kre5d&k9aS#$VtE#Xgp=;(jWa1k~s4$WD6#kWM1s!Zw|E8*$d1h~@;9T%> z&Xw{kpHsL@%ot%TlNQLb!mi_AlHW~NDYdXdPGA{vt90M@Zy>8Jx&OzD7D;bJK5%Vt z91)m274jlc(rR%=W;hQlF!ZTUy%U}*ZOOn)#E2Xf6GMh7g3h4X>%VTc+b5mVQ}6iQ zkhC;sZnmV&ERUd0!+k<S67B(|(e}<Wx=$$r$q7Ffj`S|>C4@V397SB88B2zmNt3xX zMbLfU@59^XpaYFt)Q1R_lY&i<GSxQ*8FDs_prsYogqNV2TAQ0F2+Febt;;LM{K8Mv zG+4AwMk)y`2AN=ccXww$NOe&2j<Z6ujC7Trnh0b*H%+{K01Gvin<0(k5Vp3!sq{%4 zhVTj~AR6t%xPI+w#4ns$ox>U-g{!MY2x4drV?vCndxPGfvs?>qz-!@BxWs8(=Gdd< z7dFT<CgcGmDbt4AxUgfgx5T;b#$1z*Ow<VPNCbOl!g_BOcb?-CFC#c&XFP+tzl#k2 MpUU-Xy8BfA0PJmUMF0Q* literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hr/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hr/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..cf108b275 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hr/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Croatian (https://www.transifex.com/sphinx-doc/teams/36659/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hu/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hu/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..6794e99070a2e2926c1fac0d2222cb2863e7a200 GIT binary patch literal 1114 zcmeHG(T)-^6vent^XQ8&CSHk~K(sRh8xV%Y2n#3)C}GjWL`}+2W~xIwv>k^15P!;l z&~Nb;bYY2~V3U)!)6;YAy}k46!P)l$jx)p~#HHOFjZe7#iTI2tB3kzfg@-tQ!TASb zgRtkF`}_09C}hvOR`8?DAfy6>%t2)WitA7&2@4IEB4UCmYNRSc&P@y^X5g;lFojgf zugHNVPZ)3k=Ovk$1y^PL91{MGA(iXEc?$nhJ7Rn1r9V<-y;F8(5;mOWJFl1}>CVC` zQLVW)R2U$K2nW{xV16oB$Q3tSL~yuqCv?|!Zz;zq+3%Bmie$JTADGfujsSETbFmGj zFpAH~8tZ`pR$SlpoheJDGGweHz98K!(qtwB=#M+Y(W_3cH|<|vJCk=aa-|rxwIw}j zSO8VO(j<O`R2ty>!A0$v-}HSXk}2D8YkJCi0hQX0=Ob@KwIMS_g-+}<1u%F&8o}Gn zxDS_itY0EkL>Z0HGR|%{WX9+!fH#?lsN&cKrP!EM2cDPbxofO2U$U(m%9Xdzoh)SN z8N8*vi+a7*^y17bJCh_+G$8}2RyqKY?zXyJZNYxoE(v(jhDzBP56AsOJ+XAo6;_i8 zOyefS;0)UuFHI;HEeK<(G&AkYEJ@?Qvr#RXB7G6c1wL*7jX5{Y>wU8_to}^^T{>q8 RRNXo{{O|F<zrksb{{{|0U+w?^ literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hu/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hu/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..4d04279ea --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/hu/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Hungarian (https://www.transifex.com/sphinx-doc/teams/36659/hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/id/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/id/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..8f0e7229b02f6418381bebda30c6a1e8afd05ae8 GIT binary patch literal 1117 zcmbVK!A{#i5Oq~fKK9ZcdKl3nfy&wrh!mV66-Yplh>9SsRH?1Bu_yN8&92#9WB8DM zPrs!7f__BDNlH>gFIXDwj`!`GH?!~8vz6~2eJd0%Dc&{7()We-KPkRatWtEIc;0hb zztQ@G;+o<&<?W}Q2eiH-q8GGw8^X`Jf`ltjx&~7zSiMTLl$bc7RfY-;ciOB%EnE&R zM+mO+q=eGwOTxfdNCcr^ZCzI`6=uV3f)oW3RM^;m4G*y`p~JQHIn{=pGW$af*8=Nl ztsG@JEzvM>YlU@OIbaKg$4&i3@%waMZG;mlgT;-1qz6H82U%{Z`F}QRk@Zvd35}(3 z#9+%@sGCG9XT*qI(L6|CD~N)~KgUuV#|AbNDLbq(%Z56J-r%5r`u?EXJ?~vy_-7x6 z?8qQ*X3M(VVGLVQYmY@O*4l+Ainn*(M0-(0Kz5GTqA7YG_ZC_^Q(Q#2Q*Ip_8m_Et zo+*Z5H7U7-6P%!wVslDQD3w(_qiQ0(OV|+kB!<39wL&Y%0qePQrH#X|uIs=xq+*OW zL82$&tZ$a;By@DmhTHA-&R!_eaKk^7mEn>dYcsJisB)Ux{Z<EN+x^HN^as7g5NTfi z5seTPX}>K=mctttmXZtAfh6a~qT8?BnC&ibjhrzW)>Da2=|yAM9SP^3%p8g|^4k~= z`3NO!1#PO}9jKH;%1iEGg6fh>t_te%KmJZpWpp}1Q*hgO<Q9v$*Hf|NuuZU7qH%&; uFCJy^kIGdANs=NbY4d_3@^!`4qkT>tR#Mo%baVZMmRMNPxcNaqbMObWE@aLC literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/id/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/id/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..f4a1867ca --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/id/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,45 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +# Translators: +# Tumpal Gemelli, 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Last-Translator: Tumpal Gemelli, 2019\n" +"Language-Team: Indonesian (https://www.transifex.com/sphinx-doc/teams/36659/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" +"Anda dapat menjalankan \"qcollectiongenerator\" dengan berkas proyek .qhcp di %(outdir)s, seperti ini:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"Untuk melihat berkas bantuan:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "menulis berkas proyek..." + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "menulis berkas proyek koleksi..." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/it/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/it/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..3fef9755dc50ba57f061e995090021b053f2a3f9 GIT binary patch literal 1112 zcmeHG(T)-^6vent^XQ8&np}ySK(sRh8xV#?mtDY+fD#r>Ow^<dWv1)U4sC~FKg56X zC-hsq1zlL;C)nhq?ez4VdvEXjdUW!=fa3)51aWRR2jerYe<Hphiip;OLg6vaUvd6{ zSR?HDn}@serzm94FRb7vnL$Ve2$_S*1Qb`HOcE9vE=9xyQ`AURgq)igOw7Pt#bFAm zk~heK1y2}o0jDLInK@Tw{Sp%XjUkomz<Cb;QafOKr=>qqWxZ8)rV`ei<y)_qCF$0} zDp9SuHdGiO`w08ie{X&)SI8ANTtu+HaW8b&b?+#LDcSGiU5aEdCm)&8SdIX68gsD; zr7()m$O`L$0aje!^_>Yzr7~osBR(gWS)|ES2GARI2E&U^w>#-wUpwRXQ*xykwY4Q( zYFGeOztSXrg;W~g`@vc5h2QjjB$5eRb8C9cdj*x+mgggHNVOqTMTJi6GX>E9FdV|W z&Zr0H_pDzdRYVz$(2|?G4Vf~!3}9er!m$TRu`#I*JTK34*H~G;U>i4-OK+Dsnaj{K zct?9@^?I%8apRSpagr&TkiJw)9e_x;Tivd<V7F|S1Uzd)rR<Cbqu#!nSUBejYsmyA zahqajhHZ?OCX|a7gfUf`nRaFtq_OAOs1{6-o(Sa}pEiKT3^RJWYgLA|zYXA$&R7Cf Qw~h|~JN)lYaNOa)0ow{+3jhEB literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/it/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/it/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..e9da453a4 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/it/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Italian (https://www.transifex.com/sphinx-doc/teams/36659/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ja/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ja/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..8cc04effd65f3e2b40a10ff1aac732cd96152fe4 GIT binary patch literal 1106 zcmeHF-HsA57{$0(bLq|Ac=3g}2}C<Ty8&T#F|rF73@BmI#6(TXP-colJG32!eGp&B z_t0nYE9k-!AHhjZ+D=c;`Fi^OdUEo;gx?9`DdNg54!+Mg|B3j5C?hT(l}e{Le#P+z zVvVr-&Bwd_QxvlMp%wfjbBL$_Aq!BsfbuGmY04tQrHGkeiW;fPP;irgNf@}RB+4LD za)BI}^OOM>a8{AInQ>LsFCgXL7*e?oooDbbwF9<yR{0}U)mvp}B4N#0vGqz=nr$tt z64jb(LxlmdudrwR_vXiPr9yGTMGX5B4@!4k_nvZiCHsH0yCUh&$Va9$#u0+f5-v88 z6h`qWSz#VnVBq?$?~GX{l_5hN^BK9$V@)P9gzm82AG~gNI^*u`tuuN*AvcOqn=R>3 z!$LUsgC_9<5;VZ~!;9K;zv=r(BxAPb*7TV75`x;6=Ob@GwILHlg--1=h0yyj7{I&s zunSiYtY0Bj#5s-8azXDGWWwk>s)Kf@ubo#F$Kno>vrwYpgDxvyB_crMJ5}naRjA zcu0E}^?I%8EvQ#@Mrp2SN_tW)bqFHcE_Exogx$2|JH!64yU!6Lb8aw2Cb0aw42v>s zW4tV-TwFqwP^Fn^<z`MAd!8+4&J^j2NY3z4LugF7ao+5jlws<3AzafbOX1wDqr?B+ K{@eb?z5N@yMP1bZ literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ja/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ja/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..45751e24d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ja/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Japanese (https://www.transifex.com/sphinx-doc/teams/36659/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ko/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ko/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..14e80e504fdb6e82978579867d4c2dcbe577da3d GIT binary patch literal 1115 zcmeHFzi$&U7!9J+jSR3bd_+`AMSXW^)sS3T)E`Nqq7hYlLaGEv&c(@@T<nYO%cUCw zQ`H4gHY$OHm>C&Z_(Nb|ZSp_xU4oiY@h5Q7C;K};zxVv?pEu^-<?x%sx{bA(HJ83; zIRAn594n7iy_U<}!tn);-?0W**?Rf<bp0k0-NC++5gy6}0xCer6jUN0-w$LIvA}RC zI!rJ{jZ}F^xe3994D5aw#1Jd_5;4%`5d$t@z919R;%Y%JLd3fap<H{`UHBK<CA2eN z_(QdzC(M>FVZd2B(F$1<Pb4xXsx{Y!3Ik;3a68kViC?A5rHUIaIxySumv!5=FCdqX zl>OhE9+B*{$Wx{?#^HgELoSAa6h`qT>0=&fuxPusYwfdGDnlB&!&_uC>1g6h59*DL zo!#|~T5Z36aA55{@yV8AG|QIMs9_!~xy1@`i=<cv*Y%cH?zt7$MIhN{1D=Uq#odSE z$^_>kZkK99d_{$hvTO3-(1%B`+G2xs^mgdmf|&=46A{FUPC`4V*_9U!@fq!T@K~ZN z0fo?*SbL6>rm1Z*THa<uJCHqRdUDc|fn#usc9u(}m5S4q&VscUC5lF5TdJP+K*W<) zuNA8>ovyi7W2aG{#fXVnTNok}=>8~1ONI@N6GxPbDg+@_nwho4v`Kk}%j~q7B6ShS z7T&1`<t8`Q!|5Ak82XV1o3zOySh7o~@c(I#PhX#Zd_VedHa`9e<CBxo**6%y{c?VM N3ZqYNe!cpf`wcR7Yf1nB literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ko/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ko/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..ba8b74022 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ko/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +# Translators: +# YT H <dev@theYT.net>, 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Last-Translator: YT H <dev@theYT.net>, 2019\n" +"Language-Team: Korean (https://www.transifex.com/sphinx-doc/teams/36659/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "프로젝트 파일 쓰는 중…" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lt/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lt/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..d344be359af5787d7f40c134d2d576c92f2b81c4 GIT binary patch literal 1246 zcmeHG-A)uS6ke69x%9>xFOEdWZnQI<MUd_8fcz|mWETmnCMIf9X1hDZp&i-|0|~F; z6ZkCp7Wyon?g9(M3m?EqPTDj5&iA$F=lA2eZ#Dep(4L}oymRaOg!^A;pV8*g+7D{A zC%AsWb?;%Vc804z|M6&g{vC<@`A<*yQJ0W%1xi<7N(J+$sm^neI;quIC}FtMW*#c( zGH{uI@H9&cD2zTv42)zhKq^?M>(ULSY1o&L%dY~V(z4(={Eh7vI$Ee-Q8ny@IT&a- zlcJhvWg;&o5}t`$E3M<o0h!%!$Lr6;@6**PBb`)Zm_^*VdKiW`klRo4|M#a)B)dcM zK^TkaU|@?(s`FGUXXFt%#eCoe<B*0lI1q(4j`ZzV4#{RYwq&3gbo(2-y*C@%+Xvml z!(jj2fNUATeQwD%cY;Ba#w|i)60ZWKY-#xgZBdFqav;v67rl>r4e{~>M-kWK){%kX z%I3aI40hi4da$?A??UH}^cq6dxa4D$%-xMc27;e3=wWe7t|YcWJ#((GEQ+eC3Y}+` zBXJ(4`Xrh@o(y#wISjMW(#pzmE6QEe2=?>R@SN;ub7C2&V&dB5RU4+;q>eoTF@+?7 z7#0`d%BQdfaSJXlVR}xX199Adb)dkmL9muU(+6E~bdpx%pEzRVn8d)d1PRxn$zZ7w z^mqH+SxvEg!4_6jC`{!=feCWr+(kvsrD{W(abtx`N;e{_Gn`M%NEp&psUBj3F<3p4 fE_gc~7=ayd!C;dgi5!~Y3M%}cv+Gg3KWBdc+e&%{ literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lt/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lt/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..e6c152a4d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lt/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Lithuanian (https://www.transifex.com/sphinx-doc/teams/36659/lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lv/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lv/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..05ed1f47e1311870340f6590e8d26ae87ba51eca GIT binary patch literal 1147 zcmeHG!EO^V5DlWIJ#yi~VH(jY5qQ^|C?(x=Y11}Al@h4hfP@4{&c?|aw)WQcX44Ph z^WX>g3C0ODX~ZXBY2+FE`MsI3{qxDr_X>_3v}b5XF4!2K(Eow<8Lf)ec~q%9#rX@) zztHArZh!oEwSR&{Za;B^A5{SflOR<Ix{y%4O;ncg#0n*6Tyo8<(p4yhO~Ixd{M$6i zA=m0FVqhvV4no3SO%-+`bltp!Onl=A6(;hY!@t-z(7|5q4^`bPnZ1#Mx!~neE9F_f zlyFSU7-1}v7RWlozSCceZ_`yuEv%3;Sf6;1y6^k<kj;|Z`sJ!baxozvxHj012uz*| zxk!|>T8zmp_5%|Ped<&1iswpOGBh(WA*aR6kdca@H|$;vPP*skSH0_N@ABP<oN3Nn zZ^=2cJc0%d4+#xP*ak|YX6pq#q!fYViqC};-NwCwu(iZd#0{9SWTcrinY*S4`tJt= zc-tNJ;OK$$YlO;K!Dc9#&F=#;;_N1Z0kd;~Z=jZ1o0}*I%ChvWqZL!W@Dp_ttSToH zl>`>gn4o!Z&^ipVc~JK*vqH0s^p(Cb5y*TQnz-44l^fUOUP$9Og#CSRF5Qj85RQQY z!eKW?=NLi^8g*}YG3>1yj=lBHu-#l@op(8AZ~4LodB%k7K$0?TxQz=tCG9oNB|hbv p^kkwYc>58w$HIDVR<D`k_1r~p%Eml{hJSzx|3AUsf3p1vegiT!W<me} literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lv/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lv/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..1663b0c81 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/lv/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Latvian (https://www.transifex.com/sphinx-doc/teams/36659/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/mk/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/mk/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..31dc39a193b03135aef1b8111fdf85c70a20ba69 GIT binary patch literal 1145 zcmeHG(QeZ)6fI&;dE|u`9xfA`T7eU1Q_JS9gKh25q!y~KARz(5OWnjQwKLmUx)0&= z;GMtVx`B0@_yi&y**88u=iY1k=cBdn4gA&+PZ0Y)xb=O)`47Zr#5!W{L8I{)$1gbk zLR=yI`qzi``T+|0b?yZ}>Jk#JK<NrhsbKvw(RnTsC$&n25{5f%)}fLv1D6R1FSDe8 z!su_vftkz&NCg{BUAn0>E&Bp;c_EN0EeoE(ztnEAqmAYtsg_+T2NMlfQdCQ?OytGV z!YgrWrFC36Agc^dy#LDlzFea+(n*!VYR8?_!!W#|+%C!gAJrw2(<%8NjKy{^utg@- zBGJkjc}^~|ADCbq(vSvYQE21H(57-qj>^=MiDu9r9-a<fANG3V{@GbDdN(1*MsVL- z(&J7r*rM?+p)rYffKs;Ieol8OMIsrCE9p(|^Ik&SUh*jN2HZL_F<jZ)9}|O<_k#hv zJskF7|Bm$mQdL^=6fNf$HvyRlK4&oGiI{37@ftKU=L*ZBsH&>ad1W~hi!jmis4kvN zbrLz;W~1#+r@b4^FQQg3%1gs@a-z-LGEl`bwB4;esHfc~-Vul?bh{A4<|fo3g{K(D zEqDbK7{tNwbl6|D8#@~uW3z?ADz6L7-HC;ZikwTe2T8__6|P&l8QEF!e9kjrNM9v- lif7MY=UlqrO?{UI9?ms`BYrM&*a|!7@c#+?eI@swz;DmNW!?Y) literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/mk/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/mk/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..bfafee0ae --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/mk/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Macedonian (https://www.transifex.com/sphinx-doc/teams/36659/mk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: mk\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..49ed4beb34ded579d820af700451aff4b653843a GIT binary patch literal 1137 zcmeHG-EPw`6fR;{x#Wf$E)ErwT7mP^sin<UM7MQlQrlHsK}_ODZt5mxsh!!*vONfo zz?1MCAn_&~r?7SvkAS5k``BN;@A&h{&qq67D>!yAo?sl<WMh25^$(1X7*&k@2bIcW zoIm0G3*#EYp1*&%I&UG7J-@Jo7cz&43J|gYl?$j|MKVoUWVjSD6HHMfRTT<u5-<q^ z_bQ1p$dvqo7+CO>0T-}alew95Ro5>d<(CYhT!+px_!rv-+S{%Dp{nbW*_leX=By~S z5|(DAgk_>yb8V<FK-LwWSpBv5HeIDq+;9=Y`ipy|yRLf&*}Rh7AFr-RPUqwuQyT3E zL1zgUH<1)Z@fo>7Kd`{S^<CeYuuLjLhC1eRa+t@OOl1iDVefSCx_5j$>7SoF<FhF_ zQjA(}$uTu7goYn<h#!!k4Za`lHJ|$(-$x*suxoBbw{b5aXqGr1aRaIinJOxDYM&{D zledEbjC#X99Nd$Bg-{XaG)74=`#d_k%gL0{We6jw3Kny0ghP3`{QfP4n%$zeb*LrA zWIFV`q9|Nr#rT5VxRG3XD?i9wMxH?$?d`Q%&5l<pcy(u-=8C4|M5?7m-K<P?x3Lea zWw$2aX%~XJGdvyk*EXZ0&Jmi-1m5m8!<r4dF<zEZF7_cxsM5@IbF(1rHO>~cV2bob mB<J|%A+%@QIB!-x%<xfeLpY=}mO{gAp~C;x|ND1rxBhQyifE$% literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..f79391779 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Norwegian Bokmål (Norway) (https://www.transifex.com/sphinx-doc/teams/36659/nb_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: nb_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ne/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ne/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..dca9c83bf830a2663419dc0ef406f4ae9fa109b9 GIT binary patch literal 1111 zcmeHG(T)-^6vent^XQ8&`*0<00@2P4Y(N;6RdxYG0xMzB#6(TXP-dz_JG32!{Sd#& zuh4Jt7Ia~WpJ0=dw$syd?!CS9>&eOY0*({JDdNIz4#p>3|3rL76cMdQg~C&uzu^1> zu}0YQ%g4L(Qxvl2udU!mnL$Ve2$_S*1Qb`HOcE9vE=9xyQ`AURgq)igOw7Pt#bFAm zl3$Sn3!X6G0?tY@Gjp!W`Xwa%8$&ABf%6>xrFOvf&Psoz%6hBpOeL&2%eP)JOVX`{ zRiavRZKyCn_7V22|K9vqu8=EkxQJkX<3Z@I>)uliQ?lR3yA;V_PChWDu^a*DH0ELx zN?{bAkrmbh1FX2d>pK&cN@d7MM|@7MvPhGu44^ma42Ewy-R`7!d+UtfP06)l)Yg`C zsbK+B{YsPg6;f${?+53#7k<<Ckw_+N&8_J%?-f*PTb_@+A=QRV6%{(M&lEua{cs33 zoly@i9#~%@RYVz$&{DAb4Vf~!4B&>PG~rN+jY)Ojd3m0@#;WoK+qj`zdb`BQT!x;( zE807+*K18rFt6;4lT6Ws^rc#AR8O~C-LAG^w``XLJZnRx?2HDZ-oBVvH|H8l$pq$b zmttgwZH$*Dl#3RGF;$wGc4ii&vFF*S7EF<z2<04KHh{*A8|Uq=QyG^2E`TdKV+mB< PIy(Gs@W21SafAN`C1qZU literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ne/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ne/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..cb550d578 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ne/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Nepali (https://www.transifex.com/sphinx-doc/teams/36659/ne/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ne\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nl/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nl/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..3f82b6e87fa000c5b8b550b432bc59179bb960f0 GIT binary patch literal 1110 zcmeHG-HsA56vnt$bLov2dT}If0@2P78;~8AjqC!31eCC7VxlHxC^OZe9oi1VK8Ua6 zTj;ZR3c9ewN3hA4w$rcQch2dVUyn|{mvEdQo+2*n=3son^-siSL>bX~P%1sf`3ufJ z5Nm`zZ$I3fKS3dTerW|i${ZppK*$1AE}*=MWSX+ba4BLYn4(6iG8Eh-U=jxIDv2`4 zl>CYuSn!kq7jRmUxtViS)h{9C-xyN44xQ)lFSP@<cUt))Rn=Q%XDVUMS+Vs>Sek7u ztP<6lYeR(rvX8KD{rBd_a-~9X!$l1H8}~wYUH6W1n3DZI-la$ebMk>HjpYbIX9*XZ zND8C)jI6L87+~P~uJ24(CY2#09rHQ4%41EYGKAi!GZ?<^bi0$@&5bjDHzn7KQCnNm zrG|x2^MiBZ2P9~M?}umg7yh~LBauwlnp@Lj-YW>|Tb_@+A=QRV6%{(Q&lE!c{cs3x zJEI<4+_Sz!s)%zMqoqjiHe|}^GK6k!q68|5F_{iMuP6%FSW&)U8#j_mZ<jZj%g8f$ zLwje9M*Z9qsaJKzX|8BW`cf@5if7xcZr56{Ted3#p0y#UI-|j;x349Z&AG-(GJz@F zW*C@Z8{=gu<)Q^qLX~Ewotp(|?s+z<1yiIaB00y04WT*X#(A@ARECwm4dIH;SPC__ Pfe!!s`|mGs+~2<ezpP#} literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nl/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nl/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..9a8d2877a --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/nl/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Dutch (https://www.transifex.com/sphinx-doc/teams/36659/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pl/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pl/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..7773b0646e58b81bc14719ebae79268a6e7688ac GIT binary patch literal 1249 zcmeHG-A)uS6ke69x%9>xO^!s!Zlp7vg~i>00r^=Bk&PSJn3$+ZneFaWhIVK>3=m$! zd!I$0L!ZUdS!9s-2sSzC&-u>xwdeHwdOY{FfnyHsDcZW*+!-Hn{S)mI+C19YgGS>C z&Yy99`>@eC$JzP6KbrZ!A<;A3|8RsKQ~?Q-AXN#vkT8Fis4U}&6-rLI<eFKf=b;of z1)Fm4&(b7^T&pjLfr-dC2nh>KRoJo6EwcofIN=BtCh}guzu4}egN5b|Rm)V&-blf@ z;AN$i@+_|;91}A}7|WyuQr~dT>DS`-=^CXLR>&#T5r19X_x)SQ-6y&8;p~ZIe@xzU zZ7>}Xm^>BoB2m(6aZJuIA9%sgr#|%#d9Ji212Yw4vRzCK8L0^RgRT98*IT>0hy9}? zZ}@IRb~I-$w`7-D9zmOiJwihgc7f7px$~0tC`BMS<mbYP-p9Ryuv6hE;trUxWTcri znJZHSBUbXOrHU1ua$2w{isaethKx8njbNxUVNz(O*5)P(g0d`q>v+V3U-*eS4Q5Xz zW0eFJLrk!|y4vXlc^0(1VOD6Ckv*kPO$0KpwkBR#LnY^ln=+0=*aQj@H044_H{v!d zE`nRG$15$juFmOt*oN!t%0V|m^lU<iLGn4q{{d~pv<?ni4u3=1sn2`$IjSM+jU4LD zXxm7;-0}wdgMM95tev-m<>V6cc$s6aEWfb$N+#qQBq`H|+qke3(yehWPZO?5UnXjd yzbk_7v9R8oS+{U3|78T*?3icJ_E%Bif0JFYT$sy}Nx|`th?8R0h9|agt@ax-gMCT> literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pl/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pl/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..fdae4255b --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pl/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,41 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +# Translators: +# Tawez, 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Last-Translator: Tawez, 2019\n" +"Language-Team: Polish (https://www.transifex.com/sphinx-doc/teams/36659/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "zapisywanie pliku projektu..." + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..0948d3c47df094e8333ee2242f1197fba59e1081 GIT binary patch literal 1115 zcmeHG-HsA56vnt$bLovYUL1*=K(sRh8xV%Y$gd#*B`lhls7V>hOm%37w!^Rw;#2ty z`YfJ;E-dj8Z1Sb;^y~MXb9(02ql@na92bZuh-<q!8J}?d6Y&{QM6@0h3XgIAg7Xi= z7Gcl34-e;nLiW681wYCRLMlMW98@NtxCv#Fu+VTRA|{xkMyev@+{9pF2JR*fQ%IHk ziX2$+gaH?DS(2Gqa#hwZAmQH_Qn?PCXYenz6Sj9*`Xg1=du3-XVar**_ljAP?k%hm z)tYNVg#mJmaA^IH=I3&STyeui1jifqLU&#Fj&hok{XRXUNJdNYfhmpU2tcPX7rRgj zqxgbsupSs-#r0j^nXyzVLnb=nOVZ6EP3AIy!K5=9zwY$=v%$@cGkrHFJ;kW4E$LIk z0;u|xCh;qz(g5ENu4>Qyrtc$>%-EJ&({tWSsMPj6A9-V{4Vfz{bYh<=fZ_Y`7~Xa! z1Gv6t{R*if%4md^skz&bIiu?UrWkn^WlS?D#m1yM@Vq?FU1OE`itXG`uDwI@WGO?> z;5F@C)$6sUmm06^Op{E}gbbxx>i|T$-|BX?1&3w3B;aWqDrILfnhcHw#o9SNEGH9~ z$8Czy8MZTCnourU5XMw#X4;uqk;ai{qgpXV1|pP8eBA&V3vQe@hi+w9{@Vb$biop+ Qx^;B;-{gP)gYzc;4HAN2mH+?% literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..034b098b0 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Portuguese (https://www.transifex.com/sphinx-doc/teams/36659/pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..a7f671d428aa0b4f460fb7bbd65ec659c1688309 GIT binary patch literal 1129 zcmeHG-HsA57{$0(bLovYUVI^L0&zP(Y(SV@Ho^ji1Qb~`G4Us5C^OZe9oi1V`W`-< z7y2xIGw8w+AHgOkZKtQ_d_C>_dUW!=gzW_J1aX;94%!DC|3rL5lo1yXN~Ooxf5QF; zVuQ%nCl7b)HVWnIZ*sx+GKGK&5HbUm3Mj7w8OJOzT#Aqhrl^ss3>h~On23SBj)DXd zCBGmCmON&_1)Nr7Y8G5o^%=zcD?=*RzV#ITrFOt}PAh+;s=83NW)e1>WrbJ7;-s+1 zm8jNS8!8NteT9SEe{X&)SIQJOT!gUSaj$gSw(ls1N6NoXc1I+`1$oDm#yEV?NyNoA zkisZFCu__D3-oN)cC9H(q%vfzL%ty0G}L4!edv!n!_kXQuQ%=A+*p&>GjgpM&9fyv zYM2i-*J}~iBVH3+*FUd6b6c*9L^5R?o|_)?o`Y8}crNlrR2wo=ROmRrCLacGM<aOE z8TaAxp7j+{MVQhMEfe#(JH4Be8KWy7CRltLrc5)abQS%^<0@1lV-oE<PL^f1$zAx8 zZS6p=oLvxPAp^(Ye(jt$8ugY_NIO+)5~qsBWFXZ_`yi5Hs@t^-*bUni0axHvt?_W& z-^YtdTGtpZ6L_lI1Zy>HYn&veTwFj9QKgw_r)Ei-dtP4Gk}1*`fn4BS`_P<oW4+wH bU51x&>qD2$SqwG1fe!zl{NKOg_{skU=9Oh> literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..20bd699cc --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sphinx-doc/teams/36659/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..0b3cff860edc4a5e40fba9925e93b3ad5a0d0862 GIT binary patch literal 1132 zcmeHG-HsA57{$0(bLovYUVIWafvlY$HXsa(kzK%$fD#x@O#De1%1m`=hqlA858~UY z&*C?r3rl<io1C<ro;m01Y5VKZ+4mB*GsF|bRWUhgA94H>@d;5zv>%j8kFo!Z{SU+j zQLN7%?$<pOD%OKS@Po`CqymJ@L1hBU>rf^M3k{bdVuC4Zq$)$sO$;VxV6Wpag;dF} z$bltK7;pjS6`7d@S5^HS68?=Lm22O62LDn!Vms%RKT=h_Q?>#L8_x2bSIm-hXHh6o zt+_T-7$AoV2ZjH^{8X-#D{i=m;PA)2(rw$mqa1Ik_&(Whkqj5)JyROv@Ij|B7u!$@ zqxhVxF%K-zvt8S@rYx1pkg<;Vf?Q{jCV}*!Kkg1kue!b7v_G3!leYo6QH&PZk{&h8 zhnnlPi0cur39jp3)-T+a>mrd%*@hRUr@R;7)ptA>c_XR~2^1ANDUQj9!Mo82-gL)( zxVmTk5~(7}XoQxj`7#Oa<|JTr<--Jv&!UWJ29^DoCRM1!#-!SJoIKBMQ~2;D+uEUA zIr}KcLWYh(1?^lm8uga56L+fCB*_#_$Uv%<_Cch(sqWO;upf3R0-kojt6JmXxPM3( z!?bQNUnX#4w<(ru*w#2{Lb+%|7*nO0>11X}ng?D{*peyI7ol9>ar@Amb7Q^UUtfmj YaqGi1owEdLb^{&$-}=7~<Mh`52BBkSp8x;= literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..d2a8b6aa7 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Portuguese (Portugal) (https://www.transifex.com/sphinx-doc/teams/36659/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ro/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ro/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..6ab2cab97c90b3404e9d180512ef4f5a960d9034 GIT binary patch literal 1154 zcmeHG-EPw`6fR;{x#Wf$E)Er&5`hz^)5hv88~bUeN-a!XK|%r~FLfJ_)Xr>Y*`&P& zj|UII6L8Xwb(?quB7L$?{Q3LNIkta2TlvwzZw2uJu~P^4zArfciTH|WBDSA28qab3 zhU0I<C8A!JPZ#UQC{(YX*MgsQ2`N{gbOokV(7Z@>o{Q8;t)@Z=!<{xwsHDrlWdg#B zEG?ig`W!hhk+}e=VAa>98%q<|H;~Kk0;$q6?-l$@?H)T?^>3vDJ6HBb8ZM=%=3be| zi@8Ou#I2Rqapiz4Gwjy>OY_Hajmk(T)fARH9;6<I;T`3EN%jAeMTw+0CZB|{*bWA^ z$fUYTwQ@$DkqhhxCK!h_q~1^z+Bh<>Q#mFF<<ydqX3!bz_xkVlkB)|&(^K!{!-yOj z!Ry|VBklx)7LD74#w6YXO4<6xYuct1iDW1)Wo`PH_ZH%fIgcW*&#faP!<EhJV`9+# z*zd#p{XqwI9$4=pRZUAiMN6aa0x}YO#$c#tTuHnHe&$?ZSrk=O6}nniPQ+E1>RGfX zos4xFIoxEU_07$Vc4TxEcqe&jcuu<7%q#;{%tM>3Z^L4m_$o=_J<5FFSF16lyKy_X zxw#FJga&JCzIusc5bU*B90cB=H|Q+;jxF{MvFk!%xz`02;l!1TikwTe4Qa-W6)q{= xglsK&b@~%wNJpi5jF*7H)|qtP@#0boJf&*}2mDOr&<Z!v;s0Cs`&=Hsg+G7dX;1(F literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ro/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ro/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..2dd024267 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ro/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Romanian (https://www.transifex.com/sphinx-doc/teams/36659/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ru/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ru/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..425b0f0e407fed5ebae7c30480f171b117856cf2 GIT binary patch literal 1250 zcmeHGU2YRG5Dw6%edL7~9)^lmiNL$wv?<Ldo6?^YRZ5^r0}>J-xf>^I*xFm$+ij&@ zgEMdzxC5Mp@uqFsiX&iYWRK^Y@3Uv@KaZEb*KjPMJw@v}=hpay>)&Xf(U#FV4{Eh1 zIDf%;^srVt!`a1uKAOjWAd!pza)cjM0SS{JRSCL~uzZ@REaQn4O3t|Cnpvfnp%gX+ zn{x0^(<FyntFMTGsmM482`hC~*on{$^Aa-gjU!Z;$a@a|V!MS7R_a$&4O20DV+Ch| zmz7q^v%HdUOw1TzERz<<;)MH7e<6OKu2yPcg`B}6<Id52-@k#}zLMKNoL`X~OvneW z4VEJUlcz$SCrVl^j>#$30}mMb)TiEv=So{LG&3<FJH^b9v5KHS+&&n*-rn0A^^cCc z!*^q{t2uMEC40>B2%0o(6B?3m6DW<=S}$muQUsC_KNC*$KJFEStqMmGH(<t+v1Za_ zu1yi_zaI?X?e?$_-8<4fgvwdLW+<tP8;6WJJBeUaU~TaY)KhD769qw8mcDhgV#?3` zM4bflo0Ex30*g5&SlifWwF6xQ4eu~3G|R}o(kCVYnOClf*E=v@#&x+8(l`!bbrsx_ zK8wQ;wtxb{(eK60>rgjdcgre+cEcuIUd~f`;d%p8!mE@xrY=<BdU0!!-frCNBQMHa zYj$H~*n%b!tTnvh!LYyRE4I+v#jbLR<-EwTNS2@5AkUbP9Y|894YzS&r(|=1bM={W qP5LrX6MSS5Y#s~iy_tU+j<4V%f*p3uGidr7sPO-<U4O^>f9)?`U42pj literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ru/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ru/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..7768b47c1 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ru/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Russian (https://www.transifex.com/sphinx-doc/teams/36659/ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/si/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/si/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..f31bd73acbfd7df5ee0f0cc354de55b4020bbaeb GIT binary patch literal 1112 zcmeHG(T)-^6vent^XQ8&np}ySK(sRh8;~6qU3LLO0!jc)Ow^<dWv1)U4sC~FKg56X zC-hsq1zlL;C)nhq?ez4VdvEXjdUW!=fa3)51aV<E2jerYe<HphiiqZeLg6vaUvd6{ zSR?HDn}@serzm94FRkDwnL$Ve2$_S*1Qb`HOcE9vE=9xyQ`AURgq)igOw7Pt#bFAm zk~heK1y2}o0jDLInK@Tw{Sp%XjUkomz<Cb;QafOKr=>qqWxZ8)rV`ei<y)_qCF$0} zDp9SuHdGiO`v`m1e{X&)SI8ANTtu+HaW8b&b?+#LDcSF%U5cbXCm)&8SdIX68gsD; zr7()m$O`L$0aje!^_?+Gr7~owBR(frS)|ES2GAY0`-97Nr!($OCeG;nlw2!DZEZ=1 z8Wup+ubdOVLMjdL{ot(j!aw(YB$6>(b8C9cdj*x+mgggHK(!%LMTJi6GX>E5Fc`qQ z_OJ^V_pDzdRYVz$&{Ffe4Vf~!3}C`VOcM&F*qBrYo|osjYpg6^u#FqarMJtR%w^~q zyraFddcAh;Y3`MsQIaW|ke*aa9e_x;TivQQVYh6R1Uzd&rR)s*!|uMCSUBezYsmyA zahqajhHZ?OCX|aNgfUf`nO0^Nq_OAOs1{6-t_bBEpEiKTj2q|eu2mV<{x*OsI%5e` Q-8wq_@9@7r!EuNG2GgKl2LJ#7 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/si/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/si/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..7eca3826d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/si/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Sinhala (https://www.transifex.com/sphinx-doc/teams/36659/si/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: si\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sk/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sk/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..00e966b65478c3be480a1b17e6e088f1f104e4bb GIT binary patch literal 1186 zcmeHG&2AGh5Dw7O9(&=!VW?=82)sY(56!0Ak~S%-lt9!5BqTs`H_on`t-Z0m+4K?M z&f~$eFixOJBOU=uBYQlbzt1yc|JvO6QNgi+_6+UFIxFKdu79F^LEA!WKB`on;`|lo z&Bv9>6lWX%_GA%HkjTcrTf$GWfS3vpvIJEK*qX#L%UEo<6bTbdQ6tqBl-#6XQU>lM zjdRGAyg>|%c*cMW*sjXL47sZ5SCH{BLnzmw^8)_Gwu1JytAD6!dd}<&BuqIg=UOSt z^0|a%qFQrps4zg5H$1ocOYwEON~yTvB7x<J2UmAp_a3sElHKnwQY05c@{uWx<p@FN zDHpR?3ZwWnnP5Hef`RM1zH`ZPsSN4qgb&GSk!UiIA#{4Ji|(6NyM5WYx^nvO2jomK zYHLf{)UXihe$XI(K!QW?{cv~xrQh&<1d>ZO<yLeZ_ZouzInGC1muf=>iVB_CHidBh zq1%ObtzHL?9!MV}R3rsWP*RWY9Wr3_HiWB8PU#q`sWG_@J+CZF*H~6QVly|Ex85Rg zGL*4r@QC(y4-WPlo*sKOr=JyyX5?I|TOESP=dO<Sny^?#ReT>1Koo%wJ3AokDu5I8 z5WW^Vj-b8(9YwH*px_?#+@3#ydI-BUr+3loEc=2jaL%wROkg?ga!k^&nep<Ba?yl1 zrAjjs6=p;ZmpGf?h$+$$u^i$f3E}XX8|Urf(KGDgT?nW2nq^RT4^ZL%U-|o;*8j?H D?$m6X literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sk/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sk/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..c704a7f90 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sk/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Slovak (https://www.transifex.com/sphinx-doc/teams/36659/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sl/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sl/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..6ec85f8451272aeed38322a451dd11466a368c97 GIT binary patch literal 1166 zcmeHG!EO^V5DlWIJ#yi~VN?+*5%sP&X-czcfVN3dqy(xYARz&gvvINp$KKlBY%29P z_&oR&#B4&FwBi%6G_uF@{GMmV{`F+<M+wIs+B3A1!r2+0as3nR3)((f>rtun6z8uv z|3+J)74huxCO$%<BEBpLKj{o&ra<W&Or~J}D%Mi+*a@xXTyevkHv5nZmw-z+_*Y4s zLTdCk#K25Q4nje>qBA!YrfLsBitiku!baY6_!rv_Iw)8EQdRAm*&AzE3ZAdE5-!uV zM8U+Y71lB3fNXDgQRr{QAJUa_Bb-ok*q*p|b>H{zAiF6Q`<I&(NpDI%a$~U^5!f^l zY87kcjF^xstOs5&^r=t1Ay2h&WMJoFO3t#mC1V{ycW~P4zd7x6hTYM~yL>+;=Z3SQ zwxq)xkDx}wCZQn-kAc#t-grTqlp>G}`BD_34{<LcY^-q<aeZbT85^doEZP*o#fN?$ z-klD*aB@%j6++cKV{??W^3EY+&K41jq+W6*@D)@N=TaL5L7wNnD~QF6ul!gqf=%vZ zs^h@nDI3&}jvCFt%Ao39%FHlHF0@(L2voXuZTqkVn`OJA$|0rgb_lP50zx)!4c&0- z*5T&nHgt%g8iwjsZ_pcbw>`jed*|2zt}ylM6cciM<$_c)p;{0p%vkQ)nVXU0Ew0F9 r#trGJSWodmL~uM2&U?Fg;2b-49l;r!a0xa42o?VSi`%dB@L&7^T32ht literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sl/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sl/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..97451a2e3 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sl/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Slovenian (https://www.transifex.com/sphinx-doc/teams/36659/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sphinxcontrib.qthelp.pot b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sphinxcontrib.qthelp.pot new file mode 100644 index 000000000..d0a7c281c --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sphinxcontrib.qthelp.pot @@ -0,0 +1,38 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in " +"%(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..745b019d43c40324d6149a1d04eb91cd9288c434 GIT binary patch literal 1186 zcmeHGUvJYe5HGN&Jnn@T9*&Alt-y)Xv9V^&V1GJPsfB4PNJxO>rf%Yq*_rJ$owP3i z?|eM?ESy`mZWAAYNGIRLzx(}sclPhqm7g{IR?wcHbzE@k`;7iCv@d9Nw4DdF+GAY5 z;=1~<R-5AL_P;+`?59ZN_J26SPpX83Nsy`nT}r55Br4B&Vug|^ms~TebR8;TGq4#4 z{~}8YD6~353`|7MK}c9@sM3ywZkiX6i*FpE!bILP_!rwPbg<U=OVu=UW^brqDtI;5 z%6MMPB^(noMi|Sa1+qNhk<(v_->0ipT38`dSZ3Tgy6^ipklQ7>|Hq3GNpDO(a&533 z5tt$qa+WA*wHT2L><1n&^r=t16J987$-tyyO!mvvkfDm8JJ{>>-|QV8o^(%7z2o;o za-cbLy(Ndt@(5ZqY!e!ia2qI%Ha4HrHl+w8CwwZL=zZKP2sh_Ainu;AmJBtMCU;|s z;OIlY5AXH{UFh7A-bJWPOO~Rf(Ki7Za&{iUDc2)`cc773TbL*as;cs>qZJcA^AmL* zEGj2sl>`=ZOt7)Fwb>4g4w~L^UTT(;Bc;zx1hSZiCf?YAg&Q~IT1ewKg!OfBE`1t@ zA-o0(2*-FgZe4G6;+M{yXV6Ya;p%FUf*9JwoDg$bO>fW}beD6%5qJkU6)v$ImjxDS z`OF4I&V<~7BxBle8<%!MwwE|p--K(@m5CbTC5d2rB&_##ap^fu@iKyaHsU$7{4G@Y M|5mP_)BU&d2g!+ULjV8( literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..400ac7375 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Serbian (https://www.transifex.com/sphinx-doc/teams/36659/sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..6c3b65e611061e6a9cd323f24776e9cfa87a2431 GIT binary patch literal 1208 zcmeHG&2AGh5Dw7O9=UMgFjS;U1m5+gKQx<c>0gQ}B~Y~i2?>y#jgxiR*jwA%ZKd)U zoZ-dbSr~6<(^fnJmPQ_XzM0Q6<N5t~>3a>=63SDQt~=aXpHTmW@)>0rrSqUxdxHBH z+#3&TwR7B^{l}xZ{Tl{y_Ma}`M^!+=BuG_)E+j0UB`V8!Vug}ZF1cn_>18N|O~Ixd z{IfL4A=l~@F)$Gs2O*)}P=y@}-83&D6JI$(g^9f9@ULjM&_TWNH&oM9k-edUbHU4s zE9F^UQMgFV7-1}v7Rcg-2abP1em`8T)WQlmg@wnRr~AHt1G$}&yFZ$zNDjy31J?%2 z5rN55AukdotrjD4hV{S)hCcPFcg%C8Eg6`p7?a&%YRFJU&>QR=_P2NT_m6ugC*IM! zA=%TMx!RI_W_biH8ny`yNw^7=Myu;DXq!?5l4E`@9O-@BD+t#s97SB88B2zmNt3xY zMR4%G--ow5gC2D6P;VhrP75|gN~5<CE#%D=8FDs@;Dqauz@O0QJ8KgfskOO@f}ku* z-#QX8;TL|QX2HA;WUP|FqOS>7H#XMWfzkCfTEz~U-ceR)mXQOcXC?xfS4R`Cc3`f? z4OtIq9EY&70#2pR;xL5QKmp-+-ilk-rf$6E)XIZ)Lkd?{a~H(WCi;Zv(`tHy!$EJ+ zEo_XphrQwwi*%V|>Xu*FAkUbP9Y|894YzS&CuDPhb9qj<COw&`F@Bv0Hb=sGZ|0-G ZvA35I?6MKhpyh8M!~Y4o9<uur^arWsb^QPU literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..5d4b23ca0 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Serbian (Latin) (https://www.transifex.com/sphinx-doc/teams/36659/sr%40latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sv/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sv/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..a7908452d16cedfb37950bfe50780e43f9aa9e8b GIT binary patch literal 1112 zcmeHG?T!*L6veo|=BI!Bqsf)H2}C;|Y(REcblC+A2`B+HF;SB;Q)apj?a+1@_Cb6n zUqYY7JD>|od<2`Ew4I)wbMNh)Uyn|{mvEdQo**uY&B6GL>z{}(h%%z}pj3K{^H-dI zAl8WD{LRDN`BM}s&MynWPcnmm3J@{}l?f=X0+}Q%FkFg=38tu#sth?dF_@Tvy^4br zQYCMY0}Gxo-~vu7GBY7pRs9kY{*57(Yu|bf|57_(JExUDQdPZGwq_F6oaI}um?i1f zqEMn*b8V<FK=u*#3;(_Ov0N!v+;9=W{>Ht~ZQH)19Hvx!AMa8mgOGe=N@F>E&}q!Y zCXm7?J|`=z2L|ZbuI*YAmP%#FNJl&*S6QUVO#09pbq2%BPPaShO{doQ{ft~IMvK~# zE;Y=Dn(Lht*CSpNT-QIVzi`i87l~xT*1Rx1=Dh;1zU8^d8&Yk^Oi`he;+cHte;5wo zU1!vTi+k3ukt(8$Mrf(mcN;Qebm_x1XCc=yRAOUN?K@7M=e8+i`GRfiKrWqK<|LGX zWAKi4&KiySxue%k)fy+6q6z6swbVX{bi38<S_^i|c16ImHh5KQG#K^v)x^SC*H}v? zFp1j~Lo;k+oHU_av>=G7(#*6ovmnhquZU{F6zPdThWNBTH0Rt{Z+ETAu=ck;T+um8 Rpk_DF;eUt!{Rxgc{5LUoUpN2& literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sv/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sv/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..eecb23918 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/sv/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Swedish (https://www.transifex.com/sphinx-doc/teams/36659/sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ta/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ta/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..bfe086e822beba9898a748c65b60f05784bc1637 GIT binary patch literal 1110 zcmeHG-HsA56vnt$bLov2dT}If0@2P78xV$NBfEeh0VOP&n5an^%1m`=hqklBK8Ua6 zTj;ZR3c9ewN3hA4w$rcQch2dVUyn|{mvEdQo+8fe=3son^-siSL>bY3P%1sf`3ufJ z5H|>W-g&q?e}Y2x{K5);lsQCHfRF{KTtImp$uwn=;Znp*Fhz}2Whl5wz$6UZbrNNe zDftySu;eKNF5t8xbF<*8s$W9NzcHk89Xik9Uup+z@3itqs;alj&P>7$XT{blVQIFt zuu4>Gt_>9i$Uee>_1~Kx%asbn4Hq%&Z`=#rb=^D4VM_M<WS1ftF31O_G?pU-oh4js zA}NgGbF#*IV1R+^yS_7JnN)_1b<7v!GLJQx$q@SE?r`+F+v`pH*VoSE-Hco*Ms00L zj~W(2%@10{4@l4i-w)5~FZ`D8Bauwm4Y#JpyjKv^w>%$tBdQIVDJpbopDBdF`_TyA zcE^1<zh`}cR1xPiMoUBQHe|-=Dufwb@f0eFF_{iMuP6%FSW&)Y8#j_GZ<jY&$jCEz zLwje9M!n@3>Q$Xdnk$-;fmACUg2=X8-Kn)<x9n5|JnKMEb;iSSe_u;1n{$PgWCByT z&1_(7W4tV-T(ludsM5@Ia<e4OJ<mq9WQz1fBp3LwAvEXQIB#~1%CPdcAzacqOQGgA O(BXf7|NRAy`};Sl`Ccdh literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ta/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ta/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..b28702a1a --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/ta/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Tamil (https://www.transifex.com/sphinx-doc/teams/36659/ta/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/tr/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/tr/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..7a068c90565fc9c600bb49bd5b9dbc64c2d74f4f GIT binary patch literal 1111 zcmeHG(Qeu>6lGeU^0=41^x+Dv5@>T0s9+EZ8!a#)!G>BkY0@^y1e3T8cCZ~nKV;vu zuh_n2*RU0e_6f6eWIH}S=icj^U(Zgy7jT>)P7xP&b1=T(`X}NmqKIfcDHNXL{0-+H zh&95Vcb@LfPf^I8zp;X!Wd<P?AY=|I6Hr`*GD%oyxD*i+Oi?3M5pr%~Ffjvn6^ALL zO5P#|7Cd3V1)P;+X69U#^(#pD9YZSDf%5|XrFOvf&Psoz%6hBpOeL&2%eP)JOVX`{ zRiavRZKyCn_7M)O|K9vqu8=EkxQJkX<5B3Y>poBpQ?lPDyA;WAPChZEu^a*DH0ELx zN?{bAkrmbh1FX2d>pRyhmCBH@j`*BhW|1aS89;yB9gg01d%f%a&5bkpFeO)tQCnNm zqlN`g^(#%{S4gD+z8{>|UiwYnM<TgqYi>=Cd9R^T+wy$mji@$cs;JP3eWm~gA4em2 z-yQei;*oU+sUpf~gqB7<Y{-<+WdPGm-Ekd5DK;k6f#>CU?iwr07i{B(a_Q|dCvzEk z2JdL^yk4(0J)^v`Gf6T<6Ecu$sRIz{cB|Xf7VMVol7J3W%FcK=?(d6<b#tz;luTd_ z_o<DHZH$*Dl#3RGF;$wGc4ii&vFF*K7EF=82<04KHh{*A8|U4wQyG^2K7dO)V+mB< PIy(Gs@W21SafAN`G&^4* literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/tr/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/tr/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..0110f11b3 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/tr/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Turkish (https://www.transifex.com/sphinx-doc/teams/36659/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..2ae378228e208f861234ec0efa78057ccb0a4733 GIT binary patch literal 1352 zcmeHG-A>yu6z(Q=6KOZQ+08D_(1sdqPMp#*8k%ke%7oNz2+E{M`%y^U#v|Clb_htk z#@=Nwvpvg>TOft;2#a)NpZGi9cYJ)#pC?N{YxpgpJwxkQXW{#T``>6^(U#FR9@J`2 zas7ttuZOkT8Lsx+M*@5P_|g2F;#&JG3rJ!CLYANk0n4X}%rcf3F2$4yreY)2GL+n; zU{VI&X`1AaEBOO4FyR>kF5qQd7G}(qt6xLLj~PO_4xJZpAKL=je_6kxa`lYa8A&+f ztek13EX!vSmMPYnYZD6tq{?u|>Q~}->1w6ohKngw5w}wJJnsgwcqRLPZ+=CxJ0_o) z(pZiVbe?i?o=9O7KO(1C4@@xds7IZBmP=*GP*3@oY!*{ZMlyu{u(vyS*W2FS?;jjE zdml$+OR?D2mTbp{h0vfuo6vv+>p*F^+ImIXlp>Jqvomf*@8aG-(3;^W;s&ucWTaxD zGy6;->>LgT@S!*CL+6%s7olQW#8Z?kj=vxFZhSIg@kt1W$13K6V<Xh(TjoMNH73`g z@0Vri8LPr4?A%M_i9as{8Oy{s7_a@+wY65;pHcg+vzHYr&d82bCprX?&s-ffH(<Vv z>ew<6KokLml@*wI)Ve|CQh1Jj0B;e4B=-e$BWP3s(21aF-8nm@(1D-<mzP)k6uJ;J zT_g<tA-oE~6sQfjcDqsQ7Ju7aI7Pk)^Sj9(^`f8&u2pD+u<AO)-C@7#9&8k63wwtN ze6))kpTe+n<L4Pxegl#;R+^cpFcY#~;cVF_Op(4w<QQ8yg!LnCocHt5WY}vLA#BD+ SEQ5x(h6?{D`g-W^PV`?CW{!mb literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..cfeb648a9 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Ukrainian (Ukraine) (https://www.transifex.com/sphinx-doc/teams/36659/uk_UA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: uk_UA\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/vi/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/vi/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..505bea48497bde42c01bd5caa5acc1242c1a46f7 GIT binary patch literal 1108 zcmeHG?T!*L6veo|=BIy*i9c?Lo3PQ&$8JCvz{oCONI(gTo0zCc8Olu8p&i-|!#;>_ z<ZI}&cni9)#7D5nN!#h^IrrY)`Ss-FdkM!0;yI#aHwWW0u74uFAj*j5qf+T9&R=o< zfmkE#dGqn^{22<_^OhC-By)(U03i!dxq$L2l4;5!!=;FsV2T>4%205VfJqp*t0c-G zQ}Px$u;3{JF5t8xb2I1aOuvGZe`84HI&@yZztj%c-f88J)S2EYJ5vd3&Wf#9!qRMO zVU?)XTpKD3kbQ)G>%TWYmMayC8!lql-*^zZ>$>-p!<6jz@h(L&n3Ef(G?pU-oh4js zA}NgGGqS>ZV1R+^yS_7FnN)_1bj;`EGLJQx$`E>^&S3bq)9p@r*VoSY!<1YpMs00L zml_trxgRu$ACRC9z8_vxU-}K-M<SW9HMge6yw?y^w>%$tL#hp#Dk^kppDBd?$Kep( zcSb#EJ+OX*R1xPiM$0w7-;gPz%MfljGlDLeW>86t$#m#>MNzoMD)R-~xRG3XyX47S zMxMcI+PkRLsts?=y)$Q==8C4IFV#|qAhPXNw}U3^mTlh|4Mx3vC9!DE71ognOyDlV zungN6FH0#GO^6bzG&AkoEJ%INv*9e5B0UkwIX-I$^%*zLyIq?ytovOEmvqKbICpF4 N@V~qN{s70_{Tok>Uhe<^ literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/vi/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/vi/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..5cf93d4ea --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/vi/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Vietnamese (https://www.transifex.com/sphinx-doc/teams/36659/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..aed09b396a4fe3d157ec2b4c1fc7488594149dde GIT binary patch literal 1158 zcmc&z%}*0S6t9s}k6!d(%nOl(MrL;l0qFt;D8-OaB+!_U_>pBhZAZ7W%g(d~Pb3PO zh=K=A_)5Tt@uZ&o0>WQ{2hsvParWlhZ9^;J?qpxyyq(|sy|0<ymm1y%a5bP@Md|j8 zx^)lt`zZHO8d16~1Ok^)KR~^Yl1KT2cH&|na1Hec5?w)^^#~{I9GC_NZWqAKacG<} zZOfvjWHwJzPF+LVZX*<!%z(^LP^L1b1CDDyLJXvsMS*c>YPNGS$=r}=0gFAR2xUSK zUWfD8>d<OabCoJ2eCA-nhCHJMKURiXjvvBfGK6448e9UYWjN@?uLVC#7bv()GM<K- z$3LknigF66FUk8qS}BnXCCOdt3T%fC!pSf`ZQ5MAY?4f2KQO_tqA6N%j5@X}NnE5^ zlJw`&f+TDmV)4GA;oiQ1fw9>5cyRPif<#?vc)cY9hNL>QYT*dc!X(@Ynx?n4-_RnO zhCnh#^UMo+7IzcE?LJOJ+^``eNw@|VmNzCHCKzWp%qXS_-7~%sjzn5}EtaQ>X=iV> z_z}^Or*lRc6L^w&7#%saNrD<#-S?-0LbFF?grGSir6Y7zEfflh^y0A;o%RUTN=r!6 zHdTqfLT&5lXpg8qtr`lBS~=IS$e`_Jg$~^DP0<tXg37i>3&w}yv096<o53hHm~yOa z#=#6FotCO&8H{&<nK4{JWlv6~NM{Y_Wt5^WiE-0T;=Fa}oMbY1yK;Xi4rE4$eq)ka z(5iG`gg|k3<LLF*(%Pre;+Nv~R_W<t@yE;Z`upR(<-?8dCp!z}xmTs77j<_F5OB2e ztoi`Tn?H|MKOeq(Uflk6ytj0`xo|MMcHU(_m|ZWu*)48=DE^v1*;)DjPogxxT$<Y| Wug+t6^;I0qe#9?OJ+3RSdhi#QexPgs literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..8dce37520 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,45 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +# Translators: +# Yinian Chin <yinian1992@live.com>, 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Last-Translator: Yinian Chin <yinian1992@live.com>, 2019\n" +"Language-Team: Chinese (China) (https://www.transifex.com/sphinx-doc/teams/36659/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" +"你现在可以像下面这样,配合 %(outdir)s 下的 .qhcp 项目文件运行“qcollectiongenerator”命令了:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "写入项目文件……" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "写入集合项目文件……" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.qthelp.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.qthelp.mo new file mode 100644 index 0000000000000000000000000000000000000000..cb6e599bdd793710a162f7ce86ab4eace72fffa8 GIT binary patch literal 1120 zcmeHG-Hy^g6vnt$z4XQ#FHVRg5S_N{286O0S$<X$P{LM?i9Z?2(2kawGBc&D@8Ns- z0{SeT7G2nlkKiO<W~TGa_nmX*^w)!v?<E{3h)0O?d~-BD;QA-xBchDx+$)tH;`|Bc zABZg?Kfk=cKd+!re*Q8Sd@oZ7r~n}|P^p0OCXjK=0>h;UnP7?<smhRX6M=~s*qbOw zAW`xQa$v<{23$a;DpRxMs-~Yp%)c_Ea_w1<;a_S;Y^PHFBURIdvgJ$Ia+Vcd5sQ<; zB3GhXb8V<FKn@X(a{q(*UAa=GxZxs%!;M>^+qQi}IZi46KHH~A#!K>+DUIduKqnCw zyFdz~_=0S(9vEQVc5T<1vqUOGraI(Ha*>9b_|k*nv^So-=nV$*;nkHjd+n3HVl=NU z8BoJKICbl7;?_yM1+MFzHJ-R_*F_?kvn|g}@A95Oy;1O7<V~nH#8*`4IDaM&MsFq) zc-5N@;ry2MbEJwer6F2=i$44BZuZ1ybnQVO6Jwe|)u%k8q6XE-m_&PylVzE0atpp< zJ3EkTXI}-fl!0ULvUbjz%|_cPbe)<ti&I5oGLmYoJrGH;)!ljr_RFqoO~=#Wp{iIw ztB*Bh0+YE;Fhs+4#z|tzMF)b2D$PtcH7n9O@bZXOOp&1o<Px9QgVur@>vG?+4Bz0| WgA2M~F`U{>bok%te}9I%o&Fn=m}0yD literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.qthelp.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.qthelp.po new file mode 100644 index 000000000..b5e98293d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.qthelp.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-qthelp. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-qthelp project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-qthelp 1.0.0\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-01-18 00:35+0900\n" +"PO-Revision-Date: 2019-01-17 15:35+0000\n" +"Language-Team: Chinese (Taiwan) (https://www.transifex.com/sphinx-doc/teams/36659/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/qthelp/__init__.py:60 +#, python-format +msgid "" +"You can now run \"qcollectiongenerator\" with the .qhcp project file in %(outdir)s, like this:\n" +"$ qcollectiongenerator %(outdir)s/%(project)s.qhcp\n" +"To view the help file:\n" +"$ assistant -collectionFile %(outdir)s/%(project)s.qhc" +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:100 +msgid "writing project file..." +msgstr "" + +#: sphinxcontrib/qthelp/__init__.py:151 +msgid "writing collection project file..." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/py.typed b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/templates/project.qhcp b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/templates/project.qhcp new file mode 100644 index 000000000..fe12eaa14 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/templates/project.qhcp @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" ?> +<QHelpCollectionProject version="1.0"> + <assistant> + <title>{{ title|e }} + {{ homepage|e }} + {{ startpage|e }} + + + + + {{ outname|e }}.qhp + {{ outname|e }}.qch + + + + {{ outname|e }}.qch + + + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/templates/project.qhp b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/templates/project.qhp new file mode 100644 index 000000000..53f999043 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/qthelp/templates/project.qhp @@ -0,0 +1,26 @@ + + + {{ namespace|e }} + doc + + {{ outname|e }} + {{ version|e }} + + + {{ outname|e }} + {{ version|e }} + +
    +{{ sections }} +
    +
    + +{{ keywords }} + + + {%- for filename in files %} + {{ filename|e }} + {%- endfor %} + +
    +
    diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/__init__.py new file mode 100644 index 000000000..bdbeb6fb7 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/__init__.py @@ -0,0 +1,180 @@ +from __future__ import annotations + +import os +import pickle +import types +from os import path +from typing import TYPE_CHECKING + +from sphinx.application import ENV_PICKLE_FILENAME, Sphinx +from sphinx.builders.html import BuildInfo, StandaloneHTMLBuilder +from sphinx.locale import get_translation +from sphinx.util.osutil import SEP, copyfile, ensuredir, os_path + +from sphinxcontrib.serializinghtml import jsonimpl + +if TYPE_CHECKING: + from collections.abc import Sequence + from typing import Any, Protocol + + class SerialisingImplementation(Protocol): + def dump(self, obj: Any, file: Any, *args: Any, **kwargs: Any) -> None: ... + def dumps(self, obj: Any, *args: Any, **kwargs: Any) -> str | bytes: ... + def load(self, file: Any, *args: Any, **kwargs: Any) -> Any: ... + def loads(self, data: Any, *args: Any, **kwargs: Any) -> Any: ... + +__version__ = '2.0.0' +__version_info__ = (2, 0, 0) + +package_dir = path.abspath(path.dirname(__file__)) + +__ = get_translation(__name__, 'console') + + +#: the filename for the "last build" file (for serializing builders) +LAST_BUILD_FILENAME = 'last_build' + + +class SerializingHTMLBuilder(StandaloneHTMLBuilder): + """ + An abstract builder that serializes the generated HTML. + """ + #: the serializing implementation to use. Set this to a module that + #: implements a `dump`, `load`, `dumps` and `loads` functions + #: (pickle, json etc.) + implementation: SerialisingImplementation + implementation_dumps_unicode = False + #: additional arguments for dump() + additional_dump_args: Sequence[Any] = () + + #: the filename for the global context file + globalcontext_filename: str = '' + + supported_image_types = ['image/svg+xml', 'image/png', + 'image/gif', 'image/jpeg'] + + def init(self) -> None: + self.build_info = BuildInfo(self.config, self.tags) + self.imagedir = '_images' + self.current_docname = '' + self.theme = None # type: ignore[assignment] # no theme necessary + self.templates = None # no template bridge necessary + self.init_templates() + self.init_highlighter() + self.init_css_files() + self.init_js_files() + self.use_index = self.get_builder_config('use_index', 'html') + + def get_target_uri(self, docname: str, typ: str | None = None) -> str: + if docname == 'index': + return '' + if docname.endswith(SEP + 'index'): + return docname[:-5] # up to sep + return docname + SEP + + def dump_context(self, context: dict[str, Any], filename: str | os.PathLike[str]) -> None: + context = context.copy() + if 'css_files' in context: + context['css_files'] = [css.filename for css in context['css_files']] + if 'script_files' in context: + context['script_files'] = [js.filename for js in context['script_files']] + if self.implementation_dumps_unicode: + with open(filename, 'w', encoding='utf-8') as ft: + self.implementation.dump(context, ft, *self.additional_dump_args) + else: + with open(filename, 'wb') as fb: + self.implementation.dump(context, fb, *self.additional_dump_args) + + def handle_page(self, pagename: str, ctx: dict[str, Any], templatename: str = 'page.html', + outfilename: str | None = None, event_arg: Any = None) -> None: + ctx['current_page_name'] = pagename + ctx.setdefault('pathto', lambda p: p) + self.add_sidebars(pagename, ctx) + + if not outfilename: + outfilename = path.join(self.outdir, + os_path(pagename) + self.out_suffix) + + # we're not taking the return value here, since no template is + # actually rendered + self.app.emit('html-page-context', pagename, templatename, ctx, event_arg) + + # make context object serializable + for key in list(ctx): + if isinstance(ctx[key], types.FunctionType): + del ctx[key] + + ensuredir(path.dirname(outfilename)) + self.dump_context(ctx, outfilename) + + # if there is a source file, copy the source file for the + # "show source" link + if ctx.get('sourcename'): + source_name = path.join(self.outdir, '_sources', + os_path(ctx['sourcename'])) + ensuredir(path.dirname(source_name)) + copyfile(self.env.doc2path(pagename), source_name) + + def handle_finish(self) -> None: + # dump the global context + outfilename = path.join(self.outdir, self.globalcontext_filename) + self.dump_context(self.globalcontext, outfilename) + + # super here to dump the search index + super().handle_finish() + + # copy the environment file from the doctree dir to the output dir + # as needed by the web app + copyfile(path.join(self.doctreedir, ENV_PICKLE_FILENAME), + path.join(self.outdir, ENV_PICKLE_FILENAME)) + + # touch 'last build' file, used by the web application to determine + # when to reload its environment and clear the cache + open(path.join(self.outdir, LAST_BUILD_FILENAME), 'w').close() + + +class PickleHTMLBuilder(SerializingHTMLBuilder): + """ + A Builder that dumps the generated HTML into pickle files. + """ + name = 'pickle' + epilog = __('You can now process the pickle files in %(outdir)s.') + + implementation = pickle + implementation_dumps_unicode = False + additional_dump_args: tuple[Any] = (pickle.HIGHEST_PROTOCOL,) + indexer_format = pickle + indexer_dumps_unicode = False + out_suffix = '.fpickle' + globalcontext_filename = 'globalcontext.pickle' + searchindex_filename = 'searchindex.pickle' + + +class JSONHTMLBuilder(SerializingHTMLBuilder): + """ + A builder that dumps the generated HTML into JSON files. + """ + name = 'json' + epilog = __('You can now process the JSON files in %(outdir)s.') + + implementation = jsonimpl + implementation_dumps_unicode = True + indexer_format = jsonimpl + indexer_dumps_unicode = True + out_suffix = '.fjson' + globalcontext_filename = 'globalcontext.json' + searchindex_filename = 'searchindex.json' + + +def setup(app: Sphinx) -> dict[str, Any]: + app.require_sphinx('5.0') + app.setup_extension('sphinx.builders.html') + app.add_builder(JSONHTMLBuilder) + app.add_builder(PickleHTMLBuilder) + app.add_message_catalog(__name__, path.join(package_dir, 'locales')) + + return { + 'version': __version__, + 'parallel_read_safe': True, + 'parallel_write_safe': True, + } diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e6436842f17d2c54ae61372c7f777076c6a99a6 GIT binary patch literal 9482 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/__pycache__/jsonimpl.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/__pycache__/jsonimpl.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5830cdbcf893b3c5e2c967717de13ff6a3e2d7b0 GIT binary patch literal 2053 zcmcIl&1)M+6rb5$$%@vtk~m4-?`@>S-cn2S3mOyp0ZxijDu;?fQ3=axcWtk-+Er&p z*fN4T#bEo;#!yOp=pmF|Oz2G(Yd6;ElT zs;Ou%<)s@#)uBeFnxRA@ZxcJcM(iO+uAl5XKA7*oH*r+6_OP8v;xVjqKf*dDdB zFpt2j!aUlR_1wzDmC9UM;|_C8&s}kt<~Ew1({OxY3ODezC1y684lDkOK6M(Zrtb&w z885>+`##*Q2nkPf|**j9*0_it@V9rEdkqo+Hx ztf#`P%Uz!f)3+RkpABU$SeW81NM<->JM(7C6S^EK-0|i^IjGgcV}=o7G7OF>)3nt` z>!rn@;gn3zSuVZXzRH5SV+mfmRJl4;hNQ&W?9653y`UC|l4ywl3t1`-G|#P-nr*Qd z_%9bA6>$1+VfbdlF^n*47>&Sgd8iK?#z!sFOHPIi!wxLNh(ZfTlH6I2=NX1h z85D(Ztk|0jNy0LHf#l@)<%etJzVgN&lAJ31PC&4+zR8iE!4Ak_&s+foItFAsIzZEl zpo*lw38`bD|1vtzISW!p`ig#&c1cJ6ntnzpX_FnP9Lko*bvX(xR5072Vz(O2Br~Bh z?|M$Cm~4TE%Jn6ibM&vlh#@@#D~19A@;nGg{>l96%*N>(@9Zg=_1PP<8`jnWqJx2&$JZ_nIS_1iPMs@_%f7!eo`#sJX^uyvT^ z^#R2PwxmO#EHsH5n?sl4kQFa5?H!3}uonl5xBJP*W@jj#f*(Hv0y{r<^TOtZExW7c zx9wdu-&OMeS9B?ijEp(N*+x6@L2idc5VP$M~ z?n8K}u4x?&v|3v@{92p=P`A_dqgx>T zd<)(KAU#8J#r06F!1LhwgMTF+KdEWaZo*^5u-@@Iq8|E>h$$bDBxp*% z^C)vMeqUZ^C0HUa_%w*$WJ>9MGW82N`+%rFk+VOOC-&1RTG&>89G~1BpWG*~=pC2n UWG^ex=X+U73;P*L&qcof1p1e|_W%F@ literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/jsonimpl.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/jsonimpl.py new file mode 100644 index 000000000..9b89875e0 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/jsonimpl.py @@ -0,0 +1,33 @@ +"""JSON serializer implementation wrapper.""" + +from __future__ import annotations + +import json +from collections import UserString +from typing import IO, Any + + +class SphinxJSONEncoder(json.JSONEncoder): + """JSONEncoder subclass that forces translation proxies.""" + def default(self, obj: Any) -> str: + if isinstance(obj, UserString): + return str(obj) + return super().default(obj) + + +def dump(obj: Any, file: IO[str] | IO[bytes], *args: Any, **kwds: Any) -> None: + kwds['cls'] = SphinxJSONEncoder + json.dump(obj, file, *args, **kwds) + + +def dumps(obj: Any, *args: Any, **kwds: Any) -> str: + kwds['cls'] = SphinxJSONEncoder + return json.dumps(obj, *args, **kwds) + + +def load(*args: Any, **kwds: Any) -> Any: + return json.load(*args, **kwds) + + +def loads(*args: Any, **kwds: Any) -> Any: + return json.loads(*args, **kwds) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/.tx/config b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/.tx/config new file mode 100644 index 000000000..8c16f3d6b --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/.tx/config @@ -0,0 +1,10 @@ +[main] +host = https://www.transifex.com + +[sphinx-1.sphinxcontrib-serializinghtml-pot] +file_filter = /LC_MESSAGES/sphinxcontrib.serializinghtml.po +minimum_perc = 0 +source_file = sphinxcontrib.serializinghtml.pot +source_lang = en +type = PO + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ar/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ar/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..675daed30eb5c431b63a56170dd71b530d1fd030 GIT binary patch literal 882 zcmb7CO-~y!5RKZNa_qT>xqv{$`xQvZ!UBP$6%{E6qDnnFyH3`{u~)XYfnF*k+5`9g zfnHEiZyYNA$?l~;pueKCNmWok4z={;H=3C@wx7Q}eDJY`>ptQUVz~D;7F2E%t{08- z&yI}8$AbO6=Rm91EVg7fAupLWT*(kjmU4L#D`_J=dgQpR6p47lO4^dMOD(FmW2>_ev5bk@t;88he6}9 z*YZ3pB!}z`ucrT5=Lgd|59{`*v81o5G=f^CLue0@TnL&1O~)*O^|nZ9LI+!^vSZ4H z6Dub_-dMu1LDelsIUV6CsQwj@KBHq4(saOMSV*nSOz66k$;7eMAU9GkxX4B9_%{7?ONJfzdo8SRvqsT|<&uD-&sOX&U zc^gp!=I3X8J@TuL#%<2`?<89-OfF+`rQX}^b#J{xcj`On9FzD`rx{+>vJ>lOf^xYA zaZ0seHp=agtlrjD7acN9x-wP?`W(XQfZO^rCYeUt(BRV$w&{Qg2%HwWUn{PPYsA;` wqPT(LvOF(7l^>vdU))TCFU4mJ%JcH9xGb)wU$#6eFYf%-|5W(-h2eLVADiMO4*&oF literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ar/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ar/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..d0452d113 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ar/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,34 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Abdullah ahmed , 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Abdullah ahmed , 2020\n" +"Language-Team: Arabic (https://www.transifex.com/sphinx-doc/teams/36659/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "تستطيع الآن معالجة ملفات pickle في %(outdir)s" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "تستطيع الآن معالجة ملفات JSONفي %(outdir)s" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bg/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bg/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..d31dc6bf00723365361bb38fe2fc4bad0cc83bf4 GIT binary patch literal 513 zcmZWmOHbQC5C*9yA366hm3jcd_!aTU(o_w^RFPsDg|zpzvvC$VyVmZQg#M5IvflYE zjEMwP9ciTbcE5Rj^K|gx&mP-8`$zWA9e8Ia9RKA{?B1r%-m8*uyue?|d2NjV->kIR zme!Ed1$yPQto3hgsuitkNWwTwf|+WpBg}oJ7kJfH9_Lm-mJi31Z^O}OmfhV2(;suZ zc1jXg#gQZ>AdQng#wjM}kR~GS9moARW+KkigYLTj&r8x5Ud+6S^n`OKjjttHC*bDi zWCFLtJcBR)wEoIeQ?;_TbqoRtAf@$44S>ug$YcIewFVGLtOW1{jLj#`%kQ@d1IM3dMW$A)z zmQ@*E1HqCrbbym;evQ!SOl%#?P)M-XsPXbQe7qa16>>Ob;I NvQRaoVV_U4_Y6(Rn4ACr literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bg/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bg/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..d97e5e0e1 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bg/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Bulgarian (https://www.transifex.com/sphinx-doc/teams/36659/bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bn/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bn/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..fb0cbba0140ab4392b2b9afd209b52d568f7cd9d GIT binary patch literal 511 zcmZWm&2G~`5H1oYA31XvBo3`${8v$$EkUG>iz3A(N(1+`GjSF=E`Z}*$OZ|+{b{CyzyLj1M(+aCO7?6g)XJTI=VquI9w zUUBjWk|L0}-11}ZcR0qa|*EY18omX)A zeL97!QCYyJe_DSQs%^Hqk(QNx0=OW(QE*PSk&WPR&D;f*B)i=%=Dw_1(LS!-CV7+q zm#$7&azb)^a`Iu2R5m$^X6@GN7B8LO1O>KxfMJ-Q!DBc)wD4vK*-=zZ%Hmm85iYtA zQOU{@x1Ef}wCAL2wXtVVueA@v!!57y^qJRBwIYv&t=&>ipy0GJ9DOBAUKADWZ)G7} MQ44uIki#6@1M|R_#Q*>R literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bn/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bn/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..6c9c648ea --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/bn/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Bengali (https://www.transifex.com/sphinx-doc/teams/36659/bn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ca/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ca/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..7cf12361445e2fb046fb5c4b90180bcca7c41fa6 GIT binary patch literal 511 zcmZWm+invv5G@i<`^Ym7gTzBCn7vh$#w8WGY*C~vL}}oCvT-&>8+&C>nw0>(@@)tHiT6_9%O!SaGw*)tigB{SAKC}wtb)*P zj6GD&vNuZ%+8b)jFJtQsZyU(sG|r;AZk=Z=Lv2<#+|>aWPC-!)CezP@@pxWbUq`cV z3mkb(EM0L-tQF*G*26T%>?7ov%1_^=y)+df&h?Gy)c@yY`2#N%-jo94!jlaRvGWS9 zzE7v{bx;=Y>6!GUP;I@VS|ls_3vi)nt6)S-4OuweFt<>8 zD_12fZ$ff1C1T5FGmt=vjhpx}IIIQpWk_Ts2`f2&|f NOWi;o_hd0ge*og0m#+W- literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ca/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ca/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..8cc5c48e5 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ca/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Catalan (https://www.transifex.com/sphinx-doc/teams/36659/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cak/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cak/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..ec04d633850e167ee3b324d8f944075c65e2e15e GIT binary patch literal 473 zcmZXQ%TB{E5Jii`DofTZykG%>$qVtQd5A&-s%W4pg}s})iD_yFdrAxc!B_B4dRW?qg?gQOqaJ?M4xQiW5$e01HIFhw=#1b&TBnTW%vFWbi_B=W zY6wnRB}(EJ<6P?pdqd?k9J5Uhj4Q7gh=+ zS7-~AoW)_(gfNEafW;Aycelf47?KeB@>$jC|8-IPr3*>d6%Juwg?6PtV>!FL?{?Wu zD^1w(pXgJP>U<`0ip<31XM%wgQ_il%Q&y;nEZJs(SUDa9^ZDGz+F6a|!q3b!_@)3O zlLbh>T(G;pzt;@NF4*$YPMR!%5fbl$a7j(;y;Ky6a)Cir3Z;)&RtW1Pp3HCzhf7@@ kHkK9=otY8Ang9R* literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cak/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cak/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..64d76ed5b --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cak/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Kaqchikel (https://www.transifex.com/sphinx-doc/teams/36659/cak/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: cak\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cs/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cs/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..adf0efbafee95a2118f3b4e87f032c0387499a15 GIT binary patch literal 589 zcmZWmQE$^Q5H5(PJo1dhO@e6?T;il-tll!{+H9)SK-CrA-PBEtQaiF;+U&&vN6_U?n<@5t99vcW;kSde>DEu9}cJ4?QJmm zKEr{P!c$iq3NJY%EbbvoF#Zfl%#-d1)?Z|XI5xe3vVok z>mTDWeCy{KTs#?lNmN~~MM)zI_aER)iWP^!y(}s?s=RL;kD|?H6Z*EPTFPx$m{qht z04_`sc~ZEjdwTk*7Zol#4kq>5iW;wtT{#ZA*+G|{oWs6Mk2Ity#Bg{B8s1Yuh#kWh zV8DSsFH=bNpBE{dJg3DwRx3OpA+*Ybl-(d7<=KNtWJ53@i=?KL+%>eQms=k-wNUyT xib_}~eY*BbJbU1^TP~%=Oc!QBhH^NYD<9lQEiL&&PTq025_4HY686aE&OcJpq|^Wa literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cs/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cs/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..1c3e37bcb --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cs/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Czech (https://www.transifex.com/sphinx-doc/teams/36659/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cy/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/cy/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..cfd3ebc8cbaba217377be4bd1ff30a0d637888ff GIT binary patch literal 554 zcmZWmO>f&U4DEoOeB8MQ4j76S9c|0$N21Q#(#9VI%$=t)eoi1$}ekRVH~nxA{%2p=B`w8yj+zIr-nn8_lKje{lQ?8-QNe} zyD45-DLhTZf$)+;60;u039@rY7*9IKaW9UEh!go;wcG#av1G@Ki8m6?UB, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Welsh (https://www.transifex.com/sphinx-doc/teams/36659/cy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: cy\n" +"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/da/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/da/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..6f06d0ec6a27d4f6fd171b75824077c64d88635c GIT binary patch literal 751 zcmZ`%&2G~`5H^&PkDNIS2c$%>{tJ}GB~^bMAXQAGBtqi2u_y61&aSn)CP^JvKOZ>GcZ!Vg z^`YbV6n{{3KB*cqEb~pGyQ*F z80~lg@rK-3Hq~63l3S%?xKs%5sYD5Ht`+9Iv`R*&TV5#T<;#;7yMfdv7d2nd{G9(O z*cACHhJ;ID3TPG9RwnlS^?L2uW`vmI#>>>o-^;;rmHC!hjNdsteAV@H?zi1hS!-Uh zw@R-}46@plrWYNE>xP3qDfwlSRZ8I}-vU0RZp)Ua$URKpAlE^~50 VV;|PoM@t0pkALo9@2ztW|2OXb<5mCw literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/da/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/da/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..bd60c1fa1 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/da/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,34 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Joe Hansen , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Joe Hansen , 2019\n" +"Language-Team: Danish (https://www.transifex.com/sphinx-doc/teams/36659/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "Du kan nu behandle pickle-filerne i %(outdir)s." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "Du kan nu behandle JSON-filerne i %(outdir)s." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/de/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/de/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..8ee42a8d63aea68b51ce790b39b4113539513d68 GIT binary patch literal 510 zcmZWmO>fgc5G@iXA31XvBo3`${8dq!EkUG>TSbZ?N(1+eJ#iM=E`xBGV9?3-WDp8hzJcp~{+^5p>jiq}&AluI1W7T$fOig8xs7xKY4t044S zV-J1^4f-0v-1kB zKhNjzaZ(oW?jPy*Lbc6KHzHZnAAl>;oq`+kowjhiW$uGYlKp-k^U&37=nz+~OCB7+ z+Eoe5laQRAoxK?)H6VpJe1>O3opiyokZoVEFN7I-=Zt= zl&t*Wu9wM}4xIF@HueIlt@eR, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: German (https://www.transifex.com/sphinx-doc/teams/36659/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/el/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/el/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..ce7bb5a31520e4f3c2a855ad1e2cbde2be1b6921 GIT binary patch literal 871 zcmb_ay>1gh5O#pdB{juRAlZWT{RBdM!BPH96cm%lv5+X&=dr!`Zuhjihn+NFB@!JS z9XtbyBA37$+`R!kZ^4{{5=()OmA;#q-EV$wW`5qi^QlDVHsK!OabYZ+ebPNbi?B?1 zNBFf=DqWBa314oNN=S042=H2^5ON7pjUmx0L}S1X5ndb}yoA1p(14KeprTUS6S`_@ z|MW;iIEwJ^K8ISp!O*h39(#q_2qgnB$xz5isHD}R%M5D4BXJ_+U})nAyqa6{%56-P zwyb3aqQ|zEx4*Huv(s)K9hDCcI&51bw-lA_aEk%>u2*NS&%CGLdx5|F z(5<^J5m_7GiX!_>p6AbbF7fucv8BCj*R&h S=BE^9aRdKvjz4>QBg=0Fz(bV) literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/el/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/el/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..7cc7f5271 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/el/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,34 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# tzoumakers tzoumakers , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: tzoumakers tzoumakers , 2019\n" +"Language-Team: Greek (https://www.transifex.com/sphinx-doc/teams/36659/el/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "Μπορείτε τώρα να επεξεργαστείτε τα αρχεία pickle σε %(outdir)s." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "Μπορείτε τώρα να επεξεργαστείτε τα αρχεία JSON σε %(outdir)s." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/eo/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/eo/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..2a3178e7e09d98981be578521375044432cfed89 GIT binary patch literal 513 zcmZWmO-~y^45d;}d+eEmk$M2N-Y-;222wSUrHYg-Q3%{88)q}sW@a_xkih@wFYCR( zrCyLqD=b;^n|c0v{{8Ol&poj>;``$7JMfQvl=zo?V)r)j?gv$jqXpiP55`#qplLpX$l^54qA9h`GnSz?3%uCW0cTD@Q4U7quY=)mTHM@3lj|8? zdeSUaaj2OTy56ZCAq%, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Esperanto (https://www.transifex.com/sphinx-doc/teams/36659/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/es/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/es/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..7b768cd735f4e9ed7a9543cca181c8ff8968ebea GIT binary patch literal 797 zcmaJ<&2AGh5MF*xd*sYvI3Ohg?_VG^TY}mqp-Pp|C<#a$o!v>+#j#hmw@JD16ubj> z-UnWS2Vk~MX%Rn`K8?rzW<368zCF1A*`sxj@R0DVc5bZ^?PJ22&?0;y{J7(JU&*!! zU+#Kdm+W`4-g{j^#uX^Nfzs#p{S zV)Pkijtz764viIBrC`fKsBNZ|Gh)Fk8o{ObDAcNOYYA}>1+hQHQX9v{b|rFlRIMzV z>l6m#!{O-Qu-~5!W;1_sI%hqD+)-B6=MGayqPWANgvBo)iPNO@BaMg97p zyg0e!MZ_C%>)70IWhHmoq%cCQxXCq~1kmFPE+rZb#{s;QyPNF#^kB8-LI#;$zj{h# zBy~2ms`!ekLi@{MbL8t3W+hj`7SJf1D{UHvo6RP0^~++3+d4~lr4q|^7CMTtVXNJK z-U-o$O@AUQ!zFvI&Dy4*%1hUFlYO|_b{h&Fbs=v0, 2019. +# +# Translators: +# Edward Villegas-Pulgarin , 2019 +# Leonardo J. Caballero G. , 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Leonardo J. Caballero G. , 2020\n" +"Language-Team: Spanish (https://www.transifex.com/sphinx-doc/teams/36659/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "Usted ahora puede procesar los archivos pickle en %(outdir)s." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "Usted ahora puede procesar el archivo JSON %(outdir)s." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/et/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/et/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..aa5e819ce0616aabac4f9423d6f6ade0ecdf7b45 GIT binary patch literal 663 zcmZWnOKuuL5G7Gov&=e+$|4dd?)h19%-BT!Kq4%#EkKd7Y-S4R&~%TwYXIjSIZC|p zj$34rv!n(~v8A;1)K$`}->drb`qj?{zn6?RjDy;F_D+E;TN%RZx6`fbsWZ=t%GTYo5 za%w6(IwiIGq0D?iD-B5)he~Km4q3jancrXDw2S&FG=^jn0W)~NlctHUQ4nrgZ^4N z7_Y46sZQ;((r0W{+Ys^70oO|F5HqjjoJ%A9bHoJYio5k>jbgc)3!>6zQMB1?LaOtt z8E(VeuA)aRL}BxYILJqbM@Jvp5mM9&Zgu6P7N4zK`3y|CcYP;4fk(5`H1M_qNh=uk zhrK6#S;63v)kVY8+?CuL;g+IOOJzC`7ZR3|q_%dh{IjC~ R>8rI=#r|r, 2019. +# +# Translators: +# Ivar Smolin , 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Ivar Smolin , 2020\n" +"Language-Team: Estonian (https://www.transifex.com/sphinx-doc/teams/36659/et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" +"Nüüd on sul võimalik töödelda kataloogis %(outdir)s asuvaid JSON-faile." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/eu/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/eu/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..41247c4b1ab85add56565ebdcf44656b0490ecd7 GIT binary patch literal 510 zcmZWm&2G~`5N;(-KK9IEkT|r0@n1!0wgizjE{YUGl%~CJoQbo@*)_XklJXwB7f-;m zFm5FZVx*Dg+x_P6n_oxIejJD$ia!^B*@M6AwZuQ=6Z^NBcVDPtoUHJUd@#-`2<^t$ zedR2Bv&2B&=*E0Ew%+izfhcF`0+J;86^9rtS zr&IVeDhqh`PwV$WwRNX!X-VB5fD6)F1(!N}?Ff!H%xzFfvfJ%q?yH(L?c>UAlSc(` z<*I}wB_yY3XKw}xb;(IIYdWtRymo#Y6xj9whGBjIkKypx!iynfCs8>mizih@x9CbV zB`Z7Jw=x;io|CrG#$G_R(LN9lJ6_}Y6R)3YO&$wdxs_Z%!THi~^pPxi5mcnV@Ap|! L19?1, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Basque (https://www.transifex.com/sphinx-doc/teams/36659/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fa/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fa/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..8bb908eacfdac0b3288509e9bb0d163dbd3be3d7 GIT binary patch literal 914 zcmbVKO>Yx15KVzoj+{Bn1t}4DzY3+<(yCu66g4zzBP33hyYXfX8+&DYNy`Nx(X~}sZ`$KJyQxil{rLIfRF>ol#H0xU=jw8cDElx%u}X;3%FU6x#@CM z*Ump9G9Eoo+23Q@N z7|h=C8lHzlvcq2RGW(xAKe*s|$lIdYkdC54r_@Ll!b95SumSgzJv8>> zbQ@CzWrXPEw1=5v`pY35M*AVO%lBe~Yl$(L4qbOJ7&xX>=P^4dRorPONLNO#!5Hn% z&duFzxG{C>)pnXInvxBv`Z@%WUATHNSb(XySQD@We!be-Y&9>Ni|wnfVQZPdryOQj znPCUU%~Hz60z?T_nwiDi#AN=GR~8jBMVca#T^vLR^ZVRXA27ib_7x{^7{V&uXDI|u z1IJUblj6vZpg1m$z>dCuEQZBNF@)mi{1oh`;>3=M;rXc@L-E><&QFUsNG*-&df79K zwPSk*#aHA`ietcEm%E0akutU;``J#QR4=uh|Ib>gVG{eH7}{}J;^e}wO;@)L|69;c DV{TuH literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fa/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fa/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..5d95e1829 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fa/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,37 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Hadi F , 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Hadi F , 2020\n" +"Language-Team: Persian (https://www.transifex.com/sphinx-doc/teams/36659/fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" +"شما هم اکنون می توانید فایل های رده بندی شده (pickle) را در پوشه ی " +"%(outdir)s پردازش کنید." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" +"شما هم اکنون می توانید فایل های JSON را در پوشه ی %(outdir)s پردازش کنید." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..08754b39c49e222cedb7f4d5ce475b7f81ee8b12 GIT binary patch literal 511 zcmZWm+fLg+5Cy4Ee&o3iQ>hOi7~di;S(>VWm?~0CqmcG}Wy zYzu41=>>Y_v~2WmZK|494J2V4Cc#X#))D5u(o4KrS03k9K$Z{3lW)V(XqMgG1=AmM zymm?wcg2w;B_NHHKE^2~=a42M?H$McIA$Ww)PwG(|IbU(7hcS~iS&eXCyj3;StsD; z=VSu6!#sm8|BU|1R8y^G#Uo4o3UIFEimS9S+ShPc6SZDM(Ppy=scWlCwG9iqigps< z(iRbMjgNX~XQ%zB)X`BeZPrdUcw^nl3oz{q^n>&gcH!XAz^4HuM?pT$vo~2;xZs*a zRfa$D*z#(mwiLCE)aDY3S~{<2u%;3(-gwgb MLN$, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Finnish (https://www.transifex.com/sphinx-doc/teams/36659/fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/fr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..401768c966c0469c323c5dab94b9e66910ec1a42 GIT binary patch literal 794 zcmah{&2AGh5MF*xd*sYvE=Y;M`v_CokAuGG$15AYpBYmLN|@~Pev({ z_XYl)Gtue-6U&AvJ4bDVk};Sv7jly*X|-4|gIe%HTno9(?W%y#3%t;sVyU!cW3v<~ z>sCv{<|>B%_-HsfJnHqP{n^Z&oXy#>MsBGp>v4-QL_yeQLBzsW5QTBndLFccfD+jh zFU3~Wc>(2(xUp=mxikg0O2=@5T(SXO+4O)wAo1j~ z;!D!c^sj);k*{JHXp~6~jojMO#J;~?uRXh!5E*W~M6LYWcCb_>z9owBTf4h2+kU3~ zraLJr%?mbAdSzmeWgVJMv=6s#ry=10!lpYOj{A2VrXIS-)L)eJpR1A{W^rTvvfx7Q zLy~iC&~_@DvAw&z?V~c(tS=Ll(llb&TL|mEMTwf4OJlf-q01LoK;*S)M$Wma43w(6 w#A{elY0~4;0)0, 2019. +# +# Translators: +# LAURENT Raphaël , 2019 +# Jean-François B. , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Jean-François B. , 2019\n" +"Language-Team: French (https://www.transifex.com/sphinx-doc/teams/36659/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" +"Vous pouvez maintenant traiter les fichiers sérialisés dans %(outdir)s." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "Vous pouvez maintenant traiter le fichier JSON dans %(outdir)s." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/he/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/he/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..3ca202108923b43a28901d14f84bb99c7d28f5e7 GIT binary patch literal 604 zcmZXRQBT`25XZ~3r#$X?5BIPk(B{NR8BntTg@&zC16ApGchhTPl-iN)u4Uh2UvHmf zmsT1>SUTzczMt>p`~P|O_IHQQ9>sf#53Ts`e5O2n)9JAGZfwmX7M=~~>;bJ)MhkFF zrSzsS+FLba4y}^4`lWPP`DG1p$iq08U}LOjxhvJ2U9C#Trba-P_lKj){$Mc4?(c)~ z-IQHhl%Be>f%GUK;c<`ggvBS2#3Jc_;yum@WE1?U+Uc*kIN5TXxRG?8O|8_fmflza zH$O%rxb5c|e0?$coKRh^WJx0{{3qBH&p>(IAd)dDwRVV2Qu z18i=J$kP)Sb&rp~^r8x*!(d#mtgP9Mu}ddFH(Tk_qchm0>4Ancg&6ktLBmH%Nby6s z01g6n#pHD{-qr}`TmB`mQ|DA{`y|w-8|1@0d-jZ639iX8)U=_ehW_nw, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Hebrew (https://www.transifex.com/sphinx-doc/teams/36659/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: he\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..80398a2b75deb4f93ddec95fd680172fc79f6d1d GIT binary patch literal 921 zcmcIiOK%e~5MCaq9Fe$j7*rv(0%sqE(rgLpD?m|0t0qF?=x&^>%f?>W4r#a`m8XP| zxb()+6$lWj-~e3Uk09iq!t6$BD;`HIefG@w`#j^Zf1WzI>)|+oID@!YI7h}R+99He zm_|H6{5a-$pKyJIczN9O9^!hsIN**PKtcrwIfPuvglP>XWpJ~#b_=>ZV;Z=CbCYsl zI$TZZ>OU1ZPwr;y@0xWbw^(AxN{8HLN^>b<(0R(mb|QsQe3NLVIL-KdE_$iyXAo9{ zYFOD|xm1QUb&q$*;-IHVTgK36F08E1FDx%_G+M37`dXVTDMk&RN|vc%F+@RFBSA#M z%MgWeG<`m(1pyMt2D`_L?0@pYsN@C6Tcz5NwxU93)JPS>!WJDttEddFP_%V1&G-70 zXVpaZuU;q6OD(l%m(TrS^s;^@ZdFkqUGzVj|J}KaA9m1(fbEVlh>@fDQvV{F* z0`D`*u`t87jh|9KrgEJLrm(sA45Jtp z=_bn{s@Cw0JZB#}`yQNq;_O>oUb($z&VF(B4NMf@XaZyJoc-qPQ)fTAz30yEU}zVu zBOePRAKV@?iaiwXlrxH6JNw;PTPp1Scykv6NJi&tnQX`Vy@>rX!3$?UAISfE4Zi@k C<7lD) literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..4e9fdbfc4 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,34 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Ajay Singh , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Ajay Singh , 2019\n" +"Language-Team: Hindi (https://www.transifex.com/sphinx-doc/teams/36659/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "अब आप रक्षित फाइलों को %(outdir)s में संसाधित कर सकते हैं" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "अब आप जैसन #JSON# फाइलों को %(outdir)s में संसाधित कर सकते हैं" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi_IN/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi_IN/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..432bc88232a6176e24cfdfad4f9acf94a860bf08 GIT binary patch literal 523 zcmZWmO>fgc5N#z+K62(TNE{Nu_^YBcTY^X%7c9kXl%`zK#@^VAoLy^oLQ?(*KM#Hj z<5Z%cjx?*8-8XM$-~4|5?B@~NG5ZVlSAFu2z2W#5KVpA3clMhq3G)iSDCe~`0({qK zvoEb7r&s8e)3Vh+w5c1~w2*{xm;?*eSw~p-T32|ntvxQSfUKD0vyYSMbdlZO2J@RG zUOFX-S#c^!2}t8)gmH?=J4h3ep1h7nam+wmsPDS({uGy_2VBg!ne>E9Cyj3#w_7J$ys~cN1(@!T`f+*=58-%V;N=*SVNm2n z_9!un7+kWz%J7HoJ06qNo}#Xm+MGk#Naq!ex3tEyM_fPHS~<*2X)9ibfU}jR;FB`S UvAVp6djS`6rCLbC5ijZJ57&&FPXGV_ literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi_IN/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi_IN/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..e77aaca6f --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hi_IN/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Hindi (India) (https://www.transifex.com/sphinx-doc/teams/36659/hi_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hi_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..76da5bf2ac67d8cec9a7b9ada0af468945e171b3 GIT binary patch literal 584 zcmZXRQBT`25XZ~3r#$X)+QUs^2(&q|Q^u%iV5JRHr3R|f?cGh?#8YZVwoA*z*VxzF zXW69{un9{i-Pymp^WFc?o7cZvc=piVq3t)pKj#zrZ(p@qq`4bg^Hb)Y4CmyBv`!h# z!PTYGo7`w`)r>f4m8jG&rHj%pD_|iFSul~cv7ThEP;+v*Djb;_4r$gKj=uH=gGqXO z8;ozJq;IA0Sd|QfmmFfsI)uiAeSw(qxc!lKC`FJ=3!{Z6s_0m&^L9}LT, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Croatian (https://www.transifex.com/sphinx-doc/teams/36659/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hu/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/hu/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..acd4e1748fb70bed03340293a4e02667593961a2 GIT binary patch literal 797 zcmbtSyN(kv6dfMbl++ZL0x1!AUV&vZt4Qo_0t979ltf6B&cvB<*0D#nC$DC|fr5rE zB{dR15K$q1fp6g^L2M+T!qSoNwaz`hKE6Nh-TmO;x`Vinc(O~5RtMt{ksxY_Ys9x( zj`R7~+4XJ5>0ABrzEu zlZ!GlWT;|jCFkwV^Ydo2-x>_uUUx_?HKP_)Nt0R@LllH{5=10?22mJCwMRic2#`qn zY|eML|H%uZJug6BhZ;+Uno1+6RXTRC5H>0j9yB1Vx=A}}-583NxtC}sli2>Mz~(GlTE7sK%QHxGstvP^(oV?f z4R6=gglW=}sT!mCF`SOLbzd^cG, 2019. +# +# Translators: +# Balázs Úr, 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Balázs Úr, 2020\n" +"Language-Team: Hungarian (https://www.transifex.com/sphinx-doc/teams/36659/hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" +"Most már feldolgozhatja a(z) %(outdir)s könyvtárban lévő pickle-fájlokat." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" +"Most már feldolgozhatja a(z) %(outdir)s könyvtárban lévő JSON-fájlokat." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/id/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/id/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..58db803941016eb94af67c465731e55ad7fc9da2 GIT binary patch literal 750 zcma)4+invv5M3@$`^Ym7^Mce0ythExY!!*N2~|**MoEOkqqClDOuY8W_BJU(;w$(P z_z1p&Z())k%2mSB(acEa%#4ob>x26r1A6xe4+&4V#ZPZUc}ge<9l{5~mpei5iQ+Ng z{oNqwQv6IYcw<^9xdv_4&{$KVbKsWV;2^=r>?BeJ?4-lX_qA#OOGK-^Q`kY=_Uyg*#xiUcKV;Z zG~4kK;*GfTY-YK3ihE;on6-7o6g3wJ;i;Bwr7f z-Zw6fos% literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/id/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/id/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..d29c0947e --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/id/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,34 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Tumpal Gemelli, 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Tumpal Gemelli, 2019\n" +"Language-Team: Indonesian (https://www.transifex.com/sphinx-doc/teams/36659/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "Sekarang anda dapat memroses berkas pickle di %(outdir)s." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "Sekarang anda dapat memroses berkas JSON di %(outdir)s." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/it/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/it/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..2aa83073c5ab05a4a7e5960c66c6dd961db5eaeb GIT binary patch literal 511 zcmZWm$xb6N5Cw@-A34vVM&ba1>Mdf4nIHmbP^2^yh0NTYj?*#f*e$z4!u$sx#t-l< zR1=9sQ&LIw>{r{X*WI1xEw*j;AMAS#_+m#KzwjqEZ$oDvR6*FE;$P*wwnl)j=i00b zYsl#ddgZjN^gnINIV~zk!Z=KVk*cjD%zde+c(p7&j;(+!@Ae0m-Cl2$-QNep-($RX zN)lJao+Kq8jgvOUDJG|oCL(Pe#_c#}B97FfZo2=^OVW2<%)Ej0gkvX-uOwL~;O5U@ z0C(LygJ0iTUoh2_OIdPDO&X}-Hg>K#mf#e{_`+4>$D+?D~v#84O z5>GXcMrut_T}f@up_ohO6?K+0!?RCbGu2Ev%uHdYd;$Sy6W-`n8Rb|}*8WMrm7J&w K(y+~k*?I#O9GC9^ literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/it/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/it/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..309a780ff --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/it/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Italian (https://www.transifex.com/sphinx-doc/teams/36659/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ja/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ja/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..336e12fb4f5fa637304c021e3ef2758c65ec9262 GIT binary patch literal 804 zcma)4ON$dh5FQ_=96fvJi?EA!<`G>tv##tTS;>;PAqj%V&ZINxWTt!Q?lH+;bg~x@ z3L-8j2qFjyd-S~eOZ3t~|AsYLFoF+k_^2xQ>d{}-*Gm_VEqE6ImjT!F;Fnhi-vu-P zCBQ?#{G4Td1X}^TJa1WhV84L1?u!%!gd;A-D3KzdN+CUJ|xkabw z7FskBQsagSSr6}|p~4;EqiSQjR^QsLR9e+`yU;x7;9W_HhN`$iH1(0^xMl2k*u9B7 z*Y`?SowDNq5x3|AmUsW1=XwjC1H3v>8h0e&Dk54)A9cuxOw$oV?E#C~VLBpXf^Mm0 zuocFHMa4kGx34XlLk%9LB!pRp?3H;m`)85n;==x`%nu0r9XbF2 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ja/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ja/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..9da78becd --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ja/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,34 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Takayuki Shimizukawa , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Takayuki Shimizukawa , 2019\n" +"Language-Team: Japanese (https://www.transifex.com/sphinx-doc/teams/36659/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "%(outdir)sに作成されたPickleファイルを使用できます。" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "%(outdir)sに作成されたJSONファイルを使用できます。" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ko/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ko/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..427a37623250f8932c47f580b96433b415f013ec GIT binary patch literal 774 zcma)4J#Q015IsJsE2$}_K}rOBA2x*eLQvw^fWan~eL`}%KCkVK&%3AHb?i_;lfoh? zXd+U?C z5fwxh@fz{-ie-Jlm`A+2YFP!0KQLMiIe>@?5ON5Kk`dDyOqapa`u1~Z^O$Mi0&XqI zfoXBItes0c5+3zp_V1pmk~=Iiq|_oWn9^K|0CdvjViZYX6mJsE6sIwN$wjAY`Z4&9 z=lFJwB~lqu(H-6*`9VjMPzF$}Y?jI!n}tHHSg+gF?T~CKMh&Wx0yQjvjOXWwmm&Ur z$oN4fd)v!-9ui57?ef|5zj=OU&hwC0rrMBDQK4gMqza%B!V`GVV!IpYOe1szGY{{~ zhagvU2DF1Sd-6{~LPq-mJd?PUfTgZ6i4I(MI2<}=Cd=DwB)tQNZ-9p_fHlFb9Q)`PQIs;eMmnaPd|P-J357Qd<^OPar)-l^k6(a_~2YBQC(cn H|B3ttL&6Eh literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ko/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ko/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..0758298f8 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ko/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,34 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# YT H , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: YT H , 2019\n" +"Language-Team: Korean (https://www.transifex.com/sphinx-doc/teams/36659/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "이제 %(outdir)s에서 Pickle 파일을 처리할 수 있습니다." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "이제 %(outdir)s에서 JSON 파일을 처리할 수 있습니다." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/lt/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/lt/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..94d861ddf2c1c69088e704dbc7cc5f954ffacff4 GIT binary patch literal 645 zcma)4!EVz)5DkcvkDNIS5>$;~?Og{-y^T}S#zm2Ah|&P(jkB>AIcsZoOj6X};P?0z z)=8ltE{rtNyxli%q@uTlO7Y|%MarvwRf5b~ye}35Ok?w6~>Mt@!GF_2R(pXh% z4z?+k-sQDMqn5-kwLy~ELaoR}TUfHFIV9P5n!X)RCiCR_ z+M9h?kV_*4I#n_eC^>|bMTCZgy@8PNaPWdglsY1r%de`N{x6S(dmeSXR9GYnBebmq z)`r8?$25ia<1B&UU!zBks*6?>Ze)eO0a-|~;gBjUTcMTEa9kobmIuLhyY;bCR%^NQ z^Li5;wm?>O9-wQp!QkZNbre(>^u1Zt8c~s}+H5Qb-Rz-_U!B3BjE^-u2Sy=|fx*!c z++hkMU=iHj!r`C75E$#jIZ)ugNHB^a?3(U0hH=#YFAe52_C4@4c7o>+av1czY?>wa z<~sYlOJ}XrZk0EUTM)_}22CZDK7+gz#!8G^T$9s#UbmRFG$he^y>f@Z;dH6cdndIt U&R2H, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Lithuanian (https://www.transifex.com/sphinx-doc/teams/36659/lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/lv/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/lv/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..1b7e20ebc722cddbf6c51243f08b8f5c92139646 GIT binary patch literal 546 zcmZWm+fExX5T#O|_OZ`>7$k~7?d;kcL5b;>2C`I+eMY-v(t4pZ;n6nWUy(%bHp?n?D4nO0EPHGHkRoaI_4e^&&~O+ie`WvU;I*ab;J@ zvjsS}RTAipPkN`PC;g<^B*)RXSv%R_wRI~mz_d@)XT5WHhS`yM$61zfI6Q<7vi*#6 zxBvzuhy9Ge1#lwiaa4}V{Ka|lHo79;m7#y$wKRQDyO6Yv)aD$jrF33}Y#kPO_M+, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Latvian (https://www.transifex.com/sphinx-doc/teams/36659/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/mk/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/mk/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..3e9e4444872832ea9e6ccb69ced2bcbfa476d7ff GIT binary patch literal 544 zcmZWmQE$^Q5FQdwdE}XgL)xZIaEYCXv3g|Ctr@D+K-CrA-Na4J5<9Y8+VMa5d;1am z0xqk>m^kUA`|Qv6oxi((@%+~w#WTv6l>0sSC*Dx~n=Y|Gn>zbll>x^UepAkCYXtai zrOmdqCOEx7ubh^R{;5s93T*>CW-*Uus$)E(Jj1Q2d$lpQAMSAj@4HzRL&eRXxtN+jA=>v}uZz6rbxs%2>GFT_z z`s-u@pNB;b@1ICt5Y^OcS(9XY`xoF`$yPuiOI2B;rGcYW2%Q&6ve|6n(0A5LwT(;L zCOa3fvSkwJnNLnmPu~ub_BJ_=rp?;P2CuDay#UiaK%b@Ouq(480|&qvWEpTcJcJ!& z@QN@$h7Z6%0FR1skw5xQ&PG?{x-#_3yN+fLY8#TSk=mR?xsuMSkgdZK&mMXG%uD4k iH>Is;M*_|kIz*q8QI0I9<=hFllnd2B8V_i5dw&2}gq~jj literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/mk/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/mk/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..3241a9a45 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/mk/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Macedonian (https://www.transifex.com/sphinx-doc/teams/36659/mk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: mk\n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nb_NO/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nb_NO/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..e8b1b13ce8d5444d862f027a1b6bcd0a0e42684b GIT binary patch literal 536 zcmZWmOKuZE5DgNmS+ZtPNGxnY%`YOv9gMK!39{sIEXS}#?QwhDFw;HiF2^?a$Psc9 z?!f^#1vQRDK$KKcz3QiW)vta&dwO@m@r3g^=gSuS6|cGe#gEwbX3l<91>tywpOy34 z8Ueo9XtOV@A*YwR9BFMahL>i)mTTE`%LgEBqbn?lODz?CT}54M0)xv?!_?^ajtH4tNuSPNsqjkc@yag7fu>q zNwQAB)u+h>rh`0#cmGJgXR0Z;vSdlK{4%}%gK?o`EnsThPL*037}{_3kNXNbZA%`y z(Af|*UPRGuw+pEi(`&U43tLAI#^A~p5%Cxwot~Y&=|x9{s2j|xt&`jB*ke4J;GezT*&CA+N*|L)N6&ZPDfHI>xn0*Z}vUQvHbYdnACwTrEl j!^{+R#kUb~zSIVkf@=UAUn< literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nb_NO/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nb_NO/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..9803e852f --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nb_NO/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Norwegian Bokmål (Norway) (https://www.transifex.com/sphinx-doc/teams/36659/nb_NO/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: nb_NO\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ne/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ne/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..3c4af30e19caaef3a3388aee76d32240758a15e3 GIT binary patch literal 510 zcmZWm%}yIZ45m^~d*sZ)m3jab?;k3Vfm97-sUl@*6w=-&8)q}sW@a_xG@xX)M+I=< zs)QvaBqyh*AA5, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Nepali (https://www.transifex.com/sphinx-doc/teams/36659/ne/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ne\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..eb455754f826b6d8f899a25a3d82df1427cc4fc8 GIT binary patch literal 509 zcmZWmO-~y!5T#O2d+eFRAoT!hXTMM>F{ElBOBE?wq7b+{8)w&*W3TL468IneUHu3B zEu96av|^-@=Go70#&3SVd;4>b;|=FN=ldS~6Cb($#h2Kh&Aj`eD#FPM@01VPSplJK zwB1$ClGjTN%4=!#qqcQJ8v|LK##uC1t@DIssPzgjx;o&(2`I|ZWcqb99?y%Ln`m~u zz)P1Nn^`d&Mc5&r4$+H2t za#ce7A|%HrC!Yq1HOWylGo64TzSM{7KN;q_CkmB+$XZp8}_aJtkKeN$F>_LH4|5O5)v M%0M0ucrAN>0K;dO9RL6T literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nl/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nl/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..1898268fd --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/nl/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Dutch (https://www.transifex.com/sphinx-doc/teams/36659/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..2af56846afd125cca5f55d781cf1c0ed1a65ddd4 GIT binary patch literal 760 zcmZWn!EO^V5RDM0J#ywS99ku!-nBPvX|~yvwh1Vxp;59z;^=Ig#IUhfwwFy;z4Hb9 z4af2ud<(NlAs{S`JmY!uo;))@pFRE7!1Dy{IoeSj{B^qMGqe~jL6F9~jrLF%eAES` zT!GRhcY*XX<5H9Hu{rD9U0Ea2Vtz#Dgv9Yq}rrf zIU{Gp3L|+YE2)+%x6Xk1)MwsAkVRqpCGAj(Kr#_uWUc-`j)hwsMcfUyjwFUFn{lU21PL!i zb+l#0q*@kyi6VLSCm@O7>j=g=lXeBom27^KAkTu9H_i&fGxA28wT(dK+t9|x=crU?;--pY1{Xjff~GoPv=@hPcnG!IjgMQk zzkR1&7Q+4gHbHv~GZ(, 2019. +# +# Translators: +# Tawez, 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Tawez, 2019\n" +"Language-Team: Polish (https://www.transifex.com/sphinx-doc/teams/36659/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pl\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "Możesz teraz przetwarzać pliki JSON w %(outdir)s." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..0d9d19c4a2174e2eeeff4d1f3cce0cc445eadca5 GIT binary patch literal 514 zcmZWmO>Yx15G@j?J#ywSNE}+h>{mr;T!KiOEsB&aQ5v{Ao5{v#W3TMlCgp$d&p7wD zbhedR5F?E=&wieHeslNg55~`q##eT0j4=-A0f|Fe*7*Sq^S^bPB*5X{y#6vA9$(oraCY#ytbjy?7V`@ z@6#zNL zF2q-|@{ikA)G_TjX&Y_q8B`nX1M#rqHJ(26dR1%kSlG&~WD5#TmxiOSWXX%EV*jmz ObG@Vn@^~P-Ik*Q>Rhe-B literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..7037a6c3c --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Portuguese (https://www.transifex.com/sphinx-doc/teams/36659/pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt_BR/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt_BR/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..e9b30234d83a805c743f98f21e619610830bdfce GIT binary patch literal 802 zcmaJ<&2AGh5MF*xd*sYvE=Y;M`xhvUORF|bih>dvB~c|#$l3L73|@P&y-nH+Pr*wd zapDnp56-*-Hzr$1`M31RGtzwX^UZv|bNii#?-t@N;^D^m>5b5i5o1IL@fPv*hUb06 zpCUfo^t>+qU-0){=o(U{Ktib*hy!VnHl7f=O{HRIzlWggA(T*q`!B8%M^r5E<#! zg(Y)MVK6=#jt-Cd{pnyf^Czcsa%?zrn3eRI;}nu8?vf}W@ncA0nsn|*-6+C9GUexD zQ~l4lIBDV{j2kiQ$lNexC3D(Pn6jL42`AVpS6t$dPfVU~y~CnpLI$ZW4<0n7F@q{< zR$wQUd)b?AeKO~)q%gsm>Z0bBL#t=lrI2lCEuE_@4a3!H6}U}tk@NK?X?P_R$#fbz z|F03RIY7f#SGnTvk+T~>TI&RZf&J7u;RA;y<3cCy8{HG|3LFI8r7ZiGIfodf| v7Z>QA>GackV1+geDxL8kN5%|j3(UN!#W@, 2019. +# +# Translators: +# Rafael Fontenelle , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Rafael Fontenelle , 2019\n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sphinx-doc/teams/36659/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "Você agora pode processar arquivos pickle em %(outdir)s." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "Você agora pode processar os arquivos JSON em %(outdir)s." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt_PT/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt_PT/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..d445d83e204f12a4dedbb65e733e62e2ccbc2454 GIT binary patch literal 531 zcmZWmO>fgc5N#z+KK9IEkT@iQ@mEFLYzZQ5Tofq=D|NY|jWcl;IlI>Gnxy;>{vJ2} z2jfJdAVwN#X7}m6nKwVrp8YuCIOTlK`Lb{Riq~BK;!o_~3TwVn<#D#c&t#o4T7YXe zO7AP9y;VzeWR+~xcctr%-!_nhahL=PYK`@nyIQUArmG#6MnINNX7l%x>2#6Z-v`B~ z5^pU@ =o&=i^@C^ni;QH?|)-2ijFGcyM$CBh$K*7Uzbw`e1aI9rBgu%x9)`=+E?RKH> zb<~>nVP&?_(Gy&mD)P+WqVtQ3H>2o49u0${>8xz<&e*LJpxZ<1#_2U2%ke}M{OgOzJ_Wets_6~{2H&GaQ$FwvY6@0toSSfu9nIN XA4rpBm-!x#0&e7z8c4$tAM4~d@wcBx literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt_PT/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt_PT/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..3661945d3 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/pt_PT/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Portuguese (Portugal) (https://www.transifex.com/sphinx-doc/teams/36659/pt_PT/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: pt_PT\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ro/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ro/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..91df8415310a4692575c2c158f4ce781c66ebf37 GIT binary patch literal 553 zcmZWm(QeZ)6de*zdE}V~Be5wF+{8}BSUj@Ptr@D+K-CrA-PBEu5<9Y8+M)f%es4d* z3pd-e4PoiZ_t?kx`kr(9>gCNIt```uG2Zsz*?N!pAH0PAY--IM>9&12s8Oh_1*vHvGk5dkv9>}!`uq(8sUxQ zd>!i;& seg#KQy#D(uX`#@SS)y5-94(X&zDO-CYL6~madIXWvLR`lp@n;Y0bC=Ywg3PC literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ro/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ro/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..cb6939c32 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ro/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Romanian (https://www.transifex.com/sphinx-doc/teams/36659/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ru/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ru/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..0f690fb0bf33af9a309963ee330fba7df9b634af GIT binary patch literal 649 zcmZWnUvJYe5HE zEL>W)g0OVb-TC)Ny1QR5U;J$0dxr4}<8@Q~_1WGZB}Y$)SOsplql4_()r4*3t&F=nKzYHX&gyyt`_8~&MldhF(m0=H2yFc4yVcO ztvC5RBiBX>hpJ>KoQxr)EFv@{>^+1m4m)pYL@5HvRQ^zn`~Nr=?r;=wV__Yc8KG?< zTxnvs`7$2Er$L%P?;qlmiBwMu9>SvgnPI0!bIjqe&+wUk>w zE7!q(1Y}WWfkTcBI%j96QDEwz?M;f>h=SadW^H58)vmO>djb2DpXfJ?a?arR7@CwG zamL^hC?Fi`J`W$idc51DI|l8s5FQ@(ls@aWk;48^IH%3m4%g?W2YS?g>Z2~&JbLyx zDqKQ{0-d&(j?(0?U|gYhjq8;f$9Y%bkeuAQpelsY7m%%lvC{F{Ey?)-*UV=r4M}uX gF7Oy)IG-!$eUw@n+$~, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Russian (https://www.transifex.com/sphinx-doc/teams/36659/ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/si/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/si/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..ffc521e87e17ec32f75bb8bd005e3f3076d2453f GIT binary patch literal 511 zcmZWm+fExX5Cy4E`^a-2rcxh3?d%P4iD^(1vZ*3vAxhG|I~!-$)y7`g6B7C#d>B8_ zZ|N+Npoo!1nqwc&8K3!k^x^S<tCkzm)UZ8Uenk zwAmHbkkbqF%4u2aKiZTPt!qfaI81`6YOEv7eW{n&-;^HbRzQ~bM&s|j!C;!rX2Ilc zjyFz8;;uN5qy(gK(!n^z54r|Mp}>hF0;`pk=&Hk|n)<0XSE3EnuciC2I-C6;b0w6m7TLklMC-rFLOq*U{br zT-qWce&eIl^YgP#, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Sinhala (https://www.transifex.com/sphinx-doc/teams/36659/si/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: si\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sk/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sk/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..760921e9752f00470e3c2521cce3eda5bd09cc59 GIT binary patch literal 833 zcmah{%We}f6pet@ELpR-T~H+g&nqD`(@viWC@7&(5+Sj4CQf3;u}8Kik8b)E{RF-M zRxH?5{RFmr3wILKQXaz6k?*z7xmWhN-yc7^D&cyFc!H=E$uFyeae(L|s)$R(&Vy3v z6Yd4~8^(3qoua^dl|w=$NVSAatArT?cE;e%;QTF2xL^jjgr{Yd+cDP_hB4~9_+MVN*X0zWK44mHikeq2oEmkE>YFPxKA2f&`lHetTK@?V>`3>JkBI&aQ zFS`H93&IW0M_z{-ONN?CBdAq6f`OomRKbDZGG86z>4Hn;n)LAbrV|R}G^bN+Y|`6= z3>lplTD71llxNmvCi1-Ha_QQlHlMJSo2a?B{Rc8uiDyw_ylTDvqT!j;t2jN8YbwYq zrROFBnQc-N*Y;r>#%1&d0*GVqVRsi~5e0CB8Pb2dI*cLQk`7|1At|^e?G*YW2qUOg zoNl|@y0Zz5aL&*qCh=3&89vgomGv?~x!i|jMzvu!&h3Qk-SLVCPM9VwnW!;Z8o}O( zTjw>COrt~SI${Dsw}D2NhInxS^XtzyUzue%9GWKhb2lHsTz?rUz1~jb;@&9! LU-WY*@5_DwLALr` literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sk/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sk/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..ae3e78b15 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sk/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,34 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Slavko , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Slavko , 2019\n" +"Language-Team: Slovak (https://www.transifex.com/sphinx-doc/teams/36659/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "Teraz môžete spracovať súbory pickle v %(outdir)s." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "Teraz môžete spracovať súbory JSON v %(outdir)s." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..dfd9f8538a24d5203d7ef3ee55c17347f06bcef1 GIT binary patch literal 565 zcmZWm!EO^V5Dlmj(jGZ;m;*?yV0OKmQW}>nq|FvZ%0iR`?#{;97&-RJcA6CRH~M>g z3$u+NAVwN#p67X<2O>xg8B2S}GECn=mh!Con)MhXB2MJ3YSsVerP(8o5pN`Xz?l=qYZ0vD zaPxIEg3tZ3fcO7MUlP^S8&Q*_*M9)cq*!y9YI`e<5(bV}AvB&R$#%PqLpxY4cH#d1ck7f|8MV46Q8_G&gBf)0=$fpMhE~68XrUl?A!)Qw<^rmfa9)Od6P9>> n;I*49rNhEhc0tB*IG?K!eUe5x@_`(?<8USBQbQK^$j;6$Lh7Rj literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sl/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sl/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..f79a27a43 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sl/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Slovenian (https://www.transifex.com/sphinx-doc/teams/36659/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sphinxcontrib.serializinghtml.pot b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sphinxcontrib.serializinghtml.pot new file mode 100644 index 000000000..66fe449c7 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sphinxcontrib.serializinghtml.pot @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sq/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sq/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..0fda33247b97708b24ed539742ae3162c628b696 GIT binary patch literal 776 zcmah{OODe(5H+8bm#kS73#3HQ{)PF(Lq?NK0t!l)D2b3*cI=AN#O`*w+a$w=Q?TI* zv*ZYK0Zzb@b5KbT!&kKQR9)74uIg9y<=)*74xKxM`-CUkr`MDa64=e4RJ;S!`;L#b7Q#(-TQyqH|Pgt^GkfROO8rYf5XT{qr86{Sd) zIsRQU(&`N+mi1Hi3bheR#$d{YkeftFtHq2N)Pm>YosikW7CD4o;DzoOOQkIvnoOju zQ)PxtRSdmhyFWNWa5r4rtDlJxAa%mlq)6f}c?h-{2+ z#kTsNyfE7F0^$w0v23cjGQ$Iw9|#S%I>S`JTVyX=h2$}}&~ELNiQl+I2cQ{8AQ zms!O#YQwC4By5Vjh@qX&xD;e}ZDDO`V&7k{*Ph+h5_8;mi7NcPFDzAwZ%JhQ#^K>X z(>E)>?vC<@c4UXz>dIXR7zUUpehZx%P! zFLN&B2_y@y4cb;^=j`}~x9w_qV6U&ByuQ+9B^7;Ja&3{^+^?0zUl!{Bs_(1yo9-Ly9r0WM literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sq/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sq/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..c89446768 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sq/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,34 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Besnik Bleta , 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Besnik Bleta , 2020\n" +"Language-Team: Albanian (https://www.transifex.com/sphinx-doc/teams/36659/sq/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sq\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "Tani mund të përpunoni kartelat pickle te %(outdir)s." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "Tani mund të përpunoni kartelat JSON te %(outdir)s." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..39e428b828c72932fee6168574ce0ef36493f4fc GIT binary patch literal 585 zcmZWm!EO^V5Dkda9=XC{kf3S=vukglG;X$#Hd_=a3sDldI~yl4+Sn`GAt~x_@Oyj< zvx%S}MjC0J{oagb-p|L6ezYhaP(G!6-hjX271d83wp!S{jh+3f%7DWKeo@YAYXtau ztp!%I9-QOdyyo&-7XGITfJ2KxU`$( zcmiD5G6|&dN$2eBO*io_X-DH~>tuyD)@{51Qy-wuIu~#(vs3eevn=Cqaso}so@JcF zJ77R`!k1b4`>U6|Zpwp#^*DpOyQ73StW6qDnzS7i!y>;oh%AV%$sT3s9Je(s8Pq-` zbtSdAfO0LJS0USmC7$2&n*El_VQxyhATtG=&vl4CD5D&CLoVJ5xRP^KK^k|-;?^&C Cd8SDK literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..f2621c80c --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Serbian (https://www.transifex.com/sphinx-doc/teams/36659/sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sr\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr@latin/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr@latin/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..dedddb3953e16aabe13f8b7cb1c2181ef0d8d72b GIT binary patch literal 605 zcmZXRQE$^Q5XTGRDUUq!a7bfn1y1Y~#_Ba=-I`665~$k3yPLYHr__#Ymv(4hgRjSD z*`?Js5SA?6oqzv3o&SGczxv(6^8)W1yhly)*ZF{P^s?0=O>Jz=tt>nlEyxdPoidt( zt5-_z3ZuPMbK;~`qEf$B!7*Nb|ucyBG|IlXN-_ z#@}Y-%1Ys}D;WweImDFp2#pE*3^C(z_dV@ViXfTDpQ@SuKgZ%dN0G~f^JHd)c9rnP za=8AUW$<;7r_ldr^f{us+=voKI(vb%(oZEalVZ(bD(zee4ehLX?Ld3weeHM@ZMWOd zH$&7??!v;Xqr-=gg()JBS{HRsPCoUb$IekF7*`uBDspY?+HuhJK6Od=3=Uz^*6$ci z5(dY|(1i4D!Weu33W#HVp2Uw&{p4d4?iIApDBRy4B*@SXY8YzbPLPlC^w~7DCAdP% zq{c70t8sBJcRs2sq4XIPD`B1V$;L0q=`+`Cxs;Zqx-bhgn8WE@`QS!sY0)oq_Kw4) Nn9B;{u!pv{9snrjt#$wa literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr@latin/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr@latin/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..ded0ae975 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr@latin/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Serbian (Latin) (https://www.transifex.com/sphinx-doc/teams/36659/sr@latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sr@latin\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr_RS/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sr_RS/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..8ac464d5f91809a861528f5bd283fcd00ceb76b8 GIT binary patch literal 600 zcmZWm!EO^V5DloOJ#ywSNKhpO@7fz^8#h}>n{5>-3sI8xikywJaka5mwnNgYzrpYE zEzBmO1u@b{Z|wJGH1mGFI{4YZc!BvE^KD)H6(0~Ey=*i{{Wh}ZPUfBr=Hymdr;O&{ zs-@D~+-Psrj5ukPDAj|~#nP`zU?B}zFqW0Eo@B02b8@jR9GMypY1SJIzx4Y3aXOg< zqi<7kX{GSkmGp&|9Ae5kgvNxOK+JgDeos4;B9V;c4^>b9pU2`Ik0Ngq*O0nWFk#?qphUOl$pt, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Serbian (Serbia) (https://www.transifex.com/sphinx-doc/teams/36659/sr_RS/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sr_RS\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sv/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sv/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..1421df244bd6ba6f7a85cc94a2684ee515e6a27b GIT binary patch literal 511 zcmZWm+fExX5Cy4E`^a-228jnyJ9|T=#5AaZEGSa8L`m9rXLqt|w6RyVbAkWphxG^g zEu96afEa0{Irj0K@tMB|AAav~>~ntPJnF!!_{{YmzQpcqV$D4j9!DkqBI}gV0$f`w zy(^6NRxQwxRkBf!N>{aCHIRgHm;_U5jrEwjN|kuEt{l#dfGi)3#@`3S;WV4gg2~++ zuPsT>U2!Nq2}t9lhjEI@S4b0)o_>mZam+-V(nfXa?|Di3#EY3Xmd@kcO6?lyjTLb7 zb3BG0gFJ(8Z=^4os;jlESki6&1Dumw37BoERIY~O+WXdtDB5nfq3_zNCGEn(tfFTN zurx*F`HhQC&(6N|BDaZ7f=RQsvcVf;S5AO#pP=if7w}y6k2M_jAvp>1QJ%fn%EkrP zY$|E~#6!!YdD{7?ZKTo{P}I^o^8K}6;`s}&n`%iGGhLXHS0Lbgp?q*lnk+lY-aiPq Nk_&1e4ST$py?;9um>d8A literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sv/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sv/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..903c734b5 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/sv/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Swedish (https://www.transifex.com/sphinx-doc/teams/36659/sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ta/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ta/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..be3a9d28d81551d109a6684f4ea4cf48d4902175 GIT binary patch literal 509 zcmZWm+fExX5Cw^+edM_hQ>hQ2cJ>x=iD?jlELEf|jl#C?&c@le+O=2qgoOS_zpH=1 zw=hd2DC$Tf&9RT?jL$qB9{kzk*ysGf`Kbf{#22pr@+Ed>Q)hpvl5o7hpUQb{jR4=S zwAq%{kkfPY%4u2a-`Z3wYHCQrI81_>YON#8eWe$8y{#9eVDNeM{fq>pim$r+@HNPC~-ejGCqXX-(B>i_eS^o18QZz4Tm;iU1kB, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Tamil (https://www.transifex.com/sphinx-doc/teams/36659/ta/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/te/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/te/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..1b163d2395760c5929a9246422450cd898cb3c34 GIT binary patch literal 510 zcmZWm+fExX5Cy4E`^a-22B{CAcJ_w2#57d{S*l1`h{D3VvvD@AHulP%C4v9ozxaZF zOJ{=wtr%&fIrj0K@tHq+pPqL(b~!(De(AtJ@r~;jzQpcq;_Po#5{~A0ubkJ`2=L8P zn@wpAIXy$KoR+nI(xzI{s)i(t!z7rh#yY~>S9*>YZRN4B0tnK%wfkYT;l>)OZm^>-9RMuB%?CO<3Ah^y&c4 zZ5a_i@zK%A$#IYC=rEYnt&=rgS-0{6OtXc)pPs{O**`F_--qNd$VYkh?kf8hT(YOi z@E;zV?PME@np$de4&_ohuc+VB0?*!g-Bb(ZFf*l{^9BT*%`^qSlu?ciW$PaWT*#TK KAq{)Hmz}?T^Ou?c literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/te/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/te/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..3fed43040 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/te/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,30 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Telugu (https://www.transifex.com/sphinx-doc/teams/36659/te/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/tr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/tr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..57819c2fa4806741bfecb0f3f06a321f9d62f41a GIT binary patch literal 762 zcmah{OK%e~5MCaq9658C3sNHRz5=D$DwMPdC@7&(5+QMPcAe}H$6nc9lJvr_;LMS8 z#DzQIZ}3}~Z7W)dm!(hRk-r(wd^11p-Tmm%xkI>5cw9L*&VcR_VMu5aJ`nb|JnswH zW5VXP=XJ<_CF{M_C8S(|(rYM;PKCALasjU+ zHq{CAhMoT4d8gYQ_a>9t=xoYPjo^;5vMzTbfjEp>ER0$76yhj}n-9ZQ7!r|<#e1xN z|D6}b7rc;o18yCg8m_G5PMZWybUD`P@)6~Yt7o++`GUT2=9j~!g0B*omS%}IhkEW@ zVUr+Ouh+h-QsG=|{8X=k%eGmj)4)-T4VniBPg;R9L8CU3rQwpj&}L;5P{oC7+wl=x zUfXpA&md~lhW%mhT1nEXc1k)5MRjkBsxq;0K_NM+BS>>@tZ?np&Dr5KuPSOT4C|>> zXQX-phck4wmqH0cB9h!&>YUGngxGJg Y{z;0hn4v_Px59J(AMsbK^WO|V0V>S#uK)l5 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/tr/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/tr/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..1de9d832c --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/tr/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,34 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# BouRock, 2020 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: BouRock, 2020\n" +"Language-Team: Turkish (https://www.transifex.com/sphinx-doc/teams/36659/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "Artık %(outdir)s içinde pickle dosyalarını işleyebilirsiniz." + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "Artık %(outdir)s içinde JSON dosyalarını işleyebilirsiniz." diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/uk_UA/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/uk_UA/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..6d78765c690306b48cf0b01da180982cf3343c15 GIT binary patch literal 751 zcmZuv(Qeu>6lGJN^0?2{MClgF?8=S~CgHHX8eb9bn z-?AI%N~_M2rF)Wd&$+rje_kE@s^EEn_ch)(C3tk+WBvPOr9#SYLz7?2#F5^Ne3Qni zTywC+Lg`JCYiHDySZS2V)K8_;glK^K}&tXoLc=}M$%xw`p2X+K~xmSV|aa$|(jN@%F=O6fy&;ap*P z5Ukhhnk!w@TyAPfz6^F7A+tOQ9QNCwesXdg1zYLB_lDWZh>Tq3W@$O-Vhe5DID=go zS2er^25}4&j*ei9XbIUKQaD7+;3INS, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Ukrainian (Ukraine) (https://www.transifex.com/sphinx-doc/teams/36659/uk_UA/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: uk_UA\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ur/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/ur/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..f7ce23f7f24c4078eb12ec767ff7cfcd6b198d1b GIT binary patch literal 508 zcmZWmO-~y!5Cy5HJ@(wgAoT!hXTKsSF%4=U3yPF2Q3%|fU1#HJW3TL468Indt^S1m z7G{Z5iaOFr^X%t&GtYlMet6#F*ysGj`MCrC#8<9=^Cfm?Q)hpvf^b~oy>eb#BfvK+ zZMKCql%_U4wGP}8tVviU+EGr+REeH3dr)|c=BU78qKoX+hBS# z$4jRqaaSBkQUcOA>0_K?@(t2Nq`fb3KaQD*GxeZ5_5XQE`pS!$H<6xj?xgXxB~ikez#a|XpqIS>, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Urdu (https://www.transifex.com/sphinx-doc/teams/36659/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/vi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/vi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..c123b430b1346065240a388ac96b3a9b859fe384 GIT binary patch literal 507 zcmZXR%}yIJ5XY&+X^%bk;6o3fcJ>Puh-nakY^q3Eh(gHS*-SRBcI}lt`RaT0vHA*q z7G{YAMIC9R8T&sU{`v36?_BA_!8Q)v9mw1AQ&!ShR$nir0~s3 zn_XcIIXwrDPOD1)(xzNdU5O-&!z7qsV;w>6OTB>Gb?IShrO5K$aCFn__b1uoV=#W0 z!kt4!+!gwYP>M88IuNIjT!=K0>DiaK6UQus32t;d{eNAOzUX4sjg%*tI%RyN$T}$o zPot5z@8y~J{%-U&OHH{}C6C zpa2V7M8su2Iy*oA)`>PcIt|9v+NlZ#*417L)4Zg, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Vietnamese (https://www.transifex.com/sphinx-doc/teams/36659/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/zh_CN/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/zh_CN/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..da8bd8ca7b29151f82e27dbd97f3a09c77e24a5a GIT binary patch literal 784 zcma)4&ubGw6kdOv_UPHeT!aLj{S~dABBkEc ziyn#x4+>sHK@hR{UwHOn()=5~Y`|7jaNy&;2k(3D&G+8-3+JC3@Xi4)0HVb)HTCy%yR5B8?J;n!-9>&PE z9LqIZG!atch8nOQ-be=ucSL}yjrCf6ZM{-yRoiW|xz)jCNr{H4xI#1ykmtBQc0BA} zN1hvah0BibIFN{2beAo<|C#4{S)K!Vb)q!xNWxW2w2%SXW}JaUWtbP;m}G(L``%j2 zcBvJL;ms>qMiP0^1&qMwVXmV|_Ya z6ttJx;GPI=4P0dxR#vY0c2?HTo6R_tB*wRd9I62EBnwr^Euy7ca?D1pQ9aQb)HKVW zH0AKKNdgmUI@Wd)6UK`ujEGcJmr~uwt0#GjiTYIHDi1{u_7b4gF4N|1%BcjIVIh+M zZICXFk!Sg^Eo1ui)%?ka*~_=Hr|+jnZ)UIe=g$sK9S@p*em6hdUmn--i^tQWPtz|4 QKOR2%Z)S6OWWRBL0$$k)PXGV_ literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/zh_CN/LC_MESSAGES/sphinxcontrib.serializinghtml.po b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/zh_CN/LC_MESSAGES/sphinxcontrib.serializinghtml.po new file mode 100644 index 000000000..64481553c --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/zh_CN/LC_MESSAGES/sphinxcontrib.serializinghtml.po @@ -0,0 +1,34 @@ +# Translations template for sphinxcontrib-serializinghtml. +# Copyright (C) 2019 ORGANIZATION +# This file is distributed under the same license as the +# sphinxcontrib-serializinghtml project. +# FIRST AUTHOR , 2019. +# +# Translators: +# Yinian Chin , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Last-Translator: Yinian Chin , 2019\n" +"Language-Team: Chinese (China) (https://www.transifex.com/sphinx-doc/teams/36659/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "你现在可以处理 %(outdir)s 中的 Pickle 文件了。" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "你现在可以处理 %(outdir)s 中的 JSON 文件了。" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/zh_TW/LC_MESSAGES/sphinxcontrib.serializinghtml.mo b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/locales/zh_TW/LC_MESSAGES/sphinxcontrib.serializinghtml.mo new file mode 100644 index 0000000000000000000000000000000000000000..3588d0de0bbf25b07ed76e3281d7e00d94351a65 GIT binary patch literal 519 zcmZWmO-~y^45d;}d+eEm4?Td2_X|PEK&pmhL6NdF3fuNrO*YQ%RGXRA%!CB~M}Hg_ zehc0p6{=dYWY0YN+0RcO-v8NSd&j=d{;^Bm*b&E%{E6M$)SBN^dK@qC2U(|#7U0@i z>1}DWw`z`#tdfm-P`ax9s(~bo!z7qdYploIRce8k>&jta1Z4SOJo!2pjb_>HZ7}^- z;Lwuv+!aUClYlf%dKjmee1G7wy7sm|58QrOl{eN7N?r<^VCenEW0*1UHIf8>is*Ti#a8P^SIuS*i%_j66 zg<8@!EX^u, 2019. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: sphinxcontrib-serializinghtml 1.0.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2019-02-17 21:23+0900\n" +"PO-Revision-Date: 2019-02-17 12:23+0000\n" +"Language-Team: Chinese (Taiwan) (https://www.transifex.com/sphinx-doc/teams/36659/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: sphinxcontrib/serializinghtml/__init__.py:137 +#, python-format +msgid "You can now process the pickle files in %(outdir)s." +msgstr "" + +#: sphinxcontrib/serializinghtml/__init__.py:154 +#, python-format +msgid "You can now process the JSON files in %(outdir)s." +msgstr "" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/py.typed b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib/serializinghtml/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/INSTALLER b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/METADATA b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/METADATA new file mode 100644 index 000000000..4f0e9f907 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/METADATA @@ -0,0 +1,64 @@ +Metadata-Version: 2.1 +Name: sphinxcontrib-applehelp +Version: 2.0.0 +Summary: sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +Author-email: Georg Brandl +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Education +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Framework :: Sphinx +Classifier: Framework :: Sphinx :: Extension +Classifier: Topic :: Documentation +Classifier: Topic :: Documentation :: Sphinx +Classifier: Topic :: Text Processing +Classifier: Topic :: Utilities +Requires-Dist: ruff==0.5.5 ; extra == "lint" +Requires-Dist: mypy ; extra == "lint" +Requires-Dist: types-docutils ; extra == "lint" +Requires-Dist: Sphinx>=5 ; extra == "standalone" +Requires-Dist: pytest ; extra == "test" +Project-URL: Changelog, https://github.com/sphinx-doc/sphinxcontrib-applehelp/blob/master/CHANGES.rst +Project-URL: Code, https://github.com/sphinx-doc/sphinxcontrib-applehelp/ +Project-URL: Download, https://pypi.org/project/sphinxcontrib-applehelp/ +Project-URL: Homepage, https://www.sphinx-doc.org/ +Project-URL: Issue tracker, https://github.com/sphinx-doc/sphinx/issues/ +Provides-Extra: lint +Provides-Extra: standalone +Provides-Extra: test + +======================= +sphinxcontrib-applehelp +======================= + +sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books. + +For more details, please visit http://www.sphinx-doc.org/. + +Installing +========== + +Install from PyPI:: + + pip install -U sphinxcontrib-applehelp + +Contributing +============ + +See `CONTRIBUTING.rst`__ + +.. __: https://github.com/sphinx-doc/sphinx/blob/master/CONTRIBUTING.rst + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/RECORD b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/RECORD new file mode 100644 index 000000000..39ae0241a --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/RECORD @@ -0,0 +1,110 @@ +sphinxcontrib/applehelp/__init__.py,sha256=1vzKvo_kxyqoQWaOhE_v9kYGVp4BKa1-fIhBD1PL6oM,10943 +sphinxcontrib/applehelp/__pycache__/__init__.cpython-312.pyc,, +sphinxcontrib/applehelp/locales/.tx/config,sha256=hRyYXe_G36veTNocj6tjS9gk74v5hFQQnOTUmzGjeQw,227 +sphinxcontrib/applehelp/locales/ar/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=DEl3JiWDwR8MIipbaD2o7YRD5alr0Vtj5urW4FGAtcc,1881 +sphinxcontrib/applehelp/locales/ar/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=AkDuvYG8gnvryQ1HqxLdvjZqKWF5qAUU-GL6u063fnw,2338 +sphinxcontrib/applehelp/locales/bn/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=zTaPZKfWBBG4yekQj9rZkSNVKMk2KLNckTp6G-GDDjA,1799 +sphinxcontrib/applehelp/locales/bn/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=G8pa7WlULmPUQX6ghBwuLoXAOrUnyEH8Kk7_VERPB4I,2256 +sphinxcontrib/applehelp/locales/ca/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=YFqty_u1U9x6WZfsefd8-f7Kd5BN8SsR5w0hzJJhIcA,1799 +sphinxcontrib/applehelp/locales/ca/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=Z_BQUJND_D7o_n18l6NNgkROqbetgsx7oKteTxUNFig,2256 +sphinxcontrib/applehelp/locales/cak/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=BwyiO27HivbHk1fcAykAWTAlbcSqLe71WxRHmgIvgms,1761 +sphinxcontrib/applehelp/locales/cak/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=AGiKvlrPP_ZzwhgqZT_PLurXb03bFuuhi5C7cyZC0BA,2260 +sphinxcontrib/applehelp/locales/cs/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=cwCc-ZrXF3AMDEayg3cB24X0U5DsZzaUEwezYDw2Pqo,1877 +sphinxcontrib/applehelp/locales/cs/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=HyrR5gq2Lu94hPVBul3ikuPSF7Q5Ok6CLBdc0AuQbpM,2334 +sphinxcontrib/applehelp/locales/cy/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=6gz7jJ9wkde9YrVoDlIhs5G6fWPe1QIiLuH5rnDk1Cw,1842 +sphinxcontrib/applehelp/locales/cy/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=Q04r_fhCabRcMFwaX2ivlqADfH6FLWQAMVdXeIRcrI0,2299 +sphinxcontrib/applehelp/locales/da/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=tbbHYhIOv4AtxTmuKfJV1wKR-9Hd3gr9cxxXTFfXaQc,1798 +sphinxcontrib/applehelp/locales/da/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=aX1O-iePNqqkfcK2yHBpMDhRBksElNxcAIZ4Fl5wavg,2255 +sphinxcontrib/applehelp/locales/de/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=4JyUp59q1u7OPs7XiuWS9rt01pjnR_ANR1n8V0ZYz_8,1798 +sphinxcontrib/applehelp/locales/de/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=p1N7l8OTvKXEFx7l2yC32NKCIxKS-woWk9WJY8vHnm4,2255 +sphinxcontrib/applehelp/locales/el/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=9fpYE0rt4eNBMwQBE5JeE0JFkKEMQ4FNt9kwUTs6DZI,1797 +sphinxcontrib/applehelp/locales/el/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=YVt5MqHHnBm394g7iSdWbMD5WGj5H-zQs2m4E1kK8f4,2254 +sphinxcontrib/applehelp/locales/eo/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=lo7o7RX1ROFZ_stfZTf6-EHq4Y8VFqaVQRjJuwSBoFM,1801 +sphinxcontrib/applehelp/locales/eo/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=ka_bOam5usP2GAofSpLi5sYvtVoFTU1NS5TJsV9BHBI,2258 +sphinxcontrib/applehelp/locales/es/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=DUlmczLIxDN8XwW1qJ0qJqrXhk0rSkOS206CnQWEeWg,1825 +sphinxcontrib/applehelp/locales/es/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=Vef7AT_t3lkSY78YSQ6lod3rDzEzwNkqIa89u7qVhgY,2445 +sphinxcontrib/applehelp/locales/et/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=5Vq4chke8S96OadJDbOBn9o76EEWq1tJP5AoyeS4848,1827 +sphinxcontrib/applehelp/locales/et/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=Mj7B_cj4YJm_ElKuFCi4nQfo8wnOhQbst3R_788tEjY,2450 +sphinxcontrib/applehelp/locales/eu/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=xzW9ibYWFhN_0kcj1YopTK4C6hQ01Rfc5ZwIz0KASGE,1798 +sphinxcontrib/applehelp/locales/eu/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=ulAdmnpqeLSE45P6FIPEWCziJUCCxLFM0aFLA6-1tk4,2255 +sphinxcontrib/applehelp/locales/fa/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=oe3uwVDDjbnAQVpN3SaaV6ua8ryjsj3r5EUaUB5_l4U,1798 +sphinxcontrib/applehelp/locales/fa/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=x7myQ6uGiRJQALnFUHS0w7GqIofvUv0keNM8s7nzLLQ,2255 +sphinxcontrib/applehelp/locales/fi/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=mOoOsbcUeV1pctl6Qxo1DdlWqnuCoHNg8qNNb7XnPnY,1799 +sphinxcontrib/applehelp/locales/fi/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=isLFivhXt0tcY9Y5GYzw5EUMXFzy-PqTAtm_XNvC-JE,2256 +sphinxcontrib/applehelp/locales/fr/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=2TVhlGZUTVkLiO5qjxTJ-ZrwdWZJUdc3CNQS-MhJ7RI,1910 +sphinxcontrib/applehelp/locales/fr/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=RQ8-CMn0zM0R5kXq_AGHQtPEy0GO1qDrPX7T6--J-ZQ,2879 +sphinxcontrib/applehelp/locales/he/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=0hoKnoR-EkwyXvS9lTdFQ4-I6Yt_JUi2NUA1_yvS6tc,1892 +sphinxcontrib/applehelp/locales/he/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=oAQFbNRtCdnyf5cHZnhIhQM5lEyHcg-bvwBDNCOs8as,2349 +sphinxcontrib/applehelp/locales/hi/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=bZ7stnR2N3fYj1sA7279twwsqAYriYj0-q7REWoU30Q,1797 +sphinxcontrib/applehelp/locales/hi/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=vNcX959lUtxb1yotmRLpqlfoIUs4j4KE8U-rGDwUMdY,2254 +sphinxcontrib/applehelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=fdKXcNWsyvAGRBNHHkbb6J-jY_dqZLREyIMyFnem204,1811 +sphinxcontrib/applehelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=z_6vNlbWrLMGD_QUSTW-G5bpdqtpQAhfQWNDtVcN7mQ,2268 +sphinxcontrib/applehelp/locales/hr/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=pPhuwrk_9QUve2-BotsWY0yEOSEpM_YC9NltsLI6wHc,1872 +sphinxcontrib/applehelp/locales/hr/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=i2r9cS-PgaOzBi2vXFH7L16FeBVdhn6TVIrtLI_6IsE,2329 +sphinxcontrib/applehelp/locales/hu/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=XBIGOk48h7Y8JO0fIhD9ozcbZ9JEJw4xqDCXTM4PKDI,1801 +sphinxcontrib/applehelp/locales/hu/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=1NmmMY5nUT994REYeXQE7gZktMzHMa65uyaVtiMV-E8,2258 +sphinxcontrib/applehelp/locales/id/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=av_9MHdTqdFvukBVZiDIho8Gu4ytmJW-FNLR7n4aljU,1856 +sphinxcontrib/applehelp/locales/id/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=P51kBzPcagoh4bWoZXWdueJiS1ZBpnzhsX_Kr6KEijc,2850 +sphinxcontrib/applehelp/locales/it/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=26j2Auv6_7tMQRqiPbd2ENIl_rch39K_3Rl-VrJEIEg,1799 +sphinxcontrib/applehelp/locales/it/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=oJm-LJLOwbbLogS4Dmtsec5uRIVcIwu9-5qRwAqesQw,2256 +sphinxcontrib/applehelp/locales/ja/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=K7BcIlpU8e6MTB2mlQGzx61AaqkVRNb-d2u0ceoBml0,1793 +sphinxcontrib/applehelp/locales/ja/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=ZER6Je6op1vFmQASYbSqfLSkvN61SiEz2Kil85GKoFc,2250 +sphinxcontrib/applehelp/locales/ko/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=9o7Fy6Le-_etArcP_aCFtb7SFyMfncCQ-csVmFfJXGY,1992 +sphinxcontrib/applehelp/locales/ko/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=Jnx9sJFkrEnlhZfVvK0PfG51m-bbKH28lp30paDciwU,3071 +sphinxcontrib/applehelp/locales/lt/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=U6icS7yEvMv3c-6FwBcmZSt82OSUCXJdE93H8ihY6d0,1933 +sphinxcontrib/applehelp/locales/lt/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=fDTN_m5h_rpnhkXce9kZJGBvoImt8DsBv3XyMUu7644,2390 +sphinxcontrib/applehelp/locales/lv/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=vK0t6v46IBC6c116860yaotzlffQPcujg02x_fz60eI,1834 +sphinxcontrib/applehelp/locales/lv/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=UdFj0HlcVHqo5yfsd9q3NFK6j2Kwsqg9Bp386_1teKI,2291 +sphinxcontrib/applehelp/locales/mk/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=583RssFdvkgdNtof2jQNSEGJA8deUs_-9YXxoOdlUB8,1832 +sphinxcontrib/applehelp/locales/mk/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=o-kpnZ53KGN3hxOhMXSbg8Nngj0Ry6Q42EPQB7TTD5g,2289 +sphinxcontrib/applehelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=xmCOcLcorRBU_Hld_KLNGO19Gq1233AXX7b859JS5DM,1824 +sphinxcontrib/applehelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=DVydbtrYEamGVZ4nsPd7aGjjcM4cLB4rEKsFXSQ4Wxk,2281 +sphinxcontrib/applehelp/locales/ne/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=bsBw2AcF2haWyJajNx92y38SaEblg2x01w8RwYn_G7A,1798 +sphinxcontrib/applehelp/locales/ne/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=zeSGriBQ3ThJY98aRpnitohYaFBKKUz9sdefx2PEfkA,2255 +sphinxcontrib/applehelp/locales/nl/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=nYVtQ-kzq97c7Gz6JLdaYyKwsuMYkz1_RwGMBWcO1Q0,1797 +sphinxcontrib/applehelp/locales/nl/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=9pV6B8FCnb7FEjCEMrK912cYSq66gVHYxDdkmJsH5iM,2254 +sphinxcontrib/applehelp/locales/pl/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=GcvjQN46shQ-frK47WmS9lk1bw1QvU-ZupzsQ8_aCz8,1966 +sphinxcontrib/applehelp/locales/pl/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=L_EMMCSKq8XmSRyy1hEAiNC7urlALMecCYPQpsY5wX0,2579 +sphinxcontrib/applehelp/locales/pt/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=g1VsNu-LNxlnTCcous8pcPsBakym9_fi1BdEocHGR-c,1802 +sphinxcontrib/applehelp/locales/pt/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=itNxikIrrZYDU_OoNy1u0CGv4nuZ1HAWmGFb8p0VljU,2259 +sphinxcontrib/applehelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=kNEL4-htmcDnBPok-4ajgjVfOQl0kQv7uvq1GfxXxT0,1816 +sphinxcontrib/applehelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=95A-Os2wnaGVZEh_m6vkGEJKz3N34EcJekMuShzyU-Q,2273 +sphinxcontrib/applehelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=Rz8diZ4zM-_htm_bMgfVCrTPiJbJ94MEtXrf9SvjwDQ,1819 +sphinxcontrib/applehelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=iCw_c9TgBQ4WeE3sT9gmQUpl1_5K4Xa2KPAlYMMToDo,2276 +sphinxcontrib/applehelp/locales/ro/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=vzhGlG_JprXp1jbs4mM3Fs0qf3jYr3N4YyAv2DXRpWE,1841 +sphinxcontrib/applehelp/locales/ro/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=aXznydFjOyrRSvgXbIAUm-mOj1UgmbW72jJYRzt3r-Y,2298 +sphinxcontrib/applehelp/locales/ru/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=u7aZBU22hpK0PI7QmPX_CMx7ZTDYRIv9TsK6tmhg3zM,1937 +sphinxcontrib/applehelp/locales/ru/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=jdtJEp-QqVa1TkwvWDq1ytxQ7ExWYw2ZRtSVfbTArSQ,2394 +sphinxcontrib/applehelp/locales/si/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=7spWKWGdHAbKL3nTVx6AmJ778IdhuBp0g7oGj3HxdSg,1799 +sphinxcontrib/applehelp/locales/si/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=c5vzexiHSoa6hlkDsNhiaoodBVV5WHblcY1ct2CT52s,2256 +sphinxcontrib/applehelp/locales/sk/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=u9Mz8W2qCPMZmnzTmSq2GQf0l6Dr4IhzohgJI-o70Sg,1873 +sphinxcontrib/applehelp/locales/sk/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=bIjVOY77uQZvo8cSZWUmlWVwf8W9kFqiKoDJI3A_juI,2330 +sphinxcontrib/applehelp/locales/sl/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=0tzQrKarPC6oE5kv8imlObS8O-voTmsDuwzFCvhgJrI,1853 +sphinxcontrib/applehelp/locales/sl/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=dn1jPH_Y40hTjUAibJK4gYiD1d_4nwwTPPsnYhOqFzQ,2310 +sphinxcontrib/applehelp/locales/sphinxcontrib.applehelp.pot,sha256=29GcZ6-QFUP6tV9j4lRMxTirR_1Sc3R_Tnqu00nPnU0,2200 +sphinxcontrib/applehelp/locales/sr/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=vkL2WAD5Q1kB30H7jtNz0OHhfKAy1RY0sP4OH5Jin0Q,1873 +sphinxcontrib/applehelp/locales/sr/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=YCAdmeiyKvG81TDh9n2ioKYjHw4dfdn9ouvaoZqvQVw,2330 +sphinxcontrib/applehelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=0ek_3Hb9IPyl5piRb3LvWjn_OdpR2iDrOHDGPoSfrWU,1895 +sphinxcontrib/applehelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=0lP-xM-bfaZszvfrt_OXwOv7L43z6Oh5enp8txLK5aQ,2352 +sphinxcontrib/applehelp/locales/sv/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=uiOziLyZKzlgSj7OGtpfs7kSwp2B7BC4-eKjzF05wgk,1799 +sphinxcontrib/applehelp/locales/sv/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=IgrWjSqFL9Y0iJbX9zOuFvdiimh4wfnB5ssDib3jyqM,2256 +sphinxcontrib/applehelp/locales/ta/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=hJ8SLDTJqoHHNDsl9XWpP45AmjXcYSfTyNZU69aGR6I,1797 +sphinxcontrib/applehelp/locales/ta/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=5O8YxGSIaSMm2UBgZ0eZ-BDTFQfL16eBMCu86TAXiX8,2254 +sphinxcontrib/applehelp/locales/tr/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=c84m3W3iXueJHHwK8FMSg94AoIzA6AleXurGCuGGow4,1798 +sphinxcontrib/applehelp/locales/tr/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=co78S0Z9Vf4QnOQNcPNNwok5r8m1PIE7oUvcC79apso,2255 +sphinxcontrib/applehelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=kkn-uWDYXD-1W-ktOro1T7FoVGvUhTlt1DUUmX21Ono,2039 +sphinxcontrib/applehelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=_164l_FYW7xQuIzuspDwjnh53BVEVyzfoyBcO5Gq7IM,2496 +sphinxcontrib/applehelp/locales/ur/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=wTZi0RSQt7eSOd1ieJjMVfGuT0pH_DspJNEDz0zQEa0,1796 +sphinxcontrib/applehelp/locales/ur/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=O2mQcEts5U4EHsSluQ2WTMFu-hdG7gSA-Yk-j4OMND4,2253 +sphinxcontrib/applehelp/locales/vi/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=9B4bAdTBkqy906WeX0kZI7suIhZF5Myjq-0vT3yPdT0,1795 +sphinxcontrib/applehelp/locales/vi/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=MXho2NWDk7hGnmfWgikBZGYGlx1Jj3BE8uZd9pqn0Iw,2252 +sphinxcontrib/applehelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=4Y9qvOYcKkALMnE9wG1PMvUMxc50Zrn113prYNh1bNI,1817 +sphinxcontrib/applehelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=0TvSyXPTwUDIYqGSj9f5s7YLdT2JEd1zNDuPmjGF6NY,2824 +sphinxcontrib/applehelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.applehelp.mo,sha256=9qCoC8y7YW8VPM59gwLSDlapRDhgebLPoXPXrJ4m5mY,1807 +sphinxcontrib/applehelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.applehelp.po,sha256=5QEUNTMTMCqSIq9IacCU9lUVEAf7ExA5S9plkugWBHI,2264 +sphinxcontrib/applehelp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sphinxcontrib/applehelp/templates/_access.html_t,sha256=voNxJrkimxIU-egMCckarvMrRQ5GDoWoOvNdMIN6x0U,403 +sphinxcontrib_applehelp-2.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +sphinxcontrib_applehelp-2.0.0.dist-info/METADATA,sha256=5VBpN6VhUKAgKpLC_r_RVvk6HlTkHvwNumVCn2gfZ9o,2293 +sphinxcontrib_applehelp-2.0.0.dist-info/RECORD,, +sphinxcontrib_applehelp-2.0.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/WHEEL b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/WHEEL new file mode 100644 index 000000000..3b5e64b5e --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_applehelp-2.0.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/INSTALLER b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/METADATA b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/METADATA new file mode 100644 index 000000000..617aeae99 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/METADATA @@ -0,0 +1,66 @@ +Metadata-Version: 2.1 +Name: sphinxcontrib-devhelp +Version: 2.0.0 +Summary: sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +Author-email: Georg Brandl +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Education +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Framework :: Sphinx +Classifier: Framework :: Sphinx :: Extension +Classifier: Topic :: Documentation +Classifier: Topic :: Documentation :: Sphinx +Classifier: Topic :: Text Processing +Classifier: Topic :: Utilities +Requires-Dist: ruff==0.5.5 ; extra == "lint" +Requires-Dist: mypy ; extra == "lint" +Requires-Dist: types-docutils ; extra == "lint" +Requires-Dist: Sphinx>=5 ; extra == "standalone" +Requires-Dist: pytest ; extra == "test" +Project-URL: Changelog, https://github.com/sphinx-doc/sphinxcontrib-devhelp/blob/master/CHANGES.rst +Project-URL: Code, https://github.com/sphinx-doc/sphinxcontrib-devhelp/ +Project-URL: Download, https://pypi.org/project/sphinxcontrib-devhelp/ +Project-URL: Homepage, https://www.sphinx-doc.org/ +Project-URL: Issue tracker, https://github.com/sphinx-doc/sphinx/issues/ +Provides-Extra: lint +Provides-Extra: standalone +Provides-Extra: test + +===================== +sphinxcontrib-devhelp +===================== + +sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp_ document. + +For more details, please visit http://www.sphinx-doc.org/. + +.. _Devhelp: https://wiki.gnome.org/Apps/Devhelp + +Installing +========== + +Install from PyPI:: + + pip install -U sphinxcontrib-devhelp + +Contributing +============ + +See `CONTRIBUTING.rst`__ + +.. __: https://github.com/sphinx-doc/sphinx/blob/master/CONTRIBUTING.rst + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/RECORD b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/RECORD new file mode 100644 index 000000000..1f1505cf0 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/RECORD @@ -0,0 +1,104 @@ +sphinxcontrib/devhelp/__init__.py,sha256=h4HaW-ysPBgdpAse6TPnB045qTbJoSwtzGwBeanwDyA,4813 +sphinxcontrib/devhelp/__pycache__/__init__.cpython-312.pyc,, +sphinxcontrib/devhelp/locales/.tx/config,sha256=AKQmeVckKfcMF1niN2fqiho4B-469ev3Y06ep1cqRAs,221 +sphinxcontrib/devhelp/locales/ar/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=pbE7-MIAjarTr04T68V-PQ2wsubh64aKw_dqO1tsJCc,959 +sphinxcontrib/devhelp/locales/ar/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=76f1OPUHjyF13Qy8zLgTyXKlshe1nXBnr2mGCtT4p6M,1106 +sphinxcontrib/devhelp/locales/bn/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=pX0lFh11TBB-FYtRJpoCy2TZ-FxIvi9qevHg2WVwNYM,877 +sphinxcontrib/devhelp/locales/bn/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=QiAXkw30Mc0vtbJ5gqLDyyQl6UjETfqUA2ep1k8aJZg,1024 +sphinxcontrib/devhelp/locales/ca/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=WBhR3D3J8icT2qilxwCOA2rtIVZ_B_8jaJxu-rMGqoM,877 +sphinxcontrib/devhelp/locales/ca/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=hO9sZo472aY0hLOb-faBnx2eQ9Ixx2RTiTXlf-XrCqo,1024 +sphinxcontrib/devhelp/locales/cs/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=97o8NRgEnYj2fQAkepMGPPmSjPjPt5sOWlvW4NfLguA,955 +sphinxcontrib/devhelp/locales/cs/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=7eOti6siNsRFzxGWzKu4rmI6zoguebx8hd9uZ1TtaYA,1102 +sphinxcontrib/devhelp/locales/cy/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=a6mULfvM-7FNBz0CiDPNw84fVlqH__jW2dRfo9RV-uk,920 +sphinxcontrib/devhelp/locales/cy/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=wyElVZgTtSMUYNyQQ4GQCf5pVna6tvXpbgfthZme1GA,1067 +sphinxcontrib/devhelp/locales/da/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=Hrr11wr8sS_OhffsS7bScVGM8ADflYdyYrPuqw_G_NA,876 +sphinxcontrib/devhelp/locales/da/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=ztWsLG4YKW0jfzmTxm5jcPR8apQsFoMSPSme4aQ2TLw,1023 +sphinxcontrib/devhelp/locales/de/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=xteFSX8l6UjEeyG_dw8N6EWhqIFvQaUwd__m2VyT5Ns,876 +sphinxcontrib/devhelp/locales/de/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=1aBjahYK9ianqH0etcwNNFW9UcWsPLWU6pkNh5E54Po,1023 +sphinxcontrib/devhelp/locales/el/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=OMie6-CjZH-ROZYpQ2iKEk-S2JlGQR8e6tVJfClqLJg,875 +sphinxcontrib/devhelp/locales/el/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=2CBTMs6rtqmPwZ-Rh0Le1b3en2G6uq0OuL1aLbZmdSI,1022 +sphinxcontrib/devhelp/locales/eo/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=LIS-xUihyUpj05HMvPJii486XCXICcahgix0XAVTLFA,879 +sphinxcontrib/devhelp/locales/eo/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=Is2d6_Tyn5_ieiRB0PcSn2KrxgJUG-6ASetLHABJUYc,1026 +sphinxcontrib/devhelp/locales/es/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=l0QIiSFu-xpZIiw4CZuzBnNPeZo7niB3YnAtQ-k2Kww,877 +sphinxcontrib/devhelp/locales/es/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=tfGc2hgh6oaBPhxaTgsEAtMD3x86LG5BQBCJ-BmOKbM,1024 +sphinxcontrib/devhelp/locales/et/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=PQOcvnSgi_Irvf4zlKg3MSSwnbKwkqa28Ey0xlq4xZw,885 +sphinxcontrib/devhelp/locales/et/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=3ogvoi6FPPFhMJ9W7G2jX2IDicerRm7mq4QsBxrGfps,1293 +sphinxcontrib/devhelp/locales/eu/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=FCLAh1tTs6QFMl6_e6oaVqzX11H9wocZ38WJAkYZjXQ,876 +sphinxcontrib/devhelp/locales/eu/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=SN8jy57Ipj7a9s9mg9KtlhKG50Be8Sbcdo4yQL0ln_k,1023 +sphinxcontrib/devhelp/locales/fa/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=pLQ_zqQyyI7tldVMFbzQPIc1hjs7x5sx-SM1oOWF1hs,876 +sphinxcontrib/devhelp/locales/fa/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=1sXN9f9qkEDHNfWX_Tm02-8OQobdP58ow8v23eZnwdI,1023 +sphinxcontrib/devhelp/locales/fi/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=7gmi6BDYoMppXRuo0duc8-tXcQsj3YCT07ywAHgoFfI,877 +sphinxcontrib/devhelp/locales/fi/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=BhtVa7mKajCOEXJk3j7B8cGThFDMj5wCvaHb9nJbkaM,1024 +sphinxcontrib/devhelp/locales/fr/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=5FpzdQl_ziYKtuIcnda5amitFF_GOWoO5RhOoPUvn3o,901 +sphinxcontrib/devhelp/locales/fr/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=JZ9rGEiq6FO9FoUzehj6093KQQD15PpQO_wdgyCFeTw,1310 +sphinxcontrib/devhelp/locales/he/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=XAOOceg2qjnUU1lWeXV2hk8EQNof1XfptPToW4wgwe8,970 +sphinxcontrib/devhelp/locales/he/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=bQ9HDBJz4TmiqwmqWXHPL0E8JWem3tmDqSr6lUYv80Q,1117 +sphinxcontrib/devhelp/locales/hi/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=Fq9GABrmiL1w0tmZHVuhZdZqiDyc52iHk4HN1Am8We8,875 +sphinxcontrib/devhelp/locales/hi/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=vWvK341AeyhlMcHTpb8TViiDjgp7J09UTZusSE7ovd4,1022 +sphinxcontrib/devhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=lqBE6slNG7JTYAcVXv3Nn8fmryMElKHhjTxDx4VKl_8,889 +sphinxcontrib/devhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=kCvAJWzVH8AvqCJFnUP7UoHqJgvv-IHG31BPeKpicuI,1036 +sphinxcontrib/devhelp/locales/hr/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=jyWQrgvZd7oznuFswJozS-jkqIqGC7gvFe88CaNticQ,950 +sphinxcontrib/devhelp/locales/hr/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=3GR4QXIFpMQf3AtimWQtKVeuAFbSS60CpWVgb5Bfu5U,1097 +sphinxcontrib/devhelp/locales/hu/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=_Z0IbtEYQPNLi5FpLN7QjIcjxafpPfU7h_jqdFyQl1E,879 +sphinxcontrib/devhelp/locales/hu/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=pcHwHGI2LceR0CfCR5tVsXB49QpNPtcNYrPyGHpWpjs,1026 +sphinxcontrib/devhelp/locales/id/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=c6wq61olkdXSV6FNtbMmWf0E08qSPpHxxrgd6h0kVY8,877 +sphinxcontrib/devhelp/locales/id/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=YvTC7YvXPpUBUyU_F48ZyipjEoAVRsz97zPtywCaAK8,1296 +sphinxcontrib/devhelp/locales/it/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=beF549SNqsj-98ilPeTdJNks0Yn8Qhhy05I-Iq4JCnE,877 +sphinxcontrib/devhelp/locales/it/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=b1p50wi_p_ZmyjI3ybHLu1pF_FjePzVLTyzV5AZ2ZRo,1024 +sphinxcontrib/devhelp/locales/ja/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=LNTmZB3EkOB-Hn4hDlqC04ZazcNVC78JBkNy0WiRY08,871 +sphinxcontrib/devhelp/locales/ja/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=6yV_RskUXNDarqpwgBPu4m_gOXoRD1Gtm56TqIbypbE,1018 +sphinxcontrib/devhelp/locales/ko/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=ksbB63fK-s4sr0uaIQil0Y5ykKAcFSFi_70GWWyZkTc,869 +sphinxcontrib/devhelp/locales/ko/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=GeYHuu9uYI6DIDQMxbC8nInQ04_zXxIm-r1hMNqBEx0,1016 +sphinxcontrib/devhelp/locales/lt/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=1kCpmGbiPFpgigMOFP-gMQUf76jvzE50f2JLIsv8qu8,1011 +sphinxcontrib/devhelp/locales/lt/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=6Fqd0APZ7p_6cvEuvoQ2G2ZBsIyukde3ezbnsKQQMqg,1158 +sphinxcontrib/devhelp/locales/lv/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=Apxwf1nbzsXswsq1ledok866TMG6_G4bkga0N5eA_wY,912 +sphinxcontrib/devhelp/locales/lv/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=lWqfMXxjtymj5tidZWOf-N8zI62wMQIoY_xcaUwRwSE,1059 +sphinxcontrib/devhelp/locales/mk/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=Sle3jKJvPYhTk1nFIVBXZDDRaF3bgrWFYYyvRhdWGU8,910 +sphinxcontrib/devhelp/locales/mk/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=hnvqr0AYZHVzedwzO2fbTVqcUC7zmoINkNc2IXXfCQk,1057 +sphinxcontrib/devhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=z-l7bHAo0Uwl3vJ1cTg8hdFRF53KZIh-1qkqCUe1bU4,902 +sphinxcontrib/devhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=69R179LWL-i5s-F_LMX_92JcK4ywJAKNuv5tlwgPtQk,1049 +sphinxcontrib/devhelp/locales/ne/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=vwIFtQNkM1UAHk-elEBJtNhcULdYtINPWSqT0nOlVsQ,876 +sphinxcontrib/devhelp/locales/ne/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=CUuuhY0qrXk5ibxexFc2WAU9N2WNG7ESWaGkTCSYmaw,1023 +sphinxcontrib/devhelp/locales/nl/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=7Hz5DxPxKZrLMVZ9inJo7z1n7LbmdAab0e2CGfD10RE,875 +sphinxcontrib/devhelp/locales/nl/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=GDIwSOJ-IAOipwXtBgAl8eaiyIZ2GE_cO8hKcieBpzk,1022 +sphinxcontrib/devhelp/locales/pl/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=mvJ8Pd1Tc0tRwhaqm1BHf0DJdbKS9uUxB8x_GeIiJds,1012 +sphinxcontrib/devhelp/locales/pl/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=Tp9zVeoydWKVJJHCSwRpNJlRgimQuv1LZZLyEW_hVaM,1398 +sphinxcontrib/devhelp/locales/pt/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=pokkG8EpERFa7PeeTTdh3ngVpQtHB2EQ1teDLLOtlqc,880 +sphinxcontrib/devhelp/locales/pt/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=qlAhIkXg16NXb82mI95MM1BlXlEnAvEpzFIciMZ73qs,1027 +sphinxcontrib/devhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=yMhavmPTIN8QlhEovZSmmW90gKRQ6Gxhd2x7sVnDDLw,894 +sphinxcontrib/devhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=RMlSHkvQnx6b4PK2VtGSNL7679mgQ1xVM7OB8iFpDpk,1041 +sphinxcontrib/devhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=tMxHDGUvyUCzAC9YqQRJJVmyteflkzPpsxBEPydwPLk,897 +sphinxcontrib/devhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=TWIIi4N-V4-44jD-sFHrnEBMeB4AyF71InmnkjwRusc,1044 +sphinxcontrib/devhelp/locales/ro/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=PsM8ySUcw9Ns-QHJRs7XfRkF_Ajk-oZDedfdE6ucCMg,919 +sphinxcontrib/devhelp/locales/ro/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=JG4dWmShmzMqDbyDzAacadZPXnQDzz7rx2W51iSkWZE,1066 +sphinxcontrib/devhelp/locales/ru/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=28msqeEhLhJcDIBi5kyO3vJIoE0SzIvS-mogzsqubQk,1015 +sphinxcontrib/devhelp/locales/ru/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=nSTnjnof3dZraRP2HVfFwrW7onWhNEWTnSu8HaApA4I,1162 +sphinxcontrib/devhelp/locales/si/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=lcxhNz-gykNrsiQo3U9j3sEsrpv28TzH6RT1akyizu8,877 +sphinxcontrib/devhelp/locales/si/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=q4TxftcC_siIULdBUKMmaY7xjTdVvDJbNMv6CaJ6ZwE,1024 +sphinxcontrib/devhelp/locales/sk/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=pcM4cv1rxibueoALqjEv8WxbWP0EVZ4TeerMKka45Dg,951 +sphinxcontrib/devhelp/locales/sk/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=UBxILxDAasN9dvT7fogzrGEeoDUUyAySPVRaFKxchWM,1098 +sphinxcontrib/devhelp/locales/sl/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=i5U1IA7C6ClGZwnz5xJUHeKlytlCw24oEFBA9zpuV5g,931 +sphinxcontrib/devhelp/locales/sl/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=pbLsLmdQX3Tj2uEvlDSvF-lPN-dXrP1XAUNrYjbV7GU,1078 +sphinxcontrib/devhelp/locales/sphinxcontrib.devhelp.pot,sha256=HggN_GbzeDdy6w2rBIpbA-oxD_GCzp7kAC8Wju8tfxg,965 +sphinxcontrib/devhelp/locales/sr/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=vmpHM_oortun45EUYDegAEM0HfPVIZQ8xGhWZVGbINQ,951 +sphinxcontrib/devhelp/locales/sr/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=fb0Mx6vWtJA34EppN9gIxneXQQCFmIvg7FFbZKqnB20,1098 +sphinxcontrib/devhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=QRTYjoYSe-BZOK_MTnj63OvKsFvWlouo01jsnAkBtpg,973 +sphinxcontrib/devhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=YqvCUIudfaoINxb9xGH5MZRYwTkqJE0n-h1dRTVlbXc,1120 +sphinxcontrib/devhelp/locales/sv/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=x1VT77OpSJI_Z9vdJ9iP4OOpQkbEE1IQQV2oVAFNtY0,877 +sphinxcontrib/devhelp/locales/sv/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=BuoJY2PxM4DNFv2hqiBOdTYu8BiL39yTpon39cc3MUY,1024 +sphinxcontrib/devhelp/locales/ta/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=bmwHSkS1RnO33NQgXpW9RxwWZxk4fk8scJv82LJbhYA,875 +sphinxcontrib/devhelp/locales/ta/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=TXyxR9V6QrDzsj1qZerLTOqCuBvc3v9xYrcyeFKaY-4,1022 +sphinxcontrib/devhelp/locales/tr/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=pyQRaJIMDlbBHrOc96g49innnpSyJGK0zKrJbreS6EY,876 +sphinxcontrib/devhelp/locales/tr/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=9F42i2ZZI8BF76i2J7PcwTfZHGjXDGq3b7O4N-NcL-s,1023 +sphinxcontrib/devhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=2PM4Fw1NRVDwJ0YexcuJIJt04f5f1TuCbXGFYwYna2Q,1117 +sphinxcontrib/devhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=ypZoXioFWo_FVkSc84gEkeVrivUnNvT_8SuicXUQaqU,1264 +sphinxcontrib/devhelp/locales/vi/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=G80amNJ-7zwOUn_92Pdi-Hv1LG_cWFR3jqF__y_A8No,873 +sphinxcontrib/devhelp/locales/vi/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=tN7SZcRd7ukV87T8SVJju28ugmMci6khH71oQyZworg,1020 +sphinxcontrib/devhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=xfktYSFRgB63nWc-KkXgHL5eHKWiOwaFZDXscg6iYNk,930 +sphinxcontrib/devhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=lWkJ0r1tkhrkoJtN5rqlDMMqcHx9xIyCw3M-aq0Mm_M,1368 +sphinxcontrib/devhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.devhelp.mo,sha256=XOQB3WLgxw4OuwMshXutdQbMRvNqUmCJlM4syRm5Sfw,885 +sphinxcontrib/devhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.devhelp.po,sha256=bxk94whTcHgDunFp2w-ZgmQa-ylCGbpcfdc4XXlaDpA,1032 +sphinxcontrib_devhelp-2.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +sphinxcontrib_devhelp-2.0.0.dist-info/METADATA,sha256=4rsZojinbvhlITmI3xg4LiKaslGsBl6t5X4Qb48PoSI,2325 +sphinxcontrib_devhelp-2.0.0.dist-info/RECORD,, +sphinxcontrib_devhelp-2.0.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/WHEEL b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/WHEEL new file mode 100644 index 000000000..3b5e64b5e --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_devhelp-2.0.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/INSTALLER b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/METADATA b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/METADATA new file mode 100644 index 000000000..2eb26fb37 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/METADATA @@ -0,0 +1,65 @@ +Metadata-Version: 2.1 +Name: sphinxcontrib-htmlhelp +Version: 2.1.0 +Summary: sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +Author-email: Georg Brandl +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Education +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Framework :: Sphinx +Classifier: Framework :: Sphinx :: Extension +Classifier: Topic :: Documentation +Classifier: Topic :: Documentation :: Sphinx +Classifier: Topic :: Text Processing +Classifier: Topic :: Utilities +Requires-Dist: ruff==0.5.5 ; extra == "lint" +Requires-Dist: mypy ; extra == "lint" +Requires-Dist: types-docutils ; extra == "lint" +Requires-Dist: Sphinx>=5 ; extra == "standalone" +Requires-Dist: pytest ; extra == "test" +Requires-Dist: html5lib ; extra == "test" +Project-URL: Changelog, https://github.com/sphinx-doc/sphinxcontrib-htmlhelp/blob/master/CHANGES.rst +Project-URL: Code, https://github.com/sphinx-doc/sphinxcontrib-htmlhelp/ +Project-URL: Download, https://pypi.org/project/sphinxcontrib-htmlhelp/ +Project-URL: Homepage, https://www.sphinx-doc.org/ +Project-URL: Issue tracker, https://github.com/sphinx-doc/sphinx/issues/ +Provides-Extra: lint +Provides-Extra: standalone +Provides-Extra: test + +====================== +sphinxcontrib-htmlhelp +====================== + +sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files. + +For more details, please visit http://www.sphinx-doc.org/. + +Installing +========== + +Install from PyPI:: + + pip install -U sphinxcontrib-htmlhelp + +Contributing +============ + +See `CONTRIBUTING.rst`__ + +.. __: https://github.com/sphinx-doc/sphinx/blob/master/CONTRIBUTING.rst + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/RECORD b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/RECORD new file mode 100644 index 000000000..d867c748e --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/RECORD @@ -0,0 +1,120 @@ +sphinxcontrib/htmlhelp/__init__.py,sha256=2CeGDPTUspdxvAj85lxHrCdH7qHWf6_bolA0oyty7f4,12314 +sphinxcontrib/htmlhelp/__pycache__/__init__.cpython-312.pyc,, +sphinxcontrib/htmlhelp/locales/.tx/config,sha256=3FtSZdKJWHAjOTtzxiY7FfOlyTr0RNnDYTJ6xXpWiiU,224 +sphinxcontrib/htmlhelp/locales/ar/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=qyNmVc5_xLLweJI4dRINCoXUPz73w02RxMpPdF_DyJE,1025 +sphinxcontrib/htmlhelp/locales/ar/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=Mmmt14R75ZkHRF9yYD614JPRlMqEGm8qNvuIg9cCITQ,1576 +sphinxcontrib/htmlhelp/locales/bg/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=c5ahwcmuXBTW8me7nnjCoBZuOxUheFmGpCnOoScOUiA,506 +sphinxcontrib/htmlhelp/locales/bg/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=Nx5guRV4ZeBVEwPtK9J5ZKeQG1Ok-FQ6hJYzah-cWV4,1181 +sphinxcontrib/htmlhelp/locales/bn/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=tEk6N6BkwHd5WOCYhQCbnIm4jWgYMcq737o7PTXFz3k,504 +sphinxcontrib/htmlhelp/locales/bn/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=OpppZ9OqtKR0J90VCgMC9JcKVG9OSB3DjUXFJGcR8J4,1179 +sphinxcontrib/htmlhelp/locales/ca/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=UQ3B6mYocAzA9ciUk2a6G7fLAUUeaaxpr80GdUjrdMQ,504 +sphinxcontrib/htmlhelp/locales/ca/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=0_P0-0D7OX011XPQYbiKOGPNYyMWZJHhSV44ShyJL1w,1179 +sphinxcontrib/htmlhelp/locales/cak/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=HI0x8iklB3TTpdCCtiQTvrI69yy5cEnV9OYrmXgrcqo,466 +sphinxcontrib/htmlhelp/locales/cak/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=P6-dzmQ-tBUDeZnIBZ4KdLqbQWbPvrsJa2Ez1ZTjK1I,1183 +sphinxcontrib/htmlhelp/locales/cs/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=OiplrGUNQgxcth6moP7Qld-N1jJ-TM1vv0Ab0rn2Q3M,582 +sphinxcontrib/htmlhelp/locales/cs/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=iBM585hnUgMTLKJuUaP1HDfOT5n5kYc_32DDG_FtD7Y,1257 +sphinxcontrib/htmlhelp/locales/cy/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=zRoPAkixn7I1aU1wSidqW3Azo3wxrYLT67CmPgR4HxY,547 +sphinxcontrib/htmlhelp/locales/cy/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=wh6V1kVCT_5B9qqq3aXFJcn8a0hvjwEAqKJdoSS9xcY,1222 +sphinxcontrib/htmlhelp/locales/da/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=at8jICidqvlFsC6ZU64vZxoogx4CHdi-Gs_GBh7PpzU,894 +sphinxcontrib/htmlhelp/locales/da/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=omPi7DXy02RpK6fNcd4CoHG_kdsHPOKMerOihAsrdLU,1439 +sphinxcontrib/htmlhelp/locales/de/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=oAlTZ9iCFE1V5zjmAVwzOPr8M-ZknXm2tOtEiMy3pQg,503 +sphinxcontrib/htmlhelp/locales/de/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=ASZ2BWc6iCcx3MeFTRAVXSKJjpaO9qPqx68w6Ts4dqM,1178 +sphinxcontrib/htmlhelp/locales/el/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=AlAXroiOf9lp2xM6qcZ9CaMB4oZg6KfLwI_Bj-cyXIg,1050 +sphinxcontrib/htmlhelp/locales/el/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=E8DG0IMF4gDY3ytsldcSojUy2dZnAwVfvc1XmUeL6BA,1614 +sphinxcontrib/htmlhelp/locales/eo/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=VbcghV6WkukOfI5B5y6EyChDp6nJKQzlB4ocwlazUmQ,506 +sphinxcontrib/htmlhelp/locales/eo/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=Aw9dLH0jQMNULuiYpXLE0wnSAP-EdZE8VOBWalOWHKw,1181 +sphinxcontrib/htmlhelp/locales/es/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=h_izQqxLji901b25dPNdK6HziAqD_cdih7U-p3C7ATU,962 +sphinxcontrib/htmlhelp/locales/es/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=cUcgnE2IlzwB6N2Nj3dESMzbxTIzIwCWGDTmCIjBZLk,1591 +sphinxcontrib/htmlhelp/locales/et/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=EjGLJbjr-qozqdK2qajCyqy2Orx-Eok-KXdZVELse6c,866 +sphinxcontrib/htmlhelp/locales/et/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=ka34cNRvtVaYKe2ZswpqgvIIgOvqYhpPNWXfUFHReqA,1448 +sphinxcontrib/htmlhelp/locales/eu/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=OP-SulnFDwYzyhqrMffVc_quw4jjllSM5twY2o2sygw,503 +sphinxcontrib/htmlhelp/locales/eu/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=DABvRh_uYjPCEzEHaUt610bRCQRJ0LmISmcOsMxpLvk,1178 +sphinxcontrib/htmlhelp/locales/fa/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=HDTOSLQuSYqLz8KBojOmEPECDSK5M0MCIJFmu8zq_wc,1036 +sphinxcontrib/htmlhelp/locales/fa/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=ZDUVWhPmWan8P_AkvysvDfUksoCxLNVoy6xqhIiUYog,1581 +sphinxcontrib/htmlhelp/locales/fi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=RDu0pWoq1eAFDcQV0QnabC93FdUmcWxqv0GLpmMc2fQ,504 +sphinxcontrib/htmlhelp/locales/fi/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=viNIyM28Qy15YmQHaAbnRiGGqlRxzOoOh2UG_rZrYYA,1179 +sphinxcontrib/htmlhelp/locales/fr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=LVDDumGBMP_01cCUMSoVdaeK2vuA0oixdkW9W6z0-qo,994 +sphinxcontrib/htmlhelp/locales/fr/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=N2_Bc1nnsnoQyOd45oO81I7PevcPzUfJgmIrRRtz0aE,1633 +sphinxcontrib/htmlhelp/locales/he/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=js9TQAFBE3UGJxvQ3qe-iszB3qx9aCxGlINMgmHRa2Q,597 +sphinxcontrib/htmlhelp/locales/he/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=_ysNDVoNBBuI9z4l3jWheLJ0AuH-wEO8etTV8Qyu970,1272 +sphinxcontrib/htmlhelp/locales/hi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=8enl0ZuE6p9gsFrH6XzhXvW0-gGV434HJfC78Ifcyhs,1313 +sphinxcontrib/htmlhelp/locales/hi/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=ALQ46K1WrCQ2N44xvFoBFmkoWNc0MCFHU41mL9Y-lcA,1864 +sphinxcontrib/htmlhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=0Ydnd_UsxoqpzLUTn7NnN_OFr06KnDU5BiSEJrpecPI,516 +sphinxcontrib/htmlhelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=gYj75u-SQkd-DXSzfwdOarM1N4Cp3sf9rerIF_2ifnc,1191 +sphinxcontrib/htmlhelp/locales/hr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=e7b9Zk-FhsxDOrcGV-siqjOY4rZZYV2DAcv6xbLkBfc,577 +sphinxcontrib/htmlhelp/locales/hr/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=cqByavIvE0u_1OWb_XZmcHmW49yRl9_Zil4DHQOg-Uw,1252 +sphinxcontrib/htmlhelp/locales/hu/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=f5rb-GnGTHuG9sNGFgmwomnxC_uWrj9poRQDqJqrCHw,943 +sphinxcontrib/htmlhelp/locales/hu/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=eMxwcoTAv0OTfNgTf0BXD7uHjv5RtgxDP6ROXwhfE7c,1473 +sphinxcontrib/htmlhelp/locales/id/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=zX7vZZE7oz_aDDVHph0prHeLzy799FFLRcVsj52BBE0,929 +sphinxcontrib/htmlhelp/locales/id/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=siMiVXL-KK4jMgFoYOD-GT5tLKyzEWA0ULYNC7E1Xuc,1510 +sphinxcontrib/htmlhelp/locales/it/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=kzRWy7cRyfTpAX_jKfagmDh1iYWownjgDiQTz8XNeO0,504 +sphinxcontrib/htmlhelp/locales/it/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=nut6GKqqpPbMKwpFYaeAqo3uFXZxD-c46l1bW4XdOdk,1179 +sphinxcontrib/htmlhelp/locales/ja/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=r9gh0ZxpetG1-oCbw7KXPSj2AhWHo7j4Peoq_VdAK9c,1004 +sphinxcontrib/htmlhelp/locales/ja/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=w3EloaT083ZXLe8kEq8bK11kxDfKTig8gXRh5NknICE,1561 +sphinxcontrib/htmlhelp/locales/ko/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=lm6tNTph1Be4F96DWAE8cX_cE-JuDkY6cACaYzdJd9A,942 +sphinxcontrib/htmlhelp/locales/ko/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=fQXCODdMBOsELXf1JurlM7t2jJ6pvjGpJm--uB2fLWQ,1475 +sphinxcontrib/htmlhelp/locales/lt/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=CjHsz5QCXPlduOrbETkSf3iAajt5wtIbDb0oYCal7Iw,638 +sphinxcontrib/htmlhelp/locales/lt/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=l_VyiCEsCtTU-MPc0Pzx8NO1d8BBMfS5cRBjvLSqwPE,1313 +sphinxcontrib/htmlhelp/locales/lv/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=4xF4XccwUuIfHXDnbHMOTPQ5dQgg7BjY2nD6ITng-2w,539 +sphinxcontrib/htmlhelp/locales/lv/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=HHGshkySbIge-gHXahEbrOkCcWf8LztW6_RPdZXFpJU,1214 +sphinxcontrib/htmlhelp/locales/mk/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=slGQA_d1O37EF0uq2sp-L9aMJEG9yV_8O6sP0faElV8,537 +sphinxcontrib/htmlhelp/locales/mk/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=hJtglWVYoZWkSsECXZDCyiiKIVOj_5hGS9m9EEnu_Y8,1212 +sphinxcontrib/htmlhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=vwxq0_zl3bXBKWNCcmAgBNfar3SzOuFjXn8S_IqDhKg,529 +sphinxcontrib/htmlhelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=sX5X5Rz2fiREQy-1QaPaPwL6IK0zt210gBxbH8WcVEo,1204 +sphinxcontrib/htmlhelp/locales/ne/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=1bzfjyNICnXyTp4RBTcETf3wlpafcfVKy-I_FrhumVE,503 +sphinxcontrib/htmlhelp/locales/ne/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=RMiELVJ3yVUKZGddJzT6F6A3j8DWuMocgNpUQ6heaXc,1178 +sphinxcontrib/htmlhelp/locales/nl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=Fd_0zljrsUQT8zlm52KsrTb2D8C4f5mATiqHBjwEh5A,502 +sphinxcontrib/htmlhelp/locales/nl/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=43t3Kt3yvWbsK7PpIpv7SzJmMqNB9irkxXb97YRznAg,1177 +sphinxcontrib/htmlhelp/locales/pl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=xsFdkXxPAn_akA5Fs7l7o09GVBVJ1n8xD6tP2nDVa-M,649 +sphinxcontrib/htmlhelp/locales/pl/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=iCEmgU9vO2R-TWnXkHkHXN4iqiTxDef6CfwNGF1ZkWw,1324 +sphinxcontrib/htmlhelp/locales/pt/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=Gmn3mrsRQqP7ucBe_PYZBFR_oqK8HWIs0wQArPN_2y0,507 +sphinxcontrib/htmlhelp/locales/pt/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=Z3HqXRP7B4zcGPgNxW2hWj3IKJqh9r5WsgI7MUbZmec,1182 +sphinxcontrib/htmlhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=LZ9uWT4ey-hPaMEqchzNdSotX7H2yU0bs_E8pkvFc-k,973 +sphinxcontrib/htmlhelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=pvGPoEAmAi4-NxvhX9XJP3jQnuNtBfgCcZBdlApnw5o,1534 +sphinxcontrib/htmlhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=Uyd2oGiRBKAipO0kh5RPk7ZblZ-FUg8Ja93iVmnDrvM,524 +sphinxcontrib/htmlhelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=HjVsvHLgwg7QWCxkU0zlg-r1dKSbFFzaOSJDDTouaD4,1199 +sphinxcontrib/htmlhelp/locales/ro/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=LXgdWNuU-nJdvADnMmqNqpOxXqjCJclYHHamVk4xhng,546 +sphinxcontrib/htmlhelp/locales/ro/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=xXAtIqq7B25AJPYrVsX3W16HR8_FGklEBl34-cepTLM,1221 +sphinxcontrib/htmlhelp/locales/ru/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=c_shX0Qda6otynozXzBmegY4Qzzq_Sq2VELCFO7qYds,642 +sphinxcontrib/htmlhelp/locales/ru/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=qMnljMW1J4YXkRUIgzmTgyTIsLroSlxGXDU6p9_IYXY,1317 +sphinxcontrib/htmlhelp/locales/si/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=9CtRAmFQE9nGPoJAzGdA0bIapaklJqaPegRf77F4hV4,504 +sphinxcontrib/htmlhelp/locales/si/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=wSc2gYuZWW6cMuLab75qpmq7O9WGEUDrv03P-CXwnyA,1179 +sphinxcontrib/htmlhelp/locales/sk/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=T7puvoYXcdVCs69uyiiYdaYgnv2fnOlLkzNsX2pRPDU,1009 +sphinxcontrib/htmlhelp/locales/sk/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=P4nrv7cjpYaRnEenO6wbWHXYsxuRGgzlUA99AABMohk,1547 +sphinxcontrib/htmlhelp/locales/sl/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=rTLQhGzWkRqUkoo1E-ADIGx1fz041e9SuXxX5gX2BDk,558 +sphinxcontrib/htmlhelp/locales/sl/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=W4TzgimbG2UOc_2zH25HPI1XzjbrBG7NTN9xfhtA-H4,1233 +sphinxcontrib/htmlhelp/locales/sphinxcontrib.htmlhelp.pot,sha256=v24LmocX8oP-LbhXL345D3xagoTDnV5-6B1ZlhztVtc,1120 +sphinxcontrib/htmlhelp/locales/sq/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=f7wmFe5dBKqcmpFf8mV8CIhQupRZHbkizi5nZEMqwuc,953 +sphinxcontrib/htmlhelp/locales/sq/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=TX3_LZFwLxm6GKm6DSOlYPtSflTXVUe7HosczmKE700,1508 +sphinxcontrib/htmlhelp/locales/sr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=XZ-KP_pkw_m5WHhY7v4UJEuXTQE8ppYcmPBKjVHdYzk,578 +sphinxcontrib/htmlhelp/locales/sr/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=v-AvaZthDcz3iK32pJULdvcgUkrymCtoSHydEALcRQY,1253 +sphinxcontrib/htmlhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=8Dztxhd04L6gmcfDVrqCZqVDsrJMzPBuc5WP9626hqw,598 +sphinxcontrib/htmlhelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=4sRMe_sz0J5H5Zbhhb0S8L7ZejvXKZP0TZ85JcIMr2w,1273 +sphinxcontrib/htmlhelp/locales/sr_RS/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=27Qy6GMxrbsbMZMSJoaPiM8oyK_A_itYvfSiomrGMpc,593 +sphinxcontrib/htmlhelp/locales/sr_RS/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=oWHb9gMqzOFcdx_7yEdBS3upDWdxMr3OPuxuCBH9zmw,1268 +sphinxcontrib/htmlhelp/locales/sv/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=tKFBnZdE35vaqYMYtgNXmtbBi6t2Fhk7HElAo1bPxNA,504 +sphinxcontrib/htmlhelp/locales/sv/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=Rp6A6VryFW-eEYmjMwI4tlCadE55fdSa_SES_v6_9uo,1179 +sphinxcontrib/htmlhelp/locales/ta/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=J2NWJ64pPBkJsOe7nNmfJuwhExh8N2Pa91kAxWEniOo,502 +sphinxcontrib/htmlhelp/locales/ta/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=QlSKVbHI64egKG4pteEx20rmpeuakMjLNRWNEEJlr3Q,1177 +sphinxcontrib/htmlhelp/locales/te/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=d4ZwU6pmX4QVFehhRuWlyFGoD3X1tKZvxIRlxN0zjzs,503 +sphinxcontrib/htmlhelp/locales/te/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=qAB6u3XCK1vcOO4-hhvh3gS-Do-tcF2tfkDKf-8Lx6o,1178 +sphinxcontrib/htmlhelp/locales/tr/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=NbFh0wWF6oI6vsVx2jlMn1TqYVhviFn_OETk46ZEVxQ,939 +sphinxcontrib/htmlhelp/locales/tr/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=fshzKf8rKC9MGiqRRmcZkbQrlz7SQhZl9KYDmT0woxU,1465 +sphinxcontrib/htmlhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=xtLkjfoJbLpeXmE4BIgbGwMqjAJpY0wWdyCAvwXY0PM,744 +sphinxcontrib/htmlhelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=FDl5r7bOuxhxAzo2aD-5o7F8C-DF6NRLDgdz5U7lzb8,1419 +sphinxcontrib/htmlhelp/locales/ur/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=4XFn1yCQ_qsBL2ogFIedvwzGJ6M8hRbnn3SzhkvVxhs,501 +sphinxcontrib/htmlhelp/locales/ur/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=fzkf2wHdKKIi200abKtlQk_5ds2k9whiHyM5g4bM0RU,1176 +sphinxcontrib/htmlhelp/locales/vi/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=DZ0YpcnBIia4lR95rXnjKjgQnBboiGVb14xyejQJ2J0,500 +sphinxcontrib/htmlhelp/locales/vi/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=QjBqoW-KK8Fh3-0mIBq9jYJ7lrmeFV0Ib6GTvN-Pnos,1175 +sphinxcontrib/htmlhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=B38HA46a8np8k7jtsDCQu0fuMWjeCHh-kwm4qP_dY7Y,917 +sphinxcontrib/htmlhelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=lrfET_nuwM-p7WQKvOlqZLZzM7X3H4rrK37jujMM5rw,1498 +sphinxcontrib/htmlhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.htmlhelp.mo,sha256=fWiWrXbKg-KPiEQyQ2F6FzA8e5xUIb_klLB8JHdGEGQ,512 +sphinxcontrib/htmlhelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.htmlhelp.po,sha256=fKtLWt3rYqzIzgDza9UyKEcunsTe2I4FeoAyQ4Ee_Bg,1187 +sphinxcontrib/htmlhelp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sphinxcontrib/htmlhelp/templates/project.hhc,sha256=Ihy7JrzknzHIzJGgOG1XG34JxVAUx2Sd5_zI2EXzbvo,729 +sphinxcontrib/htmlhelp/templates/project.hhp,sha256=AO8VZQY4M7UQ-pA9UcSUNppb-O8t4mY36Tpe6xXweIc,1627 +sphinxcontrib/htmlhelp/templates/project.stp,sha256=v50LjubehGTAYJcxyTNZl4ZetYrs3tOMkLaQk-wdTwU,165 +sphinxcontrib_htmlhelp-2.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +sphinxcontrib_htmlhelp-2.1.0.dist-info/METADATA,sha256=2lGxgrBiYz8epMr-csbm_qcFAS8fZnLMrfVRM_2RMA0,2323 +sphinxcontrib_htmlhelp-2.1.0.dist-info/RECORD,, +sphinxcontrib_htmlhelp-2.1.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/WHEEL b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/WHEEL new file mode 100644 index 000000000..3b5e64b5e --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_htmlhelp-2.1.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1-py3.7-nspkg.pth b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1-py3.7-nspkg.pth new file mode 100644 index 000000000..0cb96912f --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1-py3.7-nspkg.pth @@ -0,0 +1 @@ +import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('sphinxcontrib',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('sphinxcontrib', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('sphinxcontrib', [os.path.dirname(p)])));m = m or sys.modules.setdefault('sphinxcontrib', types.ModuleType('sphinxcontrib'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/INSTALLER b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/LICENSE b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/LICENSE new file mode 100644 index 000000000..78586c889 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/LICENSE @@ -0,0 +1,29 @@ +License for sphinxcontrib-jsmath +================================ + +Copyright (c) 2007-2019 by the Sphinx team +(see https://github.com/sphinx-doc/sphinx/blob/master/AUTHORS). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/METADATA b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/METADATA new file mode 100644 index 000000000..fd28c9a71 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/METADATA @@ -0,0 +1,39 @@ +Metadata-Version: 2.1 +Name: sphinxcontrib-jsmath +Version: 1.0.1 +Summary: A sphinx extension which renders display math in HTML via JavaScript +Home-page: http://sphinx-doc.org/ +Author: Georg Brandl +Author-email: georg@python.org +License: BSD +Download-URL: https://pypi.org/project/sphinxcontrib-jsmath/ +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Education +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Framework :: Sphinx +Classifier: Framework :: Sphinx :: Extension +Classifier: Topic :: Documentation +Classifier: Topic :: Documentation :: Sphinx +Classifier: Topic :: Text Processing +Classifier: Topic :: Utilities +Requires-Python: >=3.5 +Provides-Extra: test +Requires-Dist: pytest ; extra == 'test' +Requires-Dist: flake8 ; extra == 'test' +Requires-Dist: mypy ; extra == 'test' + + +sphinxcontrib-jsmath is a sphinx extension which renders display math in HTML +via JavaScript. + + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/RECORD b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/RECORD new file mode 100644 index 000000000..c8ba7816d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/RECORD @@ -0,0 +1,12 @@ +sphinxcontrib/jsmath/__init__.py,sha256=mSK0sE2QBBD7G8QBH-q7rPfgW0e537RfEqt-_ChH3jQ,3409 +sphinxcontrib/jsmath/__pycache__/__init__.cpython-312.pyc,, +sphinxcontrib/jsmath/__pycache__/version.cpython-312.pyc,, +sphinxcontrib/jsmath/version.py,sha256=YniYoapisIQ7n5Lp8c10tcCcqpRYen44YpkwVu4qGt8,293 +sphinxcontrib_jsmath-1.0.1-py3.7-nspkg.pth,sha256=bvCbvTDhKUCTNtrCbu6HVe8TsYC4G4-hRkXeHdEJ6t4,574 +sphinxcontrib_jsmath-1.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +sphinxcontrib_jsmath-1.0.1.dist-info/LICENSE,sha256=2MJeLoR4zNMrGDdes6V8WE0xBI_gwjxVkFxkyK9ndKk,1435 +sphinxcontrib_jsmath-1.0.1.dist-info/METADATA,sha256=eOYBTM3OQnZDvk2Lje8zEJzL_cMmb4y2Vebem4Z0W-g,1361 +sphinxcontrib_jsmath-1.0.1.dist-info/RECORD,, +sphinxcontrib_jsmath-1.0.1.dist-info/WHEEL,sha256=_wJFdOYk7i3xxT8ElOkUJvOdOvfNGbR9g-bf6UQT6sU,110 +sphinxcontrib_jsmath-1.0.1.dist-info/namespace_packages.txt,sha256=VJrV3_vaiKQVgVpR0I1iecxoO0drzGu-M0j40PVP2QQ,14 +sphinxcontrib_jsmath-1.0.1.dist-info/top_level.txt,sha256=VJrV3_vaiKQVgVpR0I1iecxoO0drzGu-M0j40PVP2QQ,14 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/WHEEL b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/WHEEL new file mode 100644 index 000000000..c4bde3037 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.32.3) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/namespace_packages.txt b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/namespace_packages.txt new file mode 100644 index 000000000..aa7560484 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/namespace_packages.txt @@ -0,0 +1 @@ +sphinxcontrib diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/top_level.txt b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/top_level.txt new file mode 100644 index 000000000..aa7560484 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_jsmath-1.0.1.dist-info/top_level.txt @@ -0,0 +1 @@ +sphinxcontrib diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/INSTALLER b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/METADATA b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/METADATA new file mode 100644 index 000000000..2b5e00af7 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/METADATA @@ -0,0 +1,65 @@ +Metadata-Version: 2.1 +Name: sphinxcontrib-qthelp +Version: 2.0.0 +Summary: sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +Author-email: Georg Brandl +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Education +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Framework :: Sphinx +Classifier: Framework :: Sphinx :: Extension +Classifier: Topic :: Documentation +Classifier: Topic :: Documentation :: Sphinx +Classifier: Topic :: Text Processing +Classifier: Topic :: Utilities +Requires-Dist: ruff==0.5.5 ; extra == "lint" +Requires-Dist: mypy ; extra == "lint" +Requires-Dist: types-docutils ; extra == "lint" +Requires-Dist: Sphinx>=5 ; extra == "standalone" +Requires-Dist: pytest ; extra == "test" +Requires-Dist: defusedxml>=0.7.1 ; extra == "test" +Project-URL: Changelog, https://github.com/sphinx-doc/sphinxcontrib-qthelp/blob/master/CHANGES.rst +Project-URL: Code, https://github.com/sphinx-doc/sphinxcontrib-qthelp/ +Project-URL: Download, https://pypi.org/project/sphinxcontrib-qthelp/ +Project-URL: Homepage, https://www.sphinx-doc.org/ +Project-URL: Issue tracker, https://github.com/sphinx-doc/sphinx/issues/ +Provides-Extra: lint +Provides-Extra: standalone +Provides-Extra: test + +==================== +sphinxcontrib-qthelp +==================== + +sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document. + +For more details, please visit http://www.sphinx-doc.org/. + +Installing +========== + +Install from PyPI:: + + pip install -U sphinxcontrib-qthelp + +Contributing +============ + +See `CONTRIBUTING.rst`__ + +.. __: https://github.com/sphinx-doc/sphinx/blob/master/CONTRIBUTING.rst + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/RECORD b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/RECORD new file mode 100644 index 000000000..7a68ddfed --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/RECORD @@ -0,0 +1,107 @@ +sphinxcontrib/qthelp/__init__.py,sha256=nYpNPUw-B4qMioaDs_PGxRn_bXwM9Baw6sPU7cPgmXc,10519 +sphinxcontrib/qthelp/__pycache__/__init__.cpython-312.pyc,, +sphinxcontrib/qthelp/locales/.tx/config,sha256=Z0tr-NEmeWUNyT5bIk34DwRA-_X03jCbNPDX3Pno4Ls,218 +sphinxcontrib/qthelp/locales/ar/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=8bLE-BpBtVLZjrq3lBG4o5xv1oGdYIMCnTXghYOpaIs,1194 +sphinxcontrib/qthelp/locales/ar/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=vxIxmiXxBK0hDiD4e3AuRz0dMlOscLIeIcMhzyQMPwY,1273 +sphinxcontrib/qthelp/locales/bn/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=L7fWpRDHds5LXm6qJUs2BTcSTzYGd-9yzLkMvx5AD9g,1112 +sphinxcontrib/qthelp/locales/bn/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=MX3bOnSCNPJDkUHppHpoAvunstwEDuD5JSkGmYl6Gug,1191 +sphinxcontrib/qthelp/locales/ca/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=mBqa1udafRqW3lU4ygRJFFH-SoLkAlwsqV2hJo8HQ-4,1112 +sphinxcontrib/qthelp/locales/ca/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=eSHghv24QvVMdsa9dHpsEag7EJTKn5qio6fuidGByw8,1191 +sphinxcontrib/qthelp/locales/cs/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=e-Nu5CSmG3fUH3uH8I428Iu2w99OYP-v94h9JZHry6I,1190 +sphinxcontrib/qthelp/locales/cs/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=ky_ndfoNw21j8qsnx6h2IzLqaXHLMJhImMeqgg87YUI,1269 +sphinxcontrib/qthelp/locales/cy/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=JbiLOR4ZwR4upvVaGAko8T4WrKcrcnYHy1msTEuItz4,1155 +sphinxcontrib/qthelp/locales/cy/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=IBTLtyYEZ_Yl_T2WcfBHFI0RII7O1RATl-d-_Kbv0_M,1234 +sphinxcontrib/qthelp/locales/da/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=zkhy1tH1tEuna4HTlM5De7R_LWsQ_iqO9oz9uReRSfc,1111 +sphinxcontrib/qthelp/locales/da/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=issCWPKUM3uifbS4AYcjvtcgubA8tvaK6s-TEKTUMRE,1190 +sphinxcontrib/qthelp/locales/de/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=2UCtfTaWGxaBBqhPu8U031ZST07ughx9gTW-nFPJa_I,1111 +sphinxcontrib/qthelp/locales/de/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=UbY7J1Kyy88Mqc92uGCF0bN8au_WtJUs8S6emFPySCE,1190 +sphinxcontrib/qthelp/locales/el/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=71MYEPbkbDGiOa7fFXxh3DThyMLuGiM0EF4HG3ggSII,1110 +sphinxcontrib/qthelp/locales/el/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=P6v-jKPX5OqSlcTUbxqMlkPpQVC3bizqD3chw8Odmi8,1189 +sphinxcontrib/qthelp/locales/eo/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=5gRrrg7q4cm6AfsEY1RvCqHG4NMD-jSdrbNGSNg2tqo,1114 +sphinxcontrib/qthelp/locales/eo/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=gUkv6NgaVD_KV6t-uh72yqifYN-uafDuJuHSKNy5VBg,1193 +sphinxcontrib/qthelp/locales/es/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=oilxN9qBLR5GxbD9ZPvMLbFjpDQcKGhoVxHX8dGhQBs,1128 +sphinxcontrib/qthelp/locales/es/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=GimJygYWkupb6Pkjy-6eEFwZbTPZ8i1pWiAHu3X1FHA,1328 +sphinxcontrib/qthelp/locales/et/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=zIgToE0v5B7_JkL09HvRgKjS0JPA6XkYyKL9kYqo69w,1134 +sphinxcontrib/qthelp/locales/et/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=LNrGeWIcnm-ZKY6EZ4-7-sly6x7H7A7v1rDAtR9-Mz4,1371 +sphinxcontrib/qthelp/locales/eu/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=Hu-KFiYi4soVAH9MPUnnCSswFwiTbubULNIsbLXlb5M,1111 +sphinxcontrib/qthelp/locales/eu/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=3732MpeM50HCzM7nyZ5mBF4TJoFq7VOmLImLE9LAprw,1190 +sphinxcontrib/qthelp/locales/fa/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=OpcVHSnoq-CZzTFP45x4CZWLUCzz4V9-uDugtyQRW3g,1111 +sphinxcontrib/qthelp/locales/fa/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=OcaedU-iS2oOkH54I1BO1ipjvnvBEw1WM8odqpM-8zs,1190 +sphinxcontrib/qthelp/locales/fi/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=hNzcuon80hQxuaKtMw9LJ3il2Qdi4KimG2pUKajDuvo,1112 +sphinxcontrib/qthelp/locales/fi/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=BgyBCJWLEKotpH2fev_NAezhJUt3NIHWKgbNKO5biG8,1191 +sphinxcontrib/qthelp/locales/fr/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=NxHm_EQQTK6Djh3FCT0w7ZaZh6m0WAeb8VFYgguCtds,1140 +sphinxcontrib/qthelp/locales/fr/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=tBUBTdLbcDin6y5PwGt12KSUthJD7Ap0KflnttijhA8,1350 +sphinxcontrib/qthelp/locales/he/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=mUn8JeJo7wBq_EJ4BF4a7GNxRa3Fp9yXw9d_Se4nwNg,1205 +sphinxcontrib/qthelp/locales/he/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=rpJ7cQoD8la7noK8U4InDslNvWzx1r2u3D8xXw8kiTo,1284 +sphinxcontrib/qthelp/locales/hi/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=NEBQn04iHtNPHb-giVtJ6XK3m1-p4GrimsH7C_15ENc,1110 +sphinxcontrib/qthelp/locales/hi/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=pPW0Zq4PkMv8UJYFVty0GqNj4Gy514zugeZYV065vWk,1189 +sphinxcontrib/qthelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=ub1AFI0xjHpveNuiNwERy01QV-n1A-0yfNyNqbsMUrc,1124 +sphinxcontrib/qthelp/locales/hi_IN/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=nYMsq23Z58ey4VEgL8Qu010tPDn96-4Njb03G3VYnKI,1203 +sphinxcontrib/qthelp/locales/hr/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=j66mxs3zNRYW2By7gYuh1SQ7Imn-LTIyUntUP1wpDlM,1185 +sphinxcontrib/qthelp/locales/hr/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=adeyezmeL98X13VaMxk3YRkbYFn47pwRMnXRahYOLKc,1264 +sphinxcontrib/qthelp/locales/hu/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=UBwMHxRESjDResmyJeUO5mMTgmE3kAe5Zl8YUUwEsOQ,1114 +sphinxcontrib/qthelp/locales/hu/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=CVBOvuXQyeH2WTyoYaPBwaO8rycAy6X4VAhiuZOJ0ZI,1193 +sphinxcontrib/qthelp/locales/id/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=sEJ_xge_5X3yiYW8rhQy6VyuBWjlzR-RN1n8V1VPScg,1117 +sphinxcontrib/qthelp/locales/id/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=cIzEp0fraZ8q8Wfa7ReFik4smevNnOueEZGmY0_Y4aY,1579 +sphinxcontrib/qthelp/locales/it/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=D-pF7zozlf99wgwHsqjN5kUBVjQXQU39UqSPgFXF-zw,1112 +sphinxcontrib/qthelp/locales/it/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=emfcZ0Hzgma40sn1qSMi-fRSXU-VRw545jMXJITGk1E,1191 +sphinxcontrib/qthelp/locales/ja/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=G0x_hU8zW_LfG0urxXvdtGVO7OpWl7okd61vS2ncuF8,1106 +sphinxcontrib/qthelp/locales/ja/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=5FyCRS7gCvxbkG22S0x3hp7zLK-8uxwWP9TgUggUeak,1185 +sphinxcontrib/qthelp/locales/ko/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=aRcK6a7m-eRVOkwxtAfOwc69b5VOsO9j9nffme_z2N4,1115 +sphinxcontrib/qthelp/locales/ko/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=UFo7eWR2JaETd2VuVIBd22qFmiIDpkykHWCMrow6XPw,1311 +sphinxcontrib/qthelp/locales/lt/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=yvl8ChtDRA7Sodlld1GZIc6ACGbNdNg1s9k7xFk9fOw,1246 +sphinxcontrib/qthelp/locales/lt/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=w4G5VOJQrgSbFabOOjmN4YKoTjW8WfaGzxtiyL0oyHY,1325 +sphinxcontrib/qthelp/locales/lv/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=YU_hfZUE0_G9-nOSARHuG6zGT2cIZcyWw3cKXIge00c,1147 +sphinxcontrib/qthelp/locales/lv/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=SZFviVqQAV2MwKnuh0gQXSSS6zSEoJAMFUNIVjOqnUo,1226 +sphinxcontrib/qthelp/locales/mk/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=fuV_26GnUcCqRPmUpw3TSdLsM2T26yW3gLg5LWmN4Ho,1145 +sphinxcontrib/qthelp/locales/mk/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=P0v0e_CbrdEfR6PKDi9-8Old1w0uB51cKnd7iuF0na4,1224 +sphinxcontrib/qthelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=t2cNAPyVmNSuwEMjTm_EEJVP87hLeXwjz6cS4SeHXM8,1137 +sphinxcontrib/qthelp/locales/nb_NO/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=a98epGd9-OJpHOl_H8qirNT-2nte0psSj6w10s7lc_0,1216 +sphinxcontrib/qthelp/locales/ne/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=fRW-C9KimhZiN1AhFjCuRkBBRkvKAhu-g6zeY3IlqOw,1111 +sphinxcontrib/qthelp/locales/ne/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=y2NOIIVgT9yVIKhra2nHT0zqA57RQKH7HgayyIoT-dM,1190 +sphinxcontrib/qthelp/locales/nl/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=uoE3skca8S1dM0A-SoXBaDgc7UafPhis1fjgxgFubuc,1110 +sphinxcontrib/qthelp/locales/nl/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=UkhWbbZPxQSLTvORYiibzIhmLczRPe7s6-0wu1Ws864,1189 +sphinxcontrib/qthelp/locales/pl/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=PdL_4-3f-TIIhpA2VvRSKL5B0dihueyjYhV9UChmbos,1249 +sphinxcontrib/qthelp/locales/pl/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=o8sAgwUaUfM8SZ2moLqLNGke83-rrFhdaX4hmGXDZ14,1430 +sphinxcontrib/qthelp/locales/pt/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=QOVz2vtE4Nq5HFIrWfUqQ5m0CDBe9o7GFDTvevAiqEM,1115 +sphinxcontrib/qthelp/locales/pt/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=F4GL3iz619wvfCHpMjOYByM-54DthfjqeGYy2au4bI0,1194 +sphinxcontrib/qthelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=0QcgkTYlFFMGrLz0tMn6UHdIkjw92fg6uQo0A_ocLf0,1129 +sphinxcontrib/qthelp/locales/pt_BR/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=AU8rxjuUGGxP_iWaypmrvIBxgo8IAHEsBtAc1s1h_3o,1208 +sphinxcontrib/qthelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=vj0uTru-sIWHHwvWmlgYFNlSBccNx65byDJ8McOK3HY,1132 +sphinxcontrib/qthelp/locales/pt_PT/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=WW1GrE5Eraiw-g9ooITVRkL3O70yMC0dRVKfL_bTVzk,1211 +sphinxcontrib/qthelp/locales/ro/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=gh6UBO6hhIGTtuRzrzlQKtfd6GiD1Jlc0i-_ffObrIg,1154 +sphinxcontrib/qthelp/locales/ro/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=A1zZBClgrNP0leAvleACZva3-H7zDKYN-kkh5sXUdbc,1233 +sphinxcontrib/qthelp/locales/ru/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=InzbfUm-EVH-T6d5_y-q_VkJTpbovW0wWarxlpduhFQ,1250 +sphinxcontrib/qthelp/locales/ru/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=yVqmyE4_RQCLsfNzlXTexQh2VL1zFMpnr5fxOb59oqA,1329 +sphinxcontrib/qthelp/locales/si/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=Lc3bYd9mgMhN_-4mV5MyYA-Dcl4We_GvkDkpVMS7TiE,1112 +sphinxcontrib/qthelp/locales/si/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=48Vlwl51ZCMNxBtFhchdC3dSvW1HeIHMAlMQdSkc0S8,1191 +sphinxcontrib/qthelp/locales/sk/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=q5-5qGb89Sx977l--zTm_Bqap_KFO9jp02wBCdH0kG0,1186 +sphinxcontrib/qthelp/locales/sk/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=Jm0xDxnT_K6rz1rmOrMiLOc6FnIgRkW9oyrqadkH4Yg,1265 +sphinxcontrib/qthelp/locales/sl/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=eAT67e0HlbZOATQtm0q74XZbP39mOaeOCJF-f5KxGWs,1166 +sphinxcontrib/qthelp/locales/sl/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=eZ8ufAALy5SGkzFj5Q5EwvgOR_7GddemcmrzE4nytjE,1245 +sphinxcontrib/qthelp/locales/sphinxcontrib.qthelp.pot,sha256=f45g6BS223VsVMYuot9UNr2ZTphVqDnfTl5KkmbomBE,1135 +sphinxcontrib/qthelp/locales/sr/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=JkHizpxIPbcAbT_X8CSbspHVzUyJVo_Jaco-VRVD_l0,1186 +sphinxcontrib/qthelp/locales/sr/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=lZWyf_3Q1RebgW05YcK_IrLwV_dOQ6Q7rNmZvxW3xdo,1265 +sphinxcontrib/qthelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=7KvrbNcVskX40_yZFjp1P1DIYa3-Yy_t5C291_mmxmg,1208 +sphinxcontrib/qthelp/locales/sr@latin/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=w07nFliDReC0TrtV03pjvgQtM4CWr2OuWi1pVqJqcPc,1287 +sphinxcontrib/qthelp/locales/sv/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=-HfigwmJdECHWB3X6FkL8Lr9iQjC_0tUbr1t9bRCnUw,1112 +sphinxcontrib/qthelp/locales/sv/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=SYyJ8Ax2_MAHYdT7GORsg4EfzxTCh5ycVhFQp9U_dQk,1191 +sphinxcontrib/qthelp/locales/ta/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=UGwbrgf_sNw7WsOd7xMde8G_SIRS-a_ogRA-G-fZCEQ,1110 +sphinxcontrib/qthelp/locales/ta/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=USQ5RROMORwhs_QXZg-YDU43Z7RIKdHC3h0XdOiBEHw,1189 +sphinxcontrib/qthelp/locales/tr/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=dCncMcgAzIaZA-MQ2p_JanEJYha-t72MCe7Y3hMLAf8,1111 +sphinxcontrib/qthelp/locales/tr/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=D8dh8e6gXMtD5wGZ0JYBk7jEzOomSN9qV5k_s4BRjtg,1190 +sphinxcontrib/qthelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=pMv8NSvMzs5o7c0L34H_qj64uzQE9Y178XxOo_ybkbU,1352 +sphinxcontrib/qthelp/locales/uk_UA/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=MZjy0-KTWIDCcXrbkTbbtonLWH7djcRWAwJESsRrgeI,1431 +sphinxcontrib/qthelp/locales/vi/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=a1LEiYGKL1Zlg3RaEbREXwjd9XvoAhH1KUjxzvv6SB0,1108 +sphinxcontrib/qthelp/locales/vi/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=klYW7lXfJZIjkIupI8Q81k-1DvzOlTBnCYiBYpMUoo0,1187 +sphinxcontrib/qthelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=mYvFSgYBEZGFLkBuMT3QeeTNrcLMksZasqo8ibAJXVs,1158 +sphinxcontrib/qthelp/locales/zh_CN/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=QRxl6mJND6LtT837aSLsH1wqxGwX8T9intrvf1vpzyw,1637 +sphinxcontrib/qthelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.qthelp.mo,sha256=L5E0NqIafmi9cjHsrj5t6ivNnqzXe1fg8nxb5K0QfX4,1120 +sphinxcontrib/qthelp/locales/zh_TW/LC_MESSAGES/sphinxcontrib.qthelp.po,sha256=VAvW-kwuEZ44_-kY1b_wToHlKDKuWMYb8BUcm1eZ8Zg,1199 +sphinxcontrib/qthelp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sphinxcontrib/qthelp/templates/project.qhcp,sha256=5nnVmeAKqPxe3ixxKiTy5d-mIkVUsa4LkfWi_9mIt4M,567 +sphinxcontrib/qthelp/templates/project.qhp,sha256=kqa1QlvdxgF74aePlDhHJe1_aB0OynfYPWh3oOsrazg,863 +sphinxcontrib_qthelp-2.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +sphinxcontrib_qthelp-2.0.0.dist-info/METADATA,sha256=07QrjeGQfEzpfZxxKRn0yz62cXH8ThDEs8OsPTaIxZQ,2313 +sphinxcontrib_qthelp-2.0.0.dist-info/RECORD,, +sphinxcontrib_qthelp-2.0.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/WHEEL b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/WHEEL new file mode 100644 index 000000000..3b5e64b5e --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_qthelp-2.0.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/INSTALLER b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/METADATA b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/METADATA new file mode 100644 index 000000000..c99d95dd6 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/METADATA @@ -0,0 +1,65 @@ +Metadata-Version: 2.1 +Name: sphinxcontrib-serializinghtml +Version: 2.0.0 +Summary: sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +Author-email: Georg Brandl +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Education +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Framework :: Sphinx +Classifier: Framework :: Sphinx :: Extension +Classifier: Topic :: Documentation +Classifier: Topic :: Documentation :: Sphinx +Classifier: Topic :: Text Processing +Classifier: Topic :: Utilities +Requires-Dist: ruff==0.5.5 ; extra == "lint" +Requires-Dist: mypy ; extra == "lint" +Requires-Dist: types-docutils ; extra == "lint" +Requires-Dist: Sphinx>=5 ; extra == "standalone" +Requires-Dist: pytest ; extra == "test" +Project-URL: Changelog, https://github.com/sphinx-doc/sphinxcontrib-serializinghtml/blob/master/CHANGES.rst +Project-URL: Code, https://github.com/sphinx-doc/sphinxcontrib-serializinghtml/ +Project-URL: Download, https://pypi.org/project/sphinxcontrib-serializinghtml/ +Project-URL: Homepage, https://www.sphinx-doc.org/ +Project-URL: Issue tracker, https://github.com/sphinx-doc/sphinx/issues/ +Provides-Extra: lint +Provides-Extra: standalone +Provides-Extra: test + +============================= +sphinxcontrib-serializinghtml +============================= + +sphinxcontrib-serializinghtml is a sphinx extension which outputs +"serialized" HTML files (json and pickle). + +For more details, please visit http://www.sphinx-doc.org/. + +Installing +========== + +Install from PyPI:: + + pip install -U sphinxcontrib-serializinghtml + +Contributing +============ + +See `CONTRIBUTING.rst`__ + +.. __: https://github.com/sphinx-doc/sphinx/blob/master/CONTRIBUTING.rst + diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/RECORD b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/RECORD new file mode 100644 index 000000000..76655ee6c --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/RECORD @@ -0,0 +1,119 @@ +sphinxcontrib/serializinghtml/__init__.py,sha256=-XOYApsnTYPXxTg3v9u0hwbqfg6p6pc1qUbCzGDCJW4,6630 +sphinxcontrib/serializinghtml/__pycache__/__init__.cpython-312.pyc,, +sphinxcontrib/serializinghtml/__pycache__/jsonimpl.cpython-312.pyc,, +sphinxcontrib/serializinghtml/jsonimpl.py,sha256=IyeZPUs3H_4pGnRTKCShgUATMUNwmdTS27qwYzQCH_I,863 +sphinxcontrib/serializinghtml/locales/.tx/config,sha256=7hNHvjjddtLg9Y3Qf5l6T3TBiCI_znxLOYHb4iC8Obg,245 +sphinxcontrib/serializinghtml/locales/ar/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=ChgKasrceB-E8L8sa2rrtKaKpbk04x0T_GRkdZfS75I,882 +sphinxcontrib/serializinghtml/locales/ar/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=M2-PtZu4I54j7q5TazgeWzLVJboal4izaB2QlLw03Cs,1346 +sphinxcontrib/serializinghtml/locales/bg/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=L9u1_9mS35M48cj0A0K11mdbZARjEcEiRAxZiVs_ALE,513 +sphinxcontrib/serializinghtml/locales/bg/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=OCWmdfRd5xh1tJ1cNLBjV8RBwblFpBIYdpw730cql8k,1001 +sphinxcontrib/serializinghtml/locales/bn/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=ydlY4eaPEyq4vXa0oKMHXUR8u-RFRkJEWORYr4edGyc,511 +sphinxcontrib/serializinghtml/locales/bn/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=A2RvRKjBOC7T48Rg7f2u6JKyvmnKYlFPh0Ds3cgD7jE,999 +sphinxcontrib/serializinghtml/locales/ca/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=cEtPR0Dn0Dv3XrQxM6ltisB3mPUvGY5WGwJyQLDnESc,511 +sphinxcontrib/serializinghtml/locales/ca/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=NTE8Js04eLebH0F9Z0qz1QrwhUmu-3gSjpzmLdSE19A,999 +sphinxcontrib/serializinghtml/locales/cak/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=DVoSDKizt0ItFvAWaHm1dxhOeNZji2jXN8Um8Sbgh6c,473 +sphinxcontrib/serializinghtml/locales/cak/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=c0IHHaWoKPOH1ynw8k5xx78IfMoY0Zaw8pFIgzgVI74,1003 +sphinxcontrib/serializinghtml/locales/cs/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=ZX9IZvxP-qfG-QFNBt76MEcSRKkG7UaP5XiQHuLFMj8,589 +sphinxcontrib/serializinghtml/locales/cs/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=-KXxsN-4jXq4F0fvb5igQsSObyKH41r8bXvMmzsKwJ8,1077 +sphinxcontrib/serializinghtml/locales/cy/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=qz-qfuLZxgfav0-q1JOnUx2GwdlrGbteYH8qqPattWM,554 +sphinxcontrib/serializinghtml/locales/cy/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=2y6qidUWcK2f6XQm19rX-ZzwowdCpjplklNyM67cK7Y,1042 +sphinxcontrib/serializinghtml/locales/da/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=9iKymXp0f8A988CU34wXr90mHsznU8y_akoxa0KGzho,751 +sphinxcontrib/serializinghtml/locales/da/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=sdnjiZA0z-GNQ5ny6Jiig3mIKIAiA8KKXwn4cOL2ZcU,1209 +sphinxcontrib/serializinghtml/locales/de/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=un-NfqHleTMfiLOK3HXPyvLKpCpSGq173GAXRleKw78,510 +sphinxcontrib/serializinghtml/locales/de/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=nWqund9h7qD2Kptlo-YbnuoopJA6f-D1wKEokngw_SM,998 +sphinxcontrib/serializinghtml/locales/el/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=Q0C4aw36F9jzrrpUdIVf_1zKCZCdv3ku3ENUiuhY9fc,871 +sphinxcontrib/serializinghtml/locales/el/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=EvTN2ySqWg8ILXKD7Sn4hrZo6Yc9pn_Kqo9390z5hTQ,1342 +sphinxcontrib/serializinghtml/locales/eo/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=RRUmg9TyRE__uJ_Hv5P5TXbl92yTy6qqlaeoZ0EDcHw,513 +sphinxcontrib/serializinghtml/locales/eo/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=eYtCTi8nCO5DNrX3YfhEUDssSXqbcnXQbnVjkS-HKrk,1001 +sphinxcontrib/serializinghtml/locales/es/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=rQ_vX_VJxoAYuAS1fkKslf9oxwWKTCBN8EjzrGO_SAY,797 +sphinxcontrib/serializinghtml/locales/es/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=xjYVqNUEfWv-071qb1Fx05g8OmpOX-RT9Dtl03H_MjI,1336 +sphinxcontrib/serializinghtml/locales/et/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=1cx4BSpSXPCvFLZtpWNikehogTm6LLo8a_Qxly6fWMs,663 +sphinxcontrib/serializinghtml/locales/et/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=Fx6yEH9Lhcn1rigR4RjUjwhNksJxAAZuHYB00XGXCxw,1188 +sphinxcontrib/serializinghtml/locales/eu/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=qOcV95iqdrPZ6Ujh96Iusexw9gVz5ZfT0es_HPRex5U,510 +sphinxcontrib/serializinghtml/locales/eu/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=Xea7yaXNy5A3bjYIf7zpcq6Y20H8oOGyRAsdC3aDulg,998 +sphinxcontrib/serializinghtml/locales/fa/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=Y_BhLrvbdEGOGHrxqD9T4nIBBiKG5qaNSlpqttpE03A,914 +sphinxcontrib/serializinghtml/locales/fa/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=cw2RYE5MbwA6MojL4OI7HUN2KEJBavzU6dCsK7ohfuw,1375 +sphinxcontrib/serializinghtml/locales/fi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=bvg2-3rpLLOa0s95HiU2t5Z-m6yDMjtmWdqeRn_v5P0,511 +sphinxcontrib/serializinghtml/locales/fi/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=f-vo2bNy-kMfiONS0iJDOxVqXBZRQwJ94HVSXYDKQDg,999 +sphinxcontrib/serializinghtml/locales/fr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=X3lKwIKMV_BOe1UQudxBBqgvbAwGwnw9DYwE1ZeBvNo,794 +sphinxcontrib/serializinghtml/locales/fr/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=vsmMIp_mGaxRBJQjEr7IJOUuRXT1XBxg8-M9ZEfWCt8,1298 +sphinxcontrib/serializinghtml/locales/he/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=S2jyH1v2WM4I7rgknJNiNpnGnohXmxa8d3ABB57-880,604 +sphinxcontrib/serializinghtml/locales/he/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=Q-dxHkD2tRNahRnMUDhfaRfTxI7LpnNDZQol6kENsYU,1092 +sphinxcontrib/serializinghtml/locales/hi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=DJxmbJt_6DESwF-IkJxh_MTVRWExjn3GI-IeKmAJgcQ,921 +sphinxcontrib/serializinghtml/locales/hi/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=S5qNo7gqPuJ-LHj2lWYHk7o6qHzr-AbVDgr0TGWftnU,1379 +sphinxcontrib/serializinghtml/locales/hi_IN/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=mmK-71L0AZV_Q6S_LFGmwmRQDGf-d7EMBYOT592A8RI,523 +sphinxcontrib/serializinghtml/locales/hi_IN/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=Jr1FYohjmUOzdFjLwr8o-cuiUE3ROag-zu0vzqJsFO8,1011 +sphinxcontrib/serializinghtml/locales/hr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=yOyZMfqWlgVeGywE2ey2-oIG0aaL-0pC8PJbjepFh4E,584 +sphinxcontrib/serializinghtml/locales/hr/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=CTCekjPHzdHNjiNap2K1VX4IJxiCBLh77H2qdFEnuwQ,1072 +sphinxcontrib/serializinghtml/locales/hu/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=8qtMdndBF_r8j2Iggw04FvS59BYxLiVX6_5f9wRjo4I,797 +sphinxcontrib/serializinghtml/locales/hu/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=yTZ88t5VC4LUXOQ4fK5LRWjTiAq4nIluLwwiXUViUpc,1240 +sphinxcontrib/serializinghtml/locales/id/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=EUWc3OwkjDoq5ONGLlkXkL5pSu3h11vEAgsWOIdV8-4,750 +sphinxcontrib/serializinghtml/locales/id/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=RdelUl5_YdCderUHff6C1q2Z-3Q0Bo5jxuTtsjFu8bk,1190 +sphinxcontrib/serializinghtml/locales/it/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=zhRe137pP0owE8JsQ5wfBGKaQ6ME7UYWd7wPlrPA2og,511 +sphinxcontrib/serializinghtml/locales/it/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=oz_lnhp65VolZBYobNqSkEjQXQ6oB5k2ILTJKPDQ1BU,999 +sphinxcontrib/serializinghtml/locales/ja/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=5oPkOwqJZEHoGUcdJbfqR-CFQhp0O_PdXNNE8vvj6-w,804 +sphinxcontrib/serializinghtml/locales/ja/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=kG49hlUixNkmOep39klJimQkSIceaMhaCfZ1dgqyDyM,1274 +sphinxcontrib/serializinghtml/locales/ko/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=KYcHVdxJHzkkJM7rcsclcGGUxNf3vCfBlb_AWrN-ckI,774 +sphinxcontrib/serializinghtml/locales/ko/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=nPodmzmiuke7HZuW9hp0DF3LlQZIwdM_0USSgK-_QDE,1220 +sphinxcontrib/serializinghtml/locales/lt/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=XyeoUIStVVBm7TfPlNk4fitzGUeCQcRfBCT_hLb9GL0,645 +sphinxcontrib/serializinghtml/locales/lt/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=XTH8KhuTj-1shXvi42kHS3VYNUTXGjJvPM_xUuZIGV8,1133 +sphinxcontrib/serializinghtml/locales/lv/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=rWj3Rriwi-a0wZw9IF8iK-8pLzAc5biCOUymu4oDL7k,546 +sphinxcontrib/serializinghtml/locales/lv/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=67BvqZijJCWUc7qTz2pmIwCBN_FjvcmOgDCT5UQzqCQ,1034 +sphinxcontrib/serializinghtml/locales/mk/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=BtUKL03wTpSeMBHSZijUYWLoNNUIMNcgeBEfe3dEEOQ,544 +sphinxcontrib/serializinghtml/locales/mk/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=1ayy3Af_WvsvSM2JVd8Ud4w-GOJWax_jjMGKHEJtXCY,1032 +sphinxcontrib/serializinghtml/locales/nb_NO/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=Td7YVKuswyYx0A4beaqZcFSJCOnVR-shlRtYd6cr2hk,536 +sphinxcontrib/serializinghtml/locales/nb_NO/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=kyV4Y5lfZkXRygUb-HZNlpNOoTjGj_J4PMoVWYfAupo,1024 +sphinxcontrib/serializinghtml/locales/ne/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=WJuRDwTpYVEDh669vuOebtb9NoeBuErvzlpH8AcEdew,510 +sphinxcontrib/serializinghtml/locales/ne/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=rCioKgNAxKDUuLWespQsEfWHCUNGqcWH8dRjjDCL8LU,998 +sphinxcontrib/serializinghtml/locales/nl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=F3vZq_SNcYvXwJvaCq0hGtI5w7uAGsrQPF5kJkYybGw,509 +sphinxcontrib/serializinghtml/locales/nl/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=iy8XIUCyE_HTOfPfdqQf40wHneSRYFFVmnHYjRNbQD8,997 +sphinxcontrib/serializinghtml/locales/pl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=PiA1oyd_BDFka2Zxu4smUDFOOHc9VwHEA_TgOn3SA80,760 +sphinxcontrib/serializinghtml/locales/pl/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=BPoCVD-KLLKSGuEmXN3EHEc1nQqVFH6M1vn71Q0xsTo,1260 +sphinxcontrib/serializinghtml/locales/pt/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=2rSpERkJthO16YLmNH17y690fW3jOk8bDqC_HXsnI-g,514 +sphinxcontrib/serializinghtml/locales/pt/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=5lDJLtyjxx7rQLB_hK8GTw_LIexFR7vG7BZlByrXPmA,1002 +sphinxcontrib/serializinghtml/locales/pt_BR/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=EqcP4hckVNtkwMHsks8jn_qlCyeGL8U6gnzsbzUW9Rg,802 +sphinxcontrib/serializinghtml/locales/pt_BR/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=39iMyfm3UQ1DUf6Xfii5Pz4QIaa9BBWDKjkMHy0d8bE,1270 +sphinxcontrib/serializinghtml/locales/pt_PT/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=Y_9ZdP-g7ZojARtb3wxXNLJEbJLj4bT0YhepQtCAIhA,531 +sphinxcontrib/serializinghtml/locales/pt_PT/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=gYb9iQ-t6OUMJdf6gomkhXxBpLUxStGcBTS9rKLwIQY,1019 +sphinxcontrib/serializinghtml/locales/ro/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=VdjlI_8J04tK6bXKqWo7KQ6_cHo6g9WHeDoK5qvFOk8,553 +sphinxcontrib/serializinghtml/locales/ro/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=VtlmQ6ASmCdZT_zPpaifLpQadwjMvaDuG4R6O2TXtNA,1041 +sphinxcontrib/serializinghtml/locales/ru/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=ofQEWO8BMnZaVqBeOcMj3DbZZow2lai7XNs7wfiWFRI,649 +sphinxcontrib/serializinghtml/locales/ru/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=_7bBli0wQ0CA-J5PJYMwVck3KbG8qMRwBDsXqaSp2NU,1137 +sphinxcontrib/serializinghtml/locales/si/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=3KIxPZRZsHzSQDUDm2wYP1BBkIrRwu_XcDSgpaWPc-w,511 +sphinxcontrib/serializinghtml/locales/si/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=qFa6gE5Fk46GlPr13_sstNJ_5DgZ-srQo-P_pGS7Jbs,999 +sphinxcontrib/serializinghtml/locales/sk/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=S2UDvzWg9WlLp68GxLLlL3BMxBsBxGbfOqSLR9qoYvU,833 +sphinxcontrib/serializinghtml/locales/sk/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=8FeQYXNzvFPZytNk10LD0IqCuPe0VP70HuEgu-f3Lnc,1284 +sphinxcontrib/serializinghtml/locales/sl/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=eRz5nNofpMVEGuENT4UGRLRhwBcXh-QMdLnHBz_jzkM,565 +sphinxcontrib/serializinghtml/locales/sl/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=YZj10XAnBPbETmX-yh1QCrOxHfEwIEC_LKn8oaA9J5w,1053 +sphinxcontrib/serializinghtml/locales/sphinxcontrib.serializinghtml.pot,sha256=YuaABl0kRhipM4W57IIkPt7GYSHLb-ftQOv-sR4jsto,940 +sphinxcontrib/serializinghtml/locales/sq/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=CaDU2MCcgOmg2LE9MgqiubpixENvO7yDAujehDKC6lQ,776 +sphinxcontrib/serializinghtml/locales/sq/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=v19-RQH-bNP4O7oD5qODtKZ3lcynYZGSMsqJ3iWFaGY,1241 +sphinxcontrib/serializinghtml/locales/sr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=byiPgTUYRBaaWHneuKYxrd6TKSUZyag2ekc88LP1Uzk,585 +sphinxcontrib/serializinghtml/locales/sr/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=HBqklmDJA741w_DAooNBQfTzSke8lN2xSpnGV1tmi9I,1073 +sphinxcontrib/serializinghtml/locales/sr@latin/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=VYqt79cQjAR5atFtQVl9Mc3b5NWkNXQ_hSLcS-okcQs,605 +sphinxcontrib/serializinghtml/locales/sr@latin/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=UyRHbg6vWeFk0zRrlwWpO5jJO2FhJmvnewky7JAvBuE,1093 +sphinxcontrib/serializinghtml/locales/sr_RS/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=tr3U1UR6iShIEXKCnFWaxZ-Dv7aRTWiv1urlevQmyHs,600 +sphinxcontrib/serializinghtml/locales/sr_RS/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=vyXXaiBxVJrM98VC_KrDc1C4U0mwbFcB9EF9GJTDwMY,1088 +sphinxcontrib/serializinghtml/locales/sv/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=zFz2z-mZRJt-okoGiV7PVHPFDuakY6NKmlM5AcljBO8,511 +sphinxcontrib/serializinghtml/locales/sv/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=ZEgWsOSXksXWcfGqzAPagBKP2Zx2qcB2FTmj2Lpk8e0,999 +sphinxcontrib/serializinghtml/locales/ta/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=inPpNstA19DWrtp6IlGw3FWW_zZ0g2oNwCl_A7ihf7A,509 +sphinxcontrib/serializinghtml/locales/ta/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=CCN_l9bUQENHr9qrh-iT3zuDkLDd1pd1TBSwyVsIGuY,997 +sphinxcontrib/serializinghtml/locales/te/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=RxhOeZ94h2uig50p7jjPM8FonmRHIruZm9BtlYluG_w,510 +sphinxcontrib/serializinghtml/locales/te/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=o49uQcceEmYM48g_n6FdJKoEbL5NUmtWJiY8GH3lQxY,998 +sphinxcontrib/serializinghtml/locales/tr/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=ydxic_2yz3coPwELuehKpTRckrm9LpEOZd6i6tGmdlU,762 +sphinxcontrib/serializinghtml/locales/tr/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=Ubisy2moWNdZPYR5veCNE16buwkbFb3lVZHJaBrRa2U,1195 +sphinxcontrib/serializinghtml/locales/uk_UA/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=5O2o8oX5CJyqOmYoDfrhWh9Fe3uZISwlmAKpzoqnUCA,751 +sphinxcontrib/serializinghtml/locales/uk_UA/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=9ETJVuP4Mx6IwGNBzMVJeU8iSQHfh66O5oHswcZkzV8,1239 +sphinxcontrib/serializinghtml/locales/ur/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=dY5U4ecpp88hcXa8ckJfGqLQ_QSU4kOzGBcVQvhyBvg,508 +sphinxcontrib/serializinghtml/locales/ur/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=adHKOqY7o-6YdtKN4pJzjkeKwZrxFwSJP7mwwxEX5jo,996 +sphinxcontrib/serializinghtml/locales/vi/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=06aGXhUWYuwQYL2D9Xol2LFsswJQw2Cf9rAct0G05W4,507 +sphinxcontrib/serializinghtml/locales/vi/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=jLN9PWxoR--9p6f6ClBbrVD455-tOKIAQC7CCVa00lk,995 +sphinxcontrib/serializinghtml/locales/zh_CN/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=0xgnU_5DktyqvsGWiOoFelxHd-_aH3oGvqDCHZ6Xr4Q,784 +sphinxcontrib/serializinghtml/locales/zh_CN/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=cghBveDDH9t8F25Sy6vsmzteb9ZVtYo8HXoVKwyel9Y,1243 +sphinxcontrib/serializinghtml/locales/zh_TW/LC_MESSAGES/sphinxcontrib.serializinghtml.mo,sha256=T0GZubm1WrWBy2II5uRrIm3D80t1AdrPTsqb7021wac,519 +sphinxcontrib/serializinghtml/locales/zh_TW/LC_MESSAGES/sphinxcontrib.serializinghtml.po,sha256=uCfTymNf5b6IN7zhsKsQ_7uw2c0FNUJlZau_NBZi4Lk,1007 +sphinxcontrib/serializinghtml/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sphinxcontrib_serializinghtml-2.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +sphinxcontrib_serializinghtml-2.0.0.dist-info/METADATA,sha256=dDDUNt2A2poxk3W4C_pxsIJwFHuUpd9Aq0uRsQZZ0lc,2403 +sphinxcontrib_serializinghtml-2.0.0.dist-info/RECORD,, +sphinxcontrib_serializinghtml-2.0.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/WHEEL b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/WHEEL new file mode 100644 index 000000000..3b5e64b5e --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/sphinxcontrib_serializinghtml-2.0.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/INSTALLER b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/METADATA b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/METADATA new file mode 100644 index 000000000..15116c784 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/METADATA @@ -0,0 +1,154 @@ +Metadata-Version: 2.4 +Name: urllib3 +Version: 2.5.0 +Summary: HTTP library with thread-safe connection pooling, file post, and more. +Project-URL: Changelog, https://github.com/urllib3/urllib3/blob/main/CHANGES.rst +Project-URL: Documentation, https://urllib3.readthedocs.io +Project-URL: Code, https://github.com/urllib3/urllib3 +Project-URL: Issue tracker, https://github.com/urllib3/urllib3/issues +Author-email: Andrey Petrov +Maintainer-email: Seth Michael Larson , Quentin Pradet , Illia Volochii +License-Expression: MIT +License-File: LICENSE.txt +Keywords: filepost,http,httplib,https,pooling,ssl,threadsafe,urllib +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP +Classifier: Topic :: Software Development :: Libraries +Requires-Python: >=3.9 +Provides-Extra: brotli +Requires-Dist: brotli>=1.0.9; (platform_python_implementation == 'CPython') and extra == 'brotli' +Requires-Dist: brotlicffi>=0.8.0; (platform_python_implementation != 'CPython') and extra == 'brotli' +Provides-Extra: h2 +Requires-Dist: h2<5,>=4; extra == 'h2' +Provides-Extra: socks +Requires-Dist: pysocks!=1.5.7,<2.0,>=1.5.6; extra == 'socks' +Provides-Extra: zstd +Requires-Dist: zstandard>=0.18.0; extra == 'zstd' +Description-Content-Type: text/markdown + +

    + +![urllib3](https://github.com/urllib3/urllib3/raw/main/docs/_static/banner_github.svg) + +

    + +

    + PyPI Version + Python Versions + Join our Discord + Coverage Status + Build Status on GitHub + Documentation Status
    + OpenSSF Scorecard + SLSA 3 + CII Best Practices +

    + +urllib3 is a powerful, *user-friendly* HTTP client for Python. Much of the +Python ecosystem already uses urllib3 and you should too. +urllib3 brings many critical features that are missing from the Python +standard libraries: + +- Thread safety. +- Connection pooling. +- Client-side SSL/TLS verification. +- File uploads with multipart encoding. +- Helpers for retrying requests and dealing with HTTP redirects. +- Support for gzip, deflate, brotli, and zstd encoding. +- Proxy support for HTTP and SOCKS. +- 100% test coverage. + +urllib3 is powerful and easy to use: + +```python3 +>>> import urllib3 +>>> resp = urllib3.request("GET", "http://httpbin.org/robots.txt") +>>> resp.status +200 +>>> resp.data +b"User-agent: *\nDisallow: /deny\n" +``` + +## Installing + +urllib3 can be installed with [pip](https://pip.pypa.io): + +```bash +$ python -m pip install urllib3 +``` + +Alternatively, you can grab the latest source code from [GitHub](https://github.com/urllib3/urllib3): + +```bash +$ git clone https://github.com/urllib3/urllib3.git +$ cd urllib3 +$ pip install . +``` + + +## Documentation + +urllib3 has usage and reference documentation at [urllib3.readthedocs.io](https://urllib3.readthedocs.io). + + +## Community + +urllib3 has a [community Discord channel](https://discord.gg/urllib3) for asking questions and +collaborating with other contributors. Drop by and say hello 👋 + + +## Contributing + +urllib3 happily accepts contributions. Please see our +[contributing documentation](https://urllib3.readthedocs.io/en/latest/contributing.html) +for some tips on getting started. + + +## Security Disclosures + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure with maintainers. + + +## Maintainers + +- [@sethmlarson](https://github.com/sethmlarson) (Seth M. Larson) +- [@pquentin](https://github.com/pquentin) (Quentin Pradet) +- [@illia-v](https://github.com/illia-v) (Illia Volochii) +- [@theacodes](https://github.com/theacodes) (Thea Flowers) +- [@haikuginger](https://github.com/haikuginger) (Jess Shapiro) +- [@lukasa](https://github.com/lukasa) (Cory Benfield) +- [@sigmavirus24](https://github.com/sigmavirus24) (Ian Stapleton Cordasco) +- [@shazow](https://github.com/shazow) (Andrey Petrov) + +👋 + + +## Sponsorship + +If your company benefits from this library, please consider [sponsoring its +development](https://urllib3.readthedocs.io/en/latest/sponsors.html). + + +## For Enterprise + +Professional support for urllib3 is available as part of the [Tidelift +Subscription][1]. Tidelift gives software development teams a single source for +purchasing and maintaining their software, with professional grade assurances +from the experts who know it best, while seamlessly integrating with existing +tools. + +[1]: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/RECORD b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/RECORD new file mode 100644 index 000000000..91383f148 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/RECORD @@ -0,0 +1,79 @@ +urllib3-2.5.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +urllib3-2.5.0.dist-info/METADATA,sha256=maYkTIZt0a-lkEC-hMZWbCBmcGZyJcYOeRk4_nuTrNc,6461 +urllib3-2.5.0.dist-info/RECORD,, +urllib3-2.5.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +urllib3-2.5.0.dist-info/licenses/LICENSE.txt,sha256=Ew46ZNX91dCWp1JpRjSn2d8oRGnehuVzIQAmgEHj1oY,1093 +urllib3/__init__.py,sha256=JMo1tg1nIV1AeJ2vENC_Txfl0e5h6Gzl9DGVk1rWRbo,6979 +urllib3/__pycache__/__init__.cpython-312.pyc,, +urllib3/__pycache__/_base_connection.cpython-312.pyc,, +urllib3/__pycache__/_collections.cpython-312.pyc,, +urllib3/__pycache__/_request_methods.cpython-312.pyc,, +urllib3/__pycache__/_version.cpython-312.pyc,, +urllib3/__pycache__/connection.cpython-312.pyc,, +urllib3/__pycache__/connectionpool.cpython-312.pyc,, +urllib3/__pycache__/exceptions.cpython-312.pyc,, +urllib3/__pycache__/fields.cpython-312.pyc,, +urllib3/__pycache__/filepost.cpython-312.pyc,, +urllib3/__pycache__/poolmanager.cpython-312.pyc,, +urllib3/__pycache__/response.cpython-312.pyc,, +urllib3/_base_connection.py,sha256=T1cwH3RhzsrBh6Bz3AOGVDboRsE7veijqZPXXQTR2Rg,5568 +urllib3/_collections.py,sha256=tM7c6J1iKtWZYV_QGYb8-r7Nr1524Dehnsa0Ufh6_mU,17295 +urllib3/_request_methods.py,sha256=gCeF85SO_UU4WoPwYHIoz_tw-eM_EVOkLFp8OFsC7DA,9931 +urllib3/_version.py,sha256=ZlSUkBo_Pd90B6pM0GDO7l2vitQD3QCK3xPR_K0zFJA,511 +urllib3/connection.py,sha256=iP4pgSJtpusXyYlejzNn-gih_wWCxMU-qy6OU1kaapc,42613 +urllib3/connectionpool.py,sha256=ZEhudsa8BIubD2M0XoxBBsjxbsXwMgUScH7oQ9i-j1Y,43371 +urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3/contrib/__pycache__/__init__.cpython-312.pyc,, +urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc,, +urllib3/contrib/__pycache__/socks.cpython-312.pyc,, +urllib3/contrib/emscripten/__init__.py,sha256=u6KNgzjlFZbuAAXa_ybCR7gQ71VJESnF-IIdDA73brw,733 +urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.pyc,, +urllib3/contrib/emscripten/__pycache__/connection.cpython-312.pyc,, +urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.pyc,, +urllib3/contrib/emscripten/__pycache__/request.cpython-312.pyc,, +urllib3/contrib/emscripten/__pycache__/response.cpython-312.pyc,, +urllib3/contrib/emscripten/connection.py,sha256=j8DR_flE7hsoFhNfiqHLiaPaCsVbzG44jgahwvsQ52A,8771 +urllib3/contrib/emscripten/emscripten_fetch_worker.js,sha256=CDfYF_9CDobtx2lGidyJ1zjDEvwNT5F-dchmVWXDh0E,3655 +urllib3/contrib/emscripten/fetch.py,sha256=kco06lWoQ-fdFfN51-nzeTywPVBEHg89WIst33H3xcg,23484 +urllib3/contrib/emscripten/request.py,sha256=mL28szy1KvE3NJhWor5jNmarp8gwplDU-7gwGZY5g0Q,566 +urllib3/contrib/emscripten/response.py,sha256=7oVPENYZHuzEGRtG40HonpH5tAIYHsGcHPbJt2Z0U-Y,9507 +urllib3/contrib/pyopenssl.py,sha256=Xp5Ym05VgXGhHa0C4wlutvHxY8SnKSS6WLb2t5Miu0s,19720 +urllib3/contrib/socks.py,sha256=-iardc61GypsJzD6W6yuRS7KVCyfowcQrl_719H7lIM,7549 +urllib3/exceptions.py,sha256=pziumHf0Vwx3z4gvUy7ou8nlM2yIYX0N3l3znEdeF5U,9938 +urllib3/fields.py,sha256=FCf7UULSkf10cuTRUWTQESzxgl1WT8e2aCy3kfyZins,10829 +urllib3/filepost.py,sha256=U8eNZ-mpKKHhrlbHEEiTxxgK16IejhEa7uz42yqA_dI,2388 +urllib3/http2/__init__.py,sha256=xzrASH7R5ANRkPJOot5lGnATOq3KKuyXzI42rcnwmqs,1741 +urllib3/http2/__pycache__/__init__.cpython-312.pyc,, +urllib3/http2/__pycache__/connection.cpython-312.pyc,, +urllib3/http2/__pycache__/probe.cpython-312.pyc,, +urllib3/http2/connection.py,sha256=4DB0DkZEC3yIkhGjUDIHB17wrYCLaL0Ag5bDW2_mGPI,12694 +urllib3/http2/probe.py,sha256=nnAkqbhAakOiF75rz7W0udZ38Eeh_uD8fjV74N73FEI,3014 +urllib3/poolmanager.py,sha256=oKsgP1EsAI4OVgK9-9D3AYXZS5HYV8yKUSog-QbJ8Ts,23866 +urllib3/py.typed,sha256=UaCuPFa3H8UAakbt-5G8SPacldTOGvJv18pPjUJ5gDY,93 +urllib3/response.py,sha256=TVTSu6Q1U0U7hoHYMIRxxuh4zroeMo8b5EI4DOA13Eo,46480 +urllib3/util/__init__.py,sha256=-qeS0QceivazvBEKDNFCAI-6ACcdDOE4TMvo7SLNlAQ,1001 +urllib3/util/__pycache__/__init__.cpython-312.pyc,, +urllib3/util/__pycache__/connection.cpython-312.pyc,, +urllib3/util/__pycache__/proxy.cpython-312.pyc,, +urllib3/util/__pycache__/request.cpython-312.pyc,, +urllib3/util/__pycache__/response.cpython-312.pyc,, +urllib3/util/__pycache__/retry.cpython-312.pyc,, +urllib3/util/__pycache__/ssl_.cpython-312.pyc,, +urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc,, +urllib3/util/__pycache__/ssltransport.cpython-312.pyc,, +urllib3/util/__pycache__/timeout.cpython-312.pyc,, +urllib3/util/__pycache__/url.cpython-312.pyc,, +urllib3/util/__pycache__/util.cpython-312.pyc,, +urllib3/util/__pycache__/wait.cpython-312.pyc,, +urllib3/util/connection.py,sha256=JjO722lzHlzLXPTkr9ZWBdhseXnMVjMSb1DJLVrXSnQ,4444 +urllib3/util/proxy.py,sha256=seP8-Q5B6bB0dMtwPj-YcZZQ30vHuLqRu-tI0JZ2fzs,1148 +urllib3/util/request.py,sha256=XuAsEBT58DAZYUTwpMH5Hr3A1OPoMNvNIYIunbIqbc8,8411 +urllib3/util/response.py,sha256=vQE639uoEhj1vpjEdxu5lNIhJCSUZkd7pqllUI0BZOA,3374 +urllib3/util/retry.py,sha256=bj-2YUqblxLlv8THg5fxww-DM54XCbjgZXIQ71XioCY,18459 +urllib3/util/ssl_.py,sha256=jxnQ3msYkVaokJVWqHNnAVdVtDdidrTHDeyk50gwqaQ,19786 +urllib3/util/ssl_match_hostname.py,sha256=Di7DU7zokoltapT_F0Sj21ffYxwaS_cE5apOtwueeyA,5845 +urllib3/util/ssltransport.py,sha256=Ez4O8pR_vT8dan_FvqBYS6dgDfBXEMfVfrzcdUoWfi4,8847 +urllib3/util/timeout.py,sha256=4eT1FVeZZU7h7mYD1Jq2OXNe4fxekdNvhoWUkZusRpA,10346 +urllib3/util/url.py,sha256=WRh-TMYXosmgp8m8lT4H5spoHw5yUjlcMCfU53AkoAs,15205 +urllib3/util/util.py,sha256=j3lbZK1jPyiwD34T8IgJzdWEZVT-4E-0vYIJi9UjeNA,1146 +urllib3/util/wait.py,sha256=_ph8IrUR3sqPqi0OopQgJUlH4wzkGeM5CiyA7XGGtmI,4423 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/WHEEL b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/WHEEL new file mode 100644 index 000000000..12228d414 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/licenses/LICENSE.txt b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/licenses/LICENSE.txt new file mode 100644 index 000000000..e6183d027 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3-2.5.0.dist-info/licenses/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2008-2020 Andrey Petrov and contributors. + +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. diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__init__.py new file mode 100644 index 000000000..3fe782c8a --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__init__.py @@ -0,0 +1,211 @@ +""" +Python HTTP library with thread-safe connection pooling, file post support, user friendly, and more +""" + +from __future__ import annotations + +# Set default logging handler to avoid "No handler found" warnings. +import logging +import sys +import typing +import warnings +from logging import NullHandler + +from . import exceptions +from ._base_connection import _TYPE_BODY +from ._collections import HTTPHeaderDict +from ._version import __version__ +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url +from .filepost import _TYPE_FIELDS, encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import BaseHTTPResponse, HTTPResponse +from .util.request import make_headers +from .util.retry import Retry +from .util.timeout import Timeout + +# Ensure that Python is compiled with OpenSSL 1.1.1+ +# If the 'ssl' module isn't available at all that's +# fine, we only care if the module is available. +try: + import ssl +except ImportError: + pass +else: + if not ssl.OPENSSL_VERSION.startswith("OpenSSL "): # Defensive: + warnings.warn( + "urllib3 v2 only supports OpenSSL 1.1.1+, currently " + f"the 'ssl' module is compiled with {ssl.OPENSSL_VERSION!r}. " + "See: https://github.com/urllib3/urllib3/issues/3020", + exceptions.NotOpenSSLWarning, + ) + elif ssl.OPENSSL_VERSION_INFO < (1, 1, 1): # Defensive: + raise ImportError( + "urllib3 v2 only supports OpenSSL 1.1.1+, currently " + f"the 'ssl' module is compiled with {ssl.OPENSSL_VERSION!r}. " + "See: https://github.com/urllib3/urllib3/issues/2168" + ) + +__author__ = "Andrey Petrov (andrey.petrov@shazow.net)" +__license__ = "MIT" +__version__ = __version__ + +__all__ = ( + "HTTPConnectionPool", + "HTTPHeaderDict", + "HTTPSConnectionPool", + "PoolManager", + "ProxyManager", + "HTTPResponse", + "Retry", + "Timeout", + "add_stderr_logger", + "connection_from_url", + "disable_warnings", + "encode_multipart_formdata", + "make_headers", + "proxy_from_url", + "request", + "BaseHTTPResponse", +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger( + level: int = logging.DEBUG, +) -> logging.StreamHandler[typing.TextIO]: + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s")) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug("Added a stderr logging handler to logger: %s", __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter("always", exceptions.SecurityWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter("default", exceptions.InsecurePlatformWarning, append=True) + + +def disable_warnings(category: type[Warning] = exceptions.HTTPWarning) -> None: + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter("ignore", category) + + +_DEFAULT_POOL = PoolManager() + + +def request( + method: str, + url: str, + *, + body: _TYPE_BODY | None = None, + fields: _TYPE_FIELDS | None = None, + headers: typing.Mapping[str, str] | None = None, + preload_content: bool | None = True, + decode_content: bool | None = True, + redirect: bool | None = True, + retries: Retry | bool | int | None = None, + timeout: Timeout | float | int | None = 3, + json: typing.Any | None = None, +) -> BaseHTTPResponse: + """ + A convenience, top-level request method. It uses a module-global ``PoolManager`` instance. + Therefore, its side effects could be shared across dependencies relying on it. + To avoid side effects create a new ``PoolManager`` instance and use it instead. + The method does not accept low-level ``**urlopen_kw`` keyword arguments. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param url: + The URL to perform the request on. + + :param body: + Data to send in the request body, either :class:`str`, :class:`bytes`, + an iterable of :class:`str`/:class:`bytes`, or a file-like object. + + :param fields: + Data to encode and send in the request body. + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. + + :param bool preload_content: + If True, the response's body will be preloaded into memory. + + :param bool decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param json: + Data to encode and send as JSON with UTF-encoded in the request body. + The ``"Content-Type"`` header will be set to ``"application/json"`` + unless specified otherwise. + """ + + return _DEFAULT_POOL.request( + method, + url, + body=body, + fields=fields, + headers=headers, + preload_content=preload_content, + decode_content=decode_content, + redirect=redirect, + retries=retries, + timeout=timeout, + json=json, + ) + + +if sys.platform == "emscripten": + from .contrib.emscripten import inject_into_urllib3 # noqa: 401 + + inject_into_urllib3() diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3882957da681e3dd2bbc2473355f876444bbc45f GIT binary patch literal 7335 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 WnEH75`0r-^MF81lKM~U0K>q=p7;uCD literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e7606e21a35d73d089f972a4a6fdf3deb341b11 GIT binary patch literal 22594 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 R)jFf4s?EO>D49X^{{exsJedFh literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11cf40b668765f3c3997120ba1fa84a32def39c9 GIT binary patch literal 10627 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 M!CZe=W@)(UAHZ9=YybcN literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b24c2da3167469d1249f88c225be13e4e95d4c0 GIT binary patch literal 38438 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 E8?u~r!vFvP literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a087c2174fa7e702671ac7417ecab4d727bdfb3 GIT binary patch literal 16636 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd86fa53ade69bf5eb5cf01ae5eeee5b50fcd05a GIT binary patch literal 12047 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd1adf8afa581f7fb35ff2fbecb556a13c71e0f2 GIT binary patch literal 3514 zcma)8Z)_7s7N1@3`hQ{)=MN!3x4`8viR~kSw&Z{ch*6Vd2hJsk$bjy7*M-0F?@KpQunJzTbU1o$kwhv6WPbwp5B#q&vQaQt9sc>E5ipcF3hC z#`3(`H*em&dGF2d&EH#E{0Q2g|0K^`^da;u`*50A8*nf7aR}W;3Q{-?<+voru`#dl zN#3Teq|2s4Qn0C*6oI-lcg~aafUKa1nm6Z5`f~oHpF=#tuGubUlO|Q%k6<6x6i*NI z$siVIciD`WI^gbpiD7@>5Z-}(S)Q%L{u;HlwEc)Y;~&^YPeV&hM>4Dg6z@kuvO@_f zKA@dGq_p^u^HW+C|3_l7tH?(}&zQOhX9Z+kH>gZiLpLYj+jF`|u{rwQGj_fRZ*`|G z{_=bxb#^o{K9ah0YJ4h@x;S-yJYfYd;13Geq-RyEDRW|hW}|OCbHSnv)9f@B7hrNP zbQs)5wC**8W_d@XNohTbFzaq|osq&hK6mIWWWm<NY|-Kk)AAIEtSd&&aw|AvDEJHXf*JF}2k{vrhvTw_Ka8I%o+rjE z&QLR+m^>ey0I}L=bmVO6f{`|8oEE4-R9TD18Y4|j$MZ!xW9UP%!-H{Cr8t_GGgsv+ zu)07rm>-H~RSoA2lg9EzE40Oa5(Yz99-Dp8&7<$VDA=(Y=&c5N@14Fsc6aOn`D|i2 z(7zfOtOf>`14k;t5z+>tnMT0igN0{53+CTo@GjzB3TO$@Mo4D`5ZKZl)n`dt3C()8 zOv0xVxEq|#m(UHa#EqcK{RrLQn@LmRsn=QA&?lDoKXA9pBNX@>@H$qZAXFV#&CMiIinIZN~ie%w!>-HwZN)O*N@xWTk^w2c&Be zi54J*ObJ3RDJleXz#cLo6Qt~=!x;@yZg~3F^%%wKiZ@@K>H0Pk5x3=6AwNwj>ltjh zX)zDUYI)Add3zv2)N>|buCoGJV&qaa3nDJdUDIoML4?R@4O?Q3!|o&80MgDDwX@lj zJ&`ifb`p|3Fv0%j6m6JbNl%3kAHe{(Yqe*S@5p6 z^?Zi}acDt&66h@Bd%s!<99nDdzV+_Y_Pwj^hpO#|9wsX7gUi9e=ROeokIAm`Z%(~- z>UA#DNDyE#wv7xUz}<`tjYQx}+`ON%BiOCM=bAWCLXYYR3d!;pNETO#-!8cnNT<)B z4t(y~4l@*&qs5^dq5)^$67O)g(_C`Rwm6ba>e%Y6p2V(a;}aH!}ca@qY=3IP5m|P5>%2V zR^Z}*^h!7osTCQf^^&YXX_aJxr93e**fg;srHj&VwxDN*r~eO{#5MtggDiE^om$p3 zel#mV?U&3v&ZuCzGQj+ygV$n)@1F_#eCKm1s*90)yD; z=J;rIj&JeLc{F%;=+VO_!v**jqEYDgZWEB7H*7f(2@+Oa?22Z?mnB{&fNYi<+d;S7 z_9wAg3Dy+=ycsM5F)e{bmayw&xm2B6E|U_=dj->L%-az+VedDn?e&sx328$q683x} z``Jt|W9SrK3Ml|)Y@-@Gj03JcwcS$<<5Mhs>@5$$>LK`>|AGzxb~g%!ZylQ-S@VP{ zp6(~%eaqnk3*M(~`yZTLZtMRJwTinJ#5Hel$-n3?U%2Bf&pqg3c4y=aytD*jfqsyT;R)ja#JBJ>>^LV%tJ~=t0-Q<_R#`{@I?K(_B4ZMU zrEP{0!HE$zcuotsaUnoRs+ zDlu^;K^TnHtY%L#JAnyH5W?P;wwLT;{e$;-&QJ;(K1q(k1S@jpW9T+q9LIfw_I-;& zU!#_w6LS_KE%rd5}5K literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40ae2c0b4dff8aac289b4a1c8d1b561449e65caa GIT binary patch literal 24428 zcmb_^d2k!qd1p5c0w6#Fyl=93NFsQE5_NNQjBd#zQHrR!Xgd&yZc5H1+M0^8nQY?PKNhy+vUh6# z*x&d10x4(`X9E^rfBpKs?;ZW#cfbB`H8s^7e*fh^M=no%k>mcBZj7H(1NbNPHjcZ) ziJZvCxdcDW^90-CwrLx?+NbU8>X>%0t8?0kt36(oa80{dSx4NR@JxFEJH@Jab;3LC zP57pL?A{fxNz_i)GT0sWCj!#}27BUliTdgKM8kALqH(&BMC){G zqHVg3<$L4piH_+G2K(ZjiLU7`2G_*96Ft*C46cm}iQeg62K(cEiT>$+1_$B;iA~d+ z5}T(t^PJ?En>2=RUFB*vuEFU+TpL@+JZ9vlKySxTZ zhs1{IF|l!atBpIsiA`^EVl!HrF-lt3ckOzOaSvzxiQQt$n~v%2XvsEr*(z;7(spV5 zUA!au{Zq<_t>3Xt@09AL1_te7y=p_R+ND~v2fJBr2XZ^5-Dd6{u}ADeU-mBAg2GR! z!62`CBgtec9ZAPhNo5lEH5cSaRGNuI-?*?iFCoLVAjjuYvE)x_LV`B6_T+^N=T1ry zQIe0wqG`41ycCs^>GG^Pa0mF!+h?8{zfa^jmA*B}5 zm@@mza$NPyM`T3`V>a>7F(t)kF$G>4^qEL9a!Ha^AM3GkS36IW6`qw-30BFcy5Ep+ zAB#(>Cn{k=%0P5RQQgrwvqPlv){Bpp$`iV_cBkz@svtTxb1B9@FL77`mWBiGht zdQBuTS;K+Rr=@FY)khtfk0{F3lq{-#MUsI%d^x40laYiJ<6h*rC@nAJr*91Y$quZc zJDkK#^CCBGdl^ItUyd*6y{bjX)-=TP1U~5{yyP($~ zMC3~g32a0~NMDYmg=lIaE($Y}fMs+gCQ71^PT>jefk#MaOKwDnr4@#ca+MJwC9^UM zN$l?UVk~(Hc#Qq2gsRP^qYFwpm7ul-ZBHtKa+$RlOGe`hqQub5#-zBY2(cvYVhSsb zo<#(G`Gpud)vlyvwVIZchDuxKw3H=@7{jr!SgGU!E2QkJ~>bJmiFFwDeL(KnWw(+l%)>GS9zrYf2KB2cg* z^{l(81vx5(Bccd0pnO`5QpR((L#PbfqXB~G-`q1bbZ2d1>y~X~R@>OjOZ6JwnZ>lE z82A}RbAMu!F9ozIDC>it+9=!lOHH^5T{u1Uibe_yTrEbqja0#Uuz@l#%x3E``BR2@ zYU(uTHW3H|v)KcKaIklih+I=*OVUy=NZXPGf}8$)*(_rKUo@wgmA}k*4dxeA)WFP^ zOPEnemAwlM4jW}P;*ait(-?K?Xq;x8BUG&KEI2xg%|gK;6dSq< zf@4#$YrNnX*VCq+f}^L{#IV(M6dWDJI`%Z6VcuJC>@Btg3yxs1b$h|Fz1Yff+F1F{ z%>~EiVq1T~(T}zsI=bWw#yFz7z=nH{BT*Y1j(=i9?j0_}&*`Egd#Wez>euVGj7{X* za5txO#Y&~93{ieuZU2O_HpVaPN4YPKaNKo!#-6cV;S~NYcgB{nQ~ewKTeWFjB_OO? z?wqTlhKbj}h7C>a0=*l(CoLugch$@PPHT1AXP@>Wy;N75IF>=gc@ULp;rp=)eeB z-`=Wy?g(8*J2yP(MgtqhOCOP?NLm8NV@wzO zUw}X;q-K#r;vxVC%$!!MM*KKO$`3yJy!37+LxS(;7B(ul@~XBU#JEg_kb6OlORi=v^O zVWp@`pk)gvLyhYq0~-&G0Ep12z~ppe6d~c%tgx6`5U$1)^e!btFGoP&wB}}{%aJQF z@X8TG7Gby|@w6l-X?miOcsw!_M=wzG;zc5pvq?+bzj#rfkqJo95hiqmqj6Bz35JK} z86y-}7GYRWB;o31Df#R;fH{P+5Jhxh1>#XeAlfN14rJoH8q+8F;zezmFJ5F5eeohq zHEw`O5uTN0CeqNE1bV9Xa3gYk2>Qzp>o4CL$RWX62cz-W8lLaHSCE?_R6z%h&c5Y6otdD7N<8b>~}yYprAX*0DnC zwi_q1C-aV`VsqEZ?CsQA^Kia-xX?U`?BicOTdLv$2Y=4loG)bUMQ`n`E#Ew_a_MgL z?RdU>*Q1VsyRWWJz4L{&O}q1(b{977Ep$v|Pux24&C?|(YLt9jL;IcK+rzo;P@#V8 z#!E$4ea_YWXdt*cTo~Aub>#v=-rf7u%>^27ow#%Q_UUg;7X1A`=XmEfv?gr%zV{vP z>XCx5HS4-nwbF3g_rTp%vg2vV&DD3T)%E4;`lxSxS!dB3SaCh@_7uB%(Su{(oTMJ~ zm8vX&aFEV%k}uHi@hJAuoecME^xZOnUnZe2x^bM!E_d(WmiNYPfElqylo zq4{%Y5dS2EN&Q9z1rxR{yW|u#)zUUyB|34()Jw9{hz*vthTS)2xmjLxy;(Eu5}QOf zEGF*tB~YhX^dR2@sAc0b
    `Z#t)|#WvB4QeLfu*j}Mzhv-8|pYcTO6l+kU#<-`e z*d^8?uXcS~uq*jd({Gf7Z6|UgMc{75l_`)T+;N*ZAoMFspvK9kUmC z#jbNK=#{Cfibmw+nOIr|Lo%p~0fCnI#7wI zF7}RY-(loKLk(83o~9>Zj9@CLMG7Yu5;Kxa%<>r $&Y?0`@aTLWQJq7j`}A~!BY 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 None: ... + + def set_tunnel( + self, + host: str, + port: int | None = None, + headers: typing.Mapping[str, str] | None = None, + scheme: str = "http", + ) -> None: ... + + def connect(self) -> None: ... + + def request( + self, + method: str, + url: str, + body: _TYPE_BODY | None = None, + headers: typing.Mapping[str, str] | None = None, + # We know *at least* botocore is depending on the order of the + # first 3 parameters so to be safe we only mark the later ones + # as keyword-only to ensure we have space to extend. + *, + chunked: bool = False, + preload_content: bool = True, + decode_content: bool = True, + enforce_content_length: bool = True, + ) -> None: ... + + def getresponse(self) -> BaseHTTPResponse: ... + + def close(self) -> None: ... + + @property + def is_closed(self) -> bool: + """Whether the connection either is brand new or has been previously closed. + If this property is True then both ``is_connected`` and ``has_connected_to_proxy`` + properties must be False. + """ + + @property + def is_connected(self) -> bool: + """Whether the connection is actively connected to any origin (proxy or target)""" + + @property + def has_connected_to_proxy(self) -> bool: + """Whether the connection has successfully connected to its proxy. + This returns False if no proxy is in use. Used to determine whether + errors are coming from the proxy layer or from tunnelling to the target origin. + """ + + class BaseHTTPSConnection(BaseHTTPConnection, Protocol): + default_port: typing.ClassVar[int] + default_socket_options: typing.ClassVar[_TYPE_SOCKET_OPTIONS] + + # Certificate verification methods + cert_reqs: int | str | None + assert_hostname: None | str | typing.Literal[False] + assert_fingerprint: str | None + ssl_context: ssl.SSLContext | None + + # Trusted CAs + ca_certs: str | None + ca_cert_dir: str | None + ca_cert_data: None | str | bytes + + # TLS version + ssl_minimum_version: int | None + ssl_maximum_version: int | None + ssl_version: int | str | None # Deprecated + + # Client certificates + cert_file: str | None + key_file: str | None + key_password: str | None + + def __init__( + self, + host: str, + port: int | None = None, + *, + timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, + source_address: tuple[str, int] | None = None, + blocksize: int = 16384, + socket_options: _TYPE_SOCKET_OPTIONS | None = ..., + proxy: Url | None = None, + proxy_config: ProxyConfig | None = None, + cert_reqs: int | str | None = None, + assert_hostname: None | str | typing.Literal[False] = None, + assert_fingerprint: str | None = None, + server_hostname: str | None = None, + ssl_context: ssl.SSLContext | None = None, + ca_certs: str | None = None, + ca_cert_dir: str | None = None, + ca_cert_data: None | str | bytes = None, + ssl_minimum_version: int | None = None, + ssl_maximum_version: int | None = None, + ssl_version: int | str | None = None, # Deprecated + cert_file: str | None = None, + key_file: str | None = None, + key_password: str | None = None, + ) -> None: ... diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_collections.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_collections.py new file mode 100644 index 000000000..1b6c13642 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_collections.py @@ -0,0 +1,479 @@ +from __future__ import annotations + +import typing +from collections import OrderedDict +from enum import Enum, auto +from threading import RLock + +if typing.TYPE_CHECKING: + # We can only import Protocol if TYPE_CHECKING because it's a development + # dependency, and is not available at runtime. + from typing import Protocol + + from typing_extensions import Self + + class HasGettableStringKeys(Protocol): + def keys(self) -> typing.Iterator[str]: ... + + def __getitem__(self, key: str) -> str: ... + + +__all__ = ["RecentlyUsedContainer", "HTTPHeaderDict"] + + +# Key type +_KT = typing.TypeVar("_KT") +# Value type +_VT = typing.TypeVar("_VT") +# Default type +_DT = typing.TypeVar("_DT") + +ValidHTTPHeaderSource = typing.Union[ + "HTTPHeaderDict", + typing.Mapping[str, str], + typing.Iterable[tuple[str, str]], + "HasGettableStringKeys", +] + + +class _Sentinel(Enum): + not_passed = auto() + + +def ensure_can_construct_http_header_dict( + potential: object, +) -> ValidHTTPHeaderSource | None: + if isinstance(potential, HTTPHeaderDict): + return potential + elif isinstance(potential, typing.Mapping): + # Full runtime checking of the contents of a Mapping is expensive, so for the + # purposes of typechecking, we assume that any Mapping is the right shape. + return typing.cast(typing.Mapping[str, str], potential) + elif isinstance(potential, typing.Iterable): + # Similarly to Mapping, full runtime checking of the contents of an Iterable is + # expensive, so for the purposes of typechecking, we assume that any Iterable + # is the right shape. + return typing.cast(typing.Iterable[tuple[str, str]], potential) + elif hasattr(potential, "keys") and hasattr(potential, "__getitem__"): + return typing.cast("HasGettableStringKeys", potential) + else: + return None + + +class RecentlyUsedContainer(typing.Generic[_KT, _VT], typing.MutableMapping[_KT, _VT]): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + _container: typing.OrderedDict[_KT, _VT] + _maxsize: int + dispose_func: typing.Callable[[_VT], None] | None + lock: RLock + + def __init__( + self, + maxsize: int = 10, + dispose_func: typing.Callable[[_VT], None] | None = None, + ) -> None: + super().__init__() + self._maxsize = maxsize + self.dispose_func = dispose_func + self._container = OrderedDict() + self.lock = RLock() + + def __getitem__(self, key: _KT) -> _VT: + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key: _KT, value: _VT) -> None: + evicted_item = None + with self.lock: + # Possibly evict the existing value of 'key' + try: + # If the key exists, we'll overwrite it, which won't change the + # size of the pool. Because accessing a key should move it to + # the end of the eviction line, we pop it out first. + evicted_item = key, self._container.pop(key) + self._container[key] = value + except KeyError: + # When the key does not exist, we insert the value first so that + # evicting works in all cases, including when self._maxsize is 0 + self._container[key] = value + if len(self._container) > self._maxsize: + # If we didn't evict an existing value, and we've hit our maximum + # size, then we have to evict the least recently used item from + # the beginning of the container. + evicted_item = self._container.popitem(last=False) + + # After releasing the lock on the pool, dispose of any evicted value. + if evicted_item is not None and self.dispose_func: + _, evicted_value = evicted_item + self.dispose_func(evicted_value) + + def __delitem__(self, key: _KT) -> None: + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self) -> int: + with self.lock: + return len(self._container) + + def __iter__(self) -> typing.NoReturn: + raise NotImplementedError( + "Iteration over this class is unlikely to be threadsafe." + ) + + def clear(self) -> None: + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(self._container.values()) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self) -> set[_KT]: # type: ignore[override] + with self.lock: + return set(self._container.keys()) + + +class HTTPHeaderDictItemView(set[tuple[str, str]]): + """ + HTTPHeaderDict is unusual for a Mapping[str, str] in that it has two modes of + address. + + If we directly try to get an item with a particular name, we will get a string + back that is the concatenated version of all the values: + + >>> d['X-Header-Name'] + 'Value1, Value2, Value3' + + However, if we iterate over an HTTPHeaderDict's items, we will optionally combine + these values based on whether combine=True was called when building up the dictionary + + >>> d = HTTPHeaderDict({"A": "1", "B": "foo"}) + >>> d.add("A", "2", combine=True) + >>> d.add("B", "bar") + >>> list(d.items()) + [ + ('A', '1, 2'), + ('B', 'foo'), + ('B', 'bar'), + ] + + This class conforms to the interface required by the MutableMapping ABC while + also giving us the nonstandard iteration behavior we want; items with duplicate + keys, ordered by time of first insertion. + """ + + _headers: HTTPHeaderDict + + def __init__(self, headers: HTTPHeaderDict) -> None: + self._headers = headers + + def __len__(self) -> int: + return len(list(self._headers.iteritems())) + + def __iter__(self) -> typing.Iterator[tuple[str, str]]: + return self._headers.iteritems() + + def __contains__(self, item: object) -> bool: + if isinstance(item, tuple) and len(item) == 2: + passed_key, passed_val = item + if isinstance(passed_key, str) and isinstance(passed_val, str): + return self._headers._has_value_for_header(passed_key, passed_val) + return False + + +class HTTPHeaderDict(typing.MutableMapping[str, str]): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + _container: typing.MutableMapping[str, list[str]] + + def __init__(self, headers: ValidHTTPHeaderSource | None = None, **kwargs: str): + super().__init__() + self._container = {} # 'dict' is insert-ordered + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key: str, val: str) -> None: + # avoid a bytes/str comparison by decoding before httplib + if isinstance(key, bytes): + key = key.decode("latin-1") + self._container[key.lower()] = [key, val] + + def __getitem__(self, key: str) -> str: + val = self._container[key.lower()] + return ", ".join(val[1:]) + + def __delitem__(self, key: str) -> None: + del self._container[key.lower()] + + def __contains__(self, key: object) -> bool: + if isinstance(key, str): + return key.lower() in self._container + return False + + def setdefault(self, key: str, default: str = "") -> str: + return super().setdefault(key, default) + + def __eq__(self, other: object) -> bool: + maybe_constructable = ensure_can_construct_http_header_dict(other) + if maybe_constructable is None: + return False + else: + other_as_http_header_dict = type(self)(maybe_constructable) + + return {k.lower(): v for k, v in self.itermerged()} == { + k.lower(): v for k, v in other_as_http_header_dict.itermerged() + } + + def __ne__(self, other: object) -> bool: + return not self.__eq__(other) + + def __len__(self) -> int: + return len(self._container) + + def __iter__(self) -> typing.Iterator[str]: + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def discard(self, key: str) -> None: + try: + del self[key] + except KeyError: + pass + + def add(self, key: str, val: str, *, combine: bool = False) -> None: + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + If this is called with combine=True, instead of adding a new header value + as a distinct item during iteration, this will instead append the value to + any existing header value with a comma. If no existing header value exists + for the key, then the value will simply be added, ignoring the combine parameter. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + >>> list(headers.items()) + [('foo', 'bar'), ('foo', 'baz')] + >>> headers.add('foo', 'quz', combine=True) + >>> list(headers.items()) + [('foo', 'bar, baz, quz')] + """ + # avoid a bytes/str comparison by decoding before httplib + if isinstance(key, bytes): + key = key.decode("latin-1") + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + # if there are values here, then there is at least the initial + # key/value pair + assert len(vals) >= 2 + if combine: + vals[-1] = vals[-1] + ", " + val + else: + vals.append(val) + + def extend(self, *args: ValidHTTPHeaderSource, **kwargs: str) -> None: + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError( + f"extend() takes at most 1 positional arguments ({len(args)} given)" + ) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, typing.Mapping): + for key, val in other.items(): + self.add(key, val) + elif isinstance(other, typing.Iterable): + other = typing.cast(typing.Iterable[tuple[str, str]], other) + for key, value in other: + self.add(key, value) + elif hasattr(other, "keys") and hasattr(other, "__getitem__"): + # THIS IS NOT A TYPESAFE BRANCH + # In this branch, the object has a `keys` attr but is not a Mapping or any of + # the other types indicated in the method signature. We do some stuff with + # it as though it partially implements the Mapping interface, but we're not + # doing that stuff safely AT ALL. + for key in other.keys(): + self.add(key, other[key]) + + for key, value in kwargs.items(): + self.add(key, value) + + @typing.overload + def getlist(self, key: str) -> list[str]: ... + + @typing.overload + def getlist(self, key: str, default: _DT) -> list[str] | _DT: ... + + def getlist( + self, key: str, default: _Sentinel | _DT = _Sentinel.not_passed + ) -> list[str] | _DT: + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is _Sentinel.not_passed: + # _DT is unbound; empty list is instance of List[str] + return [] + # _DT is bound; default is instance of _DT + return default + else: + # _DT may or may not be bound; vals[1:] is instance of List[str], which + # meets our external interface requirement of `Union[List[str], _DT]`. + return vals[1:] + + def _prepare_for_method_change(self) -> Self: + """ + Remove content-specific header fields before changing the request + method to GET or HEAD according to RFC 9110, Section 15.4. + """ + content_specific_headers = [ + "Content-Encoding", + "Content-Language", + "Content-Location", + "Content-Type", + "Content-Length", + "Digest", + "Last-Modified", + ] + for header in content_specific_headers: + self.discard(header) + return self + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self) -> str: + return f"{type(self).__name__}({dict(self.itermerged())})" + + def _copy_from(self, other: HTTPHeaderDict) -> None: + for key in other: + val = other.getlist(key) + self._container[key.lower()] = [key, *val] + + def copy(self) -> Self: + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self) -> typing.Iterator[tuple[str, str]]: + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self) -> typing.Iterator[tuple[str, str]]: + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ", ".join(val[1:]) + + def items(self) -> HTTPHeaderDictItemView: # type: ignore[override] + return HTTPHeaderDictItemView(self) + + def _has_value_for_header(self, header_name: str, potential_value: str) -> bool: + if header_name in self: + return potential_value in self._container[header_name.lower()][1:] + return False + + def __ior__(self, other: object) -> HTTPHeaderDict: + # Supports extending a header dict in-place using operator |= + # combining items with add instead of __setitem__ + maybe_constructable = ensure_can_construct_http_header_dict(other) + if maybe_constructable is None: + return NotImplemented + self.extend(maybe_constructable) + return self + + def __or__(self, other: object) -> Self: + # Supports merging header dicts using operator | + # combining items with add instead of __setitem__ + maybe_constructable = ensure_can_construct_http_header_dict(other) + if maybe_constructable is None: + return NotImplemented + result = self.copy() + result.extend(maybe_constructable) + return result + + def __ror__(self, other: object) -> Self: + # Supports merging header dicts using operator | when other is on left side + # combining items with add instead of __setitem__ + maybe_constructable = ensure_can_construct_http_header_dict(other) + if maybe_constructable is None: + return NotImplemented + result = type(self)(maybe_constructable) + result.extend(self) + return result diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_request_methods.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_request_methods.py new file mode 100644 index 000000000..297c271bf --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_request_methods.py @@ -0,0 +1,278 @@ +from __future__ import annotations + +import json as _json +import typing +from urllib.parse import urlencode + +from ._base_connection import _TYPE_BODY +from ._collections import HTTPHeaderDict +from .filepost import _TYPE_FIELDS, encode_multipart_formdata +from .response import BaseHTTPResponse + +__all__ = ["RequestMethods"] + +_TYPE_ENCODE_URL_FIELDS = typing.Union[ + typing.Sequence[tuple[str, typing.Union[str, bytes]]], + typing.Mapping[str, typing.Union[str, bytes]], +] + + +class RequestMethods: + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`urllib3.HTTPConnectionPool` and + :class:`urllib3.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = {"DELETE", "GET", "HEAD", "OPTIONS"} + + def __init__(self, headers: typing.Mapping[str, str] | None = None) -> None: + self.headers = headers or {} + + def urlopen( + self, + method: str, + url: str, + body: _TYPE_BODY | None = None, + headers: typing.Mapping[str, str] | None = None, + encode_multipart: bool = True, + multipart_boundary: str | None = None, + **kw: typing.Any, + ) -> BaseHTTPResponse: # Abstract + raise NotImplementedError( + "Classes extending RequestMethods must implement " + "their own ``urlopen`` method." + ) + + def request( + self, + method: str, + url: str, + body: _TYPE_BODY | None = None, + fields: _TYPE_FIELDS | None = None, + headers: typing.Mapping[str, str] | None = None, + json: typing.Any | None = None, + **urlopen_kw: typing.Any, + ) -> BaseHTTPResponse: + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param url: + The URL to perform the request on. + + :param body: + Data to send in the request body, either :class:`str`, :class:`bytes`, + an iterable of :class:`str`/:class:`bytes`, or a file-like object. + + :param fields: + Data to encode and send in the URL or request body, depending on ``method``. + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param json: + Data to encode and send as JSON with UTF-encoded in the request body. + The ``"Content-Type"`` header will be set to ``"application/json"`` + unless specified otherwise. + """ + method = method.upper() + + if json is not None and body is not None: + raise TypeError( + "request got values for both 'body' and 'json' parameters which are mutually exclusive" + ) + + if json is not None: + if headers is None: + headers = self.headers + + if not ("content-type" in map(str.lower, headers.keys())): + headers = HTTPHeaderDict(headers) + headers["Content-Type"] = "application/json" + + body = _json.dumps(json, separators=(",", ":"), ensure_ascii=False).encode( + "utf-8" + ) + + if body is not None: + urlopen_kw["body"] = body + + if method in self._encode_url_methods: + return self.request_encode_url( + method, + url, + fields=fields, # type: ignore[arg-type] + headers=headers, + **urlopen_kw, + ) + else: + return self.request_encode_body( + method, url, fields=fields, headers=headers, **urlopen_kw + ) + + def request_encode_url( + self, + method: str, + url: str, + fields: _TYPE_ENCODE_URL_FIELDS | None = None, + headers: typing.Mapping[str, str] | None = None, + **urlopen_kw: str, + ) -> BaseHTTPResponse: + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param url: + The URL to perform the request on. + + :param fields: + Data to encode and send in the URL. + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + """ + if headers is None: + headers = self.headers + + extra_kw: dict[str, typing.Any] = {"headers": headers} + extra_kw.update(urlopen_kw) + + if fields: + url += "?" + urlencode(fields) + + return self.urlopen(method, url, **extra_kw) + + def request_encode_body( + self, + method: str, + url: str, + fields: _TYPE_FIELDS | None = None, + headers: typing.Mapping[str, str] | None = None, + encode_multipart: bool = True, + multipart_boundary: str | None = None, + **urlopen_kw: str, + ) -> BaseHTTPResponse: + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :func:`urllib3.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :func:`urllib.parse.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimic behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param url: + The URL to perform the request on. + + :param fields: + Data to encode and send in the request body. + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param encode_multipart: + If True, encode the ``fields`` using the multipart/form-data MIME + format. + + :param multipart_boundary: + If not specified, then a random boundary will be generated using + :func:`urllib3.filepost.choose_boundary`. + """ + if headers is None: + headers = self.headers + + extra_kw: dict[str, typing.Any] = {"headers": HTTPHeaderDict(headers)} + body: bytes | str + + if fields: + if "body" in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one." + ) + + if encode_multipart: + body, content_type = encode_multipart_formdata( + fields, boundary=multipart_boundary + ) + else: + body, content_type = ( + urlencode(fields), # type: ignore[arg-type] + "application/x-www-form-urlencoded", + ) + + extra_kw["body"] = body + extra_kw["headers"].setdefault("Content-Type", content_type) + + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_version.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_version.py new file mode 100644 index 000000000..49707ce59 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/_version.py @@ -0,0 +1,21 @@ +# file generated by setuptools-scm +# don't change, don't track in version control + +__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"] + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import Tuple + from typing import Union + + VERSION_TUPLE = Tuple[Union[int, str], ...] +else: + VERSION_TUPLE = object + +version: str +__version__: str +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE + +__version__ = version = '2.5.0' +__version_tuple__ = version_tuple = (2, 5, 0) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/connection.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/connection.py new file mode 100644 index 000000000..8082387d9 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/connection.py @@ -0,0 +1,1093 @@ +from __future__ import annotations + +import datetime +import http.client +import logging +import os +import re +import socket +import sys +import threading +import typing +import warnings +from http.client import HTTPConnection as _HTTPConnection +from http.client import HTTPException as HTTPException # noqa: F401 +from http.client import ResponseNotReady +from socket import timeout as SocketTimeout + +if typing.TYPE_CHECKING: + from .response import HTTPResponse + from .util.ssl_ import _TYPE_PEER_CERT_RET_DICT + from .util.ssltransport import SSLTransport + +from ._collections import HTTPHeaderDict +from .http2 import probe as http2_probe +from .util.response import assert_header_parsing +from .util.timeout import _DEFAULT_TIMEOUT, _TYPE_TIMEOUT, Timeout +from .util.util import to_str +from .util.wait import wait_for_read + +try: # Compiled with SSL? + import ssl + + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): + ssl = None # type: ignore[assignment] + + class BaseSSLError(BaseException): # type: ignore[no-redef] + pass + + +from ._base_connection import _TYPE_BODY +from ._base_connection import ProxyConfig as ProxyConfig +from ._base_connection import _ResponseOptions as _ResponseOptions +from ._version import __version__ +from .exceptions import ( + ConnectTimeoutError, + HeaderParsingError, + NameResolutionError, + NewConnectionError, + ProxyError, + SystemTimeWarning, +) +from .util import SKIP_HEADER, SKIPPABLE_HEADERS, connection, ssl_ +from .util.request import body_to_chunks +from .util.ssl_ import assert_fingerprint as _assert_fingerprint +from .util.ssl_ import ( + create_urllib3_context, + is_ipaddress, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .util.ssl_match_hostname import CertificateError, match_hostname +from .util.url import Url + +# Not a no-op, we're adding this to the namespace so it can be imported. +ConnectionError = ConnectionError +BrokenPipeError = BrokenPipeError + + +log = logging.getLogger(__name__) + +port_by_scheme = {"http": 80, "https": 443} + +# When it comes time to update this value as a part of regular maintenance +# (ie test_recent_date is failing) update it to ~6 months before the current date. +RECENT_DATE = datetime.date(2025, 1, 1) + +_CONTAINS_CONTROL_CHAR_RE = re.compile(r"[^-!#$%&'*+.^_`|~0-9a-zA-Z]") + + +class HTTPConnection(_HTTPConnection): + """ + Based on :class:`http.client.HTTPConnection` but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``source_address``: Set the source address for the current connection. + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass: + + .. code-block:: python + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port: typing.ClassVar[int] = port_by_scheme["http"] # type: ignore[misc] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options: typing.ClassVar[connection._TYPE_SOCKET_OPTIONS] = [ + (socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + ] + + #: Whether this connection verifies the host's certificate. + is_verified: bool = False + + #: Whether this proxy connection verified the proxy host's certificate. + # If no proxy is currently connected to the value will be ``None``. + proxy_is_verified: bool | None = None + + blocksize: int + source_address: tuple[str, int] | None + socket_options: connection._TYPE_SOCKET_OPTIONS | None + + _has_connected_to_proxy: bool + _response_options: _ResponseOptions | None + _tunnel_host: str | None + _tunnel_port: int | None + _tunnel_scheme: str | None + + def __init__( + self, + host: str, + port: int | None = None, + *, + timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, + source_address: tuple[str, int] | None = None, + blocksize: int = 16384, + socket_options: None | ( + connection._TYPE_SOCKET_OPTIONS + ) = default_socket_options, + proxy: Url | None = None, + proxy_config: ProxyConfig | None = None, + ) -> None: + super().__init__( + host=host, + port=port, + timeout=Timeout.resolve_default_timeout(timeout), + source_address=source_address, + blocksize=blocksize, + ) + self.socket_options = socket_options + self.proxy = proxy + self.proxy_config = proxy_config + + self._has_connected_to_proxy = False + self._response_options = None + self._tunnel_host: str | None = None + self._tunnel_port: int | None = None + self._tunnel_scheme: str | None = None + + @property + def host(self) -> str: + """ + Getter method to remove any trailing dots that indicate the hostname is an FQDN. + + In general, SSL certificates don't include the trailing dot indicating a + fully-qualified domain name, and thus, they don't validate properly when + checked against a domain name that includes the dot. In addition, some + servers may not expect to receive the trailing dot when provided. + + However, the hostname with trailing dot is critical to DNS resolution; doing a + lookup with the trailing dot will properly only resolve the appropriate FQDN, + whereas a lookup without a trailing dot will search the system's search domain + list. Thus, it's important to keep the original host around for use only in + those cases where it's appropriate (i.e., when doing DNS lookup to establish the + actual TCP connection across which we're going to send HTTP requests). + """ + return self._dns_host.rstrip(".") + + @host.setter + def host(self, value: str) -> None: + """ + Setter for the `host` property. + + We assume that only urllib3 uses the _dns_host attribute; httplib itself + only uses `host`, and it seems reasonable that other libraries follow suit. + """ + self._dns_host = value + + def _new_conn(self) -> socket.socket: + """Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + try: + sock = connection.create_connection( + (self._dns_host, self.port), + self.timeout, + source_address=self.source_address, + socket_options=self.socket_options, + ) + except socket.gaierror as e: + raise NameResolutionError(self.host, self, e) from e + except SocketTimeout as e: + raise ConnectTimeoutError( + self, + f"Connection to {self.host} timed out. (connect timeout={self.timeout})", + ) from e + + except OSError as e: + raise NewConnectionError( + self, f"Failed to establish a new connection: {e}" + ) from e + + sys.audit("http.client.connect", self, self.host, self.port) + + return sock + + def set_tunnel( + self, + host: str, + port: int | None = None, + headers: typing.Mapping[str, str] | None = None, + scheme: str = "http", + ) -> None: + if scheme not in ("http", "https"): + raise ValueError( + f"Invalid proxy scheme for tunneling: {scheme!r}, must be either 'http' or 'https'" + ) + super().set_tunnel(host, port=port, headers=headers) + self._tunnel_scheme = scheme + + if sys.version_info < (3, 11, 9) or ((3, 12) <= sys.version_info < (3, 12, 3)): + # Taken from python/cpython#100986 which was backported in 3.11.9 and 3.12.3. + # When using connection_from_host, host will come without brackets. + def _wrap_ipv6(self, ip: bytes) -> bytes: + if b":" in ip and ip[0] != b"["[0]: + return b"[" + ip + b"]" + return ip + + if sys.version_info < (3, 11, 9): + # `_tunnel` copied from 3.11.13 backporting + # https://github.com/python/cpython/commit/0d4026432591d43185568dd31cef6a034c4b9261 + # and https://github.com/python/cpython/commit/6fbc61070fda2ffb8889e77e3b24bca4249ab4d1 + def _tunnel(self) -> None: + _MAXLINE = http.client._MAXLINE # type: ignore[attr-defined] + connect = b"CONNECT %s:%d HTTP/1.0\r\n" % ( # type: ignore[str-format] + self._wrap_ipv6(self._tunnel_host.encode("ascii")), # type: ignore[union-attr] + self._tunnel_port, + ) + headers = [connect] + for header, value in self._tunnel_headers.items(): # type: ignore[attr-defined] + headers.append(f"{header}: {value}\r\n".encode("latin-1")) + headers.append(b"\r\n") + # Making a single send() call instead of one per line encourages + # the host OS to use a more optimal packet size instead of + # potentially emitting a series of small packets. + self.send(b"".join(headers)) + del headers + + response = self.response_class(self.sock, method=self._method) # type: ignore[attr-defined] + try: + (version, code, message) = response._read_status() # type: ignore[attr-defined] + + if code != http.HTTPStatus.OK: + self.close() + raise OSError( + f"Tunnel connection failed: {code} {message.strip()}" + ) + while True: + line = response.fp.readline(_MAXLINE + 1) + if len(line) > _MAXLINE: + raise http.client.LineTooLong("header line") + if not line: + # for sites which EOF without sending a trailer + break + if line in (b"\r\n", b"\n", b""): + break + + if self.debuglevel > 0: + print("header:", line.decode()) + finally: + response.close() + + elif (3, 12) <= sys.version_info < (3, 12, 3): + # `_tunnel` copied from 3.12.11 backporting + # https://github.com/python/cpython/commit/23aef575c7629abcd4aaf028ebd226fb41a4b3c8 + def _tunnel(self) -> None: # noqa: F811 + connect = b"CONNECT %s:%d HTTP/1.1\r\n" % ( # type: ignore[str-format] + self._wrap_ipv6(self._tunnel_host.encode("idna")), # type: ignore[union-attr] + self._tunnel_port, + ) + headers = [connect] + for header, value in self._tunnel_headers.items(): # type: ignore[attr-defined] + headers.append(f"{header}: {value}\r\n".encode("latin-1")) + headers.append(b"\r\n") + # Making a single send() call instead of one per line encourages + # the host OS to use a more optimal packet size instead of + # potentially emitting a series of small packets. + self.send(b"".join(headers)) + del headers + + response = self.response_class(self.sock, method=self._method) # type: ignore[attr-defined] + try: + (version, code, message) = response._read_status() # type: ignore[attr-defined] + + self._raw_proxy_headers = http.client._read_headers(response.fp) # type: ignore[attr-defined] + + if self.debuglevel > 0: + for header in self._raw_proxy_headers: + print("header:", header.decode()) + + if code != http.HTTPStatus.OK: + self.close() + raise OSError( + f"Tunnel connection failed: {code} {message.strip()}" + ) + + finally: + response.close() + + def connect(self) -> None: + self.sock = self._new_conn() + if self._tunnel_host: + # If we're tunneling it means we're connected to our proxy. + self._has_connected_to_proxy = True + + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + + # If there's a proxy to be connected to we are fully connected. + # This is set twice (once above and here) due to forwarding proxies + # not using tunnelling. + self._has_connected_to_proxy = bool(self.proxy) + + if self._has_connected_to_proxy: + self.proxy_is_verified = False + + @property + def is_closed(self) -> bool: + return self.sock is None + + @property + def is_connected(self) -> bool: + if self.sock is None: + return False + return not wait_for_read(self.sock, timeout=0.0) + + @property + def has_connected_to_proxy(self) -> bool: + return self._has_connected_to_proxy + + @property + def proxy_is_forwarding(self) -> bool: + """ + Return True if a forwarding proxy is configured, else return False + """ + return bool(self.proxy) and self._tunnel_host is None + + @property + def proxy_is_tunneling(self) -> bool: + """ + Return True if a tunneling proxy is configured, else return False + """ + return self._tunnel_host is not None + + def close(self) -> None: + try: + super().close() + finally: + # Reset all stateful properties so connection + # can be re-used without leaking prior configs. + self.sock = None + self.is_verified = False + self.proxy_is_verified = None + self._has_connected_to_proxy = False + self._response_options = None + self._tunnel_host = None + self._tunnel_port = None + self._tunnel_scheme = None + + def putrequest( + self, + method: str, + url: str, + skip_host: bool = False, + skip_accept_encoding: bool = False, + ) -> None: + """""" + # Empty docstring because the indentation of CPython's implementation + # is broken but we don't want this method in our documentation. + match = _CONTAINS_CONTROL_CHAR_RE.search(method) + if match: + raise ValueError( + f"Method cannot contain non-token characters {method!r} (found at least {match.group()!r})" + ) + + return super().putrequest( + method, url, skip_host=skip_host, skip_accept_encoding=skip_accept_encoding + ) + + def putheader(self, header: str, *values: str) -> None: # type: ignore[override] + """""" + if not any(isinstance(v, str) and v == SKIP_HEADER for v in values): + super().putheader(header, *values) + elif to_str(header.lower()) not in SKIPPABLE_HEADERS: + skippable_headers = "', '".join( + [str.title(header) for header in sorted(SKIPPABLE_HEADERS)] + ) + raise ValueError( + f"urllib3.util.SKIP_HEADER only supports '{skippable_headers}'" + ) + + # `request` method's signature intentionally violates LSP. + # urllib3's API is different from `http.client.HTTPConnection` and the subclassing is only incidental. + def request( # type: ignore[override] + self, + method: str, + url: str, + body: _TYPE_BODY | None = None, + headers: typing.Mapping[str, str] | None = None, + *, + chunked: bool = False, + preload_content: bool = True, + decode_content: bool = True, + enforce_content_length: bool = True, + ) -> None: + # Update the inner socket's timeout value to send the request. + # This only triggers if the connection is re-used. + if self.sock is not None: + self.sock.settimeout(self.timeout) + + # Store these values to be fed into the HTTPResponse + # object later. TODO: Remove this in favor of a real + # HTTP lifecycle mechanism. + + # We have to store these before we call .request() + # because sometimes we can still salvage a response + # off the wire even if we aren't able to completely + # send the request body. + self._response_options = _ResponseOptions( + request_method=method, + request_url=url, + preload_content=preload_content, + decode_content=decode_content, + enforce_content_length=enforce_content_length, + ) + + if headers is None: + headers = {} + header_keys = frozenset(to_str(k.lower()) for k in headers) + skip_accept_encoding = "accept-encoding" in header_keys + skip_host = "host" in header_keys + self.putrequest( + method, url, skip_accept_encoding=skip_accept_encoding, skip_host=skip_host + ) + + # Transform the body into an iterable of sendall()-able chunks + # and detect if an explicit Content-Length is doable. + chunks_and_cl = body_to_chunks(body, method=method, blocksize=self.blocksize) + chunks = chunks_and_cl.chunks + content_length = chunks_and_cl.content_length + + # When chunked is explicit set to 'True' we respect that. + if chunked: + if "transfer-encoding" not in header_keys: + self.putheader("Transfer-Encoding", "chunked") + else: + # Detect whether a framing mechanism is already in use. If so + # we respect that value, otherwise we pick chunked vs content-length + # depending on the type of 'body'. + if "content-length" in header_keys: + chunked = False + elif "transfer-encoding" in header_keys: + chunked = True + + # Otherwise we go off the recommendation of 'body_to_chunks()'. + else: + chunked = False + if content_length is None: + if chunks is not None: + chunked = True + self.putheader("Transfer-Encoding", "chunked") + else: + self.putheader("Content-Length", str(content_length)) + + # Now that framing headers are out of the way we send all the other headers. + if "user-agent" not in header_keys: + self.putheader("User-Agent", _get_default_user_agent()) + for header, value in headers.items(): + self.putheader(header, value) + self.endheaders() + + # If we're given a body we start sending that in chunks. + if chunks is not None: + for chunk in chunks: + # Sending empty chunks isn't allowed for TE: chunked + # as it indicates the end of the body. + if not chunk: + continue + if isinstance(chunk, str): + chunk = chunk.encode("utf-8") + if chunked: + self.send(b"%x\r\n%b\r\n" % (len(chunk), chunk)) + else: + self.send(chunk) + + # Regardless of whether we have a body or not, if we're in + # chunked mode we want to send an explicit empty chunk. + if chunked: + self.send(b"0\r\n\r\n") + + def request_chunked( + self, + method: str, + url: str, + body: _TYPE_BODY | None = None, + headers: typing.Mapping[str, str] | None = None, + ) -> None: + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + warnings.warn( + "HTTPConnection.request_chunked() is deprecated and will be removed " + "in urllib3 v2.1.0. Instead use HTTPConnection.request(..., chunked=True).", + category=DeprecationWarning, + stacklevel=2, + ) + self.request(method, url, body=body, headers=headers, chunked=True) + + def getresponse( # type: ignore[override] + self, + ) -> HTTPResponse: + """ + Get the response from the server. + + If the HTTPConnection is in the correct state, returns an instance of HTTPResponse or of whatever object is returned by the response_class variable. + + If a request has not been sent or if a previous response has not be handled, ResponseNotReady is raised. If the HTTP response indicates that the connection should be closed, then it will be closed before the response is returned. When the connection is closed, the underlying socket is closed. + """ + # Raise the same error as http.client.HTTPConnection + if self._response_options is None: + raise ResponseNotReady() + + # Reset this attribute for being used again. + resp_options = self._response_options + self._response_options = None + + # Since the connection's timeout value may have been updated + # we need to set the timeout on the socket. + self.sock.settimeout(self.timeout) + + # This is needed here to avoid circular import errors + from .response import HTTPResponse + + # Save a reference to the shutdown function before ownership is passed + # to httplib_response + # TODO should we implement it everywhere? + _shutdown = getattr(self.sock, "shutdown", None) + + # Get the response from http.client.HTTPConnection + httplib_response = super().getresponse() + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: + log.warning( + "Failed to parse headers (url=%s): %s", + _url_from_connection(self, resp_options.request_url), + hpe, + exc_info=True, + ) + + headers = HTTPHeaderDict(httplib_response.msg.items()) + + response = HTTPResponse( + body=httplib_response, + headers=headers, + status=httplib_response.status, + version=httplib_response.version, + version_string=getattr(self, "_http_vsn_str", "HTTP/?"), + reason=httplib_response.reason, + preload_content=resp_options.preload_content, + decode_content=resp_options.decode_content, + original_response=httplib_response, + enforce_content_length=resp_options.enforce_content_length, + request_method=resp_options.request_method, + request_url=resp_options.request_url, + sock_shutdown=_shutdown, + ) + return response + + +class HTTPSConnection(HTTPConnection): + """ + Many of the parameters to this constructor are passed to the underlying SSL + socket by means of :py:func:`urllib3.util.ssl_wrap_socket`. + """ + + default_port = port_by_scheme["https"] # type: ignore[misc] + + cert_reqs: int | str | None = None + ca_certs: str | None = None + ca_cert_dir: str | None = None + ca_cert_data: None | str | bytes = None + ssl_version: int | str | None = None + ssl_minimum_version: int | None = None + ssl_maximum_version: int | None = None + assert_fingerprint: str | None = None + _connect_callback: typing.Callable[..., None] | None = None + + def __init__( + self, + host: str, + port: int | None = None, + *, + timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, + source_address: tuple[str, int] | None = None, + blocksize: int = 16384, + socket_options: None | ( + connection._TYPE_SOCKET_OPTIONS + ) = HTTPConnection.default_socket_options, + proxy: Url | None = None, + proxy_config: ProxyConfig | None = None, + cert_reqs: int | str | None = None, + assert_hostname: None | str | typing.Literal[False] = None, + assert_fingerprint: str | None = None, + server_hostname: str | None = None, + ssl_context: ssl.SSLContext | None = None, + ca_certs: str | None = None, + ca_cert_dir: str | None = None, + ca_cert_data: None | str | bytes = None, + ssl_minimum_version: int | None = None, + ssl_maximum_version: int | None = None, + ssl_version: int | str | None = None, # Deprecated + cert_file: str | None = None, + key_file: str | None = None, + key_password: str | None = None, + ) -> None: + super().__init__( + host, + port=port, + timeout=timeout, + source_address=source_address, + blocksize=blocksize, + socket_options=socket_options, + proxy=proxy, + proxy_config=proxy_config, + ) + + self.key_file = key_file + self.cert_file = cert_file + self.key_password = key_password + self.ssl_context = ssl_context + self.server_hostname = server_hostname + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ssl_version = ssl_version + self.ssl_minimum_version = ssl_minimum_version + self.ssl_maximum_version = ssl_maximum_version + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + self.ca_cert_data = ca_cert_data + + # cert_reqs depends on ssl_context so calculate last. + if cert_reqs is None: + if self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + else: + cert_reqs = resolve_cert_reqs(None) + self.cert_reqs = cert_reqs + self._connect_callback = None + + def set_cert( + self, + key_file: str | None = None, + cert_file: str | None = None, + cert_reqs: int | str | None = None, + key_password: str | None = None, + ca_certs: str | None = None, + assert_hostname: None | str | typing.Literal[False] = None, + assert_fingerprint: str | None = None, + ca_cert_dir: str | None = None, + ca_cert_data: None | str | bytes = None, + ) -> None: + """ + This method should only be called once, before the connection is used. + """ + warnings.warn( + "HTTPSConnection.set_cert() is deprecated and will be removed " + "in urllib3 v2.1.0. Instead provide the parameters to the " + "HTTPSConnection constructor.", + category=DeprecationWarning, + stacklevel=2, + ) + + # If cert_reqs is not provided we'll assume CERT_REQUIRED unless we also + # have an SSLContext object in which case we'll use its verify_mode. + if cert_reqs is None: + if self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + else: + cert_reqs = resolve_cert_reqs(None) + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.key_password = key_password + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + self.ca_cert_data = ca_cert_data + + def connect(self) -> None: + # Today we don't need to be doing this step before the /actual/ socket + # connection, however in the future we'll need to decide whether to + # create a new socket or re-use an existing "shared" socket as a part + # of the HTTP/2 handshake dance. + if self._tunnel_host is not None and self._tunnel_port is not None: + probe_http2_host = self._tunnel_host + probe_http2_port = self._tunnel_port + else: + probe_http2_host = self.host + probe_http2_port = self.port + + # Check if the target origin supports HTTP/2. + # If the value comes back as 'None' it means that the current thread + # is probing for HTTP/2 support. Otherwise, we're waiting for another + # probe to complete, or we get a value right away. + target_supports_http2: bool | None + if "h2" in ssl_.ALPN_PROTOCOLS: + target_supports_http2 = http2_probe.acquire_and_get( + host=probe_http2_host, port=probe_http2_port + ) + else: + # If HTTP/2 isn't going to be offered it doesn't matter if + # the target supports HTTP/2. Don't want to make a probe. + target_supports_http2 = False + + if self._connect_callback is not None: + self._connect_callback( + "before connect", + thread_id=threading.get_ident(), + target_supports_http2=target_supports_http2, + ) + + try: + sock: socket.socket | ssl.SSLSocket + self.sock = sock = self._new_conn() + server_hostname: str = self.host + tls_in_tls = False + + # Do we need to establish a tunnel? + if self.proxy_is_tunneling: + # We're tunneling to an HTTPS origin so need to do TLS-in-TLS. + if self._tunnel_scheme == "https": + # _connect_tls_proxy will verify and assign proxy_is_verified + self.sock = sock = self._connect_tls_proxy(self.host, sock) + tls_in_tls = True + elif self._tunnel_scheme == "http": + self.proxy_is_verified = False + + # If we're tunneling it means we're connected to our proxy. + self._has_connected_to_proxy = True + + self._tunnel() + # Override the host with the one we're requesting data from. + server_hostname = typing.cast(str, self._tunnel_host) + + if self.server_hostname is not None: + server_hostname = self.server_hostname + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn( + ( + f"System time is way off (before {RECENT_DATE}). This will probably " + "lead to SSL verification errors" + ), + SystemTimeWarning, + ) + + # Remove trailing '.' from fqdn hostnames to allow certificate validation + server_hostname_rm_dot = server_hostname.rstrip(".") + + sock_and_verified = _ssl_wrap_socket_and_match_hostname( + sock=sock, + cert_reqs=self.cert_reqs, + ssl_version=self.ssl_version, + ssl_minimum_version=self.ssl_minimum_version, + ssl_maximum_version=self.ssl_maximum_version, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + ca_cert_data=self.ca_cert_data, + cert_file=self.cert_file, + key_file=self.key_file, + key_password=self.key_password, + server_hostname=server_hostname_rm_dot, + ssl_context=self.ssl_context, + tls_in_tls=tls_in_tls, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint, + ) + self.sock = sock_and_verified.socket + + # If an error occurs during connection/handshake we may need to release + # our lock so another connection can probe the origin. + except BaseException: + if self._connect_callback is not None: + self._connect_callback( + "after connect failure", + thread_id=threading.get_ident(), + target_supports_http2=target_supports_http2, + ) + + if target_supports_http2 is None: + http2_probe.set_and_release( + host=probe_http2_host, port=probe_http2_port, supports_http2=None + ) + raise + + # If this connection doesn't know if the origin supports HTTP/2 + # we report back to the HTTP/2 probe our result. + if target_supports_http2 is None: + supports_http2 = sock_and_verified.socket.selected_alpn_protocol() == "h2" + http2_probe.set_and_release( + host=probe_http2_host, + port=probe_http2_port, + supports_http2=supports_http2, + ) + + # Forwarding proxies can never have a verified target since + # the proxy is the one doing the verification. Should instead + # use a CONNECT tunnel in order to verify the target. + # See: https://github.com/urllib3/urllib3/issues/3267. + if self.proxy_is_forwarding: + self.is_verified = False + else: + self.is_verified = sock_and_verified.is_verified + + # If there's a proxy to be connected to we are fully connected. + # This is set twice (once above and here) due to forwarding proxies + # not using tunnelling. + self._has_connected_to_proxy = bool(self.proxy) + + # Set `self.proxy_is_verified` unless it's already set while + # establishing a tunnel. + if self._has_connected_to_proxy and self.proxy_is_verified is None: + self.proxy_is_verified = sock_and_verified.is_verified + + def _connect_tls_proxy(self, hostname: str, sock: socket.socket) -> ssl.SSLSocket: + """ + Establish a TLS connection to the proxy using the provided SSL context. + """ + # `_connect_tls_proxy` is called when self._tunnel_host is truthy. + proxy_config = typing.cast(ProxyConfig, self.proxy_config) + ssl_context = proxy_config.ssl_context + sock_and_verified = _ssl_wrap_socket_and_match_hostname( + sock, + cert_reqs=self.cert_reqs, + ssl_version=self.ssl_version, + ssl_minimum_version=self.ssl_minimum_version, + ssl_maximum_version=self.ssl_maximum_version, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + ca_cert_data=self.ca_cert_data, + server_hostname=hostname, + ssl_context=ssl_context, + assert_hostname=proxy_config.assert_hostname, + assert_fingerprint=proxy_config.assert_fingerprint, + # Features that aren't implemented for proxies yet: + cert_file=None, + key_file=None, + key_password=None, + tls_in_tls=False, + ) + self.proxy_is_verified = sock_and_verified.is_verified + return sock_and_verified.socket # type: ignore[return-value] + + +class _WrappedAndVerifiedSocket(typing.NamedTuple): + """ + Wrapped socket and whether the connection is + verified after the TLS handshake + """ + + socket: ssl.SSLSocket | SSLTransport + is_verified: bool + + +def _ssl_wrap_socket_and_match_hostname( + sock: socket.socket, + *, + cert_reqs: None | str | int, + ssl_version: None | str | int, + ssl_minimum_version: int | None, + ssl_maximum_version: int | None, + cert_file: str | None, + key_file: str | None, + key_password: str | None, + ca_certs: str | None, + ca_cert_dir: str | None, + ca_cert_data: None | str | bytes, + assert_hostname: None | str | typing.Literal[False], + assert_fingerprint: str | None, + server_hostname: str | None, + ssl_context: ssl.SSLContext | None, + tls_in_tls: bool = False, +) -> _WrappedAndVerifiedSocket: + """Logic for constructing an SSLContext from all TLS parameters, passing + that down into ssl_wrap_socket, and then doing certificate verification + either via hostname or fingerprint. This function exists to guarantee + that both proxies and targets have the same behavior when connecting via TLS. + """ + default_ssl_context = False + if ssl_context is None: + default_ssl_context = True + context = create_urllib3_context( + ssl_version=resolve_ssl_version(ssl_version), + ssl_minimum_version=ssl_minimum_version, + ssl_maximum_version=ssl_maximum_version, + cert_reqs=resolve_cert_reqs(cert_reqs), + ) + else: + context = ssl_context + + context.verify_mode = resolve_cert_reqs(cert_reqs) + + # In some cases, we want to verify hostnames ourselves + if ( + # `ssl` can't verify fingerprints or alternate hostnames + assert_fingerprint + or assert_hostname + # assert_hostname can be set to False to disable hostname checking + or assert_hostname is False + # We still support OpenSSL 1.0.2, which prevents us from verifying + # hostnames easily: https://github.com/pyca/pyopenssl/pull/933 + or ssl_.IS_PYOPENSSL + or not ssl_.HAS_NEVER_CHECK_COMMON_NAME + ): + context.check_hostname = False + + # Try to load OS default certs if none are given. We need to do the hasattr() check + # for custom pyOpenSSL SSLContext objects because they don't support + # load_default_certs(). + if ( + not ca_certs + and not ca_cert_dir + and not ca_cert_data + and default_ssl_context + and hasattr(context, "load_default_certs") + ): + context.load_default_certs() + + # Ensure that IPv6 addresses are in the proper format and don't have a + # scope ID. Python's SSL module fails to recognize scoped IPv6 addresses + # and interprets them as DNS hostnames. + if server_hostname is not None: + normalized = server_hostname.strip("[]") + if "%" in normalized: + normalized = normalized[: normalized.rfind("%")] + if is_ipaddress(normalized): + server_hostname = normalized + + ssl_sock = ssl_wrap_socket( + sock=sock, + keyfile=key_file, + certfile=cert_file, + key_password=key_password, + ca_certs=ca_certs, + ca_cert_dir=ca_cert_dir, + ca_cert_data=ca_cert_data, + server_hostname=server_hostname, + ssl_context=context, + tls_in_tls=tls_in_tls, + ) + + try: + if assert_fingerprint: + _assert_fingerprint( + ssl_sock.getpeercert(binary_form=True), assert_fingerprint + ) + elif ( + context.verify_mode != ssl.CERT_NONE + and not context.check_hostname + and assert_hostname is not False + ): + cert: _TYPE_PEER_CERT_RET_DICT = ssl_sock.getpeercert() # type: ignore[assignment] + + # Need to signal to our match_hostname whether to use 'commonName' or not. + # If we're using our own constructed SSLContext we explicitly set 'False' + # because PyPy hard-codes 'True' from SSLContext.hostname_checks_common_name. + if default_ssl_context: + hostname_checks_common_name = False + else: + hostname_checks_common_name = ( + getattr(context, "hostname_checks_common_name", False) or False + ) + + _match_hostname( + cert, + assert_hostname or server_hostname, # type: ignore[arg-type] + hostname_checks_common_name, + ) + + return _WrappedAndVerifiedSocket( + socket=ssl_sock, + is_verified=context.verify_mode == ssl.CERT_REQUIRED + or bool(assert_fingerprint), + ) + except BaseException: + ssl_sock.close() + raise + + +def _match_hostname( + cert: _TYPE_PEER_CERT_RET_DICT | None, + asserted_hostname: str, + hostname_checks_common_name: bool = False, +) -> None: + # Our upstream implementation of ssl.match_hostname() + # only applies this normalization to IP addresses so it doesn't + # match DNS SANs so we do the same thing! + stripped_hostname = asserted_hostname.strip("[]") + if is_ipaddress(stripped_hostname): + asserted_hostname = stripped_hostname + + try: + match_hostname(cert, asserted_hostname, hostname_checks_common_name) + except CertificateError as e: + log.warning( + "Certificate did not match expected hostname: %s. Certificate: %s", + asserted_hostname, + cert, + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert # type: ignore[attr-defined] + raise + + +def _wrap_proxy_error(err: Exception, proxy_scheme: str | None) -> ProxyError: + # Look for the phrase 'wrong version number', if found + # then we should warn the user that we're very sure that + # this proxy is HTTP-only and they have a configuration issue. + error_normalized = " ".join(re.split("[^a-z]", str(err).lower())) + is_likely_http_proxy = ( + "wrong version number" in error_normalized + or "unknown protocol" in error_normalized + or "record layer failure" in error_normalized + ) + http_proxy_warning = ( + ". Your proxy appears to only use HTTP and not HTTPS, " + "try changing your proxy URL to be HTTP. See: " + "https://urllib3.readthedocs.io/en/latest/advanced-usage.html" + "#https-proxy-error-http-proxy" + ) + new_err = ProxyError( + f"Unable to connect to proxy" + f"{http_proxy_warning if is_likely_http_proxy and proxy_scheme == 'https' else ''}", + err, + ) + new_err.__cause__ = err + return new_err + + +def _get_default_user_agent() -> str: + return f"python-urllib3/{__version__}" + + +class DummyConnection: + """Used to detect a failed ConnectionCls import.""" + + +if not ssl: + HTTPSConnection = DummyConnection # type: ignore[misc, assignment] # noqa: F811 + + +VerifiedHTTPSConnection = HTTPSConnection + + +def _url_from_connection( + conn: HTTPConnection | HTTPSConnection, path: str | None = None +) -> str: + """Returns the URL from a given connection. This is mainly used for testing and logging.""" + + scheme = "https" if isinstance(conn, HTTPSConnection) else "http" + + return Url(scheme=scheme, host=conn.host, port=conn.port, path=path).url diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/connectionpool.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/connectionpool.py new file mode 100644 index 000000000..3a0685b4c --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/connectionpool.py @@ -0,0 +1,1178 @@ +from __future__ import annotations + +import errno +import logging +import queue +import sys +import typing +import warnings +import weakref +from socket import timeout as SocketTimeout +from types import TracebackType + +from ._base_connection import _TYPE_BODY +from ._collections import HTTPHeaderDict +from ._request_methods import RequestMethods +from .connection import ( + BaseSSLError, + BrokenPipeError, + DummyConnection, + HTTPConnection, + HTTPException, + HTTPSConnection, + ProxyConfig, + _wrap_proxy_error, +) +from .connection import port_by_scheme as port_by_scheme +from .exceptions import ( + ClosedPoolError, + EmptyPoolError, + FullPoolError, + HostChangedError, + InsecureRequestWarning, + LocationValueError, + MaxRetryError, + NewConnectionError, + ProtocolError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, +) +from .response import BaseHTTPResponse +from .util.connection import is_connection_dropped +from .util.proxy import connection_requires_http_tunnel +from .util.request import _TYPE_BODY_POSITION, set_file_position +from .util.retry import Retry +from .util.ssl_match_hostname import CertificateError +from .util.timeout import _DEFAULT_TIMEOUT, _TYPE_DEFAULT, Timeout +from .util.url import Url, _encode_target +from .util.url import _normalize_host as normalize_host +from .util.url import parse_url +from .util.util import to_str + +if typing.TYPE_CHECKING: + import ssl + + from typing_extensions import Self + + from ._base_connection import BaseHTTPConnection, BaseHTTPSConnection + +log = logging.getLogger(__name__) + +_TYPE_TIMEOUT = typing.Union[Timeout, float, _TYPE_DEFAULT, None] + + +# Pool objects +class ConnectionPool: + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + + .. note:: + ConnectionPool.urlopen() does not normalize or percent-encode target URIs + which is useful if your target server doesn't support percent-encoded + target URIs. + """ + + scheme: str | None = None + QueueCls = queue.LifoQueue + + def __init__(self, host: str, port: int | None = None) -> None: + if not host: + raise LocationValueError("No host specified.") + + self.host = _normalize_host(host, scheme=self.scheme) + self.port = port + + # This property uses 'normalize_host()' (not '_normalize_host()') + # to avoid removing square braces around IPv6 addresses. + # This value is sent to `HTTPConnection.set_tunnel()` if called + # because square braces are required for HTTP CONNECT tunneling. + self._tunnel_host = normalize_host(host, scheme=self.scheme).lower() + + def __str__(self) -> str: + return f"{type(self).__name__}(host={self.host!r}, port={self.port!r})" + + def __enter__(self) -> Self: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> typing.Literal[False]: + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self) -> None: + """ + Close all pooled connections and disable the pool. + """ + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`http.client.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`http.client.HTTPConnection`. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.ProxyManager` + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.ProxyManager` + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = "http" + ConnectionCls: type[BaseHTTPConnection] | type[BaseHTTPSConnection] = HTTPConnection + + def __init__( + self, + host: str, + port: int | None = None, + timeout: _TYPE_TIMEOUT | None = _DEFAULT_TIMEOUT, + maxsize: int = 1, + block: bool = False, + headers: typing.Mapping[str, str] | None = None, + retries: Retry | bool | int | None = None, + _proxy: Url | None = None, + _proxy_headers: typing.Mapping[str, str] | None = None, + _proxy_config: ProxyConfig | None = None, + **conn_kw: typing.Any, + ): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool: queue.LifoQueue[typing.Any] | None = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + self.proxy_config = _proxy_config + + # Fill the queue up so that doing get() on it will block properly + for _ in range(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault("socket_options", []) + + self.conn_kw["proxy"] = self.proxy + self.conn_kw["proxy_config"] = self.proxy_config + + # Do not pass 'self' as callback to 'finalize'. + # Then the 'finalize' would keep an endless living (leak) to self. + # By just passing a reference to the pool allows the garbage collector + # to free self if nobody else has a reference to it. + pool = self.pool + + # Close all the HTTPConnections in the pool before the + # HTTPConnectionPool object is garbage collected. + weakref.finalize(self, _close_pool_connections, pool) + + def _new_conn(self) -> BaseHTTPConnection: + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug( + "Starting new HTTP connection (%d): %s:%s", + self.num_connections, + self.host, + self.port or "80", + ) + + conn = self.ConnectionCls( + host=self.host, + port=self.port, + timeout=self.timeout.connect_timeout, + **self.conn_kw, + ) + return conn + + def _get_conn(self, timeout: float | None = None) -> BaseHTTPConnection: + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + + if self.pool is None: + raise ClosedPoolError(self, "Pool is closed.") + + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") from None # Defensive: + + except queue.Empty: + if self.block: + raise EmptyPoolError( + self, + "Pool is empty and a new connection can't be opened due to blocking mode.", + ) from None + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + + return conn or self._new_conn() + + def _put_conn(self, conn: BaseHTTPConnection | None) -> None: + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + if self.pool is not None: + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + if self.block: + # This should never happen if you got the conn from self._get_conn + raise FullPoolError( + self, + "Pool reached maximum size and no more connections are allowed.", + ) from None + + log.warning( + "Connection pool is full, discarding connection: %s. Connection pool size: %s", + self.host, + self.pool.qsize(), + ) + + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn: BaseHTTPConnection) -> None: + """ + Called right before a request is made, after the socket is created. + """ + + def _prepare_proxy(self, conn: BaseHTTPConnection) -> None: + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout: _TYPE_TIMEOUT) -> Timeout: + """Helper that always returns a :class:`urllib3.util.Timeout`""" + if timeout is _DEFAULT_TIMEOUT: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout( + self, + err: BaseSSLError | OSError | SocketTimeout, + url: str, + timeout_value: _TYPE_TIMEOUT | None, + ) -> None: + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError( + self, url, f"Read timed out. (read timeout={timeout_value})" + ) from err + + # See the above comment about EAGAIN in Python 3. + if hasattr(err, "errno") and err.errno in _blocking_errnos: + raise ReadTimeoutError( + self, url, f"Read timed out. (read timeout={timeout_value})" + ) from err + + def _make_request( + self, + conn: BaseHTTPConnection, + method: str, + url: str, + body: _TYPE_BODY | None = None, + headers: typing.Mapping[str, str] | None = None, + retries: Retry | None = None, + timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, + chunked: bool = False, + response_conn: BaseHTTPConnection | None = None, + preload_content: bool = True, + decode_content: bool = True, + enforce_content_length: bool = True, + ) -> BaseHTTPResponse: + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param url: + The URL to perform the request on. + + :param body: + Data to send in the request body, either :class:`str`, :class:`bytes`, + an iterable of :class:`str`/:class:`bytes`, or a file-like object. + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param response_conn: + Set this to ``None`` if you will handle releasing the connection or + set the connection to have the response release it. + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = Timeout.resolve_default_timeout(timeout_obj.connect_timeout) + + try: + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # _validate_conn() starts the connection to an HTTPS proxy + # so we need to wrap errors with 'ProxyError' here too. + except ( + OSError, + NewConnectionError, + TimeoutError, + BaseSSLError, + CertificateError, + SSLError, + ) as e: + new_e: Exception = e + if isinstance(e, (BaseSSLError, CertificateError)): + new_e = SSLError(e) + # If the connection didn't successfully connect to it's proxy + # then there + if isinstance( + new_e, (OSError, NewConnectionError, TimeoutError, SSLError) + ) and (conn and conn.proxy and not conn.has_connected_to_proxy): + new_e = _wrap_proxy_error(new_e, conn.proxy.scheme) + raise new_e + + # conn.request() calls http.client.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + try: + conn.request( + method, + url, + body=body, + headers=headers, + chunked=chunked, + preload_content=preload_content, + decode_content=decode_content, + enforce_content_length=enforce_content_length, + ) + + # We are swallowing BrokenPipeError (errno.EPIPE) since the server is + # legitimately able to close the connection after sending a valid response. + # With this behaviour, the received response is still readable. + except BrokenPipeError: + pass + except OSError as e: + # MacOS/Linux + # EPROTOTYPE and ECONNRESET are needed on macOS + # https://erickt.github.io/blog/2014/11/19/adventures-in-debugging-a-potential-osx-kernel-bug/ + # Condition changed later to emit ECONNRESET instead of only EPROTOTYPE. + if e.errno != errno.EPROTOTYPE and e.errno != errno.ECONNRESET: + raise + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + if not conn.is_closed: + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, f"Read timed out. (read timeout={read_timeout})" + ) + conn.timeout = read_timeout + + # Receive the response from the server + try: + response = conn.getresponse() + except (BaseSSLError, OSError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # Set properties that are used by the pooling layer. + response.retries = retries + response._connection = response_conn # type: ignore[attr-defined] + response._pool = self # type: ignore[attr-defined] + + log.debug( + '%s://%s:%s "%s %s %s" %s %s', + self.scheme, + self.host, + self.port, + method, + url, + response.version_string, + response.status, + response.length_remaining, + ) + + return response + + def close(self) -> None: + """ + Close all pooled connections and disable the pool. + """ + if self.pool is None: + return + # Disable access to the pool + old_pool, self.pool = self.pool, None + + # Close all the HTTPConnections in the pool. + _close_pool_connections(old_pool) + + def is_same_host(self, url: str) -> bool: + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith("/"): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, _, host, port, *_ = parse_url(url) + scheme = scheme or "http" + if host is not None: + host = _normalize_host(host, scheme=scheme) + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen( # type: ignore[override] + self, + method: str, + url: str, + body: _TYPE_BODY | None = None, + headers: typing.Mapping[str, str] | None = None, + retries: Retry | bool | int | None = None, + redirect: bool = True, + assert_same_host: bool = True, + timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, + pool_timeout: int | None = None, + release_conn: bool | None = None, + chunked: bool = False, + body_pos: _TYPE_BODY_POSITION | None = None, + preload_content: bool = True, + decode_content: bool = True, + **response_kw: typing.Any, + ) -> BaseHTTPResponse: + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method + such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param url: + The URL to perform the request on. + + :param body: + Data to send in the request body, either :class:`str`, :class:`bytes`, + an iterable of :class:`str`/:class:`bytes`, or a file-like object. + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When ``False``, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param bool preload_content: + If True, the response's body will be preloaded into memory. + + :param bool decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of ``preload_content`` + which defaults to ``True``. + + :param bool chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + """ + parsed_url = parse_url(url) + destination_scheme = parsed_url.scheme + + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = preload_content + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + # Ensure that the URL we're connecting to is properly encoded + if url.startswith("/"): + url = to_str(_encode_target(url)) + else: + url = to_str(parsed_url.url) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] + release_this_conn = release_conn + + http_tunnel_required = connection_requires_http_tunnel( + self.proxy, self.proxy_config, destination_scheme + ) + + # Merge the proxy headers. Only done when not using HTTP CONNECT. We + # have to copy the headers dict so we can safely change it without those + # changes being reflected in anyone else's copy. + if not http_tunnel_required: + headers = headers.copy() # type: ignore[attr-defined] + headers.update(self.proxy_headers) # type: ignore[union-attr] + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout # type: ignore[assignment] + + # Is this a closed/new connection that requires CONNECT tunnelling? + if self.proxy is not None and http_tunnel_required and conn.is_closed: + try: + self._prepare_proxy(conn) + except (BaseSSLError, OSError, SocketTimeout) as e: + self._raise_timeout( + err=e, url=self.proxy.url, timeout_value=conn.timeout + ) + raise + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Make the request on the HTTPConnection object + response = self._make_request( + conn, + method, + url, + timeout=timeout_obj, + body=body, + headers=headers, + chunked=chunked, + retries=retries, + response_conn=response_conn, + preload_content=preload_content, + decode_content=decode_content, + **response_kw, + ) + + # Everything went great! + clean_exit = True + + except EmptyPoolError: + # Didn't get a connection from the pool, no need to clean up + clean_exit = True + release_this_conn = False + raise + + except ( + TimeoutError, + HTTPException, + OSError, + ProtocolError, + BaseSSLError, + SSLError, + CertificateError, + ProxyError, + ) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + new_e: Exception = e + if isinstance(e, (BaseSSLError, CertificateError)): + new_e = SSLError(e) + if isinstance( + new_e, + ( + OSError, + NewConnectionError, + TimeoutError, + SSLError, + HTTPException, + ), + ) and (conn and conn.proxy and not conn.has_connected_to_proxy): + new_e = _wrap_proxy_error(new_e, conn.proxy.scheme) + elif isinstance(new_e, (OSError, HTTPException)): + new_e = ProtocolError("Connection aborted.", new_e) + + retries = retries.increment( + method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2] + ) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + if conn: + conn.close() + conn = None + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning( + "Retrying (%r) after connection broken by '%r': %s", retries, err, url + ) + return self.urlopen( + method, + url, + body, + headers, + retries, + redirect, + assert_same_host, + timeout=timeout, + pool_timeout=pool_timeout, + release_conn=release_conn, + chunked=chunked, + body_pos=body_pos, + preload_content=preload_content, + decode_content=decode_content, + **response_kw, + ) + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + # Change the method according to RFC 9110, Section 15.4.4. + method = "GET" + # And lose the body not to transfer anything sensitive. + body = None + headers = HTTPHeaderDict(headers)._prepare_for_method_change() + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + response.drain_conn() + raise + return response + + response.drain_conn() + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, + redirect_location, + body, + headers, + retries=retries, + redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, + pool_timeout=pool_timeout, + release_conn=release_conn, + chunked=chunked, + body_pos=body_pos, + preload_content=preload_content, + decode_content=decode_content, + **response_kw, + ) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.headers.get("Retry-After")) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + response.drain_conn() + raise + return response + + response.drain_conn() + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, + url, + body, + headers, + retries=retries, + redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, + pool_timeout=pool_timeout, + release_conn=release_conn, + chunked=chunked, + body_pos=body_pos, + preload_content=preload_content, + decode_content=decode_content, + **response_kw, + ) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + :class:`.HTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, ``ssl_version``, ``key_password`` are only used if :mod:`ssl` + is available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = "https" + ConnectionCls: type[BaseHTTPSConnection] = HTTPSConnection + + def __init__( + self, + host: str, + port: int | None = None, + timeout: _TYPE_TIMEOUT | None = _DEFAULT_TIMEOUT, + maxsize: int = 1, + block: bool = False, + headers: typing.Mapping[str, str] | None = None, + retries: Retry | bool | int | None = None, + _proxy: Url | None = None, + _proxy_headers: typing.Mapping[str, str] | None = None, + key_file: str | None = None, + cert_file: str | None = None, + cert_reqs: int | str | None = None, + key_password: str | None = None, + ca_certs: str | None = None, + ssl_version: int | str | None = None, + ssl_minimum_version: ssl.TLSVersion | None = None, + ssl_maximum_version: ssl.TLSVersion | None = None, + assert_hostname: str | typing.Literal[False] | None = None, + assert_fingerprint: str | None = None, + ca_cert_dir: str | None = None, + **conn_kw: typing.Any, + ) -> None: + super().__init__( + host, + port, + timeout, + maxsize, + block, + headers, + retries, + _proxy, + _proxy_headers, + **conn_kw, + ) + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.key_password = key_password + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.ssl_minimum_version = ssl_minimum_version + self.ssl_maximum_version = ssl_maximum_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_proxy(self, conn: HTTPSConnection) -> None: # type: ignore[override] + """Establishes a tunnel connection through HTTP CONNECT.""" + if self.proxy and self.proxy.scheme == "https": + tunnel_scheme = "https" + else: + tunnel_scheme = "http" + + conn.set_tunnel( + scheme=tunnel_scheme, + host=self._tunnel_host, + port=self.port, + headers=self.proxy_headers, + ) + conn.connect() + + def _new_conn(self) -> BaseHTTPSConnection: + """ + Return a fresh :class:`urllib3.connection.HTTPConnection`. + """ + self.num_connections += 1 + log.debug( + "Starting new HTTPS connection (%d): %s:%s", + self.num_connections, + self.host, + self.port or "443", + ) + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: # type: ignore[comparison-overlap] + raise ImportError( + "Can't connect to HTTPS URL because the SSL module is not available." + ) + + actual_host: str = self.host + actual_port = self.port + if self.proxy is not None and self.proxy.host is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + return self.ConnectionCls( + host=actual_host, + port=actual_port, + timeout=self.timeout.connect_timeout, + cert_file=self.cert_file, + key_file=self.key_file, + key_password=self.key_password, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint, + ssl_version=self.ssl_version, + ssl_minimum_version=self.ssl_minimum_version, + ssl_maximum_version=self.ssl_maximum_version, + **self.conn_kw, + ) + + def _validate_conn(self, conn: BaseHTTPConnection) -> None: + """ + Called right before a request is made, after the socket is created. + """ + super()._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if conn.is_closed: + conn.connect() + + # TODO revise this, see https://github.com/urllib3/urllib3/issues/2791 + if not conn.is_verified and not conn.proxy_is_verified: + warnings.warn( + ( + f"Unverified HTTPS request is being made to host '{conn.host}'. " + "Adding certificate verification is strongly advised. See: " + "https://urllib3.readthedocs.io/en/latest/advanced-usage.html" + "#tls-warnings" + ), + InsecureRequestWarning, + ) + + +def connection_from_url(url: str, **kw: typing.Any) -> HTTPConnectionPool: + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, _, host, port, *_ = parse_url(url) + scheme = scheme or "http" + port = port or port_by_scheme.get(scheme, 80) + if scheme == "https": + return HTTPSConnectionPool(host, port=port, **kw) # type: ignore[arg-type] + else: + return HTTPConnectionPool(host, port=port, **kw) # type: ignore[arg-type] + + +@typing.overload +def _normalize_host(host: None, scheme: str | None) -> None: ... + + +@typing.overload +def _normalize_host(host: str, scheme: str | None) -> str: ... + + +def _normalize_host(host: str | None, scheme: str | None) -> str | None: + """ + Normalize hosts for comparisons and use with sockets. + """ + + host = normalize_host(host, scheme) + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + if host and host.startswith("[") and host.endswith("]"): + host = host[1:-1] + return host + + +def _url_from_pool( + pool: HTTPConnectionPool | HTTPSConnectionPool, path: str | None = None +) -> str: + """Returns the URL from a given connection pool. This is mainly used for testing and logging.""" + return Url(scheme=pool.scheme, host=pool.host, port=pool.port, path=path).url + + +def _close_pool_connections(pool: queue.LifoQueue[typing.Any]) -> None: + """Drains a queue of connections and closes each one.""" + try: + while True: + conn = pool.get(block=False) + if conn: + conn.close() + except queue.Empty: + pass # Done. diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..328867bc4c41f77fe9e8ed91075c5548452531a6 GIT binary patch literal 218 zcmX@j%ge<81bcQTW`O9&AOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdRjHqmpPQ8XTbOm!FafVR^c^#Rugl<(KG}l$PWdWhUn6>%mz$nMwKul_eSZ zdB%E%M*78>C8@dviOJcC=|J73ML9ruWBug(ypkfI!ua^iyv&mLc)fzkUmP~M`6;D2 Zsdh!IK$kEAaWRPTk(rT^v4|PS0ssVhJY4_) literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d77b7c21c76cf6b8b458ae78bbe4380a2240e05 GIT binary patch literal 28241 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 I26%-37nkV*!~g&Q literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..921fb6b701105b57a76c84a4eadfce21ee9eb624 GIT binary patch literal 8196 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 None: + # override connection classes to use emscripten specific classes + # n.b. mypy complains about the overriding of classes below + # if it isn't ignored + HTTPConnectionPool.ConnectionCls = EmscriptenHTTPConnection + HTTPSConnectionPool.ConnectionCls = EmscriptenHTTPSConnection + urllib3.connection.HTTPConnection = EmscriptenHTTPConnection # type: ignore[misc,assignment] + urllib3.connection.HTTPSConnection = EmscriptenHTTPSConnection # type: ignore[misc,assignment] diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..626030f1e9e47c65d64b32736ffcb3154bfd05ab GIT binary patch literal 926 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 YSV|YD_)+ None: + self.host = host + self.port = port + self.timeout = timeout if isinstance(timeout, float) else 0.0 + self.scheme = "http" + self._closed = True + self._response = None + # ignore these things because we don't + # have control over that stuff + self.proxy = None + self.proxy_config = None + self.blocksize = blocksize + self.source_address = None + self.socket_options = None + self.is_verified = False + + def set_tunnel( + self, + host: str, + port: int | None = 0, + headers: typing.Mapping[str, str] | None = None, + scheme: str = "http", + ) -> None: + pass + + def connect(self) -> None: + pass + + def request( + self, + method: str, + url: str, + body: _TYPE_BODY | None = None, + headers: typing.Mapping[str, str] | None = None, + # We know *at least* botocore is depending on the order of the + # first 3 parameters so to be safe we only mark the later ones + # as keyword-only to ensure we have space to extend. + *, + chunked: bool = False, + preload_content: bool = True, + decode_content: bool = True, + enforce_content_length: bool = True, + ) -> None: + self._closed = False + if url.startswith("/"): + # no scheme / host / port included, make a full url + url = f"{self.scheme}://{self.host}:{self.port}" + url + request = EmscriptenRequest( + url=url, + method=method, + timeout=self.timeout if self.timeout else 0, + decode_content=decode_content, + ) + request.set_body(body) + if headers: + for k, v in headers.items(): + request.set_header(k, v) + self._response = None + try: + if not preload_content: + self._response = send_streaming_request(request) + if self._response is None: + self._response = send_request(request) + except _TimeoutError as e: + raise TimeoutError(e.message) from e + except _RequestError as e: + raise HTTPException(e.message) from e + + def getresponse(self) -> BaseHTTPResponse: + if self._response is not None: + return EmscriptenHttpResponseWrapper( + internal_response=self._response, + url=self._response.request.url, + connection=self, + ) + else: + raise ResponseNotReady() + + def close(self) -> None: + self._closed = True + self._response = None + + @property + def is_closed(self) -> bool: + """Whether the connection either is brand new or has been previously closed. + If this property is True then both ``is_connected`` and ``has_connected_to_proxy`` + properties must be False. + """ + return self._closed + + @property + def is_connected(self) -> bool: + """Whether the connection is actively connected to any origin (proxy or target)""" + return True + + @property + def has_connected_to_proxy(self) -> bool: + """Whether the connection has successfully connected to its proxy. + This returns False if no proxy is in use. Used to determine whether + errors are coming from the proxy layer or from tunnelling to the target origin. + """ + return False + + +class EmscriptenHTTPSConnection(EmscriptenHTTPConnection): + default_port = port_by_scheme["https"] + # all this is basically ignored, as browser handles https + cert_reqs: int | str | None = None + ca_certs: str | None = None + ca_cert_dir: str | None = None + ca_cert_data: None | str | bytes = None + cert_file: str | None + key_file: str | None + key_password: str | None + ssl_context: typing.Any | None + ssl_version: int | str | None = None + ssl_minimum_version: int | None = None + ssl_maximum_version: int | None = None + assert_hostname: None | str | typing.Literal[False] + assert_fingerprint: str | None = None + + def __init__( + self, + host: str, + port: int = 0, + *, + timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, + source_address: tuple[str, int] | None = None, + blocksize: int = 16384, + socket_options: ( + None | _TYPE_SOCKET_OPTIONS + ) = HTTPConnection.default_socket_options, + proxy: Url | None = None, + proxy_config: ProxyConfig | None = None, + cert_reqs: int | str | None = None, + assert_hostname: None | str | typing.Literal[False] = None, + assert_fingerprint: str | None = None, + server_hostname: str | None = None, + ssl_context: typing.Any | None = None, + ca_certs: str | None = None, + ca_cert_dir: str | None = None, + ca_cert_data: None | str | bytes = None, + ssl_minimum_version: int | None = None, + ssl_maximum_version: int | None = None, + ssl_version: int | str | None = None, # Deprecated + cert_file: str | None = None, + key_file: str | None = None, + key_password: str | None = None, + ) -> None: + super().__init__( + host, + port=port, + timeout=timeout, + source_address=source_address, + blocksize=blocksize, + socket_options=socket_options, + proxy=proxy, + proxy_config=proxy_config, + ) + self.scheme = "https" + + self.key_file = key_file + self.cert_file = cert_file + self.key_password = key_password + self.ssl_context = ssl_context + self.server_hostname = server_hostname + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ssl_version = ssl_version + self.ssl_minimum_version = ssl_minimum_version + self.ssl_maximum_version = ssl_maximum_version + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + self.ca_cert_data = ca_cert_data + + self.cert_reqs = None + + # The browser will automatically verify all requests. + # We have no control over that setting. + self.is_verified = True + + def set_cert( + self, + key_file: str | None = None, + cert_file: str | None = None, + cert_reqs: int | str | None = None, + key_password: str | None = None, + ca_certs: str | None = None, + assert_hostname: None | str | typing.Literal[False] = None, + assert_fingerprint: str | None = None, + ca_cert_dir: str | None = None, + ca_cert_data: None | str | bytes = None, + ) -> None: + pass + + +# verify that this class implements BaseHTTP(s) connection correctly +if typing.TYPE_CHECKING: + _supports_http_protocol: BaseHTTPConnection = EmscriptenHTTPConnection("", 0) + _supports_https_protocol: BaseHTTPSConnection = EmscriptenHTTPSConnection("", 0) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js new file mode 100644 index 000000000..243b86222 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js @@ -0,0 +1,110 @@ +let Status = { + SUCCESS_HEADER: -1, + SUCCESS_EOF: -2, + ERROR_TIMEOUT: -3, + ERROR_EXCEPTION: -4, +}; + +let connections = {}; +let nextConnectionID = 1; +const encoder = new TextEncoder(); + +self.addEventListener("message", async function (event) { + if (event.data.close) { + let connectionID = event.data.close; + delete connections[connectionID]; + return; + } else if (event.data.getMore) { + let connectionID = event.data.getMore; + let { curOffset, value, reader, intBuffer, byteBuffer } = + connections[connectionID]; + // if we still have some in buffer, then just send it back straight away + if (!value || curOffset >= value.length) { + // read another buffer if required + try { + let readResponse = await reader.read(); + + if (readResponse.done) { + // read everything - clear connection and return + delete connections[connectionID]; + Atomics.store(intBuffer, 0, Status.SUCCESS_EOF); + Atomics.notify(intBuffer, 0); + // finished reading successfully + // return from event handler + return; + } + curOffset = 0; + connections[connectionID].value = readResponse.value; + value = readResponse.value; + } catch (error) { + console.log("Request exception:", error); + let errorBytes = encoder.encode(error.message); + let written = errorBytes.length; + byteBuffer.set(errorBytes); + intBuffer[1] = written; + Atomics.store(intBuffer, 0, Status.ERROR_EXCEPTION); + Atomics.notify(intBuffer, 0); + } + } + + // send as much buffer as we can + let curLen = value.length - curOffset; + if (curLen > byteBuffer.length) { + curLen = byteBuffer.length; + } + byteBuffer.set(value.subarray(curOffset, curOffset + curLen), 0); + + Atomics.store(intBuffer, 0, curLen); // store current length in bytes + Atomics.notify(intBuffer, 0); + curOffset += curLen; + connections[connectionID].curOffset = curOffset; + + return; + } else { + // start fetch + let connectionID = nextConnectionID; + nextConnectionID += 1; + const intBuffer = new Int32Array(event.data.buffer); + const byteBuffer = new Uint8Array(event.data.buffer, 8); + try { + const response = await fetch(event.data.url, event.data.fetchParams); + // return the headers first via textencoder + var headers = []; + for (const pair of response.headers.entries()) { + headers.push([pair[0], pair[1]]); + } + let headerObj = { + headers: headers, + status: response.status, + connectionID, + }; + const headerText = JSON.stringify(headerObj); + let headerBytes = encoder.encode(headerText); + let written = headerBytes.length; + byteBuffer.set(headerBytes); + intBuffer[1] = written; + // make a connection + connections[connectionID] = { + reader: response.body.getReader(), + intBuffer: intBuffer, + byteBuffer: byteBuffer, + value: undefined, + curOffset: 0, + }; + // set header ready + Atomics.store(intBuffer, 0, Status.SUCCESS_HEADER); + Atomics.notify(intBuffer, 0); + // all fetching after this goes through a new postmessage call with getMore + // this allows for parallel requests + } catch (error) { + console.log("Request exception:", error); + let errorBytes = encoder.encode(error.message); + let written = errorBytes.length; + byteBuffer.set(errorBytes); + intBuffer[1] = written; + Atomics.store(intBuffer, 0, Status.ERROR_EXCEPTION); + Atomics.notify(intBuffer, 0); + } + } +}); +self.postMessage({ inited: true }); diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.py new file mode 100644 index 000000000..66958217a --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.py @@ -0,0 +1,728 @@ +""" +Support for streaming http requests in emscripten. + +A few caveats - + +If your browser (or Node.js) has WebAssembly JavaScript Promise Integration enabled +https://github.com/WebAssembly/js-promise-integration/blob/main/proposals/js-promise-integration/Overview.md +*and* you launch pyodide using `pyodide.runPythonAsync`, this will fetch data using the +JavaScript asynchronous fetch api (wrapped via `pyodide.ffi.call_sync`). In this case +timeouts and streaming should just work. + +Otherwise, it uses a combination of XMLHttpRequest and a web-worker for streaming. + +This approach has several caveats: + +Firstly, you can't do streaming http in the main UI thread, because atomics.wait isn't allowed. +Streaming only works if you're running pyodide in a web worker. + +Secondly, this uses an extra web worker and SharedArrayBuffer to do the asynchronous fetch +operation, so it requires that you have crossOriginIsolation enabled, by serving over https +(or from localhost) with the two headers below set: + + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Embedder-Policy: require-corp + +You can tell if cross origin isolation is successfully enabled by looking at the global crossOriginIsolated variable in +JavaScript console. If it isn't, streaming requests will fallback to XMLHttpRequest, i.e. getting the whole +request into a buffer and then returning it. it shows a warning in the JavaScript console in this case. + +Finally, the webworker which does the streaming fetch is created on initial import, but will only be started once +control is returned to javascript. Call `await wait_for_streaming_ready()` to wait for streaming fetch. + +NB: in this code, there are a lot of JavaScript objects. They are named js_* +to make it clear what type of object they are. +""" + +from __future__ import annotations + +import io +import json +from email.parser import Parser +from importlib.resources import files +from typing import TYPE_CHECKING, Any + +import js # type: ignore[import-not-found] +from pyodide.ffi import ( # type: ignore[import-not-found] + JsArray, + JsException, + JsProxy, + to_js, +) + +if TYPE_CHECKING: + from typing_extensions import Buffer + +from .request import EmscriptenRequest +from .response import EmscriptenResponse + +""" +There are some headers that trigger unintended CORS preflight requests. +See also https://github.com/koenvo/pyodide-http/issues/22 +""" +HEADERS_TO_IGNORE = ("user-agent",) + +SUCCESS_HEADER = -1 +SUCCESS_EOF = -2 +ERROR_TIMEOUT = -3 +ERROR_EXCEPTION = -4 + +_STREAMING_WORKER_CODE = ( + files(__package__) + .joinpath("emscripten_fetch_worker.js") + .read_text(encoding="utf-8") +) + + +class _RequestError(Exception): + def __init__( + self, + message: str | None = None, + *, + request: EmscriptenRequest | None = None, + response: EmscriptenResponse | None = None, + ): + self.request = request + self.response = response + self.message = message + super().__init__(self.message) + + +class _StreamingError(_RequestError): + pass + + +class _TimeoutError(_RequestError): + pass + + +def _obj_from_dict(dict_val: dict[str, Any]) -> JsProxy: + return to_js(dict_val, dict_converter=js.Object.fromEntries) + + +class _ReadStream(io.RawIOBase): + def __init__( + self, + int_buffer: JsArray, + byte_buffer: JsArray, + timeout: float, + worker: JsProxy, + connection_id: int, + request: EmscriptenRequest, + ): + self.int_buffer = int_buffer + self.byte_buffer = byte_buffer + self.read_pos = 0 + self.read_len = 0 + self.connection_id = connection_id + self.worker = worker + self.timeout = int(1000 * timeout) if timeout > 0 else None + self.is_live = True + self._is_closed = False + self.request: EmscriptenRequest | None = request + + def __del__(self) -> None: + self.close() + + # this is compatible with _base_connection + def is_closed(self) -> bool: + return self._is_closed + + # for compatibility with RawIOBase + @property + def closed(self) -> bool: + return self.is_closed() + + def close(self) -> None: + if self.is_closed(): + return + self.read_len = 0 + self.read_pos = 0 + self.int_buffer = None + self.byte_buffer = None + self._is_closed = True + self.request = None + if self.is_live: + self.worker.postMessage(_obj_from_dict({"close": self.connection_id})) + self.is_live = False + super().close() + + def readable(self) -> bool: + return True + + def writable(self) -> bool: + return False + + def seekable(self) -> bool: + return False + + def readinto(self, byte_obj: Buffer) -> int: + if not self.int_buffer: + raise _StreamingError( + "No buffer for stream in _ReadStream.readinto", + request=self.request, + response=None, + ) + if self.read_len == 0: + # wait for the worker to send something + js.Atomics.store(self.int_buffer, 0, ERROR_TIMEOUT) + self.worker.postMessage(_obj_from_dict({"getMore": self.connection_id})) + if ( + js.Atomics.wait(self.int_buffer, 0, ERROR_TIMEOUT, self.timeout) + == "timed-out" + ): + raise _TimeoutError + data_len = self.int_buffer[0] + if data_len > 0: + self.read_len = data_len + self.read_pos = 0 + elif data_len == ERROR_EXCEPTION: + string_len = self.int_buffer[1] + # decode the error string + js_decoder = js.TextDecoder.new() + json_str = js_decoder.decode(self.byte_buffer.slice(0, string_len)) + raise _StreamingError( + f"Exception thrown in fetch: {json_str}", + request=self.request, + response=None, + ) + else: + # EOF, free the buffers and return zero + # and free the request + self.is_live = False + self.close() + return 0 + # copy from int32array to python bytes + ret_length = min(self.read_len, len(memoryview(byte_obj))) + subarray = self.byte_buffer.subarray( + self.read_pos, self.read_pos + ret_length + ).to_py() + memoryview(byte_obj)[0:ret_length] = subarray + self.read_len -= ret_length + self.read_pos += ret_length + return ret_length + + +class _StreamingFetcher: + def __init__(self) -> None: + # make web-worker and data buffer on startup + self.streaming_ready = False + + js_data_blob = js.Blob.new( + to_js([_STREAMING_WORKER_CODE], create_pyproxies=False), + _obj_from_dict({"type": "application/javascript"}), + ) + + def promise_resolver(js_resolve_fn: JsProxy, js_reject_fn: JsProxy) -> None: + def onMsg(e: JsProxy) -> None: + self.streaming_ready = True + js_resolve_fn(e) + + def onErr(e: JsProxy) -> None: + js_reject_fn(e) # Defensive: never happens in ci + + self.js_worker.onmessage = onMsg + self.js_worker.onerror = onErr + + js_data_url = js.URL.createObjectURL(js_data_blob) + self.js_worker = js.globalThis.Worker.new(js_data_url) + self.js_worker_ready_promise = js.globalThis.Promise.new(promise_resolver) + + def send(self, request: EmscriptenRequest) -> EmscriptenResponse: + headers = { + k: v for k, v in request.headers.items() if k not in HEADERS_TO_IGNORE + } + + body = request.body + fetch_data = {"headers": headers, "body": to_js(body), "method": request.method} + # start the request off in the worker + timeout = int(1000 * request.timeout) if request.timeout > 0 else None + js_shared_buffer = js.SharedArrayBuffer.new(1048576) + js_int_buffer = js.Int32Array.new(js_shared_buffer) + js_byte_buffer = js.Uint8Array.new(js_shared_buffer, 8) + + js.Atomics.store(js_int_buffer, 0, ERROR_TIMEOUT) + js.Atomics.notify(js_int_buffer, 0) + js_absolute_url = js.URL.new(request.url, js.location).href + self.js_worker.postMessage( + _obj_from_dict( + { + "buffer": js_shared_buffer, + "url": js_absolute_url, + "fetchParams": fetch_data, + } + ) + ) + # wait for the worker to send something + js.Atomics.wait(js_int_buffer, 0, ERROR_TIMEOUT, timeout) + if js_int_buffer[0] == ERROR_TIMEOUT: + raise _TimeoutError( + "Timeout connecting to streaming request", + request=request, + response=None, + ) + elif js_int_buffer[0] == SUCCESS_HEADER: + # got response + # header length is in second int of intBuffer + string_len = js_int_buffer[1] + # decode the rest to a JSON string + js_decoder = js.TextDecoder.new() + # this does a copy (the slice) because decode can't work on shared array + # for some silly reason + json_str = js_decoder.decode(js_byte_buffer.slice(0, string_len)) + # get it as an object + response_obj = json.loads(json_str) + return EmscriptenResponse( + request=request, + status_code=response_obj["status"], + headers=response_obj["headers"], + body=_ReadStream( + js_int_buffer, + js_byte_buffer, + request.timeout, + self.js_worker, + response_obj["connectionID"], + request, + ), + ) + elif js_int_buffer[0] == ERROR_EXCEPTION: + string_len = js_int_buffer[1] + # decode the error string + js_decoder = js.TextDecoder.new() + json_str = js_decoder.decode(js_byte_buffer.slice(0, string_len)) + raise _StreamingError( + f"Exception thrown in fetch: {json_str}", request=request, response=None + ) + else: + raise _StreamingError( + f"Unknown status from worker in fetch: {js_int_buffer[0]}", + request=request, + response=None, + ) + + +class _JSPIReadStream(io.RawIOBase): + """ + A read stream that uses pyodide.ffi.run_sync to read from a JavaScript fetch + response. This requires support for WebAssembly JavaScript Promise Integration + in the containing browser, and for pyodide to be launched via runPythonAsync. + + :param js_read_stream: + The JavaScript stream reader + + :param timeout: + Timeout in seconds + + :param request: + The request we're handling + + :param response: + The response this stream relates to + + :param js_abort_controller: + A JavaScript AbortController object, used for timeouts + """ + + def __init__( + self, + js_read_stream: Any, + timeout: float, + request: EmscriptenRequest, + response: EmscriptenResponse, + js_abort_controller: Any, # JavaScript AbortController for timeouts + ): + self.js_read_stream = js_read_stream + self.timeout = timeout + self._is_closed = False + self._is_done = False + self.request: EmscriptenRequest | None = request + self.response: EmscriptenResponse | None = response + self.current_buffer = None + self.current_buffer_pos = 0 + self.js_abort_controller = js_abort_controller + + def __del__(self) -> None: + self.close() + + # this is compatible with _base_connection + def is_closed(self) -> bool: + return self._is_closed + + # for compatibility with RawIOBase + @property + def closed(self) -> bool: + return self.is_closed() + + def close(self) -> None: + if self.is_closed(): + return + self.read_len = 0 + self.read_pos = 0 + self.js_read_stream.cancel() + self.js_read_stream = None + self._is_closed = True + self._is_done = True + self.request = None + self.response = None + super().close() + + def readable(self) -> bool: + return True + + def writable(self) -> bool: + return False + + def seekable(self) -> bool: + return False + + def _get_next_buffer(self) -> bool: + result_js = _run_sync_with_timeout( + self.js_read_stream.read(), + self.timeout, + self.js_abort_controller, + request=self.request, + response=self.response, + ) + if result_js.done: + self._is_done = True + return False + else: + self.current_buffer = result_js.value.to_py() + self.current_buffer_pos = 0 + return True + + def readinto(self, byte_obj: Buffer) -> int: + if self.current_buffer is None: + if not self._get_next_buffer() or self.current_buffer is None: + self.close() + return 0 + ret_length = min( + len(byte_obj), len(self.current_buffer) - self.current_buffer_pos + ) + byte_obj[0:ret_length] = self.current_buffer[ + self.current_buffer_pos : self.current_buffer_pos + ret_length + ] + self.current_buffer_pos += ret_length + if self.current_buffer_pos == len(self.current_buffer): + self.current_buffer = None + return ret_length + + +# check if we are in a worker or not +def is_in_browser_main_thread() -> bool: + return hasattr(js, "window") and hasattr(js, "self") and js.self == js.window + + +def is_cross_origin_isolated() -> bool: + return hasattr(js, "crossOriginIsolated") and js.crossOriginIsolated + + +def is_in_node() -> bool: + return ( + hasattr(js, "process") + and hasattr(js.process, "release") + and hasattr(js.process.release, "name") + and js.process.release.name == "node" + ) + + +def is_worker_available() -> bool: + return hasattr(js, "Worker") and hasattr(js, "Blob") + + +_fetcher: _StreamingFetcher | None = None + +if is_worker_available() and ( + (is_cross_origin_isolated() and not is_in_browser_main_thread()) + and (not is_in_node()) +): + _fetcher = _StreamingFetcher() +else: + _fetcher = None + + +NODE_JSPI_ERROR = ( + "urllib3 only works in Node.js with pyodide.runPythonAsync" + " and requires the flag --experimental-wasm-stack-switching in " + " versions of node <24." +) + + +def send_streaming_request(request: EmscriptenRequest) -> EmscriptenResponse | None: + if has_jspi(): + return send_jspi_request(request, True) + elif is_in_node(): + raise _RequestError( + message=NODE_JSPI_ERROR, + request=request, + response=None, + ) + + if _fetcher and streaming_ready(): + return _fetcher.send(request) + else: + _show_streaming_warning() + return None + + +_SHOWN_TIMEOUT_WARNING = False + + +def _show_timeout_warning() -> None: + global _SHOWN_TIMEOUT_WARNING + if not _SHOWN_TIMEOUT_WARNING: + _SHOWN_TIMEOUT_WARNING = True + message = "Warning: Timeout is not available on main browser thread" + js.console.warn(message) + + +_SHOWN_STREAMING_WARNING = False + + +def _show_streaming_warning() -> None: + global _SHOWN_STREAMING_WARNING + if not _SHOWN_STREAMING_WARNING: + _SHOWN_STREAMING_WARNING = True + message = "Can't stream HTTP requests because: \n" + if not is_cross_origin_isolated(): + message += " Page is not cross-origin isolated\n" + if is_in_browser_main_thread(): + message += " Python is running in main browser thread\n" + if not is_worker_available(): + message += " Worker or Blob classes are not available in this environment." # Defensive: this is always False in browsers that we test in + if streaming_ready() is False: + message += """ Streaming fetch worker isn't ready. If you want to be sure that streaming fetch +is working, you need to call: 'await urllib3.contrib.emscripten.fetch.wait_for_streaming_ready()`""" + from js import console + + console.warn(message) + + +def send_request(request: EmscriptenRequest) -> EmscriptenResponse: + if has_jspi(): + return send_jspi_request(request, False) + elif is_in_node(): + raise _RequestError( + message=NODE_JSPI_ERROR, + request=request, + response=None, + ) + try: + js_xhr = js.XMLHttpRequest.new() + + if not is_in_browser_main_thread(): + js_xhr.responseType = "arraybuffer" + if request.timeout: + js_xhr.timeout = int(request.timeout * 1000) + else: + js_xhr.overrideMimeType("text/plain; charset=ISO-8859-15") + if request.timeout: + # timeout isn't available on the main thread - show a warning in console + # if it is set + _show_timeout_warning() + + js_xhr.open(request.method, request.url, False) + for name, value in request.headers.items(): + if name.lower() not in HEADERS_TO_IGNORE: + js_xhr.setRequestHeader(name, value) + + js_xhr.send(to_js(request.body)) + + headers = dict(Parser().parsestr(js_xhr.getAllResponseHeaders())) + + if not is_in_browser_main_thread(): + body = js_xhr.response.to_py().tobytes() + else: + body = js_xhr.response.encode("ISO-8859-15") + return EmscriptenResponse( + status_code=js_xhr.status, headers=headers, body=body, request=request + ) + except JsException as err: + if err.name == "TimeoutError": + raise _TimeoutError(err.message, request=request) + elif err.name == "NetworkError": + raise _RequestError(err.message, request=request) + else: + # general http error + raise _RequestError(err.message, request=request) + + +def send_jspi_request( + request: EmscriptenRequest, streaming: bool +) -> EmscriptenResponse: + """ + Send a request using WebAssembly JavaScript Promise Integration + to wrap the asynchronous JavaScript fetch api (experimental). + + :param request: + Request to send + + :param streaming: + Whether to stream the response + + :return: The response object + :rtype: EmscriptenResponse + """ + timeout = request.timeout + js_abort_controller = js.AbortController.new() + headers = {k: v for k, v in request.headers.items() if k not in HEADERS_TO_IGNORE} + req_body = request.body + fetch_data = { + "headers": headers, + "body": to_js(req_body), + "method": request.method, + "signal": js_abort_controller.signal, + } + # Node.js returns the whole response (unlike opaqueredirect in browsers), + # so urllib3 can set `redirect: manual` to control redirects itself. + # https://stackoverflow.com/a/78524615 + if _is_node_js(): + fetch_data["redirect"] = "manual" + # Call JavaScript fetch (async api, returns a promise) + fetcher_promise_js = js.fetch(request.url, _obj_from_dict(fetch_data)) + # Now suspend WebAssembly until we resolve that promise + # or time out. + response_js = _run_sync_with_timeout( + fetcher_promise_js, + timeout, + js_abort_controller, + request=request, + response=None, + ) + headers = {} + header_iter = response_js.headers.entries() + while True: + iter_value_js = header_iter.next() + if getattr(iter_value_js, "done", False): + break + else: + headers[str(iter_value_js.value[0])] = str(iter_value_js.value[1]) + status_code = response_js.status + body: bytes | io.RawIOBase = b"" + + response = EmscriptenResponse( + status_code=status_code, headers=headers, body=b"", request=request + ) + if streaming: + # get via inputstream + if response_js.body is not None: + # get a reader from the fetch response + body_stream_js = response_js.body.getReader() + body = _JSPIReadStream( + body_stream_js, timeout, request, response, js_abort_controller + ) + else: + # get directly via arraybuffer + # n.b. this is another async JavaScript call. + body = _run_sync_with_timeout( + response_js.arrayBuffer(), + timeout, + js_abort_controller, + request=request, + response=response, + ).to_py() + response.body = body + return response + + +def _run_sync_with_timeout( + promise: Any, + timeout: float, + js_abort_controller: Any, + request: EmscriptenRequest | None, + response: EmscriptenResponse | None, +) -> Any: + """ + Await a JavaScript promise synchronously with a timeout which is implemented + via the AbortController + + :param promise: + Javascript promise to await + + :param timeout: + Timeout in seconds + + :param js_abort_controller: + A JavaScript AbortController object, used on timeout + + :param request: + The request being handled + + :param response: + The response being handled (if it exists yet) + + :raises _TimeoutError: If the request times out + :raises _RequestError: If the request raises a JavaScript exception + + :return: The result of awaiting the promise. + """ + timer_id = None + if timeout > 0: + timer_id = js.setTimeout( + js_abort_controller.abort.bind(js_abort_controller), int(timeout * 1000) + ) + try: + from pyodide.ffi import run_sync + + # run_sync here uses WebAssembly JavaScript Promise Integration to + # suspend python until the JavaScript promise resolves. + return run_sync(promise) + except JsException as err: + if err.name == "AbortError": + raise _TimeoutError( + message="Request timed out", request=request, response=response + ) + else: + raise _RequestError(message=err.message, request=request, response=response) + finally: + if timer_id is not None: + js.clearTimeout(timer_id) + + +def has_jspi() -> bool: + """ + Return true if jspi can be used. + + This requires both browser support and also WebAssembly + to be in the correct state - i.e. that the javascript + call into python was async not sync. + + :return: True if jspi can be used. + :rtype: bool + """ + try: + from pyodide.ffi import can_run_sync, run_sync # noqa: F401 + + return bool(can_run_sync()) + except ImportError: + return False + + +def _is_node_js() -> bool: + """ + Check if we are in Node.js. + + :return: True if we are in Node.js. + :rtype: bool + """ + return ( + hasattr(js, "process") + and hasattr(js.process, "release") + # According to the Node.js documentation, the release name is always "node". + and js.process.release.name == "node" + ) + + +def streaming_ready() -> bool | None: + if _fetcher: + return _fetcher.streaming_ready + else: + return None # no fetcher, return None to signify that + + +async def wait_for_streaming_ready() -> bool: + if _fetcher: + await _fetcher.js_worker_ready_promise + return True + else: + return False diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/request.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/request.py new file mode 100644 index 000000000..e692e692b --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/request.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +from dataclasses import dataclass, field + +from ..._base_connection import _TYPE_BODY + + +@dataclass +class EmscriptenRequest: + method: str + url: str + params: dict[str, str] | None = None + body: _TYPE_BODY | None = None + headers: dict[str, str] = field(default_factory=dict) + timeout: float = 0 + decode_content: bool = True + + def set_header(self, name: str, value: str) -> None: + self.headers[name.capitalize()] = value + + def set_body(self, body: _TYPE_BODY | None) -> None: + self.body = body diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.py new file mode 100644 index 000000000..cb1088a18 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.py @@ -0,0 +1,277 @@ +from __future__ import annotations + +import json as _json +import logging +import typing +from contextlib import contextmanager +from dataclasses import dataclass +from http.client import HTTPException as HTTPException +from io import BytesIO, IOBase + +from ...exceptions import InvalidHeader, TimeoutError +from ...response import BaseHTTPResponse +from ...util.retry import Retry +from .request import EmscriptenRequest + +if typing.TYPE_CHECKING: + from ..._base_connection import BaseHTTPConnection, BaseHTTPSConnection + +log = logging.getLogger(__name__) + + +@dataclass +class EmscriptenResponse: + status_code: int + headers: dict[str, str] + body: IOBase | bytes + request: EmscriptenRequest + + +class EmscriptenHttpResponseWrapper(BaseHTTPResponse): + def __init__( + self, + internal_response: EmscriptenResponse, + url: str | None = None, + connection: BaseHTTPConnection | BaseHTTPSConnection | None = None, + ): + self._pool = None # set by pool class + self._body = None + self._response = internal_response + self._url = url + self._connection = connection + self._closed = False + super().__init__( + headers=internal_response.headers, + status=internal_response.status_code, + request_url=url, + version=0, + version_string="HTTP/?", + reason="", + decode_content=True, + ) + self.length_remaining = self._init_length(self._response.request.method) + self.length_is_certain = False + + @property + def url(self) -> str | None: + return self._url + + @url.setter + def url(self, url: str | None) -> None: + self._url = url + + @property + def connection(self) -> BaseHTTPConnection | BaseHTTPSConnection | None: + return self._connection + + @property + def retries(self) -> Retry | None: + return self._retries + + @retries.setter + def retries(self, retries: Retry | None) -> None: + # Override the request_url if retries has a redirect location. + self._retries = retries + + def stream( + self, amt: int | None = 2**16, decode_content: bool | None = None + ) -> typing.Generator[bytes]: + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + while True: + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + else: + break + + def _init_length(self, request_method: str | None) -> int | None: + length: int | None + content_length: str | None = self.headers.get("content-length") + + if content_length is not None: + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = {int(val) for val in content_length.split(",")} + if len(lengths) > 1: + raise InvalidHeader( + "Content-Length contained multiple " + "unmatching values (%s)" % content_length + ) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + else: # if content_length is None + length = None + + # Check for responses that shouldn't include a body + if ( + self.status in (204, 304) + or 100 <= self.status < 200 + or request_method == "HEAD" + ): + length = 0 + + return length + + def read( + self, + amt: int | None = None, + decode_content: bool | None = None, # ignored because browser decodes always + cache_content: bool = False, + ) -> bytes: + if ( + self._closed + or self._response is None + or (isinstance(self._response.body, IOBase) and self._response.body.closed) + ): + return b"" + + with self._error_catcher(): + # body has been preloaded as a string by XmlHttpRequest + if not isinstance(self._response.body, IOBase): + self.length_remaining = len(self._response.body) + self.length_is_certain = True + # wrap body in IOStream + self._response.body = BytesIO(self._response.body) + if amt is not None and amt >= 0: + # don't cache partial content + cache_content = False + data = self._response.body.read(amt) + else: # read all we can (and cache it) + data = self._response.body.read() + if cache_content: + self._body = data + if self.length_remaining is not None: + self.length_remaining = max(self.length_remaining - len(data), 0) + if len(data) == 0 or ( + self.length_is_certain and self.length_remaining == 0 + ): + # definitely finished reading, close response stream + self._response.body.close() + return typing.cast(bytes, data) + + def read_chunked( + self, + amt: int | None = None, + decode_content: bool | None = None, + ) -> typing.Generator[bytes]: + # chunked is handled by browser + while True: + bytes = self.read(amt, decode_content) + if not bytes: + break + yield bytes + + def release_conn(self) -> None: + if not self._pool or not self._connection: + return None + + self._pool._put_conn(self._connection) + self._connection = None + + def drain_conn(self) -> None: + self.close() + + @property + def data(self) -> bytes: + if self._body: + return self._body + else: + return self.read(cache_content=True) + + def json(self) -> typing.Any: + """ + Deserializes the body of the HTTP response as a Python object. + + The body of the HTTP response must be encoded using UTF-8, as per + `RFC 8529 Section 8.1 `_. + + To use a custom JSON decoder pass the result of :attr:`HTTPResponse.data` to + your custom decoder instead. + + If the body of the HTTP response is not decodable to UTF-8, a + `UnicodeDecodeError` will be raised. If the body of the HTTP response is not a + valid JSON document, a `json.JSONDecodeError` will be raised. + + Read more :ref:`here `. + + :returns: The body of the HTTP response as a Python object. + """ + data = self.data.decode("utf-8") + return _json.loads(data) + + def close(self) -> None: + if not self._closed: + if isinstance(self._response.body, IOBase): + self._response.body.close() + if self._connection: + self._connection.close() + self._connection = None + self._closed = True + + @contextmanager + def _error_catcher(self) -> typing.Generator[None]: + """ + Catch Emscripten specific exceptions thrown by fetch.py, + instead re-raising urllib3 variants, so that low-level exceptions + are not leaked in the high-level api. + + On exit, release the connection back to the pool. + """ + from .fetch import _RequestError, _TimeoutError # avoid circular import + + clean_exit = False + + try: + yield + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + except _TimeoutError as e: + raise TimeoutError(str(e)) + except _RequestError as e: + raise HTTPException(str(e)) + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now + if ( + isinstance(self._response.body, IOBase) + and not self._response.body.closed + ): + self._response.body.close() + # release the connection back to the pool + self.release_conn() + else: + # If we have read everything from the response stream, + # return the connection back to the pool. + if ( + isinstance(self._response.body, IOBase) + and self._response.body.closed + ): + self.release_conn() diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/pyopenssl.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/pyopenssl.py new file mode 100644 index 000000000..3714500ec --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/pyopenssl.py @@ -0,0 +1,564 @@ +""" +Module for using pyOpenSSL as a TLS backend. This module was relevant before +the standard library ``ssl`` module supported SNI, but now that we've dropped +support for Python 2.7 all relevant Python versions support SNI so +**this module is no longer recommended**. + +This needs the following packages installed: + +* `pyOpenSSL`_ (tested with 16.0.0) +* `cryptography`_ (minimum 1.3.4, from pyopenssl) +* `idna`_ (minimum 2.0) + +However, pyOpenSSL depends on cryptography, so while we use all three directly here we +end up having relatively few packages required. + +You can install them with the following command: + +.. code-block:: bash + + $ python -m pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this: + +.. code-block:: python + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +.. _pyopenssl: https://www.pyopenssl.org +.. _cryptography: https://cryptography.io +.. _idna: https://github.com/kjd/idna +""" + +from __future__ import annotations + +import OpenSSL.SSL # type: ignore[import-untyped] +from cryptography import x509 + +try: + from cryptography.x509 import UnsupportedExtension # type: ignore[attr-defined] +except ImportError: + # UnsupportedExtension is gone in cryptography >= 2.1.0 + class UnsupportedExtension(Exception): # type: ignore[no-redef] + pass + + +import logging +import ssl +import typing +from io import BytesIO +from socket import socket as socket_cls +from socket import timeout + +from .. import util + +if typing.TYPE_CHECKING: + from OpenSSL.crypto import X509 # type: ignore[import-untyped] + + +__all__ = ["inject_into_urllib3", "extract_from_urllib3"] + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions: dict[int, int] = { + util.ssl_.PROTOCOL_TLS: OpenSSL.SSL.SSLv23_METHOD, # type: ignore[attr-defined] + util.ssl_.PROTOCOL_TLS_CLIENT: OpenSSL.SSL.SSLv23_METHOD, # type: ignore[attr-defined] + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, "PROTOCOL_TLSv1_1") and hasattr(OpenSSL.SSL, "TLSv1_1_METHOD"): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, "PROTOCOL_TLSv1_2") and hasattr(OpenSSL.SSL, "TLSv1_2_METHOD"): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER + + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = {v: k for k, v in _stdlib_to_openssl_verify.items()} + +# The SSLvX values are the most likely to be missing in the future +# but we check them all just to be sure. +_OP_NO_SSLv2_OR_SSLv3: int = getattr(OpenSSL.SSL, "OP_NO_SSLv2", 0) | getattr( + OpenSSL.SSL, "OP_NO_SSLv3", 0 +) +_OP_NO_TLSv1: int = getattr(OpenSSL.SSL, "OP_NO_TLSv1", 0) +_OP_NO_TLSv1_1: int = getattr(OpenSSL.SSL, "OP_NO_TLSv1_1", 0) +_OP_NO_TLSv1_2: int = getattr(OpenSSL.SSL, "OP_NO_TLSv1_2", 0) +_OP_NO_TLSv1_3: int = getattr(OpenSSL.SSL, "OP_NO_TLSv1_3", 0) + +_openssl_to_ssl_minimum_version: dict[int, int] = { + ssl.TLSVersion.MINIMUM_SUPPORTED: _OP_NO_SSLv2_OR_SSLv3, + ssl.TLSVersion.TLSv1: _OP_NO_SSLv2_OR_SSLv3, + ssl.TLSVersion.TLSv1_1: _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1, + ssl.TLSVersion.TLSv1_2: _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1 | _OP_NO_TLSv1_1, + ssl.TLSVersion.TLSv1_3: ( + _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1 | _OP_NO_TLSv1_1 | _OP_NO_TLSv1_2 + ), + ssl.TLSVersion.MAXIMUM_SUPPORTED: ( + _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1 | _OP_NO_TLSv1_1 | _OP_NO_TLSv1_2 + ), +} +_openssl_to_ssl_maximum_version: dict[int, int] = { + ssl.TLSVersion.MINIMUM_SUPPORTED: ( + _OP_NO_SSLv2_OR_SSLv3 + | _OP_NO_TLSv1 + | _OP_NO_TLSv1_1 + | _OP_NO_TLSv1_2 + | _OP_NO_TLSv1_3 + ), + ssl.TLSVersion.TLSv1: ( + _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1_1 | _OP_NO_TLSv1_2 | _OP_NO_TLSv1_3 + ), + ssl.TLSVersion.TLSv1_1: _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1_2 | _OP_NO_TLSv1_3, + ssl.TLSVersion.TLSv1_2: _OP_NO_SSLv2_OR_SSLv3 | _OP_NO_TLSv1_3, + ssl.TLSVersion.TLSv1_3: _OP_NO_SSLv2_OR_SSLv3, + ssl.TLSVersion.MAXIMUM_SUPPORTED: _OP_NO_SSLv2_OR_SSLv3, +} + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3() -> None: + "Monkey-patch urllib3 with PyOpenSSL-backed SSL-support." + + _validate_dependencies_met() + + util.SSLContext = PyOpenSSLContext # type: ignore[assignment] + util.ssl_.SSLContext = PyOpenSSLContext # type: ignore[assignment] + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3() -> None: + "Undo monkey-patching by :func:`inject_into_urllib3`." + + util.SSLContext = orig_util_SSLContext + util.ssl_.SSLContext = orig_util_SSLContext + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met() -> None: + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError( + "'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer." + ) + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError( + "'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer." + ) + + +def _dnsname_to_stdlib(name: str) -> str | None: + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + + If the name cannot be idna-encoded then we return None signalling that + the name given should be skipped. + """ + + def idna_encode(name: str) -> bytes | None: + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + import idna + + try: + for prefix in ["*.", "."]: + if name.startswith(prefix): + name = name[len(prefix) :] + return prefix.encode("ascii") + idna.encode(name) + return idna.encode(name) + except idna.core.IDNAError: + return None + + # Don't send IPv6 addresses through the IDNA encoder. + if ":" in name: + return name + + encoded_name = idna_encode(name) + if encoded_name is None: + return None + return encoded_name.decode("utf-8") + + +def get_subj_alt_name(peer_cert: X509) -> list[tuple[str, str]]: + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + cert = peer_cert.to_cryptography() + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class(x509.SubjectAlternativeName).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except ( + x509.DuplicateExtension, + UnsupportedExtension, + x509.UnsupportedGeneralNameType, + UnicodeError, + ) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + # We also want to skip over names which cannot be idna encoded. + names = [ + ("DNS", name) + for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None + ] + names.extend( + ("IP Address", str(name)) for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket: + """API-compatibility wrapper for Python OpenSSL's Connection-class.""" + + def __init__( + self, + connection: OpenSSL.SSL.Connection, + socket: socket_cls, + suppress_ragged_eofs: bool = True, + ) -> None: + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._io_refs = 0 + self._closed = False + + def fileno(self) -> int: + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self) -> None: + if self._io_refs > 0: + self._io_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args: typing.Any, **kwargs: typing.Any) -> bytes: + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): + return b"" + else: + raise OSError(e.args[0], str(e)) from e + except OpenSSL.SSL.ZeroReturnError: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b"" + else: + raise + except OpenSSL.SSL.WantReadError as e: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout("The read operation timed out") from e + else: + return self.recv(*args, **kwargs) + + # TLS 1.3 post-handshake authentication + except OpenSSL.SSL.Error as e: + raise ssl.SSLError(f"read error: {e!r}") from e + else: + return data # type: ignore[no-any-return] + + def recv_into(self, *args: typing.Any, **kwargs: typing.Any) -> int: + try: + return self.connection.recv_into(*args, **kwargs) # type: ignore[no-any-return] + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, "Unexpected EOF"): + return 0 + else: + raise OSError(e.args[0], str(e)) from e + except OpenSSL.SSL.ZeroReturnError: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError as e: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout("The read operation timed out") from e + else: + return self.recv_into(*args, **kwargs) + + # TLS 1.3 post-handshake authentication + except OpenSSL.SSL.Error as e: + raise ssl.SSLError(f"read error: {e!r}") from e + + def settimeout(self, timeout: float) -> None: + return self.socket.settimeout(timeout) + + def _send_until_done(self, data: bytes) -> int: + while True: + try: + return self.connection.send(data) # type: ignore[no-any-return] + except OpenSSL.SSL.WantWriteError as e: + if not util.wait_for_write(self.socket, self.socket.gettimeout()): + raise timeout() from e + continue + except OpenSSL.SSL.SysCallError as e: + raise OSError(e.args[0], str(e)) from e + + def sendall(self, data: bytes) -> None: + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done( + data[total_sent : total_sent + SSL_WRITE_BLOCKSIZE] + ) + total_sent += sent + + def shutdown(self, how: int) -> None: + try: + self.connection.shutdown() + except OpenSSL.SSL.Error as e: + raise ssl.SSLError(f"shutdown error: {e!r}") from e + + def close(self) -> None: + self._closed = True + if self._io_refs <= 0: + self._real_close() + + def _real_close(self) -> None: + try: + return self.connection.close() # type: ignore[no-any-return] + except OpenSSL.SSL.Error: + return + + def getpeercert( + self, binary_form: bool = False + ) -> dict[str, list[typing.Any]] | None: + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 # type: ignore[no-any-return] + + if binary_form: + return OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, x509) # type: ignore[no-any-return] + + return { + "subject": ((("commonName", x509.get_subject().CN),),), # type: ignore[dict-item] + "subjectAltName": get_subj_alt_name(x509), + } + + def version(self) -> str: + return self.connection.get_protocol_version_name() # type: ignore[no-any-return] + + def selected_alpn_protocol(self) -> str | None: + alpn_proto = self.connection.get_alpn_proto_negotiated() + return alpn_proto.decode() if alpn_proto else None + + +WrappedSocket.makefile = socket_cls.makefile # type: ignore[attr-defined] + + +class PyOpenSSLContext: + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + + def __init__(self, protocol: int) -> None: + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + self._minimum_version: int = ssl.TLSVersion.MINIMUM_SUPPORTED + self._maximum_version: int = ssl.TLSVersion.MAXIMUM_SUPPORTED + self._verify_flags: int = ssl.VERIFY_X509_TRUSTED_FIRST + + @property + def options(self) -> int: + return self._options + + @options.setter + def options(self, value: int) -> None: + self._options = value + self._set_ctx_options() + + @property + def verify_flags(self) -> int: + return self._verify_flags + + @verify_flags.setter + def verify_flags(self, value: int) -> None: + self._verify_flags = value + self._ctx.get_cert_store().set_flags(self._verify_flags) + + @property + def verify_mode(self) -> int: + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value: ssl.VerifyMode) -> None: + self._ctx.set_verify(_stdlib_to_openssl_verify[value], _verify_callback) + + def set_default_verify_paths(self) -> None: + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers: bytes | str) -> None: + if isinstance(ciphers, str): + ciphers = ciphers.encode("utf-8") + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations( + self, + cafile: str | None = None, + capath: str | None = None, + cadata: bytes | None = None, + ) -> None: + if cafile is not None: + cafile = cafile.encode("utf-8") # type: ignore[assignment] + if capath is not None: + capath = capath.encode("utf-8") # type: ignore[assignment] + try: + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + except OpenSSL.SSL.Error as e: + raise ssl.SSLError(f"unable to load trusted certificates: {e!r}") from e + + def load_cert_chain( + self, + certfile: str, + keyfile: str | None = None, + password: str | None = None, + ) -> None: + try: + self._ctx.use_certificate_chain_file(certfile) + if password is not None: + if not isinstance(password, bytes): + password = password.encode("utf-8") # type: ignore[assignment] + self._ctx.set_passwd_cb(lambda *_: password) + self._ctx.use_privatekey_file(keyfile or certfile) + except OpenSSL.SSL.Error as e: + raise ssl.SSLError(f"Unable to load certificate chain: {e!r}") from e + + def set_alpn_protocols(self, protocols: list[bytes | str]) -> None: + protocols = [util.util.to_bytes(p, "ascii") for p in protocols] + return self._ctx.set_alpn_protos(protocols) # type: ignore[no-any-return] + + def wrap_socket( + self, + sock: socket_cls, + server_side: bool = False, + do_handshake_on_connect: bool = True, + suppress_ragged_eofs: bool = True, + server_hostname: bytes | str | None = None, + ) -> WrappedSocket: + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + # If server_hostname is an IP, don't use it for SNI, per RFC6066 Section 3 + if server_hostname and not util.ssl_.is_ipaddress(server_hostname): + if isinstance(server_hostname, str): + server_hostname = server_hostname.encode("utf-8") + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError as e: + if not util.wait_for_read(sock, sock.gettimeout()): + raise timeout("select timed out") from e + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError(f"bad handshake: {e!r}") from e + break + + return WrappedSocket(cnx, sock) + + def _set_ctx_options(self) -> None: + self._ctx.set_options( + self._options + | _openssl_to_ssl_minimum_version[self._minimum_version] + | _openssl_to_ssl_maximum_version[self._maximum_version] + ) + + @property + def minimum_version(self) -> int: + return self._minimum_version + + @minimum_version.setter + def minimum_version(self, minimum_version: int) -> None: + self._minimum_version = minimum_version + self._set_ctx_options() + + @property + def maximum_version(self) -> int: + return self._maximum_version + + @maximum_version.setter + def maximum_version(self, maximum_version: int) -> None: + self._maximum_version = maximum_version + self._set_ctx_options() + + +def _verify_callback( + cnx: OpenSSL.SSL.Connection, + x509: X509, + err_no: int, + err_depth: int, + return_code: int, +) -> bool: + return err_no == 0 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/socks.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/socks.py new file mode 100644 index 000000000..c62b5e033 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/contrib/socks.py @@ -0,0 +1,228 @@ +""" +This module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4, SOCKS4A (an extension of SOCKS4), and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +The SOCKS implementation supports the full range of urllib3 features. It also +supports the following SOCKS features: + +- SOCKS4A (``proxy_url='socks4a://...``) +- SOCKS4 (``proxy_url='socks4://...``) +- SOCKS5 with remote DNS (``proxy_url='socks5h://...``) +- SOCKS5 with local DNS (``proxy_url='socks5://...``) +- Usernames and passwords for the SOCKS proxy + +.. note:: + It is recommended to use ``socks5h://`` or ``socks4a://`` schemes in + your ``proxy_url`` to ensure that DNS resolution is done from the remote + server instead of client-side when connecting to a domain name. + +SOCKS4 supports IPv4 and domain names with the SOCKS4A extension. SOCKS5 +supports IPv4, IPv6, and domain names. + +When connecting to a SOCKS4 proxy the ``username`` portion of the ``proxy_url`` +will be sent as the ``userid`` section of the SOCKS request: + +.. code-block:: python + + proxy_url="socks4a://@proxy-host" + +When connecting to a SOCKS5 proxy the ``username`` and ``password`` portion +of the ``proxy_url`` will be sent as the username/password to authenticate +with the proxy: + +.. code-block:: python + + proxy_url="socks5h://:@proxy-host" + +""" + +from __future__ import annotations + +try: + import socks # type: ignore[import-not-found] +except ImportError: + import warnings + + from ..exceptions import DependencyWarning + + warnings.warn( + ( + "SOCKS support in urllib3 requires the installation of optional " + "dependencies: specifically, PySocks. For more information, see " + "https://urllib3.readthedocs.io/en/latest/advanced-usage.html#socks-proxies" + ), + DependencyWarning, + ) + raise + +import typing +from socket import timeout as SocketTimeout + +from ..connection import HTTPConnection, HTTPSConnection +from ..connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None # type: ignore[assignment] + + +class _TYPE_SOCKS_OPTIONS(typing.TypedDict): + socks_version: int + proxy_host: str | None + proxy_port: str | None + username: str | None + password: str | None + rdns: bool + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + + def __init__( + self, + _socks_options: _TYPE_SOCKS_OPTIONS, + *args: typing.Any, + **kwargs: typing.Any, + ) -> None: + self._socks_options = _socks_options + super().__init__(*args, **kwargs) + + def _new_conn(self) -> socks.socksocket: + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw: dict[str, typing.Any] = {} + if self.source_address: + extra_kw["source_address"] = self.source_address + + if self.socket_options: + extra_kw["socket_options"] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options["socks_version"], + proxy_addr=self._socks_options["proxy_host"], + proxy_port=self._socks_options["proxy_port"], + proxy_username=self._socks_options["username"], + proxy_password=self._socks_options["password"], + proxy_rdns=self._socks_options["rdns"], + timeout=self.timeout, + **extra_kw, + ) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, + f"Connection to {self.host} timed out. (connect timeout={self.timeout})", + ) from e + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + f"Connection to {self.host} timed out. (connect timeout={self.timeout})", + ) from e + else: + # Adding `from e` messes with coverage somehow, so it's omitted. + # See #2386. + raise NewConnectionError( + self, f"Failed to establish a new connection: {error}" + ) + else: + raise NewConnectionError( + self, f"Failed to establish a new connection: {e}" + ) from e + + except OSError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, f"Failed to establish a new connection: {e}" + ) from e + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + + pool_classes_by_scheme = { + "http": SOCKSHTTPConnectionPool, + "https": SOCKSHTTPSConnectionPool, + } + + def __init__( + self, + proxy_url: str, + username: str | None = None, + password: str | None = None, + num_pools: int = 10, + headers: typing.Mapping[str, str] | None = None, + **connection_pool_kw: typing.Any, + ): + parsed = parse_url(proxy_url) + + if username is None and password is None and parsed.auth is not None: + split = parsed.auth.split(":") + if len(split) == 2: + username, password = split + if parsed.scheme == "socks5": + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == "socks5h": + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == "socks4": + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == "socks4a": + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError(f"Unable to determine SOCKS version from {proxy_url}") + + self.proxy_url = proxy_url + + socks_options = { + "socks_version": socks_version, + "proxy_host": parsed.host, + "proxy_port": parsed.port, + "username": username, + "password": password, + "rdns": rdns, + } + connection_pool_kw["_socks_options"] = socks_options + + super().__init__(num_pools, headers, **connection_pool_kw) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/exceptions.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/exceptions.py new file mode 100644 index 000000000..a0de9d6cc --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/exceptions.py @@ -0,0 +1,335 @@ +from __future__ import annotations + +import socket +import typing +import warnings +from email.errors import MessageDefect +from http.client import IncompleteRead as httplib_IncompleteRead + +if typing.TYPE_CHECKING: + from .connection import HTTPConnection + from .connectionpool import ConnectionPool + from .response import HTTPResponse + from .util.retry import Retry + +# Base Exceptions + + +class HTTPError(Exception): + """Base exception used by this module.""" + + +class HTTPWarning(Warning): + """Base warning used by this module.""" + + +_TYPE_REDUCE_RESULT = tuple[typing.Callable[..., object], tuple[object, ...]] + + +class PoolError(HTTPError): + """Base exception for errors caused within a pool.""" + + def __init__(self, pool: ConnectionPool, message: str) -> None: + self.pool = pool + self._message = message + super().__init__(f"{pool}: {message}") + + def __reduce__(self) -> _TYPE_REDUCE_RESULT: + # For pickling purposes. + return self.__class__, (None, self._message) + + +class RequestError(PoolError): + """Base exception for PoolErrors that have associated URLs.""" + + def __init__(self, pool: ConnectionPool, url: str, message: str) -> None: + self.url = url + super().__init__(pool, message) + + def __reduce__(self) -> _TYPE_REDUCE_RESULT: + # For pickling purposes. + return self.__class__, (None, self.url, self._message) + + +class SSLError(HTTPError): + """Raised when SSL certificate fails in an HTTPS connection.""" + + +class ProxyError(HTTPError): + """Raised when the connection to a proxy fails.""" + + # The original error is also available as __cause__. + original_error: Exception + + def __init__(self, message: str, error: Exception) -> None: + super().__init__(message, error) + self.original_error = error + + +class DecodeError(HTTPError): + """Raised when automatic decoding based on Content-Type fails.""" + + +class ProtocolError(HTTPError): + """Raised when something unexpected happens mid-request/response.""" + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param str url: The requested Url + :param reason: The underlying error + :type reason: :class:`Exception` + + """ + + def __init__( + self, pool: ConnectionPool, url: str, reason: Exception | None = None + ) -> None: + self.reason = reason + + message = f"Max retries exceeded with url: {url} (Caused by {reason!r})" + + super().__init__(pool, url, message) + + def __reduce__(self) -> _TYPE_REDUCE_RESULT: + # For pickling purposes. + return self.__class__, (None, self.url, self.reason) + + +class HostChangedError(RequestError): + """Raised when an existing pool gets a request for a foreign host.""" + + def __init__( + self, pool: ConnectionPool, url: str, retries: Retry | int = 3 + ) -> None: + message = f"Tried to open a foreign host with url: {url}" + super().__init__(pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """Raised when passing an invalid state to a timeout""" + + +class TimeoutError(HTTPError): + """Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + ` and :exc:`ConnectTimeoutErrors `. + """ + + +class ReadTimeoutError(TimeoutError, RequestError): + """Raised when a socket timeout occurs while receiving data from a server""" + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + """Raised when a socket timeout occurs while connecting to a server""" + + +class NewConnectionError(ConnectTimeoutError, HTTPError): + """Raised when we fail to establish a new connection. Usually ECONNREFUSED.""" + + def __init__(self, conn: HTTPConnection, message: str) -> None: + self.conn = conn + self._message = message + super().__init__(f"{conn}: {message}") + + def __reduce__(self) -> _TYPE_REDUCE_RESULT: + # For pickling purposes. + return self.__class__, (None, self._message) + + @property + def pool(self) -> HTTPConnection: + warnings.warn( + "The 'pool' property is deprecated and will be removed " + "in urllib3 v2.1.0. Use 'conn' instead.", + DeprecationWarning, + stacklevel=2, + ) + + return self.conn + + +class NameResolutionError(NewConnectionError): + """Raised when host name resolution fails.""" + + def __init__(self, host: str, conn: HTTPConnection, reason: socket.gaierror): + message = f"Failed to resolve '{host}' ({reason})" + self._host = host + self._reason = reason + super().__init__(conn, message) + + def __reduce__(self) -> _TYPE_REDUCE_RESULT: + # For pickling purposes. + return self.__class__, (self._host, None, self._reason) + + +class EmptyPoolError(PoolError): + """Raised when a pool runs out of connections and no more are allowed.""" + + +class FullPoolError(PoolError): + """Raised when we try to add a connection to a full pool in blocking mode.""" + + +class ClosedPoolError(PoolError): + """Raised when a request enters a pool after the pool has been closed.""" + + +class LocationValueError(ValueError, HTTPError): + """Raised when there is something wrong with a given URL input.""" + + +class LocationParseError(LocationValueError): + """Raised when get_host or similar fails to parse the URL input.""" + + def __init__(self, location: str) -> None: + message = f"Failed to parse: {location}" + super().__init__(message) + + self.location = location + + +class URLSchemeUnknown(LocationValueError): + """Raised when a URL input has an unsupported scheme.""" + + def __init__(self, scheme: str): + message = f"Not supported URL scheme {scheme}" + super().__init__(message) + + self.scheme = scheme + + +class ResponseError(HTTPError): + """Used as a container for an error reason supplied in a MaxRetryError.""" + + GENERIC_ERROR = "too many error responses" + SPECIFIC_ERROR = "too many {status_code} error responses" + + +class SecurityWarning(HTTPWarning): + """Warned when performing security reducing actions""" + + +class InsecureRequestWarning(SecurityWarning): + """Warned when making an unverified HTTPS request.""" + + +class NotOpenSSLWarning(SecurityWarning): + """Warned when using unsupported SSL library""" + + +class SystemTimeWarning(SecurityWarning): + """Warned when system time is suspected to be wrong""" + + +class InsecurePlatformWarning(SecurityWarning): + """Warned when certain TLS/SSL configuration is not available on a platform.""" + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + + +class ResponseNotChunked(ProtocolError, ValueError): + """Response needs to be chunked in order to read it as chunks.""" + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be :class:`http.client.HTTPResponse` like + (have an fp attribute which returns raw chunks) for read_chunked(). + """ + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of :class:`http.client.IncompleteRead` to allow int value + for ``partial`` to avoid creating large objects on streamed reads. + """ + + partial: int # type: ignore[assignment] + expected: int + + def __init__(self, partial: int, expected: int) -> None: + self.partial = partial + self.expected = expected + + def __repr__(self) -> str: + return "IncompleteRead(%i bytes read, %i more expected)" % ( + self.partial, + self.expected, + ) + + +class InvalidChunkLength(HTTPError, httplib_IncompleteRead): + """Invalid chunk length in a chunked response.""" + + def __init__(self, response: HTTPResponse, length: bytes) -> None: + self.partial: int = response.tell() # type: ignore[assignment] + self.expected: int | None = response.length_remaining + self.response = response + self.length = length + + def __repr__(self) -> str: + return "InvalidChunkLength(got length %r, %i bytes read)" % ( + self.length, + self.partial, + ) + + +class InvalidHeader(HTTPError): + """The header provided was somehow invalid.""" + + +class ProxySchemeUnknown(AssertionError, URLSchemeUnknown): + """ProxyManager does not support the supplied scheme""" + + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme: str | None) -> None: + # 'localhost' is here because our URL parser parses + # localhost:8080 -> scheme=localhost, remove if we fix this. + if scheme == "localhost": + scheme = None + if scheme is None: + message = "Proxy URL had no scheme, should start with http:// or https://" + else: + message = f"Proxy URL had unsupported scheme {scheme}, should use http:// or https://" + super().__init__(message) + + +class ProxySchemeUnsupported(ValueError): + """Fetching HTTPS resources through HTTPS proxies is unsupported""" + + +class HeaderParsingError(HTTPError): + """Raised by assert_header_parsing, but we convert it to a log.warning statement.""" + + def __init__( + self, defects: list[MessageDefect], unparsed_data: bytes | str | None + ) -> None: + message = f"{defects or 'Unknown'}, unparsed data: {unparsed_data!r}" + super().__init__(message) + + +class UnrewindableBodyError(HTTPError): + """urllib3 encountered an error when trying to rewind a body""" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/fields.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/fields.py new file mode 100644 index 000000000..97c4730cf --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/fields.py @@ -0,0 +1,341 @@ +from __future__ import annotations + +import email.utils +import mimetypes +import typing + +_TYPE_FIELD_VALUE = typing.Union[str, bytes] +_TYPE_FIELD_VALUE_TUPLE = typing.Union[ + _TYPE_FIELD_VALUE, + tuple[str, _TYPE_FIELD_VALUE], + tuple[str, _TYPE_FIELD_VALUE, str], +] + + +def guess_content_type( + filename: str | None, default: str = "application/octet-stream" +) -> str: + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param_rfc2231(name: str, value: _TYPE_FIELD_VALUE) -> str: + """ + Helper function to format and quote a single header parameter using the + strategy defined in RFC 2231. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows + `RFC 2388 Section 4.4 `_. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as ``bytes`` or `str``. + :returns: + An RFC-2231-formatted unicode string. + + .. deprecated:: 2.0.0 + Will be removed in urllib3 v2.1.0. This is not valid for + ``multipart/form-data`` header parameters. + """ + import warnings + + warnings.warn( + "'format_header_param_rfc2231' is deprecated and will be " + "removed in urllib3 v2.1.0. This is not valid for " + "multipart/form-data header parameters.", + DeprecationWarning, + stacklevel=2, + ) + + if isinstance(value, bytes): + value = value.decode("utf-8") + + if not any(ch in value for ch in '"\\\r\n'): + result = f'{name}="{value}"' + try: + result.encode("ascii") + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + + value = email.utils.encode_rfc2231(value, "utf-8") + value = f"{name}*={value}" + + return value + + +def format_multipart_header_param(name: str, value: _TYPE_FIELD_VALUE) -> str: + """ + Format and quote a single multipart header parameter. + + This follows the `WHATWG HTML Standard`_ as of 2021/06/10, matching + the behavior of current browser and curl versions. Values are + assumed to be UTF-8. The ``\\n``, ``\\r``, and ``"`` characters are + percent encoded. + + .. _WHATWG HTML Standard: + https://html.spec.whatwg.org/multipage/ + form-control-infrastructure.html#multipart-form-data + + :param name: + The name of the parameter, an ASCII-only ``str``. + :param value: + The value of the parameter, a ``str`` or UTF-8 encoded + ``bytes``. + :returns: + A string ``name="value"`` with the escaped value. + + .. versionchanged:: 2.0.0 + Matches the WHATWG HTML Standard as of 2021/06/10. Control + characters are no longer percent encoded. + + .. versionchanged:: 2.0.0 + Renamed from ``format_header_param_html5`` and + ``format_header_param``. The old names will be removed in + urllib3 v2.1.0. + """ + if isinstance(value, bytes): + value = value.decode("utf-8") + + # percent encode \n \r " + value = value.translate({10: "%0A", 13: "%0D", 34: "%22"}) + return f'{name}="{value}"' + + +def format_header_param_html5(name: str, value: _TYPE_FIELD_VALUE) -> str: + """ + .. deprecated:: 2.0.0 + Renamed to :func:`format_multipart_header_param`. Will be + removed in urllib3 v2.1.0. + """ + import warnings + + warnings.warn( + "'format_header_param_html5' has been renamed to " + "'format_multipart_header_param'. The old name will be " + "removed in urllib3 v2.1.0.", + DeprecationWarning, + stacklevel=2, + ) + return format_multipart_header_param(name, value) + + +def format_header_param(name: str, value: _TYPE_FIELD_VALUE) -> str: + """ + .. deprecated:: 2.0.0 + Renamed to :func:`format_multipart_header_param`. Will be + removed in urllib3 v2.1.0. + """ + import warnings + + warnings.warn( + "'format_header_param' has been renamed to " + "'format_multipart_header_param'. The old name will be " + "removed in urllib3 v2.1.0.", + DeprecationWarning, + stacklevel=2, + ) + return format_multipart_header_param(name, value) + + +class RequestField: + """ + A data container for request body parameters. + + :param name: + The name of this request field. Must be unicode. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. Must be unicode. + :param headers: + An optional dict-like object of headers to initially use for the field. + + .. versionchanged:: 2.0.0 + The ``header_formatter`` parameter is deprecated and will + be removed in urllib3 v2.1.0. + """ + + def __init__( + self, + name: str, + data: _TYPE_FIELD_VALUE, + filename: str | None = None, + headers: typing.Mapping[str, str] | None = None, + header_formatter: typing.Callable[[str, _TYPE_FIELD_VALUE], str] | None = None, + ): + self._name = name + self._filename = filename + self.data = data + self.headers: dict[str, str | None] = {} + if headers: + self.headers = dict(headers) + + if header_formatter is not None: + import warnings + + warnings.warn( + "The 'header_formatter' parameter is deprecated and " + "will be removed in urllib3 v2.1.0.", + DeprecationWarning, + stacklevel=2, + ) + self.header_formatter = header_formatter + else: + self.header_formatter = format_multipart_header_param + + @classmethod + def from_tuples( + cls, + fieldname: str, + value: _TYPE_FIELD_VALUE_TUPLE, + header_formatter: typing.Callable[[str, _TYPE_FIELD_VALUE], str] | None = None, + ) -> RequestField: + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + filename: str | None + content_type: str | None + data: _TYPE_FIELD_VALUE + + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls( + fieldname, data, filename=filename, header_formatter=header_formatter + ) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name: str, value: _TYPE_FIELD_VALUE) -> str: + """ + Override this method to change how each multipart header + parameter is formatted. By default, this calls + :func:`format_multipart_header_param`. + + :param name: + The name of the parameter, an ASCII-only ``str``. + :param value: + The value of the parameter, a ``str`` or UTF-8 encoded + ``bytes``. + + :meta public: + """ + return self.header_formatter(name, value) + + def _render_parts( + self, + header_parts: ( + dict[str, _TYPE_FIELD_VALUE | None] + | typing.Sequence[tuple[str, _TYPE_FIELD_VALUE | None]] + ), + ) -> str: + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + iterable: typing.Iterable[tuple[str, _TYPE_FIELD_VALUE | None]] + + parts = [] + if isinstance(header_parts, dict): + iterable = header_parts.items() + else: + iterable = header_parts + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return "; ".join(parts) + + def render_headers(self) -> str: + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ["Content-Disposition", "Content-Type", "Content-Location"] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append(f"{sort_key}: {self.headers[sort_key]}") + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append(f"{header_name}: {header_value}") + + lines.append("\r\n") + return "\r\n".join(lines) + + def make_multipart( + self, + content_disposition: str | None = None, + content_type: str | None = None, + content_location: str | None = None, + ) -> None: + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_disposition: + The 'Content-Disposition' of the request body. Defaults to 'form-data' + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + content_disposition = (content_disposition or "form-data") + "; ".join( + [ + "", + self._render_parts( + (("name", self._name), ("filename", self._filename)) + ), + ] + ) + + self.headers["Content-Disposition"] = content_disposition + self.headers["Content-Type"] = content_type + self.headers["Content-Location"] = content_location diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/filepost.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/filepost.py new file mode 100644 index 000000000..14f70b05b --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/filepost.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +import binascii +import codecs +import os +import typing +from io import BytesIO + +from .fields import _TYPE_FIELD_VALUE_TUPLE, RequestField + +writer = codecs.lookup("utf-8")[3] + +_TYPE_FIELDS_SEQUENCE = typing.Sequence[ + typing.Union[tuple[str, _TYPE_FIELD_VALUE_TUPLE], RequestField] +] +_TYPE_FIELDS = typing.Union[ + _TYPE_FIELDS_SEQUENCE, + typing.Mapping[str, _TYPE_FIELD_VALUE_TUPLE], +] + + +def choose_boundary() -> str: + """ + Our embarrassingly-simple replacement for mimetools.choose_boundary. + """ + return binascii.hexlify(os.urandom(16)).decode() + + +def iter_field_objects(fields: _TYPE_FIELDS) -> typing.Iterable[RequestField]: + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts, and lists of + :class:`~urllib3.fields.RequestField`. + + """ + iterable: typing.Iterable[RequestField | tuple[str, _TYPE_FIELD_VALUE_TUPLE]] + + if isinstance(fields, typing.Mapping): + iterable = fields.items() + else: + iterable = fields + + for field in iterable: + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) + + +def encode_multipart_formdata( + fields: _TYPE_FIELDS, boundary: str | None = None +) -> tuple[bytes, str]: + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). + Values are processed by :func:`urllib3.fields.RequestField.from_tuples`. + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`urllib3.filepost.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(f"--{boundary}\r\n".encode("latin-1")) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, str): + writer(body).write(data) + else: + body.write(data) + + body.write(b"\r\n") + + body.write(f"--{boundary}--\r\n".encode("latin-1")) + + content_type = f"multipart/form-data; boundary={boundary}" + + return body.getvalue(), content_type diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/__init__.py new file mode 100644 index 000000000..133e1d8f2 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/__init__.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +from importlib.metadata import version + +__all__ = [ + "inject_into_urllib3", + "extract_from_urllib3", +] + +import typing + +orig_HTTPSConnection: typing.Any = None + + +def inject_into_urllib3() -> None: + # First check if h2 version is valid + h2_version = version("h2") + if not h2_version.startswith("4."): + raise ImportError( + "urllib3 v2 supports h2 version 4.x.x, currently " + f"the 'h2' module is compiled with {h2_version!r}. " + "See: https://github.com/urllib3/urllib3/issues/3290" + ) + + # Import here to avoid circular dependencies. + from .. import connection as urllib3_connection + from .. import util as urllib3_util + from ..connectionpool import HTTPSConnectionPool + from ..util import ssl_ as urllib3_util_ssl + from .connection import HTTP2Connection + + global orig_HTTPSConnection + orig_HTTPSConnection = urllib3_connection.HTTPSConnection + + HTTPSConnectionPool.ConnectionCls = HTTP2Connection + urllib3_connection.HTTPSConnection = HTTP2Connection # type: ignore[misc] + + # TODO: Offer 'http/1.1' as well, but for testing purposes this is handy. + urllib3_util.ALPN_PROTOCOLS = ["h2"] + urllib3_util_ssl.ALPN_PROTOCOLS = ["h2"] + + +def extract_from_urllib3() -> None: + from .. import connection as urllib3_connection + from .. import util as urllib3_util + from ..connectionpool import HTTPSConnectionPool + from ..util import ssl_ as urllib3_util_ssl + + HTTPSConnectionPool.ConnectionCls = orig_HTTPSConnection + urllib3_connection.HTTPSConnection = orig_HTTPSConnection # type: ignore[misc] + + urllib3_util.ALPN_PROTOCOLS = ["http/1.1"] + urllib3_util_ssl.ALPN_PROTOCOLS = ["http/1.1"] diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed53dfb5b135534ff18efbcda30140d12378b387 GIT binary patch literal 1771 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 ThhK9FygyUZ@i~V#!<+vP<$Ry9 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1406ec1778b18c6e8f8b7b8690f8aca736c7e809 GIT binary patch literal 3722 zcmb6bTWlLy_1<~d9zQmY<1}d=?KE*3CT(q+ba%C=OY1zkU0_3K%Zl~VjvUXVaq4*7 zJL63qIgnQUFj7~|3PHA}i^dQf1aJNlkOxRZ8qT13oWPjkT!u?< z9C`<7{9U98k2!}s!E;FGAJ=6h1YMY8H`ECYx(IatUK(8`TtI*A0JtqK1KsNNw(>5v)LhGuW!`LWBzF z5uQ{;Te4<}p48IW>$dP6P>;BQn|LUY06fCBVCtC}lU^=wTd`SVUXLX+`mNY|1^Bu- zJ!P4(iOW-`CJjw@uy@BVsF#ds!-`pX%OL4wCKhdCne=olSFmP{>`3(VaLi0w`l(zp zbt8ElPUlGm_D5o~mX#Zh<*4zZxq|Ic)pRy(sp{h4{br3ewgRA^DFawW&)SbXxc14l z_4a|1aL-#Ezfcl3Jcq0Cv6AptPuC{!pj6W;uyDbj*?9v#l7{sXUqo}1ZQpnuVN}FL zZiZVDB(Uv4ekclu;S@;VZ~KaTii5;}Un3bXx(rdYp9Yc+NQoailEk7oM?Y@gX!sk0 zy#J-iWz>(XrspGwj9_F@KeI7MoxN`~q#vwVQ8)|y+JC*5?tXyoSqtbE{{dRS{pd6@ z@dAf|is5&!(4bq*)CR4-w&b!}8;TTNI~q5vN4RgHI~eTI*5KNi8yaJD2Q*u9{m8X| z8}}0*@F`v=v}sh^o^R`g2|^4)Xw9+3ODy!MA#8Utbu*tPx*Zrzn)<}8l%At?!}g}l zbk?+z*_3X(iJsA6S82C;0BWwOoR&>?UEI7yFnlNwxh2BDS9ZmHj- zCbOD)UAGqHSE73#M+lCY{|2y(YA)2;UJ|Q;*87Q{Bwip%idEY>9)?#=md0wFI}odO z_Eb8D%AG@>j+8rNE8_FE&b78kwOif_053aG^P=#;mJgP-9u)4Zv_;Bok=4uPHl^gL zdV&>CXW7%a;pwVzk`#gq+YeX5$IId4t7bWTqBKzpqF{T;|Ie2S3io`0xIpZgGW^@4 zkB+V@-&heU!DHp%vDN-^@OX77O4ohmVBhM1r8$13fwM*65)4G{OPp>2XZ)L7w76;^>I`=^N76Api7S|5zXY$37A8R5L9=VzUtZ z1r`sQsSZg1>;0pi=#ZYQEbz-+UzLWpeU{jepy9{$Qho=T&EE1*q@|}>z#AtJa#9XL zznQi>dpn_DfJEPyYKoI;3OBiUevGw2ndqi&$+SPkhGjFKqhTx07(|9zeLbC(lQWi1 zWERHqY|@mcbv-M?k*FfUxL7WbF2G4Q0Q@swnSj9`BDGrl2Gw$R#UVN@-L&ADAm{QVXPCMv8`(@DD!-#!rfkjXaw<=Vp0#ACk(MqSGmOZ3 zxXd0rlM2790*lc2=S?870*Y_g_#=}xWe5wWI=WToNwnDcN>!}y#DU$M03!c)L9C_WHoNO56EgTzUAtRlE{kx%tWXdfWLeo^rlG6#naPjdhK! zw@n(pA0LVP_{V{`==qEX?1|{2&?m;jdtKcu8q;v-t6a_AU-iUCh^?B5zTZ`aS9<0y z_l*8O?zzO0o%x5pI-RsOCka)X(C+KJ>>QiBR8|`nJ6<(8+qgjaqX2eUoRcC|xvw<7 z;qR>;>!tPX{P)(o3BE#edo zKApA5NuX`}rVS$_7iGrhacT>_pYf3x#ri4uItBCuIR!xB7{1u2rBl|2Rz8=}KLp_? zWsrOIq`XV!RYjt&%WQI9S5@1qs`G}H&rsa2syFk=OnpaERWoB)rm7P9LLo8*5egIv zP5^j>2yM^Ikc8$h1Jul{Tir!9PH1&4zq{$@#c{mpJu0@>MzLS)u7*2mJe`mBIrEuw zYoHz4;;Ap0kcczDeGK4H~`XH2^gpWBhm2_c;n~xyCUD zM>9Cdp+m>l+XvTB=y@no37sj2&Mdc7ccI>%iZ@dBMwZ=Gsk bool: + """ + "An implementation that validates fields according to the definitions in Sections + 5.1 and 5.5 of [HTTP] only needs an additional check that field names do not + include uppercase characters." (https://httpwg.org/specs/rfc9113.html#n-field-validity) + + `http.client._is_legal_header_name` does not validate the field name according to the + HTTP 1.1 spec, so we do that here, in addition to checking for uppercase characters. + + This does not allow for the `:` character in the header name, so should not + be used to validate pseudo-headers. + """ + return bool(RE_IS_LEGAL_HEADER_NAME.match(name)) + + +def _is_illegal_header_value(value: bytes) -> bool: + """ + "A field value MUST NOT contain the zero value (ASCII NUL, 0x00), line feed + (ASCII LF, 0x0a), or carriage return (ASCII CR, 0x0d) at any position. A field + value MUST NOT start or end with an ASCII whitespace character (ASCII SP or HTAB, + 0x20 or 0x09)." (https://httpwg.org/specs/rfc9113.html#n-field-validity) + """ + return bool(RE_IS_ILLEGAL_HEADER_VALUE.search(value)) + + +class _LockedObject(typing.Generic[T]): + """ + A wrapper class that hides a specific object behind a lock. + The goal here is to provide a simple way to protect access to an object + that cannot safely be simultaneously accessed from multiple threads. The + intended use of this class is simple: take hold of it with a context + manager, which returns the protected object. + """ + + __slots__ = ( + "lock", + "_obj", + ) + + def __init__(self, obj: T): + self.lock = threading.RLock() + self._obj = obj + + def __enter__(self) -> T: + self.lock.acquire() + return self._obj + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: types.TracebackType | None, + ) -> None: + self.lock.release() + + +class HTTP2Connection(HTTPSConnection): + def __init__( + self, host: str, port: int | None = None, **kwargs: typing.Any + ) -> None: + self._h2_conn = self._new_h2_conn() + self._h2_stream: int | None = None + self._headers: list[tuple[bytes, bytes]] = [] + + if "proxy" in kwargs or "proxy_config" in kwargs: # Defensive: + raise NotImplementedError("Proxies aren't supported with HTTP/2") + + super().__init__(host, port, **kwargs) + + if self._tunnel_host is not None: + raise NotImplementedError("Tunneling isn't supported with HTTP/2") + + def _new_h2_conn(self) -> _LockedObject[h2.connection.H2Connection]: + config = h2.config.H2Configuration(client_side=True) + return _LockedObject(h2.connection.H2Connection(config=config)) + + def connect(self) -> None: + super().connect() + with self._h2_conn as conn: + conn.initiate_connection() + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + + def putrequest( # type: ignore[override] + self, + method: str, + url: str, + **kwargs: typing.Any, + ) -> None: + """putrequest + This deviates from the HTTPConnection method signature since we never need to override + sending accept-encoding headers or the host header. + """ + if "skip_host" in kwargs: + raise NotImplementedError("`skip_host` isn't supported") + if "skip_accept_encoding" in kwargs: + raise NotImplementedError("`skip_accept_encoding` isn't supported") + + self._request_url = url or "/" + self._validate_path(url) # type: ignore[attr-defined] + + if ":" in self.host: + authority = f"[{self.host}]:{self.port or 443}" + else: + authority = f"{self.host}:{self.port or 443}" + + self._headers.append((b":scheme", b"https")) + self._headers.append((b":method", method.encode())) + self._headers.append((b":authority", authority.encode())) + self._headers.append((b":path", url.encode())) + + with self._h2_conn as conn: + self._h2_stream = conn.get_next_available_stream_id() + + def putheader(self, header: str | bytes, *values: str | bytes) -> None: # type: ignore[override] + # TODO SKIPPABLE_HEADERS from urllib3 are ignored. + header = header.encode() if isinstance(header, str) else header + header = header.lower() # A lot of upstream code uses capitalized headers. + if not _is_legal_header_name(header): + raise ValueError(f"Illegal header name {str(header)}") + + for value in values: + value = value.encode() if isinstance(value, str) else value + if _is_illegal_header_value(value): + raise ValueError(f"Illegal header value {str(value)}") + self._headers.append((header, value)) + + def endheaders(self, message_body: typing.Any = None) -> None: # type: ignore[override] + if self._h2_stream is None: + raise ConnectionError("Must call `putrequest` first.") + + with self._h2_conn as conn: + conn.send_headers( + stream_id=self._h2_stream, + headers=self._headers, + end_stream=(message_body is None), + ) + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + self._headers = [] # Reset headers for the next request. + + def send(self, data: typing.Any) -> None: + """Send data to the server. + `data` can be: `str`, `bytes`, an iterable, or file-like objects + that support a .read() method. + """ + if self._h2_stream is None: + raise ConnectionError("Must call `putrequest` first.") + + with self._h2_conn as conn: + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + + if hasattr(data, "read"): # file-like objects + while True: + chunk = data.read(self.blocksize) + if not chunk: + break + if isinstance(chunk, str): + chunk = chunk.encode() # pragma: no cover + conn.send_data(self._h2_stream, chunk, end_stream=False) + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + conn.end_stream(self._h2_stream) + return + + if isinstance(data, str): # str -> bytes + data = data.encode() + + try: + if isinstance(data, bytes): + conn.send_data(self._h2_stream, data, end_stream=True) + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + else: + for chunk in data: + conn.send_data(self._h2_stream, chunk, end_stream=False) + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + conn.end_stream(self._h2_stream) + except TypeError: + raise TypeError( + "`data` should be str, bytes, iterable, or file. got %r" + % type(data) + ) + + def set_tunnel( + self, + host: str, + port: int | None = None, + headers: typing.Mapping[str, str] | None = None, + scheme: str = "http", + ) -> None: + raise NotImplementedError( + "HTTP/2 does not support setting up a tunnel through a proxy" + ) + + def getresponse( # type: ignore[override] + self, + ) -> HTTP2Response: + status = None + data = bytearray() + with self._h2_conn as conn: + end_stream = False + while not end_stream: + # TODO: Arbitrary read value. + if received_data := self.sock.recv(65535): + events = conn.receive_data(received_data) + for event in events: + if isinstance(event, h2.events.ResponseReceived): + headers = HTTPHeaderDict() + for header, value in event.headers: + if header == b":status": + status = int(value.decode()) + else: + headers.add( + header.decode("ascii"), value.decode("ascii") + ) + + elif isinstance(event, h2.events.DataReceived): + data += event.data + conn.acknowledge_received_data( + event.flow_controlled_length, event.stream_id + ) + + elif isinstance(event, h2.events.StreamEnded): + end_stream = True + + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + + assert status is not None + return HTTP2Response( + status=status, + headers=headers, + request_url=self._request_url, + data=bytes(data), + ) + + def request( # type: ignore[override] + self, + method: str, + url: str, + body: _TYPE_BODY | None = None, + headers: typing.Mapping[str, str] | None = None, + *, + preload_content: bool = True, + decode_content: bool = True, + enforce_content_length: bool = True, + **kwargs: typing.Any, + ) -> None: + """Send an HTTP/2 request""" + if "chunked" in kwargs: + # TODO this is often present from upstream. + # raise NotImplementedError("`chunked` isn't supported with HTTP/2") + pass + + if self.sock is not None: + self.sock.settimeout(self.timeout) + + self.putrequest(method, url) + + headers = headers or {} + for k, v in headers.items(): + if k.lower() == "transfer-encoding" and v == "chunked": + continue + else: + self.putheader(k, v) + + if b"user-agent" not in dict(self._headers): + self.putheader(b"user-agent", _get_default_user_agent()) + + if body: + self.endheaders(message_body=body) + self.send(body) + else: + self.endheaders() + + def close(self) -> None: + with self._h2_conn as conn: + try: + conn.close_connection() + if data := conn.data_to_send(): + self.sock.sendall(data) + except Exception: + pass + + # Reset all our HTTP/2 connection state. + self._h2_conn = self._new_h2_conn() + self._h2_stream = None + self._headers = [] + + super().close() + + +class HTTP2Response(BaseHTTPResponse): + # TODO: This is a woefully incomplete response object, but works for non-streaming. + def __init__( + self, + status: int, + headers: HTTPHeaderDict, + request_url: str, + data: bytes, + decode_content: bool = False, # TODO: support decoding + ) -> None: + super().__init__( + status=status, + headers=headers, + # Following CPython, we map HTTP versions to major * 10 + minor integers + version=20, + version_string="HTTP/2", + # No reason phrase in HTTP/2 + reason=None, + decode_content=decode_content, + request_url=request_url, + ) + self._data = data + self.length_remaining = 0 + + @property + def data(self) -> bytes: + return self._data + + def get_redirect_location(self) -> None: + return None + + def close(self) -> None: + pass diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/probe.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/probe.py new file mode 100644 index 000000000..9ea900764 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/http2/probe.py @@ -0,0 +1,87 @@ +from __future__ import annotations + +import threading + + +class _HTTP2ProbeCache: + __slots__ = ( + "_lock", + "_cache_locks", + "_cache_values", + ) + + def __init__(self) -> None: + self._lock = threading.Lock() + self._cache_locks: dict[tuple[str, int], threading.RLock] = {} + self._cache_values: dict[tuple[str, int], bool | None] = {} + + def acquire_and_get(self, host: str, port: int) -> bool | None: + # By the end of this block we know that + # _cache_[values,locks] is available. + value = None + with self._lock: + key = (host, port) + try: + value = self._cache_values[key] + # If it's a known value we return right away. + if value is not None: + return value + except KeyError: + self._cache_locks[key] = threading.RLock() + self._cache_values[key] = None + + # If the value is unknown, we acquire the lock to signal + # to the requesting thread that the probe is in progress + # or that the current thread needs to return their findings. + key_lock = self._cache_locks[key] + key_lock.acquire() + try: + # If the by the time we get the lock the value has been + # updated we want to return the updated value. + value = self._cache_values[key] + + # In case an exception like KeyboardInterrupt is raised here. + except BaseException as e: # Defensive: + assert not isinstance(e, KeyError) # KeyError shouldn't be possible. + key_lock.release() + raise + + return value + + def set_and_release( + self, host: str, port: int, supports_http2: bool | None + ) -> None: + key = (host, port) + key_lock = self._cache_locks[key] + with key_lock: # Uses an RLock, so can be locked again from same thread. + if supports_http2 is None and self._cache_values[key] is not None: + raise ValueError( + "Cannot reset HTTP/2 support for origin after value has been set." + ) # Defensive: not expected in normal usage + + self._cache_values[key] = supports_http2 + key_lock.release() + + def _values(self) -> dict[tuple[str, int], bool | None]: + """This function is for testing purposes only. Gets the current state of the probe cache""" + with self._lock: + return {k: v for k, v in self._cache_values.items()} + + def _reset(self) -> None: + """This function is for testing purposes only. Reset the cache values""" + with self._lock: + self._cache_locks = {} + self._cache_values = {} + + +_HTTP2_PROBE_CACHE = _HTTP2ProbeCache() + +set_and_release = _HTTP2_PROBE_CACHE.set_and_release +acquire_and_get = _HTTP2_PROBE_CACHE.acquire_and_get +_values = _HTTP2_PROBE_CACHE._values +_reset = _HTTP2_PROBE_CACHE._reset + +__all__ = [ + "set_and_release", + "acquire_and_get", +] diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/poolmanager.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/poolmanager.py new file mode 100644 index 000000000..5763fea80 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/poolmanager.py @@ -0,0 +1,653 @@ +from __future__ import annotations + +import functools +import logging +import typing +import warnings +from types import TracebackType +from urllib.parse import urljoin + +from ._collections import HTTPHeaderDict, RecentlyUsedContainer +from ._request_methods import RequestMethods +from .connection import ProxyConfig +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, port_by_scheme +from .exceptions import ( + LocationValueError, + MaxRetryError, + ProxySchemeUnknown, + URLSchemeUnknown, +) +from .response import BaseHTTPResponse +from .util.connection import _TYPE_SOCKET_OPTIONS +from .util.proxy import connection_requires_http_tunnel +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import Url, parse_url + +if typing.TYPE_CHECKING: + import ssl + + from typing_extensions import Self + +__all__ = ["PoolManager", "ProxyManager", "proxy_from_url"] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ( + "key_file", + "cert_file", + "cert_reqs", + "ca_certs", + "ca_cert_data", + "ssl_version", + "ssl_minimum_version", + "ssl_maximum_version", + "ca_cert_dir", + "ssl_context", + "key_password", + "server_hostname", +) +# Default value for `blocksize` - a new parameter introduced to +# http.client.HTTPConnection & http.client.HTTPSConnection in Python 3.7 +_DEFAULT_BLOCKSIZE = 16384 + + +class PoolKey(typing.NamedTuple): + """ + All known keyword arguments that could be provided to the pool manager, its + pools, or the underlying connections. + + All custom key schemes should include the fields in this key at a minimum. + """ + + key_scheme: str + key_host: str + key_port: int | None + key_timeout: Timeout | float | int | None + key_retries: Retry | bool | int | None + key_block: bool | None + key_source_address: tuple[str, int] | None + key_key_file: str | None + key_key_password: str | None + key_cert_file: str | None + key_cert_reqs: str | None + key_ca_certs: str | None + key_ca_cert_data: str | bytes | None + key_ssl_version: int | str | None + key_ssl_minimum_version: ssl.TLSVersion | None + key_ssl_maximum_version: ssl.TLSVersion | None + key_ca_cert_dir: str | None + key_ssl_context: ssl.SSLContext | None + key_maxsize: int | None + key_headers: frozenset[tuple[str, str]] | None + key__proxy: Url | None + key__proxy_headers: frozenset[tuple[str, str]] | None + key__proxy_config: ProxyConfig | None + key_socket_options: _TYPE_SOCKET_OPTIONS | None + key__socks_options: frozenset[tuple[str, str]] | None + key_assert_hostname: bool | str | None + key_assert_fingerprint: str | None + key_server_hostname: str | None + key_blocksize: int | None + + +def _default_key_normalizer( + key_class: type[PoolKey], request_context: dict[str, typing.Any] +) -> PoolKey: + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context["scheme"] = context["scheme"].lower() + context["host"] = context["host"].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ("headers", "_proxy_headers", "_socks_options"): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get("socket_options") + if socket_opts is not None: + context["socket_options"] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context["key_" + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + # Default key_blocksize to _DEFAULT_BLOCKSIZE if missing from the context + if context.get("key_blocksize") is None: + context["key_blocksize"] = _DEFAULT_BLOCKSIZE + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + "http": functools.partial(_default_key_normalizer, PoolKey), + "https": functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = {"http": HTTPConnectionPool, "https": HTTPSConnectionPool} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example: + + .. code-block:: python + + import urllib3 + + http = urllib3.PoolManager(num_pools=2) + + resp1 = http.request("GET", "https://google.com/") + resp2 = http.request("GET", "https://google.com/mail") + resp3 = http.request("GET", "https://yahoo.com/") + + print(len(http.pools)) + # 2 + + """ + + proxy: Url | None = None + proxy_config: ProxyConfig | None = None + + def __init__( + self, + num_pools: int = 10, + headers: typing.Mapping[str, str] | None = None, + **connection_pool_kw: typing.Any, + ) -> None: + super().__init__(headers) + if "retries" in connection_pool_kw: + retries = connection_pool_kw["retries"] + if not isinstance(retries, Retry): + # When Retry is initialized, raise_on_redirect is based + # on a redirect boolean value. + # But requests made via a pool manager always set + # redirect to False, and raise_on_redirect always ends + # up being False consequently. + # Here we fix the issue by setting raise_on_redirect to + # a value needed by the pool manager without considering + # the redirect boolean. + raise_on_redirect = retries is not False + retries = Retry.from_int(retries, redirect=False) + retries.raise_on_redirect = raise_on_redirect + connection_pool_kw = connection_pool_kw.copy() + connection_pool_kw["retries"] = retries + self.connection_pool_kw = connection_pool_kw + + self.pools: RecentlyUsedContainer[PoolKey, HTTPConnectionPool] + self.pools = RecentlyUsedContainer(num_pools) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self) -> Self: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> typing.Literal[False]: + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool( + self, + scheme: str, + host: str, + port: int, + request_context: dict[str, typing.Any] | None = None, + ) -> HTTPConnectionPool: + """ + Create a new :class:`urllib3.connectionpool.ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls: type[HTTPConnectionPool] = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Default blocksize to _DEFAULT_BLOCKSIZE if missing or explicitly + # set to 'None' in the request_context. + if request_context.get("blocksize") is None: + request_context["blocksize"] = _DEFAULT_BLOCKSIZE + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ("scheme", "host", "port"): + request_context.pop(key, None) + + if scheme == "http": + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self) -> None: + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host( + self, + host: str | None, + port: int | None = None, + scheme: str | None = "http", + pool_kwargs: dict[str, typing.Any] | None = None, + ) -> HTTPConnectionPool: + """ + Get a :class:`urllib3.connectionpool.ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context["scheme"] = scheme or "http" + if not port: + port = port_by_scheme.get(request_context["scheme"].lower(), 80) + request_context["port"] = port + request_context["host"] = host + + return self.connection_from_context(request_context) + + def connection_from_context( + self, request_context: dict[str, typing.Any] + ) -> HTTPConnectionPool: + """ + Get a :class:`urllib3.connectionpool.ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + if "strict" in request_context: + warnings.warn( + "The 'strict' parameter is no longer needed on Python 3+. " + "This will raise an error in urllib3 v2.1.0.", + DeprecationWarning, + ) + request_context.pop("strict") + + scheme = request_context["scheme"].lower() + pool_key_constructor = self.key_fn_by_scheme.get(scheme) + if not pool_key_constructor: + raise URLSchemeUnknown(scheme) + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key( + self, pool_key: PoolKey, request_context: dict[str, typing.Any] + ) -> HTTPConnectionPool: + """ + Get a :class:`urllib3.connectionpool.ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context["scheme"] + host = request_context["host"] + port = request_context["port"] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url( + self, url: str, pool_kwargs: dict[str, typing.Any] | None = None + ) -> HTTPConnectionPool: + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host( + u.host, port=u.port, scheme=u.scheme, pool_kwargs=pool_kwargs + ) + + def _merge_pool_kwargs( + self, override: dict[str, typing.Any] | None + ) -> dict[str, typing.Any]: + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def _proxy_requires_url_absolute_form(self, parsed_url: Url) -> bool: + """ + Indicates if the proxy requires the complete destination URL in the + request. Normally this is only needed when not using an HTTP CONNECT + tunnel. + """ + if self.proxy is None: + return False + + return not connection_requires_http_tunnel( + self.proxy, self.proxy_config, parsed_url.scheme + ) + + def urlopen( # type: ignore[override] + self, method: str, url: str, redirect: bool = True, **kw: typing.Any + ) -> BaseHTTPResponse: + """ + Same as :meth:`urllib3.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + + if u.scheme is None: + warnings.warn( + "URLs without a scheme (ie 'https://') are deprecated and will raise an error " + "in a future version of urllib3. To avoid this DeprecationWarning ensure all URLs " + "start with 'https://' or 'http://'. Read more in this issue: " + "https://github.com/urllib3/urllib3/issues/2920", + category=DeprecationWarning, + stacklevel=2, + ) + + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw["assert_same_host"] = False + kw["redirect"] = False + + if "headers" not in kw: + kw["headers"] = self.headers + + if self._proxy_requires_url_absolute_form(u): + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + if response.status == 303: + # Change the method according to RFC 9110, Section 15.4.4. + method = "GET" + # And lose the body not to transfer anything sensitive. + kw["body"] = None + kw["headers"] = HTTPHeaderDict(kw["headers"])._prepare_for_method_change() + + retries = kw.get("retries", response.retries) + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + # Strip headers marked as unsafe to forward to the redirected location. + # Check remove_headers_on_redirect to avoid a potential network call within + # conn.is_same_host() which may use socket.gethostbyname() in the future. + if retries.remove_headers_on_redirect and not conn.is_same_host( + redirect_location + ): + new_headers = kw["headers"].copy() + for header in kw["headers"]: + if header.lower() in retries.remove_headers_on_redirect: + new_headers.pop(header, None) + kw["headers"] = new_headers + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + response.drain_conn() + raise + return response + + kw["retries"] = retries + kw["redirect"] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + + response.drain_conn() + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary containing headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + :param proxy_ssl_context: + The proxy SSL context is used to establish the TLS connection to the + proxy when using HTTPS proxies. + + :param use_forwarding_for_https: + (Defaults to False) If set to True will forward requests to the HTTPS + proxy to be made on behalf of the client instead of creating a TLS + tunnel via the CONNECT method. **Enabling this flag means that request + and response headers and content will be visible from the HTTPS proxy** + whereas tunneling keeps request and response headers and content + private. IP address, target hostname, SNI, and port are always visible + to an HTTPS proxy even when this flag is disabled. + + :param proxy_assert_hostname: + The hostname of the certificate to verify against. + + :param proxy_assert_fingerprint: + The fingerprint of the certificate to verify against. + + Example: + + .. code-block:: python + + import urllib3 + + proxy = urllib3.ProxyManager("https://localhost:3128/") + + resp1 = proxy.request("GET", "https://google.com/") + resp2 = proxy.request("GET", "https://httpbin.org/") + + print(len(proxy.pools)) + # 1 + + resp3 = proxy.request("GET", "https://httpbin.org/") + resp4 = proxy.request("GET", "https://twitter.com/") + + print(len(proxy.pools)) + # 3 + + """ + + def __init__( + self, + proxy_url: str, + num_pools: int = 10, + headers: typing.Mapping[str, str] | None = None, + proxy_headers: typing.Mapping[str, str] | None = None, + proxy_ssl_context: ssl.SSLContext | None = None, + use_forwarding_for_https: bool = False, + proxy_assert_hostname: None | str | typing.Literal[False] = None, + proxy_assert_fingerprint: str | None = None, + **connection_pool_kw: typing.Any, + ) -> None: + if isinstance(proxy_url, HTTPConnectionPool): + str_proxy_url = f"{proxy_url.scheme}://{proxy_url.host}:{proxy_url.port}" + else: + str_proxy_url = proxy_url + proxy = parse_url(str_proxy_url) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + self.proxy_ssl_context = proxy_ssl_context + self.proxy_config = ProxyConfig( + proxy_ssl_context, + use_forwarding_for_https, + proxy_assert_hostname, + proxy_assert_fingerprint, + ) + + connection_pool_kw["_proxy"] = self.proxy + connection_pool_kw["_proxy_headers"] = self.proxy_headers + connection_pool_kw["_proxy_config"] = self.proxy_config + + super().__init__(num_pools, headers, **connection_pool_kw) + + def connection_from_host( + self, + host: str | None, + port: int | None = None, + scheme: str | None = "http", + pool_kwargs: dict[str, typing.Any] | None = None, + ) -> HTTPConnectionPool: + if scheme == "https": + return super().connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs + ) + + return super().connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs # type: ignore[union-attr] + ) + + def _set_proxy_headers( + self, url: str, headers: typing.Mapping[str, str] | None = None + ) -> typing.Mapping[str, str]: + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {"Accept": "*/*"} + + netloc = parse_url(url).netloc + if netloc: + headers_["Host"] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen( # type: ignore[override] + self, method: str, url: str, redirect: bool = True, **kw: typing.Any + ) -> BaseHTTPResponse: + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + if not connection_requires_http_tunnel(self.proxy, self.proxy_config, u.scheme): + # For connections using HTTP CONNECT, httplib sets the necessary + # headers on the CONNECT to the proxy. If we're not using CONNECT, + # we'll definitely need to set 'Host' at the very least. + headers = kw.get("headers", self.headers) + kw["headers"] = self._set_proxy_headers(url, headers) + + return super().urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url: str, **kw: typing.Any) -> ProxyManager: + return ProxyManager(proxy_url=url, **kw) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/py.typed b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/py.typed new file mode 100644 index 000000000..5f3ea3d91 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/py.typed @@ -0,0 +1,2 @@ +# Instruct type checkers to look for inline type annotations in this package. +# See PEP 561. diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/response.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/response.py new file mode 100644 index 000000000..5632dab3b --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/response.py @@ -0,0 +1,1307 @@ +from __future__ import annotations + +import collections +import io +import json as _json +import logging +import re +import socket +import sys +import typing +import warnings +import zlib +from contextlib import contextmanager +from http.client import HTTPMessage as _HttplibHTTPMessage +from http.client import HTTPResponse as _HttplibHTTPResponse +from socket import timeout as SocketTimeout + +if typing.TYPE_CHECKING: + from ._base_connection import BaseHTTPConnection + +try: + try: + import brotlicffi as brotli # type: ignore[import-not-found] + except ImportError: + import brotli # type: ignore[import-not-found] +except ImportError: + brotli = None + +from . import util +from ._base_connection import _TYPE_BODY +from ._collections import HTTPHeaderDict +from .connection import BaseSSLError, HTTPConnection, HTTPException +from .exceptions import ( + BodyNotHttplibCompatible, + DecodeError, + HTTPError, + IncompleteRead, + InvalidChunkLength, + InvalidHeader, + ProtocolError, + ReadTimeoutError, + ResponseNotChunked, + SSLError, +) +from .util.response import is_fp_closed, is_response_to_head +from .util.retry import Retry + +if typing.TYPE_CHECKING: + from .connectionpool import HTTPConnectionPool + +log = logging.getLogger(__name__) + + +class ContentDecoder: + def decompress(self, data: bytes) -> bytes: + raise NotImplementedError() + + def flush(self) -> bytes: + raise NotImplementedError() + + +class DeflateDecoder(ContentDecoder): + def __init__(self) -> None: + self._first_try = True + self._data = b"" + self._obj = zlib.decompressobj() + + def decompress(self, data: bytes) -> bytes: + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None # type: ignore[assignment] + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None # type: ignore[assignment] + + def flush(self) -> bytes: + return self._obj.flush() + + +class GzipDecoderState: + FIRST_MEMBER = 0 + OTHER_MEMBERS = 1 + SWALLOW_DATA = 2 + + +class GzipDecoder(ContentDecoder): + def __init__(self) -> None: + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + self._state = GzipDecoderState.FIRST_MEMBER + + def decompress(self, data: bytes) -> bytes: + ret = bytearray() + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return bytes(ret) + while True: + try: + ret += self._obj.decompress(data) + except zlib.error: + previous_state = self._state + # Ignore data after the first error + self._state = GzipDecoderState.SWALLOW_DATA + if previous_state == GzipDecoderState.OTHER_MEMBERS: + # Allow trailing garbage acceptable in other gzip clients + return bytes(ret) + raise + data = self._obj.unused_data + if not data: + return bytes(ret) + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + def flush(self) -> bytes: + return self._obj.flush() + + +if brotli is not None: + + class BrotliDecoder(ContentDecoder): + # Supports both 'brotlipy' and 'Brotli' packages + # since they share an import name. The top branches + # are for 'brotlipy' and bottom branches for 'Brotli' + def __init__(self) -> None: + self._obj = brotli.Decompressor() + if hasattr(self._obj, "decompress"): + setattr(self, "decompress", self._obj.decompress) + else: + setattr(self, "decompress", self._obj.process) + + def flush(self) -> bytes: + if hasattr(self._obj, "flush"): + return self._obj.flush() # type: ignore[no-any-return] + return b"" + + +try: + # Python 3.14+ + from compression import zstd # type: ignore[import-not-found] # noqa: F401 + + HAS_ZSTD = True + + class ZstdDecoder(ContentDecoder): + def __init__(self) -> None: + self._obj = zstd.ZstdDecompressor() + + def decompress(self, data: bytes) -> bytes: + if not data: + return b"" + data_parts = [self._obj.decompress(data)] + while self._obj.eof and self._obj.unused_data: + unused_data = self._obj.unused_data + self._obj = zstd.ZstdDecompressor() + data_parts.append(self._obj.decompress(unused_data)) + return b"".join(data_parts) + + def flush(self) -> bytes: + if not self._obj.eof: + raise DecodeError("Zstandard data is incomplete") + return b"" + +except ImportError: + try: + # Python 3.13 and earlier require the 'zstandard' module. + import zstandard as zstd + + # The package 'zstandard' added the 'eof' property starting + # in v0.18.0 which we require to ensure a complete and + # valid zstd stream was fed into the ZstdDecoder. + # See: https://github.com/urllib3/urllib3/pull/2624 + _zstd_version = tuple( + map(int, re.search(r"^([0-9]+)\.([0-9]+)", zstd.__version__).groups()) # type: ignore[union-attr] + ) + if _zstd_version < (0, 18): # Defensive: + raise ImportError("zstandard module doesn't have eof") + except (AttributeError, ImportError, ValueError): # Defensive: + HAS_ZSTD = False + else: + HAS_ZSTD = True + + class ZstdDecoder(ContentDecoder): # type: ignore[no-redef] + def __init__(self) -> None: + self._obj = zstd.ZstdDecompressor().decompressobj() + + def decompress(self, data: bytes) -> bytes: + if not data: + return b"" + data_parts = [self._obj.decompress(data)] + while self._obj.eof and self._obj.unused_data: + unused_data = self._obj.unused_data + self._obj = zstd.ZstdDecompressor().decompressobj() + data_parts.append(self._obj.decompress(unused_data)) + return b"".join(data_parts) + + def flush(self) -> bytes: + ret = self._obj.flush() # note: this is a no-op + if not self._obj.eof: + raise DecodeError("Zstandard data is incomplete") + return ret # type: ignore[no-any-return] + + +class MultiDecoder(ContentDecoder): + """ + From RFC7231: + If one or more encodings have been applied to a representation, the + sender that applied the encodings MUST generate a Content-Encoding + header field that lists the content codings in the order in which + they were applied. + """ + + def __init__(self, modes: str) -> None: + self._decoders = [_get_decoder(m.strip()) for m in modes.split(",")] + + def flush(self) -> bytes: + return self._decoders[0].flush() + + def decompress(self, data: bytes) -> bytes: + for d in reversed(self._decoders): + data = d.decompress(data) + return data + + +def _get_decoder(mode: str) -> ContentDecoder: + if "," in mode: + return MultiDecoder(mode) + + # According to RFC 9110 section 8.4.1.3, recipients should + # consider x-gzip equivalent to gzip + if mode in ("gzip", "x-gzip"): + return GzipDecoder() + + if brotli is not None and mode == "br": + return BrotliDecoder() + + if HAS_ZSTD and mode == "zstd": + return ZstdDecoder() + + return DeflateDecoder() + + +class BytesQueueBuffer: + """Memory-efficient bytes buffer + + To return decoded data in read() and still follow the BufferedIOBase API, we need a + buffer to always return the correct amount of bytes. + + This buffer should be filled using calls to put() + + Our maximum memory usage is determined by the sum of the size of: + + * self.buffer, which contains the full data + * the largest chunk that we will copy in get() + + The worst case scenario is a single chunk, in which case we'll make a full copy of + the data inside get(). + """ + + def __init__(self) -> None: + self.buffer: typing.Deque[bytes] = collections.deque() + self._size: int = 0 + + def __len__(self) -> int: + return self._size + + def put(self, data: bytes) -> None: + self.buffer.append(data) + self._size += len(data) + + def get(self, n: int) -> bytes: + if n == 0: + return b"" + elif not self.buffer: + raise RuntimeError("buffer is empty") + elif n < 0: + raise ValueError("n should be > 0") + + fetched = 0 + ret = io.BytesIO() + while fetched < n: + remaining = n - fetched + chunk = self.buffer.popleft() + chunk_length = len(chunk) + if remaining < chunk_length: + left_chunk, right_chunk = chunk[:remaining], chunk[remaining:] + ret.write(left_chunk) + self.buffer.appendleft(right_chunk) + self._size -= remaining + break + else: + ret.write(chunk) + self._size -= chunk_length + fetched += chunk_length + + if not self.buffer: + break + + return ret.getvalue() + + def get_all(self) -> bytes: + buffer = self.buffer + if not buffer: + assert self._size == 0 + return b"" + if len(buffer) == 1: + result = buffer.pop() + else: + ret = io.BytesIO() + ret.writelines(buffer.popleft() for _ in range(len(buffer))) + result = ret.getvalue() + self._size = 0 + return result + + +class BaseHTTPResponse(io.IOBase): + CONTENT_DECODERS = ["gzip", "x-gzip", "deflate"] + if brotli is not None: + CONTENT_DECODERS += ["br"] + if HAS_ZSTD: + CONTENT_DECODERS += ["zstd"] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + DECODER_ERROR_CLASSES: tuple[type[Exception], ...] = (IOError, zlib.error) + if brotli is not None: + DECODER_ERROR_CLASSES += (brotli.error,) + + if HAS_ZSTD: + DECODER_ERROR_CLASSES += (zstd.ZstdError,) + + def __init__( + self, + *, + headers: typing.Mapping[str, str] | typing.Mapping[bytes, bytes] | None = None, + status: int, + version: int, + version_string: str, + reason: str | None, + decode_content: bool, + request_url: str | None, + retries: Retry | None = None, + ) -> None: + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) # type: ignore[arg-type] + self.status = status + self.version = version + self.version_string = version_string + self.reason = reason + self.decode_content = decode_content + self._has_decoded_content = False + self._request_url: str | None = request_url + self.retries = retries + + self.chunked = False + tr_enc = self.headers.get("transfer-encoding", "").lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + self._decoder: ContentDecoder | None = None + self.length_remaining: int | None + + def get_redirect_location(self) -> str | None | typing.Literal[False]: + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get("location") + return False + + @property + def data(self) -> bytes: + raise NotImplementedError() + + def json(self) -> typing.Any: + """ + Deserializes the body of the HTTP response as a Python object. + + The body of the HTTP response must be encoded using UTF-8, as per + `RFC 8529 Section 8.1 `_. + + To use a custom JSON decoder pass the result of :attr:`HTTPResponse.data` to + your custom decoder instead. + + If the body of the HTTP response is not decodable to UTF-8, a + `UnicodeDecodeError` will be raised. If the body of the HTTP response is not a + valid JSON document, a `json.JSONDecodeError` will be raised. + + Read more :ref:`here `. + + :returns: The body of the HTTP response as a Python object. + """ + data = self.data.decode("utf-8") + return _json.loads(data) + + @property + def url(self) -> str | None: + raise NotImplementedError() + + @url.setter + def url(self, url: str | None) -> None: + raise NotImplementedError() + + @property + def connection(self) -> BaseHTTPConnection | None: + raise NotImplementedError() + + @property + def retries(self) -> Retry | None: + return self._retries + + @retries.setter + def retries(self, retries: Retry | None) -> None: + # Override the request_url if retries has a redirect location. + if retries is not None and retries.history: + self.url = retries.history[-1].redirect_location + self._retries = retries + + def stream( + self, amt: int | None = 2**16, decode_content: bool | None = None + ) -> typing.Iterator[bytes]: + raise NotImplementedError() + + def read( + self, + amt: int | None = None, + decode_content: bool | None = None, + cache_content: bool = False, + ) -> bytes: + raise NotImplementedError() + + def read1( + self, + amt: int | None = None, + decode_content: bool | None = None, + ) -> bytes: + raise NotImplementedError() + + def read_chunked( + self, + amt: int | None = None, + decode_content: bool | None = None, + ) -> typing.Iterator[bytes]: + raise NotImplementedError() + + def release_conn(self) -> None: + raise NotImplementedError() + + def drain_conn(self) -> None: + raise NotImplementedError() + + def shutdown(self) -> None: + raise NotImplementedError() + + def close(self) -> None: + raise NotImplementedError() + + def _init_decoder(self) -> None: + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get("content-encoding", "").lower() + if self._decoder is None: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + elif "," in content_encoding: + encodings = [ + e.strip() + for e in content_encoding.split(",") + if e.strip() in self.CONTENT_DECODERS + ] + if encodings: + self._decoder = _get_decoder(content_encoding) + + def _decode( + self, data: bytes, decode_content: bool | None, flush_decoder: bool + ) -> bytes: + """ + Decode the data passed in and potentially flush the decoder. + """ + if not decode_content: + if self._has_decoded_content: + raise RuntimeError( + "Calling read(decode_content=False) is not supported after " + "read(decode_content=True) was called." + ) + return data + + try: + if self._decoder: + data = self._decoder.decompress(data) + self._has_decoded_content = True + except self.DECODER_ERROR_CLASSES as e: + content_encoding = self.headers.get("content-encoding", "").lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, + e, + ) from e + if flush_decoder: + data += self._flush_decoder() + + return data + + def _flush_decoder(self) -> bytes: + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + return self._decoder.decompress(b"") + self._decoder.flush() + return b"" + + # Compatibility methods for `io` module + def readinto(self, b: bytearray) -> int: + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[: len(temp)] = temp + return len(temp) + + # Compatibility methods for http.client.HTTPResponse + def getheaders(self) -> HTTPHeaderDict: + warnings.warn( + "HTTPResponse.getheaders() is deprecated and will be removed " + "in urllib3 v2.6.0. Instead access HTTPResponse.headers directly.", + category=DeprecationWarning, + stacklevel=2, + ) + return self.headers + + def getheader(self, name: str, default: str | None = None) -> str | None: + warnings.warn( + "HTTPResponse.getheader() is deprecated and will be removed " + "in urllib3 v2.6.0. Instead use HTTPResponse.headers.get(name, default).", + category=DeprecationWarning, + stacklevel=2, + ) + return self.headers.get(name, default) + + # Compatibility method for http.cookiejar + def info(self) -> HTTPHeaderDict: + return self.headers + + def geturl(self) -> str | None: + return self.url + + +class HTTPResponse(BaseHTTPResponse): + """ + HTTP Response container. + + Backwards-compatible with :class:`http.client.HTTPResponse` but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in :class:`http.client.HTTPResponse`: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param original_response: + When this HTTPResponse wrapper is generated from an :class:`http.client.HTTPResponse` + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + def __init__( + self, + body: _TYPE_BODY = "", + headers: typing.Mapping[str, str] | typing.Mapping[bytes, bytes] | None = None, + status: int = 0, + version: int = 0, + version_string: str = "HTTP/?", + reason: str | None = None, + preload_content: bool = True, + decode_content: bool = True, + original_response: _HttplibHTTPResponse | None = None, + pool: HTTPConnectionPool | None = None, + connection: HTTPConnection | None = None, + msg: _HttplibHTTPMessage | None = None, + retries: Retry | None = None, + enforce_content_length: bool = True, + request_method: str | None = None, + request_url: str | None = None, + auto_close: bool = True, + sock_shutdown: typing.Callable[[int], None] | None = None, + ) -> None: + super().__init__( + headers=headers, + status=status, + version=version, + version_string=version_string, + reason=reason, + decode_content=decode_content, + request_url=request_url, + retries=retries, + ) + + self.enforce_content_length = enforce_content_length + self.auto_close = auto_close + + self._body = None + self._fp: _HttplibHTTPResponse | None = None + self._original_response = original_response + self._fp_bytes_read = 0 + self.msg = msg + + if body and isinstance(body, (str, bytes)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, "read"): + self._fp = body # type: ignore[assignment] + self._sock_shutdown = sock_shutdown + + # Are we using the chunked-style of transfer encoding? + self.chunk_left: int | None = None + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # Used to return the correct amount of bytes for partial read()s + self._decoded_buffer = BytesQueueBuffer() + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def release_conn(self) -> None: + if not self._pool or not self._connection: + return None + + self._pool._put_conn(self._connection) + self._connection = None + + def drain_conn(self) -> None: + """ + Read and discard any remaining HTTP response data in the response connection. + + Unread data in the HTTPResponse connection blocks the connection from being released back to the pool. + """ + try: + self.read() + except (HTTPError, OSError, BaseSSLError, HTTPException): + pass + + @property + def data(self) -> bytes: + # For backwards-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body # type: ignore[return-value] + + if self._fp: + return self.read(cache_content=True) + + return None # type: ignore[return-value] + + @property + def connection(self) -> HTTPConnection | None: + return self._connection + + def isclosed(self) -> bool: + return is_fp_closed(self._fp) + + def tell(self) -> int: + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``urllib3.response.HTTPResponse.read`` + if bytes are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method: str | None) -> int | None: + """ + Set initial length value for Response content if available. + """ + length: int | None + content_length: str | None = self.headers.get("content-length") + + if content_length is not None: + if self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning( + "Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked." + ) + return None + + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = {int(val) for val in content_length.split(",")} + if len(lengths) > 1: + raise InvalidHeader( + "Content-Length contained multiple " + "unmatching values (%s)" % content_length + ) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + else: # if content_length is None + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == "HEAD": + length = 0 + + return length + + @contextmanager + def _error_catcher(self) -> typing.Generator[None]: + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout as e: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, "Read timed out.") from e # type: ignore[arg-type] + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if "read operation timed out" not in str(e): + # SSL errors related to framing/MAC get wrapped and reraised here + raise SSLError(e) from e + + raise ReadTimeoutError(self._pool, None, "Read timed out.") from e # type: ignore[arg-type] + + except IncompleteRead as e: + if ( + e.expected is not None + and e.partial is not None + and e.expected == -e.partial + ): + arg = "Response may not contain content." + else: + arg = f"Connection broken: {e!r}" + raise ProtocolError(arg, e) from e + + except (HTTPException, OSError) as e: + raise ProtocolError(f"Connection broken: {e!r}", e) from e + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def _fp_read( + self, + amt: int | None = None, + *, + read1: bool = False, + ) -> bytes: + """ + Read a response with the thought that reading the number of bytes + larger than can fit in a 32-bit int at a time via SSL in some + known cases leads to an overflow error that has to be prevented + if `amt` or `self.length_remaining` indicate that a problem may + happen. + + The known cases: + * CPython < 3.9.7 because of a bug + https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900. + * urllib3 injected with pyOpenSSL-backed SSL-support. + * CPython < 3.10 only when `amt` does not fit 32-bit int. + """ + assert self._fp + c_int_max = 2**31 - 1 + if ( + (amt and amt > c_int_max) + or ( + amt is None + and self.length_remaining + and self.length_remaining > c_int_max + ) + ) and (util.IS_PYOPENSSL or sys.version_info < (3, 10)): + if read1: + return self._fp.read1(c_int_max) + buffer = io.BytesIO() + # Besides `max_chunk_amt` being a maximum chunk size, it + # affects memory overhead of reading a response by this + # method in CPython. + # `c_int_max` equal to 2 GiB - 1 byte is the actual maximum + # chunk size that does not lead to an overflow error, but + # 256 MiB is a compromise. + max_chunk_amt = 2**28 + while amt is None or amt != 0: + if amt is not None: + chunk_amt = min(amt, max_chunk_amt) + amt -= chunk_amt + else: + chunk_amt = max_chunk_amt + data = self._fp.read(chunk_amt) + if not data: + break + buffer.write(data) + del data # to reduce peak memory usage by `max_chunk_amt`. + return buffer.getvalue() + elif read1: + return self._fp.read1(amt) if amt is not None else self._fp.read1() + else: + # StringIO doesn't like amt=None + return self._fp.read(amt) if amt is not None else self._fp.read() + + def _raw_read( + self, + amt: int | None = None, + *, + read1: bool = False, + ) -> bytes: + """ + Reads `amt` of bytes from the socket. + """ + if self._fp is None: + return None # type: ignore[return-value] + + fp_closed = getattr(self._fp, "closed", False) + + with self._error_catcher(): + data = self._fp_read(amt, read1=read1) if not fp_closed else b"" + if amt is not None and amt != 0 and not data: + # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + if ( + self.enforce_content_length + and self.length_remaining is not None + and self.length_remaining != 0 + ): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + elif read1 and ( + (amt != 0 and not data) or self.length_remaining == len(data) + ): + # All data has been read, but `self._fp.read1` in + # CPython 3.12 and older doesn't always close + # `http.client.HTTPResponse`, so we close it here. + # See https://github.com/python/cpython/issues/113199 + self._fp.close() + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + return data + + def read( + self, + amt: int | None = None, + decode_content: bool | None = None, + cache_content: bool = False, + ) -> bytes: + """ + Similar to :meth:`http.client.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if amt and amt < 0: + # Negative numbers and `None` should be treated the same. + amt = None + elif amt is not None: + cache_content = False + + if len(self._decoded_buffer) >= amt: + return self._decoded_buffer.get(amt) + + data = self._raw_read(amt) + + flush_decoder = amt is None or (amt != 0 and not data) + + if not data and len(self._decoded_buffer) == 0: + return data + + if amt is None: + data = self._decode(data, decode_content, flush_decoder) + if cache_content: + self._body = data + else: + # do not waste memory on buffer when not decoding + if not decode_content: + if self._has_decoded_content: + raise RuntimeError( + "Calling read(decode_content=False) is not supported after " + "read(decode_content=True) was called." + ) + return data + + decoded_data = self._decode(data, decode_content, flush_decoder) + self._decoded_buffer.put(decoded_data) + + while len(self._decoded_buffer) < amt and data: + # TODO make sure to initially read enough data to get past the headers + # For example, the GZ file header takes 10 bytes, we don't want to read + # it one byte at a time + data = self._raw_read(amt) + decoded_data = self._decode(data, decode_content, flush_decoder) + self._decoded_buffer.put(decoded_data) + data = self._decoded_buffer.get(amt) + + return data + + def read1( + self, + amt: int | None = None, + decode_content: bool | None = None, + ) -> bytes: + """ + Similar to ``http.client.HTTPResponse.read1`` and documented + in :meth:`io.BufferedReader.read1`, but with an additional parameter: + ``decode_content``. + + :param amt: + How much of the content to read. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if decode_content is None: + decode_content = self.decode_content + if amt and amt < 0: + # Negative numbers and `None` should be treated the same. + amt = None + # try and respond without going to the network + if self._has_decoded_content: + if not decode_content: + raise RuntimeError( + "Calling read1(decode_content=False) is not supported after " + "read1(decode_content=True) was called." + ) + if len(self._decoded_buffer) > 0: + if amt is None: + return self._decoded_buffer.get_all() + return self._decoded_buffer.get(amt) + if amt == 0: + return b"" + + # FIXME, this method's type doesn't say returning None is possible + data = self._raw_read(amt, read1=True) + if not decode_content or data is None: + return data + + self._init_decoder() + while True: + flush_decoder = not data + decoded_data = self._decode(data, decode_content, flush_decoder) + self._decoded_buffer.put(decoded_data) + if decoded_data or flush_decoder: + break + data = self._raw_read(8192, read1=True) + + if amt is None: + return self._decoded_buffer.get_all() + return self._decoded_buffer.get(amt) + + def stream( + self, amt: int | None = 2**16, decode_content: bool | None = None + ) -> typing.Generator[bytes]: + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + yield from self.read_chunked(amt, decode_content=decode_content) + else: + while not is_fp_closed(self._fp) or len(self._decoded_buffer) > 0: + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + # Overrides from io.IOBase + def readable(self) -> bool: + return True + + def shutdown(self) -> None: + if not self._sock_shutdown: + raise ValueError("Cannot shutdown socket as self._sock_shutdown is not set") + if self._connection is None: + raise RuntimeError( + "Cannot shutdown as connection has already been released to the pool" + ) + self._sock_shutdown(socket.SHUT_RD) + + def close(self) -> None: + self._sock_shutdown = None + + if not self.closed and self._fp: + self._fp.close() + + if self._connection: + self._connection.close() + + if not self.auto_close: + io.IOBase.close(self) + + @property + def closed(self) -> bool: + if not self.auto_close: + return io.IOBase.closed.__get__(self) # type: ignore[no-any-return] + elif self._fp is None: + return True + elif hasattr(self._fp, "isclosed"): + return self._fp.isclosed() + elif hasattr(self._fp, "closed"): + return self._fp.closed + else: + return True + + def fileno(self) -> int: + if self._fp is None: + raise OSError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise OSError( + "The file-like object this HTTPResponse is wrapped " + "around has no file descriptor" + ) + + def flush(self) -> None: + if ( + self._fp is not None + and hasattr(self._fp, "flush") + and not getattr(self._fp, "closed", False) + ): + return self._fp.flush() + + def supports_chunked_reads(self) -> bool: + """ + Checks if the underlying file-like object looks like a + :class:`http.client.HTTPResponse` object. We do this by testing for + the fp attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, "fp") + + def _update_chunk_length(self) -> None: + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return None + line = self._fp.fp.readline() # type: ignore[union-attr] + line = line.split(b";", 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + self.close() + if line: + # Invalid chunked protocol response, abort. + raise InvalidChunkLength(self, line) from None + else: + # Truncated at start of next chunk + raise ProtocolError("Response ended prematurely") from None + + def _handle_chunk(self, amt: int | None) -> bytes: + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) # type: ignore[union-attr] + returned_chunk = chunk + self._fp._safe_read(2) # type: ignore[union-attr] # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif self.chunk_left is not None and amt < self.chunk_left: + value = self._fp._safe_read(amt) # type: ignore[union-attr] + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) # type: ignore[union-attr] + self._fp._safe_read(2) # type: ignore[union-attr] # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) # type: ignore[union-attr] + self._fp._safe_read(2) # type: ignore[union-attr] # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk # type: ignore[no-any-return] + + def read_chunked( + self, amt: int | None = None, decode_content: bool | None = None + ) -> typing.Generator[bytes]: + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing." + ) + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be http.client.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks." + ) + + with self._error_catcher(): + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return None + + # If a response is already read and closed + # then return immediately. + if self._fp.fp is None: # type: ignore[union-attr] + return None + + if amt and amt < 0: + # Negative numbers and `None` should be treated the same, + # but httplib handles only `None` correctly. + amt = None + + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode( + chunk, decode_content=decode_content, flush_decoder=False + ) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while self._fp is not None: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b"\r\n": + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() + + @property + def url(self) -> str | None: + """ + Returns the URL that was the source of this response. + If the request that generated this response redirected, this method + will return the final redirect location. + """ + return self._request_url + + @url.setter + def url(self, url: str) -> None: + self._request_url = url + + def __iter__(self) -> typing.Iterator[bytes]: + buffer: list[bytes] = [] + for chunk in self.stream(decode_content=True): + if b"\n" in chunk: + chunks = chunk.split(b"\n") + yield b"".join(buffer) + chunks[0] + b"\n" + for x in chunks[1:-1]: + yield x + b"\n" + if chunks[-1]: + buffer = [chunks[-1]] + else: + buffer = [] + else: + buffer.append(chunk) + if buffer: + yield b"".join(buffer) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__init__.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__init__.py new file mode 100644 index 000000000..534126033 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__init__.py @@ -0,0 +1,42 @@ +# For backwards compatibility, provide imports that used to be here. +from __future__ import annotations + +from .connection import is_connection_dropped +from .request import SKIP_HEADER, SKIPPABLE_HEADERS, make_headers +from .response import is_fp_closed +from .retry import Retry +from .ssl_ import ( + ALPN_PROTOCOLS, + IS_PYOPENSSL, + SSLContext, + assert_fingerprint, + create_urllib3_context, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import Timeout +from .url import Url, parse_url +from .wait import wait_for_read, wait_for_write + +__all__ = ( + "IS_PYOPENSSL", + "SSLContext", + "ALPN_PROTOCOLS", + "Retry", + "Timeout", + "Url", + "assert_fingerprint", + "create_urllib3_context", + "is_connection_dropped", + "is_fp_closed", + "parse_url", + "make_headers", + "resolve_cert_reqs", + "resolve_ssl_version", + "ssl_wrap_socket", + "wait_for_read", + "wait_for_write", + "SKIP_HEADER", + "SKIPPABLE_HEADERS", +) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5396213d7e8fda0516a0e05c654772986e1caeec GIT binary patch literal 1031 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 TmT!_M*n0E)W}yA5mkIY@+cc=i literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16fdb3e7201aad7d5996a1c80cef0bf6697c8bd1 GIT binary patch literal 1243 zcmZ8g&2G~`5Z<-(9damv0*b%`6{EHxs9)+$dtg6+Vk%`w(YJeS-&w+61u1*_%O=MO}ZZGf7qY zB58*`K3WIiJsP52JitTE({>gR;!;N268GQmbY-6zVqP8MZ5idiA$;Pl21y=<2+g2j{z*0#8iRq=|HgKkGpvrJW0{s#2GmzaW_~Uyp z?V>S3#+k3h`e^3txPXlFA71Pg=jFygrP{tx|7O%btn3-{-z)V|rM_QT+N&%bC~Rf+ z2qGX;w{6=rcopQgWq2oKNNg5Sep)JOQ1^R*7 z8k{-~mt>{|G3djUq&n2h^HNi7y;uPlHplz*2%r_TEe-3MAV literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..debd4c2d4d0f889951b45c99ff83c3130e1b34a7 GIT binary patch literal 8343 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 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f3e0754db94f1656cee89a1759aa24b0c78459a GIT binary patch literal 2899 zcma)8OKcm*8J>Ocxuhghl5P1RjpC*<5sOUi9tyQEBG*oB15$)YNf8AFvEmNNwU@ih z%uo_lst}AGY_x#mUKF4WP!u_|aM5FtB0&*f+Y1E?kg{-514$0Kv6fM^KJ}m3U5S=+ z=m6ZA+5fpS|M&g;dp4U!Fh2dntQE2deIYi{P=kfCHwTMNWFbp&P+eJ66tPwvwXQAd za;-VBdVDcnPb?;2uUj!ESx+sdV4bq!Ki3!2R@zFyY*>bsggMhv^O>)O`@G^Crt5m# z+#pcG7x?( z(gwG=tHiVjoii!3-Rc!eJz7>o$Z+T|YX~WOe}ly)N})Eo(JK$t?uYX{I)iw4A_#p8 zQB6VbAXi^OtJ*tgMUnQx=b`a`*~JeT!PZim=mp!Xh{;otwx!+=GrpxndE~V_|46oD(uMvt(T(y^piz~K6CLQ}G!QRphI7@6ZTy{K0tU_AaO~J{Vbs?RSd*N%L zMqV`J9xjU*1*tZ>mVe7NmmGrOy+t^ob=xKT;VX@vK>3)Tv{?|<@0;eF+DlDNn(0`?x=MckRwvCpq#>3j1D`?<{{Xbo)6!yUEO#>7mZ>YY)@Y9eui+5I$KR z;@|4epgMY~&yrL8M~H6yY*m?NyQvmggH zIy@rzy4sVc%KIWcE-plliW=od)wU|*P%<%4!vr)t{U|XkF{^s_~&nj~|Uz z2VR-l*6yjlJf)*`eO+touvci7k3^bny{-IFk8-%Bv>=WGan`jJl#iJg;bi6;3Wc>WzBM#Fji?gP74D(C0GS6udH%vLg8cLmVp5Qbi~3$P#wb+ z>eVqoA4B~Dp<=HhO@Rxe2qEC#aKY<}M}aIn7tcvd;0w>QL5=f9q3qbi<%O#Y3v)A& z4j?7+G=&4QWdi)mgxZx>WKT_-5r#uV707CtG$hp*UgYNk!nt;kZ1_1Q1qu=@AJEO( zC|PX)=HYuqZh+Q8nA162^*DZ}6htpcSh8U-KihPJgDY7kH}hFPZ9`jN+;q#tPlPUf zqvzZF)IzHfa+1zrDZyWldXsNd2`@FwmgAY0A6sg1!hDT!N(Z3`XiPi=Y^Xp75MCm@ zRx0YsPeg|CAVF!wgps&bO#6k>uqmsf6j(wm*~#cQ$j-u#{TUt`=;G6gGa;MKJwq044kHO+M4HlcCBg1@n0GgE>pmlge>|iN3;dtgzUR~=* zkR9rT0VdvS5+*@m3V=w02gI=ea3;QbW%}|YB~mLY<)AShhQgbXb>!xtiuXlPtHgFi zLK2!$)pp?@4S+EWA~O|t-vo5y2@!t+Lp~<1Lj(81viEf%5QSX|Ui-0Tqd_RVNk;Mg zbRa50F*0$YQ9TVp^NN&8+>>=hMJ2rpKXwKl(8F>lcVg$r_|}o}jqAI{@Q!hE%Q*Sa zIQ`qBTgF63pV$L6l-H>sT|XZDhw$T+@FsPAeaZ725RQUyZ7>3652)xX!c3p_Tmov} z7HUJiYSD>FJ$er00;;7_r3wB?sYJ!S`$o?li2no|Ziys$0DnMKv``7VXUQMbJ*(-Ei}btjPBbxjHqgEmSUfGME VQZ6Zb7hhH0P@Yzlv~pHD`5$&>^JoA7 literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1c773af38fcd98f6d11195e1eedf7564f62470b GIT binary patch literal 20312 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 WOTX$DYJ+Rh@42o!zE#bb!v6({?2JmBsD zNx(xJcG+faFK{KH0tejLE9fTj{_ED-s<^F)T7JRVLiY z&TuCiT_DkwtO=JRehb4s^v~e_(9EE4jn^yf1C>+kZR=~sg96)bUt^432QyD z_J(_twc*-iU$`$B3`;yHOB zJj}SzAvH*iCKtjZa;@?iQ6QwT``t93GO;`IkPVu8f z%4}VFr)ZwA-sn+nZ04IMxR)`_;o}~CE{EjfZ((-nkq;Q-YLSosDfeBQnNPfXrPVwnaNzN1v7sNu8M6XQhzTh4*vPpwx}`^QGA*NIJaxd+(Pt zB<=sYGdzYKzrL$8_OZ9N`7I5b(C_w^Mx+B@cfMtG6dwQo)awzcr@YsXqgfjLxROuK zmySri;NiG*RO-VFOi0J1Al{SUKGwnBf6@u*AZnjpv&C$@v9qsp-JE=4Kc_f&?jrXp z|4R3D?uPv$cb!N6N#r+RPqv2pq_%KS+7}*_+QWw>#|=I_93GH5!iS{B@Q5UaL#%Cw z**19ced2VG*L=}bDxHaD;^~w+jc?CtYDvD4h%c_aPpdO%(;8-#^o_Oo*pi%-FQnAf zm6f!TktI!-pFcOLC~4(=Ua!~`IW;#nK6!3(em*ia`_j?K*u=zKI5Ib>3G{sg(CKwy zDU(?l910Bu?Lpi7B3f$pq%;Z`+lkX0>QZzFAJ5Z=3m?OyM`MP-Ll(yoj6eR-7XaMi zvJmEMBRaD-$#xZ)^OR?2dHWzPA)H&dn|44<$li2h?UIX1Z}5tf=dupTO|5S5Dt*}{ zLC3M?33{V{j)Bd|nN=kvE-0(AxR_SN@!7S^QaUA$gieG;`bFf7goY0Hi_w%M&aTa_ ziN``Cq2vAH^(9%6y&@h}&Sc`LDuKex8uBt6GpiXjF3Dng(IUX=@VYEY=~Qn&C>im{!%$lDv|MuB4?##3oUb0*_4C9P72v?#y@{PgsYuIDUax9|`PR`FB znodjL2|-g6rz3Oe%jwKuW;K&m;?cxl$b!H~jGR^@mf-N98qdgwR-&=1(JN?eF**}Z z4614(5?Wc)Y9nzqa(N{kIWjUjJRDh!-;gCm1WE1qQ!gOd;EL^>(0Y6EzI*>pK)f@R z4;;z~hYFsyJD&TVV46gd%(UQWmgNyX#%QzwyNc51kq&h6^{e0Bfb zvs=~2HqI8k-2Rhqhx6TMat?9FSN|){?spZ0{lDUP&jtRWuRYf>eD7TD)clrjq3EeECmI1d&g6I0_0>#dnp z$g9umshUv+L?kZ{h@nvEWvx|MnkvJP_qM@=7*@m{+VV| zIURK1P-6Qy64AVoNHQ(0CS<_=NaTyF(FBvu5iJmjl%0=}h(Zb$V<4MHKt%Gg)*1oNBQH(P z%}>otM;2xx3+Lv|&tQdCVKD477pCSWC$!cV#^xi_lc*jUe_?X`#mM-~`SWNuJ$8Ol ztDc#SOwUl(>>SQw;M4qi*22{Ii<1jlU}ko5x~w~`VNXV6`oj5BlXIGXc5Y^2W_;!x zQKQwCe?`X6O-)WOXf>c=>h#6P=SB~oh|Dj{VLCOR-Wz(jHeCKOqIr>L9DnP%jLq& zsAB4}H~9?p#GY(Pq}j5z44p>oxyCD%Wqm{3F+0Gbpj302hOy_#TC_sZv2T=Pa%F9M zFjbh1F{*$Gm)<7T=IC!aY*34`ocX<6U8-wBW}BPNOs$!>Oq*fPlXXHo8#ADaW#e_z zcqJk0TyEUc1fM2$)bM=QY0~jEevJ=$*MI3HxjN3&C^5b$UV$o;5*MMg$jXX>ouw-= zGP+xmMN(c9aaj^$vXY4}#$(ZpZ0IT{SE5QZ$qG&~oD6TN8tFin*D^qqX3{9cDjBWH z`YSa)T}A{NLk5v51q}}RwG@X=qz;I&XiB^+lLWvKgr4vxHEzA5yfbtWPhE>9;*yw#UlUhT z(QDCof({&py=*)s6g_2qsGNJ^i*MN8hC0$SWuApC`wXeAq zc_k5z$(l2fzAh`89fWCq2(cGVUzi?`oFALj>{sNBLJkDYC8uIIlr$H(B&!+Cv6PI) zv`T1(m?Jr2#9Jmv^ zJG@mB+O9d0uQ{?+b9Cdyhjop&eOq<=H_jK_b#I)@yZfkN^YOP^->%3tp5CfFlM~K7 z476?sI`V;zI~7}j(8db|cOd6(M8!hoOm6n&cfXSJM;_U20dJABdAyIkTyxi*{_U%pH4Zk_#nZt4rUFT9-d|6ZwsqMh?U$4;=AB^)tyON0A;d@$kZ$^g=z z`Esp{%h0T{$K3o%Ur8jEL>t+1ruGJx7r#;av|5ra%dG>OiHmBI%}4rP^nZXvwlU{q zHJ!L-Z2PEkWtEHyvaO;blsRYuF=qW_qI3Z3Hj}XzS7_2DRAqQ*pIuj?D-ksvyDDd_ z9W^s~ zJMEiKi)-msCV?P%V$cM|OLLRDesKv%)r=gKNL*d|7@FgmUR6xVP^4u=yfmFo$(JAz z6mZxObubzAA%Fxno`eFFYx+p^Nnli4BPq>;6jvZlV3T6t)`XN#gdrO>CnGNCR7giA zjhqONrm(9IQ-&KtC7OZuX9x4&v}qnpG9(wozGhcsRi(qo-0juKpfwX=B0-VAs47b+ z{x|qjr;uQ?H*i9A&fWAd(3TV0-g8&K8hm5^fxGizW&P{1+b8ZwTb2Er_JXf+^HUFN zn&0TYef@58z5_B~WOKX_sM+-H`08?wx=+|l{|f#5&YS7^r)`t})6JBz^owObh}rXG zD$NXNGR8@6ZoYMq&1NEgRTe+ON>((j5Fdkr@+@A;WlCt4lo%xv63vxaTY<2JRF6XN z+i@-`GV*uLQ>}@-%w$uNsFkOhh7l{6Gu4_CT7Qd~`qJHt`HrJoHODr`9|r2b^`&oq z>5Y*)_N~DFoUp%q)+|j9eOV$9A`-J!5`WMmk)uDm^hgM}k}%BBal@WPJM=#_>)5bm zonQ53JZ8RRf2*Vc8gUGcTedVfvmOWWSDKk+(suVe=3L!$WPW=*q;&6jEIiIky;-!} zU_zz0o<-T(=I9()i6$-gIXjUlp>BtUF?jF;!nSvNjWE>0MqI+;c<6 zbVn?`HfvX^v+m{2QhgK3TD*lTf#0agbeSc~`%S3yPT`QjL1WwKk=!>)bMG@n)NZ}7_@Gq3c{+NeBci&)xl*0s@#o?RK*FYH+!Hlfm6cU~$r zSy$$Wnag@|A?N6x9O|2d=AI|(GWxc7o%xhmCF_jN>xfelv>}r>%xCdrPiEfUNEsNpEaS<`)NBy@>{D;$O?)( zD*&H0t6BFv{O+04CJy-7?c{%dWz_PZS46w9fyZ&Akx@Y2Se#>v@hhtkPxus1#u7OF z^i#iN_39@p9Z*csCYLL@qC~@8x7!#g6L2N7VgYAA+=DnEC2>VbXVNehM8k7Mssd1k z#Dyj357*=H%u2c*V(K%b+*-CWGtfs2^@r6?$0 z&_kLC`H-Ok5DTDDK;fVxIFVq=1}PAx3(g1~7-OW?j7(;D$uNLON08(doctg_vQ!Y_ zQ7^Fqj?{Q^HEFu(dUYMZFu|TuVK>i=))uQk7~BYka)mymkaz(-(SWG8P{}*dE6UIr z*?bwA5*cz-5k}T33`iPEIT_I#<#g^LLofV)MFx>F4dV+;WR7%6*B=psppiyXa2GQx z6x1si0@mrC!G_L{eQxUfh4Yd53$wE`a|@Fby=F{-+0fR^n+xlsJh1eq(#Su%1a+Bu zOoOs7u43^r{!vZC3@3)@Ana3P0UKSA4sCUN=_zWop+_52kX~WItWxLmOudE1Z!Scm z2K6Fi%FU60I30VL`|8rAfjwQ93P(`5t3{c|jf!YPlq1x=ZC!i&V#ECLn!_ddoHR$hfXP6>MvPNNaNX`D3GsLiiZg+j>}U zXxe8ad38}}$opP4W@E~qDkI4N)C+bCrQY?cEZah)4`h!BrWMT21(;!qoJ?P1V%a>b z#B0N$qoKngaS9A0WAS4pwGn621d{Am(#jeO!^Ey85dBCfWJj1WH`4pG+7-k{5gtiN z2moJ|Bhl5&(!y!20<-br8*{aGIQFMxula!E>rMZpe1aoyw)gw)lRQNm2YDl~+;qm-tf~u&_3`$J0C~)a2aF4=WpUO`qASoXZJwMHeU3-ahjE zwg-c!axLR|_c(I=9Xa2@Txcv8I{&byt!U$`$M{Efdu?TrvsY9;uHw3%-R>I8ca0(7 z`9^qq---Ob6Y!IDSLXa3k6oWwTFF(^f9w1=&lA!a{=Me@LTlTvJx+!-(EOlzV5{=b z#+e;=OU~U>=o;O0|5WIBuWLZ}>TS9o2pwf*`1%0$ZJ;0owuRO_qP1rp2>UUBp26IK zqp#byt2*yjb-q2dF}35a-1thNrgqc4BLrUmR946o`KXL%L#jSB~^3yE*_htodslXekxv@TJaYC#?k0D6;L)0ZH z$9zbt7SPXXYXd6ZM7i=uREg~#W68n`t+#+98i7injgZp|7eFMbK&e89qD!g36&5CSAd9*6)LZr$41M7w(${ngB>rri4pHlDPvK3E@!@*zR z$@)qjhE#i2*k~(xQL+{AqtF?HN2vl1%fqGTQEJAR$QPhAWxX2>8H+ikn4RJ)dD;;B z!zk!Me9)%!p-nAtTb>8Kj8a@nuzY1am->WSS#N0+!1a_!TZR@cd(7V9QL#KRS#T)p z&pO|tC5z`~ARAzItntlpuw$!lR+dJQtu*muE5Bxw_?wkquDs4$Hm)=JXK2c_m@(Lr zrXO7uDdHEjzw-9rNkc%C;Ode4Rc$rnpB4l&ks}&iwQgXi3&IruHl}U1X}ZBo zP{PTmA=R4ANR(xno1@%VEpc04afWV|NJ9^XBB}NTcNtOTg1qw@T7bX za#(Ai>s~aww9q2fWNCpta!9KoVG~WPq#~wkPlaB7Zgx6iI_>7Q`pBLWK0>z>gH_7w z=t}v=l>9Lzq>CuGD4}?DN%c_vgg(DR$)8g41|{F6c_t?F&?*z62vxv0&YBy$n^Y{=~)kwGJ4m?B@edyc$cZPEQ z{eK6|(R1L5N-p{D)SepUemLqG57>YBtbg2V|4XkE@YCbt{~Qev95R#z7OF9nkx~pB zK??3^SBT1PKysx+yQJDIdx3n49XZT-JZz#)t4sC42& z)aZiFI*Rm5HV`}TR!q%aJ3^8W@1tT=lHmO|F0PCvaLZUS@RS$BwZwehVLD@`Cd@m| zrUx}sx`BLBe8IRWO*>w`5rxHV`df9s%}M=cwjmKM3QgKfiUy23)s}}#mlB#Ys>b5+ zpqm9FHK%?j#3jLb3hUW%Ih{@@#A4jurK`{iS)sVXCz$=H#53bcrypB9zG84d`Ijho zk9Niw02raLb824gdt>r}yKASm_11H*J$L8WR&D>L@X!}{UAR^GTIKB#% zOl%LF%@3S?_xRSp!j|ts&T-+R5o1f2UIG5y%gda|QTp8wk6)c&6W@exm$hBvRQ?r# zevw4~Or4nL*6a@YJ;>f%M>jWw7T57xgo_-He`^l?mj^-T`ayGnfb&s0iP#ysON!E} zzzw00=9!!xpSw5`24;AX@x~r#cb7CjZa$C9|=qfa}e&|6NtMCD2P1}cd`t)=D z>JKYS=m`^SuXqRSxA+13_we@v=cqddUDtY?fSCD5W)O@On=+EI3f1xeuXUyGYkX;! zFPGyo+La86@-Qfrb{@e<8aW;W)A{A{AhVv00B_a~!^n^v`rYQk6u*EzLodUtZt0Os zH76y3ynMZeKM`jl9R)#$(vO!yYe?H4VK>Ea46|3z~*17L&u0B(SqUj$m;tLZCLor33tJS#T%Km^WHzb%}| z3n$+0e;}O31*qE-clz&sWh?MpPIzv|*RbvD%KN(R9C;fanyxM1RL(KQwgj#cv`|Nf zDWQwmT8)0k7!F`|k9KPM^bEVK{iOM$1!5MVk`(Tl>7qor2L!mVw%@{dfFSyn*q&aL ze@A%~AXWZ7CI5jE*4m|91ibFoZwl)8l`s`E5~-r*piaTWMSMJ|q7M*4Hx;v_6zj-> zC^M=ke?iSz7eq?XJ*_`D@V`kIyn0i@qaXP{r26E9Qy4_vh9|i7t{B5rUa^Y)fdy?? z5OwsV5{o8OQrm)lT*S7XU>lqNCl!XirN4B=<1Yyh(>@r)R1ii5(?eJuQ$`p>@}$OKqCQB*d#2E=*X!3wLgx@gQKE^@vme&H%$T`O z4n`W|JiFLs3`+SC(ZqBphW`I{D9T?EzKD>>wtJ z^qZn~xO3S#%MM=V;@73s3BvPLO70ReC%gHt?@l&4wkKm$K1Yd2Ngooeg8k}%U6Y@h zKBIf!X@4mPsnid4XUv~EXjOZe%`W#V$Ef-!CC4c_NeMaZm1ijVG$qec@*E}4Q!+-$ zDM}`gXaQ4wr(6ElhDVf1%B|e}vm(twp7pXHm^hdP@eQi#n@ZAeF_?v+IWMHZHH9=w z{G{ijKdNAtRN3V~LjL8b6G28P{b!(F7tixRa1%x2_H! zW&-_*@Qi-D@mb{;XbGXtsVOJNK`Z9@|H5_s4OjVd&i8Z9^K-7^=bV?NfnRX#|D8MW zU%8Q;is}t-AyB*FFSK{(xYk0T4q#2&t8E*VJM}HMan z-hmwa>jGDO_*b0ES-wbfW&Rt2k$Wv59NkcPsH)BG>)tw^!eha@}Y14KL=n+DEPq-uq~RujA_D&2ph&*@Qpn_-Y4mwYC@VzpaDPt^K~+R; zH9`0xR&TMEpgJn8C#Zo)Z6v6PmQpi8EnIaE>%G{qqo1%*j8*k!}E2FdIA{v1Q_%)P@e_{>hr)r zeIgjB&jbVYsbHW!7Yx)VgMs>NFi;-|1ND(GkcRSTAAye+Y+n8){!xp-SK|ke-MvLm z6@Qjz#1gPm4Pik5hy^3u3>0X6uzFy(tLL$ga{uR}sQ{$XZ;D^Ab5-r+MyS{Pb>uv# z|2xc&Q2Q%R;M)sL9k``msBPXjSEy;-cu`Ld^yC~p8#Ava3N39pM`JRwk$bmEMH_h7G>!e%d+b@ZDU2EW#&gxB-u@rCd7$%vQ8%N zn7v~pu@s`ZDPT1QOd|!PAZX(N1>(YeaDbvokv_OUTLkEf6xuLzby1`3OW&AC1qwfP z_I^m(P5QgU?auAa&dw}%X1=}Og~J?z^2?9J*_&+${h7SDg|P{0^XEXUA_+|)iIO~7 zD(9KS$=+2R{4Ui zsAu?ziD!hr5|!eV85C7jGek05ABlU+U~25u{sBqCFw=TD;=KHovM20JPrfjgOphg# zB?6SPTW-d#@2YB@O}X61#%vx{R` zo0Bt!o=8rN^^RzgY*VSB6X|hnS~C(x!O$>lMM9`kS!Ftrx3=q$aIi0-D~8;g7c*zY zGcdb=voL-rQ81KjLf5nDd-q+)FJczdu&P!dbaKRAM^$eCN8J95^Vh>WLOyulo!az3 zy^7ADCAx%kYLP0TIcJ|NKBtmASDoG^Z^}3aQ@)`=ahhqm@{fM{j|(|0M_B_r>cNEv~$|Z7$VlON_gM z+k!Uz|DU9}9S!*|C2>;ls>gn7tW@$1p_d+ke>(6#tytf|hQte9UeshU1jhS|6q3So z+Ix9gwBOOz{d0>z`n*=I>8BQZ(LWHc-h z%Fy`n6NCJbgMARcbns{r*p3MO!Xb|1q0Aaa{#YVmXj)bm6xo;&G<+s8Yvi&CJd+{Q z_BgY8?O9~fiMy15$zEgPgd--^UF-n~5K7fWeqPB+84*i5uc&;c5tI0#kqMrJoMU{E zdGTf8r2|Fpg4)|#^n9z^?&t<`03HFJsd&_6^n6w^OeUihRKp4krWeb3YdclF8|Yhz)&SF=kBxi>hqhrZ?z^iS`*ipYx9-XCvF6e15e9?pCgLdcivkK zgve?RxAf-d&A{Fo4MST#6bxVNUg<8MT08a5)LT(O8#{WhF&jG${|tYy^!`$X zOD+#qgOQ7mtvptKz7p(M_jXtbB;&*e*kgpe@L0Ly0uZansOO8hW-h`B1tNAm-rGH- zb|bdyflHpIOyHRdG&o%f;_Dam-W${7l=wYRCb=MH3>%pcC)Q^8)EFiMNCdGMi?)p3)DWN1R0EEy&Km%JBsl}QU9v*K z^r9i_gpUj~))V*vmAt+xW1R$#epeA*(cwkQ7_y=F@S-Zg1B{j|m-$FD^T8tyx4^$B z2*OMJmnmv2=7|QNttHIz5Kv9ARde=%EN@$v0YC zs7W@!vU>VsN(`j&3531{?z!Y!@|S!L^yw_o%MpXvY!!fLlsgNDb!epp}O9MynK_pD3cYwJI)8v$4zB?#(m&pk34`o-K;&QW`i;pl+SUO*&p zW2Bep7f_kH@aQ~R0BW9!w}^2#bf;yk%q&8D6AiwbID9wX1t7%( z3&R~u=S3{TdRYQtq#k~{U^GQsXBcjh1jxyG0~7(>nisG$z+eMiSvNis60xZ0z)!BP zqLM9OS>Q)iUN3+k9l|tG)V<)^>R6`gJgi2bqhNIw4LO%5NdrTFGl=WC@4C#ZvJ6O1 zBs;|G))tXT?yVSlBGjeaB z#^hpS(tsU{93&wpyqkW9%j5vmevp z=T8A{EARXM*Q(LB^RNB*8`t)Ixbw!ICqIp~RYR>8M^{GIk~c%0)o`r*OeM?%(|WY? z#{RE<$b2||WB>4dY_%4U3f2VnT%N!D+AkKW+uK) zkvDwc5?7|nr>fiA)_N-2AGzJW@3MU5`5Wy=%$*(8)`wO{FO6PK-fZpuj0N5r4O6!w zC=fh<^t(&tS3dFY{6nPUPd)wDqz{z$m0#1p9{RYea(v>(kx2lp;nUP6O_N=uS#B$U zxbXSs-`KVG@F(n7Zbv#UKXB#fm7Z(b_1TYK`PJF$>Gj>GDv{IcfzyA9bgb_lt3;k# z4?Oqxtzim<+CE1frv1*gwm1AW2B^C_xock>ppt#)H+{hq6#ZL7K^>JezyxpZw=Mh>VItTlPMrWnjuZCXU-qHPS;x}O7C+!lw*;A9qDH*M^rzF3 zma)HN%@iO$!HiP8**|~) literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..193ab5856fa7abe63fb6461c2f3b20df198251f7 GIT binary patch literal 13350 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 SYu;bmW;izTDT68H*Z%;*I+W-D literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..552c4adf727d02b79ac98e4f673f6fe189374a93 GIT binary patch literal 11715 zcmd5?U2GdycAnvnL{XHeUrTWuXCgbc=*X1qM9GG+cjL&i<207twVYyEB-DsA6vrkx z%*@cTSZ`owQ@|+}h=V@ZL9&SR6sK9BNsD3&G$;}j=r4*=l@~Htr!boBL*BTSix%la z`<;8|&XAIvWOw_}v32M2{+xU6Ip?0gJO9wt6_xOO@)v6U^r$3#K|jP3<`sGM4k}lq zQ<5fWazQG}X<4Rvpb$t0*gKdG;vFo6is5va^@R#;#rAYN>S3*|5Gi(~J7h@@o*odu z{kPSIx$T8uu`}H%O9APKq(xqnv<^M|VUUkX$Mo3g&HfBgOLuEgJ+5``M+0ChqTPR^ zb;SQAYI>g@%LVSkPx?#uvo&K_v+KhEACn$f3?#b0q#p^n-l>*KrlUHBS+b|`J2X|Q z6!Gqz*BwpIsg;7`7)9NzIA79y>Y3rcPhyrnWm%?$#_(aIq!zM#1zyVTYqbZJE0Qjy zWlaK6<#Z4T1nXUynID{(${dp6NuW9?4`%YEjQ*>d{Q5Xlj)L)nl2= z%N4cY_Jketj9&UcTBRkvs*LB&qCTz`^mF6K7Ef5_X+7)M<5MS3?4C9?o!5>YI-L2w zIcGZKPQ@`TLoJLay;{MT8!s<9d9(Cra__!z+i>*VWi@+7oyY8oRY3ov;}yp!jJvc* zmKQA&E>?7-Vt1f;O=`4BUGa-kRv1KriF5@XvnLd z0E|yL2q|c%htgp!ptos35)Cb+<6kb=AvOQg;#&B%aJpUV(b`@Mr6YPI-JwUdUakGL z(1(~sPr6f&X?+k!zoiQ;{aQy;OSd+lMFAnM4Qicu_uw7FyI1eiHfdc=Bm2=Zq;)s7 z3@nBc!}WGoTGShzlH}HvtXaw#^A(GUT{0R~@VI@pl2uE}oUTCljFPS?s;#K>gCtSO znHGMPO|y{Vvyw>w)AZeQ1v7gll~Ontc^^SFie=Ms6qkp7yUR!AfappRdy_5_qd>3( zAv&-xxo1qVbX7a>L~>8UpPqM|a?{)sK3V>h`!?F86`d9(QhJO;@i=W7KCEZe77Wk}2L|LLIuVCy>q5&N7Rv*;~eO^kUgbDo0Dy?m^Pe>LtL)tBwLi zna4>JGXyOOL6z@EQ7x=l*0V;=(6upzolHW|1NSW^5wdn3ClqLk;bK2(xm*BbS3MBn z4sk8O#DN&+cBP!fGWN`fOavQKas^Yx3nZ^dzZKNq7Ci|jX0*1EprY>Xi=FZxbp@4Du`YWH$hw45EP~Ez<_z3`$_pg_vGi% zN=7hgTJz&sULVgH1%3SSJ&(>krcFHg=o1s)8Gjzu(u1oYlccc2@O9kvK(%t&qwD_*?zV7|G3VYag!P8=si$0> zPG=lubWzEvS@>w&NT|6SEHNVvJK}2(DG8Hn-ie5o?o_O%Ls?RuotZh|srDvqau^d` zb33M-V1mEXRt`;{q`_u^j<04yK?6g@oYNOM3f%Yg6`#iwlj%}%yp-eMCRDGx5vEhg zu@So=WrcN^6Tp>?QOXu7nlF8MV?M7;o;amImqER$Lej5uyYbl3q^(+mm%ICv)dr0hA#UG-tZ z5<$@vb=9sw`4b-01CZLC8YML+7%^@RJ`VA8(>QTZmC?je;iL zQ>RBr!GC7D$dPhn{V1vlD1;0hD}b1o>eRGerOGjn779~{8GZr z<|b2Da)t$nbBoY(IEQS8Fpi8$NpAOH`e~Y4SWp*j4;l^6sy58Lk@KyG?SPU+qB>|y zfWcA=r^CoOq_bSpG=>Q->K;5;uzh>P0IrM~AuVGbKI#|&A{@;MWUQHhOh-BD8J}u4 ztqEBz8l{Ru?urQpa>{a*FXA{ikg3PrfKEg<)7cOYI9N&bpd`tw@1Sx;Ixn4e!^EaB z(s=}lB3eB!WxNsh7#-9CO{3i?SGpH$SqnCe1}^;3Fh1j9x+o<=)Ae@O2-QO*(RDo0g?x zX!X$~1i)l2Gns174A(YE(Nd(*&!V^>HDc0z53CF)mxhzq7yi6sdH9)2p&xhM9K3I3 z@R6m#N3I|GXvgy4lW2?jZBrjTu{`(`Ya82hDfIKm{VY(;dISdK2>uv@E}(Kna=gCt z(uZ#Sv`1nLai6yln}R(a0Y$qcy&cd3=xOs?L=8Pb^w5fH9`uBM5;-X)!qe3bFBq$~ zyH0yGf&)vuIPjI606#+H09r8su^ymeD;30m4`fTh%O=Eq>RNi)YNal3IY&dkhvI^C zt8dd~=MQ(S^gX=P_i(Lu$2H@l(9gO)?y8MH{b~E(hW;t~chOH@shxVU_R`$SOZlaj z^0gPw)Xo%Y@nS7fTu)RY7$fQ~R7mO_y!lf>4#DxHPz2{EF$UY0rxO9I9|JAQS0T;P z?jH2!9SynWD&snlLME#Z3h}wefL8$1CMmoi-QKbL#@>TVI}YB6E6eebT4egu1r&TI z9(EY&iN`L`6g!bGM$XGEy9u0^PfGrd(CZ0>ICoa3(+*hd!P#}i>Q%Wzawv_$p7XM3 zmyy~yFKcaQa8|6orkU;M18>V3)<@a#ldu?1a0rKOlEdO7PET08G$EF|}z7_d%lq3YM9w-7=)h&|+gJkJgtSF2y z#U_r(uEN=%UvMX0SJJ~j(F*5sHgM;)bDA@h$u2Gor~MF^U#b_*zM zhEfe9nzWVb&M^h7r>%Yce2Y{_wf7*8FemrY z*^^APF_lw~8n#h_{VHYkdWiO0kNOO$hZ(`@9Wzk9JP91E2eSpc9%dV?he+sbQXSv` zGi=rt+QNN8DXp`iucF)jM-(t_o1|Fpr2|)|Zah4(v}NLE|L~>ff6+O3S$}8dM(4<_ zzAcS_+&i`!4EA?7q+nNfBhuC}d@I&_`QaZw-{|h_7`_=FxGMia_47^2oi-`C?@uNg z;lN;OH5eM|Ye=EqzD7{$+1wbGdIm4W{_E~esdw``sakx;9Vyf?{CVG&e@pECqe>$v z_dd?oXp;tp8|}fa;YJVx{`>A`spr0LH})%g6L$1L=fSx2XF~@kq|f5p4(e0L4kg=il~R_1oArv-1;7>7#&jbULXVqf;yAFpM2qG~kw#6;x}j)GIyt$5Op-|p{7w3Hp!asFr$>Z$gl%k z?Q<7Q`fWd@@pOZ6LAtv|>KVFvia6YD)2@=KW5rcr4TTWKRVabp*8WA_k3 z56JW|p&usuDTF?2LPRM|*JROLig_dxlticu@6a(2ys(rdG7At5%9>LmoT*=3MbcaZ zktJm7NKA8ZoAT?R2^lpNy~LtmHkTqaiU~-_$KBD{b+(YzKIZ%fHm&0^)QIp>^g?C1z=w75;DMkenNvDL;?0gLk?Ya-u>ZQ zKm6#ipQS!deLC|u>Ce(P;wNg66YGV6*u{jQiV6$v@Lu~|?DU;Ogn6Fx=eSq0(uT2u zaEuY8c>p0cUfr*duvGu*Br%{xJg~RynKACnXcb(i;G#j~BA~QzdMPLFYf0gRhy$&k z%j#uzO)74Qu!eg93T=>67R`zWMR1PZr&^|TIa4?ecNi=k1h92*J9JRwvN18daJa&HF+s?BXa-Ec>hX#WQn4O zk*|>r3sCPR8y9{<+1N-Pst5v@0*OP^jtHwpR8sVUS|&3AKPStRJXv=4WGX4#JLOZe zEi{>JwjM%VPq`o%Jj%cF>jIyPLUA)~>uHn!OX0#ry#j$|NoqGoP1yKyR@zC9DJ6`! zsQJiMQCnzAp z_rn|-DlW0y8>;mydsc6fU#|-gzCeo8(tL~OI#xo2*7{N+#PZG-Y#-%*xb36lNj-?< zYdXFF2>Tcc=)wWW=NqZlQ?FzT1>g!8Gqxz>j!F` z%C$r9AA9fEjfttH?NijBdNWmvJ@AWo-{r?>?6vLh?|N_7a(s6!vU|OT^inIg!R32t z$csPPSWFyGj4QJBGRDvWSo2)eH*Rm4dlF;3WQh;p0*UnoFd^1n%0`nNeB;3%j26|V zH(I-ze!5j*+euSzyoxvk;>`}|dO*^}CpTWVWrsVPG2VFmH{;oYNqjvj_t=N)?J#@v zdtliSC|>`R`PUi#HUHX!i@*ly4;w+28hR|tqM;i#o%U->p}+bq8s zne%Tu_`Ofl#yyqw0_CE}mm_t%F{6ZjT(88|>8M}L{(~ADIwT$mXk~FBwFr@7)}DMB zI5&(9U3RlScQU@~=Ft6D zs&7_nJrCXL-*oxqceY*C-aY-+>FbZJJaTC1kweRm9A4Ubn5X5JH=kVYpQ*)WZeqRk z>*-q8w(Frkj(!lmk$P@v^f@;F>h^bcy|wF_v$FH)rJYYN?|f!y^E1o+leO67?f#*a z{_&;$aisgBA4iw_pQ^>4VyaqDiqbhe*kUynb5pI}#$CdCh-@W7??coW#1$Uw5k=q@ z8&9oY#h5dwoM&IBAl)uDT!&J~fHf7y(5!a>Jc{%U$ma4wn-}J%TPvLo*<;nu-(z61WN_}zVyq$v>c8!<^s}= z$1fbe{Ni$Gq7jjl?KdCVdvj~D(a{m!dpo|R5yl%b)AwMbooW#YZPeF@O407sPSjR6 z$>EYrJwq3c+z$8N3CQ8&@@i0O>q9mXRZMR~>(1~XHTE{B*7&~68oR>C1hPh|ZHZ$eZ xSeEwR?%8xD{$~7I+xxNiV%JZ7bgZ`f;F9vpQqSatuK#SS2Ic*CBq|xP{ui!hEcyTd literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8dadeffcaec2e373a75ec22444863023f5ed7345 GIT binary patch literal 16252 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 J9N$~`{{Uuc(vAQC literal 0 HcmV?d00001 diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae9e7e72303a8aa1b9b66bd2a094c35d7bb5ecc7 GIT binary patch literal 2020 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 bool: # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + :param conn: :class:`urllib3.connection.HTTPConnection` object. + """ + return not conn.is_connected + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection( + address: tuple[str, int], + timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, + source_address: tuple[str, int] | None = None, + socket_options: _TYPE_SOCKET_OPTIONS | None = None, +) -> socket.socket: + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`socket.getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith("["): + host = host.strip("[]") + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + try: + host.encode("idna") + except UnicodeError: + raise LocationParseError(f"'{host}', label empty or too long") from None + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not _DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + # Break explicitly a reference cycle + err = None + return sock + + except OSError as _: + err = _ + if sock is not None: + sock.close() + + if err is not None: + try: + raise err + finally: + # Break explicitly a reference cycle + err = None + else: + raise OSError("getaddrinfo returns an empty list") + + +def _set_socket_options( + sock: socket.socket, options: _TYPE_SOCKET_OPTIONS | None +) -> None: + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family() -> socket.AddressFamily: + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host: str) -> bool: + """Returns True if the system can bind an IPv6 address.""" + sock = None + has_ipv6 = False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/urllib3/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6("::1") diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/proxy.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/proxy.py new file mode 100644 index 000000000..908fc6621 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/proxy.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +import typing + +from .url import Url + +if typing.TYPE_CHECKING: + from ..connection import ProxyConfig + + +def connection_requires_http_tunnel( + proxy_url: Url | None = None, + proxy_config: ProxyConfig | None = None, + destination_scheme: str | None = None, +) -> bool: + """ + Returns True if the connection requires an HTTP CONNECT through the proxy. + + :param URL proxy_url: + URL of the proxy. + :param ProxyConfig proxy_config: + Proxy configuration from poolmanager.py + :param str destination_scheme: + The scheme of the destination. (i.e https, http, etc) + """ + # If we're not using a proxy, no way to use a tunnel. + if proxy_url is None: + return False + + # HTTP destinations never require tunneling, we always forward. + if destination_scheme == "http": + return False + + # Support for forwarding with HTTPS proxies and HTTPS destinations. + if ( + proxy_url.scheme == "https" + and proxy_config + and proxy_config.use_forwarding_for_https + ): + return False + + # Otherwise always use a tunnel. + return True diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/request.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/request.py new file mode 100644 index 000000000..23605c522 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/request.py @@ -0,0 +1,266 @@ +from __future__ import annotations + +import io +import typing +from base64 import b64encode +from enum import Enum + +from ..exceptions import UnrewindableBodyError +from .util import to_bytes + +if typing.TYPE_CHECKING: + from typing import Final + +# Pass as a value within ``headers`` to skip +# emitting some HTTP headers that are added automatically. +# The only headers that are supported are ``Accept-Encoding``, +# ``Host``, and ``User-Agent``. +SKIP_HEADER = "@@@SKIP_HEADER@@@" +SKIPPABLE_HEADERS = frozenset(["accept-encoding", "host", "user-agent"]) + +ACCEPT_ENCODING = "gzip,deflate" +try: + try: + import brotlicffi as _unused_module_brotli # type: ignore[import-not-found] # noqa: F401 + except ImportError: + import brotli as _unused_module_brotli # type: ignore[import-not-found] # noqa: F401 +except ImportError: + pass +else: + ACCEPT_ENCODING += ",br" + +try: + from compression import ( # type: ignore[import-not-found] # noqa: F401 + zstd as _unused_module_zstd, + ) + + ACCEPT_ENCODING += ",zstd" +except ImportError: + try: + import zstandard as _unused_module_zstd # noqa: F401 + + ACCEPT_ENCODING += ",zstd" + except ImportError: + pass + + +class _TYPE_FAILEDTELL(Enum): + token = 0 + + +_FAILEDTELL: Final[_TYPE_FAILEDTELL] = _TYPE_FAILEDTELL.token + +_TYPE_BODY_POSITION = typing.Union[int, _TYPE_FAILEDTELL] + +# When sending a request with these methods we aren't expecting +# a body so don't need to set an explicit 'Content-Length: 0' +# The reason we do this in the negative instead of tracking methods +# which 'should' have a body is because unknown methods should be +# treated as if they were 'POST' which *does* expect a body. +_METHODS_NOT_EXPECTING_BODY = {"GET", "HEAD", "DELETE", "TRACE", "OPTIONS", "CONNECT"} + + +def make_headers( + keep_alive: bool | None = None, + accept_encoding: bool | list[str] | str | None = None, + user_agent: str | None = None, + basic_auth: str | None = None, + proxy_basic_auth: str | None = None, + disable_cache: bool | None = None, +) -> dict[str, str]: + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. If the dependencies for + Brotli (either the ``brotli`` or ``brotlicffi`` package) and/or Zstandard + (the ``zstandard`` package) algorithms are installed, then their encodings are + included in the string ('br' and 'zstd', respectively). + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example: + + .. code-block:: python + + import urllib3 + + print(urllib3.util.make_headers(keep_alive=True, user_agent="Batman/1.0")) + # {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + print(urllib3.util.make_headers(accept_encoding=True)) + # {'accept-encoding': 'gzip,deflate'} + """ + headers: dict[str, str] = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ",".join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers["accept-encoding"] = accept_encoding + + if user_agent: + headers["user-agent"] = user_agent + + if keep_alive: + headers["connection"] = "keep-alive" + + if basic_auth: + headers["authorization"] = ( + f"Basic {b64encode(basic_auth.encode('latin-1')).decode()}" + ) + + if proxy_basic_auth: + headers["proxy-authorization"] = ( + f"Basic {b64encode(proxy_basic_auth.encode('latin-1')).decode()}" + ) + + if disable_cache: + headers["cache-control"] = "no-cache" + + return headers + + +def set_file_position( + body: typing.Any, pos: _TYPE_BODY_POSITION | None +) -> _TYPE_BODY_POSITION | None: + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, "tell", None) is not None: + try: + pos = body.tell() + except OSError: + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body: typing.IO[typing.AnyStr], body_pos: _TYPE_BODY_POSITION) -> None: + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, "seek", None) + if body_seek is not None and isinstance(body_pos, int): + try: + body_seek(body_pos) + except OSError as e: + raise UnrewindableBodyError( + "An error occurred when rewinding request body for redirect/retry." + ) from e + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError( + "Unable to record file position for rewinding " + "request body during a redirect/retry." + ) + else: + raise ValueError( + f"body_pos must be of type integer, instead it was {type(body_pos)}." + ) + + +class ChunksAndContentLength(typing.NamedTuple): + chunks: typing.Iterable[bytes] | None + content_length: int | None + + +def body_to_chunks( + body: typing.Any | None, method: str, blocksize: int +) -> ChunksAndContentLength: + """Takes the HTTP request method, body, and blocksize and + transforms them into an iterable of chunks to pass to + socket.sendall() and an optional 'Content-Length' header. + + A 'Content-Length' of 'None' indicates the length of the body + can't be determined so should use 'Transfer-Encoding: chunked' + for framing instead. + """ + + chunks: typing.Iterable[bytes] | None + content_length: int | None + + # No body, we need to make a recommendation on 'Content-Length' + # based on whether that request method is expected to have + # a body or not. + if body is None: + chunks = None + if method.upper() not in _METHODS_NOT_EXPECTING_BODY: + content_length = 0 + else: + content_length = None + + # Bytes or strings become bytes + elif isinstance(body, (str, bytes)): + chunks = (to_bytes(body),) + content_length = len(chunks[0]) + + # File-like object, TODO: use seek() and tell() for length? + elif hasattr(body, "read"): + + def chunk_readable() -> typing.Iterable[bytes]: + nonlocal body, blocksize + encode = isinstance(body, io.TextIOBase) + while True: + datablock = body.read(blocksize) + if not datablock: + break + if encode: + datablock = datablock.encode("utf-8") + yield datablock + + chunks = chunk_readable() + content_length = None + + # Otherwise we need to start checking via duck-typing. + else: + try: + # Check if the body implements the buffer API. + mv = memoryview(body) + except TypeError: + try: + # Check if the body is an iterable + chunks = iter(body) + content_length = None + except TypeError: + raise TypeError( + f"'body' must be a bytes-like object, file-like " + f"object, or iterable. Instead was {body!r}" + ) from None + else: + # Since it implements the buffer API can be passed directly to socket.sendall() + chunks = (body,) + content_length = mv.nbytes + + return ChunksAndContentLength(chunks=chunks, content_length=content_length) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/response.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/response.py new file mode 100644 index 000000000..0f4578696 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/response.py @@ -0,0 +1,101 @@ +from __future__ import annotations + +import http.client as httplib +from email.errors import MultipartInvariantViolationDefect, StartBoundaryNotFoundDefect + +from ..exceptions import HeaderParsingError + + +def is_fp_closed(obj: object) -> bool: + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() # type: ignore[no-any-return, attr-defined] + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed # type: ignore[no-any-return, attr-defined] + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None # type: ignore[attr-defined] + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers: httplib.HTTPMessage) -> None: + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param http.client.HTTPMessage headers: Headers to verify. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError(f"expected httplib.Message, got {type(headers)}.") + + unparsed_data = None + + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = headers.get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = payload + + # httplib is assuming a response body is available + # when parsing headers even when httplib only sends + # header data to parse_headers() This results in + # defects on multipart responses in particular. + # See: https://github.com/urllib3/urllib3/issues/800 + + # So we ignore the following defects: + # - StartBoundaryNotFoundDefect: + # The claimed start boundary was never found. + # - MultipartInvariantViolationDefect: + # A message claimed to be a multipart but no subparts were found. + defects = [ + defect + for defect in headers.defects + if not isinstance( + defect, (StartBoundaryNotFoundDefect, MultipartInvariantViolationDefect) + ) + ] + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response: httplib.HTTPResponse) -> bool: + """ + Checks whether the request of a response has been a HEAD-request. + + :param http.client.HTTPResponse response: + Response to check if the originating request + used 'HEAD' as a method. + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method_str = response._method # type: str # type: ignore[attr-defined] + return method_str.upper() == "HEAD" diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/retry.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/retry.py new file mode 100644 index 000000000..0456cceba --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/retry.py @@ -0,0 +1,533 @@ +from __future__ import annotations + +import email +import logging +import random +import re +import time +import typing +from itertools import takewhile +from types import TracebackType + +from ..exceptions import ( + ConnectTimeoutError, + InvalidHeader, + MaxRetryError, + ProtocolError, + ProxyError, + ReadTimeoutError, + ResponseError, +) +from .util import reraise + +if typing.TYPE_CHECKING: + from typing_extensions import Self + + from ..connectionpool import ConnectionPool + from ..response import BaseHTTPResponse + +log = logging.getLogger(__name__) + + +# Data structure for representing the metadata of requests that result in a retry. +class RequestHistory(typing.NamedTuple): + method: str | None + url: str | None + error: Exception | None + status: int | None + redirect_location: str | None + + +class Retry: + """Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool: + + .. code-block:: python + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request("GET", "https://example.com/") + + Or per-request (which overrides the default for the pool): + + .. code-block:: python + + response = http.request("GET", "https://example.com/", retries=Retry(10)) + + Retries can be disabled by passing ``False``: + + .. code-block:: python + + response = http.request("GET", "https://example.com/", retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + + :param int other: + How many times to retry on other errors. + + Other errors are errors that are not connect, read, redirect or status errors. + These errors might be raised after the request was sent to the server, so the + request might have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + If ``total`` is not set, it's a good idea to set this to 0 to account + for unexpected edge cases and avoid infinite retry loops. + + :param Collection allowed_methods: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_ALLOWED_METHODS`. + + Set to a ``None`` value to retry on any verb. + + :param Collection status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``allowed_methods`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ** ({number of previous retries})) + + seconds. If `backoff_jitter` is non-zero, this sleep is extended by:: + + random.uniform(0, {backoff jitter}) + + seconds. For example, if the backoff_factor is 0.1, then :func:`Retry.sleep` will + sleep for [0.0s, 0.2s, 0.4s, 0.8s, ...] between retries. No backoff will ever + be longer than `backoff_max`. + + By default, backoff is disabled (factor set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + + :param tuple history: The history of the request encountered during + each call to :meth:`~Retry.increment`. The list is in the order + the requests occurred. Each list item is of class :class:`RequestHistory`. + + :param bool respect_retry_after_header: + Whether to respect Retry-After header on status codes defined as + :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + + :param Collection remove_headers_on_redirect: + Sequence of headers to remove from the request when a response + indicating a redirect is returned before firing off the redirected + request. + """ + + #: Default methods to be used for ``allowed_methods`` + DEFAULT_ALLOWED_METHODS = frozenset( + ["HEAD", "GET", "PUT", "DELETE", "OPTIONS", "TRACE"] + ) + + #: Default status codes to be used for ``status_forcelist`` + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + #: Default headers to be used for ``remove_headers_on_redirect`` + DEFAULT_REMOVE_HEADERS_ON_REDIRECT = frozenset( + ["Cookie", "Authorization", "Proxy-Authorization"] + ) + + #: Default maximum backoff time. + DEFAULT_BACKOFF_MAX = 120 + + # Backward compatibility; assigned outside of the class. + DEFAULT: typing.ClassVar[Retry] + + def __init__( + self, + total: bool | int | None = 10, + connect: int | None = None, + read: int | None = None, + redirect: bool | int | None = None, + status: int | None = None, + other: int | None = None, + allowed_methods: typing.Collection[str] | None = DEFAULT_ALLOWED_METHODS, + status_forcelist: typing.Collection[int] | None = None, + backoff_factor: float = 0, + backoff_max: float = DEFAULT_BACKOFF_MAX, + raise_on_redirect: bool = True, + raise_on_status: bool = True, + history: tuple[RequestHistory, ...] | None = None, + respect_retry_after_header: bool = True, + remove_headers_on_redirect: typing.Collection[ + str + ] = DEFAULT_REMOVE_HEADERS_ON_REDIRECT, + backoff_jitter: float = 0.0, + ) -> None: + self.total = total + self.connect = connect + self.read = read + self.status = status + self.other = other + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.allowed_methods = allowed_methods + self.backoff_factor = backoff_factor + self.backoff_max = backoff_max + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self.history = history or () + self.respect_retry_after_header = respect_retry_after_header + self.remove_headers_on_redirect = frozenset( + h.lower() for h in remove_headers_on_redirect + ) + self.backoff_jitter = backoff_jitter + + def new(self, **kw: typing.Any) -> Self: + params = dict( + total=self.total, + connect=self.connect, + read=self.read, + redirect=self.redirect, + status=self.status, + other=self.other, + allowed_methods=self.allowed_methods, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + backoff_max=self.backoff_max, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + history=self.history, + remove_headers_on_redirect=self.remove_headers_on_redirect, + respect_retry_after_header=self.respect_retry_after_header, + backoff_jitter=self.backoff_jitter, + ) + + params.update(kw) + return type(self)(**params) # type: ignore[arg-type] + + @classmethod + def from_int( + cls, + retries: Retry | bool | int | None, + redirect: bool | int | None = True, + default: Retry | bool | int | None = None, + ) -> Retry: + """Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self) -> float: + """Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len( + list( + takewhile(lambda x: x.redirect_location is None, reversed(self.history)) + ) + ) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + if self.backoff_jitter != 0.0: + backoff_value += random.random() * self.backoff_jitter + return float(max(0, min(self.backoff_max, backoff_value))) + + def parse_retry_after(self, retry_after: str) -> float: + seconds: float + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate_tz(retry_after) + if retry_date_tuple is None: + raise InvalidHeader(f"Invalid Retry-After header: {retry_after}") + + retry_date = email.utils.mktime_tz(retry_date_tuple) + seconds = retry_date - time.time() + + seconds = max(seconds, 0) + + return seconds + + def get_retry_after(self, response: BaseHTTPResponse) -> float | None: + """Get the value of Retry-After in seconds.""" + + retry_after = response.headers.get("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response: BaseHTTPResponse) -> bool: + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self) -> None: + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response: BaseHTTPResponse | None = None) -> None: + """Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if self.respect_retry_after_header and response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err: Exception) -> bool: + """Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + if isinstance(err, ProxyError): + err = err.original_error + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err: Exception) -> bool: + """Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method: str) -> bool: + """Checks if a given HTTP method should be retried upon, depending if + it is included in the allowed_methods + """ + if self.allowed_methods and method.upper() not in self.allowed_methods: + return False + return True + + def is_retry( + self, method: str, status_code: int, has_retry_after: bool = False + ) -> bool: + """Is this method/status code retryable? (Based on allowlists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return bool( + self.total + and self.respect_retry_after_header + and has_retry_after + and (status_code in self.RETRY_AFTER_STATUS_CODES) + ) + + def is_exhausted(self) -> bool: + """Are we out of retries?""" + retry_counts = [ + x + for x in ( + self.total, + self.connect, + self.read, + self.redirect, + self.status, + self.other, + ) + if x + ] + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment( + self, + method: str | None = None, + url: str | None = None, + response: BaseHTTPResponse | None = None, + error: Exception | None = None, + _pool: ConnectionPool | None = None, + _stacktrace: TracebackType | None = None, + ) -> Self: + """Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.BaseHTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + other = self.other + cause = "unknown" + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or method is None or not self._is_method_retryable(method): + raise reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif error: + # Other retry? + if other is not None: + other -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = "too many redirects" + response_redirect_location = response.get_redirect_location() + if response_redirect_location: + redirect_location = response_redirect_location + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and the given method is in the allowed_methods + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status) + status = response.status + + history = self.history + ( + RequestHistory(method, url, error, status, redirect_location), + ) + + new_retry = self.new( + total=total, + connect=connect, + read=read, + redirect=redirect, + status=status_count, + other=other, + history=history, + ) + + if new_retry.is_exhausted(): + reason = error or ResponseError(cause) + raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self) -> str: + return ( + f"{type(self).__name__}(total={self.total}, connect={self.connect}, " + f"read={self.read}, redirect={self.redirect}, status={self.status})" + ) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssl_.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssl_.py new file mode 100644 index 000000000..b2cc1aa7b --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssl_.py @@ -0,0 +1,524 @@ +from __future__ import annotations + +import hashlib +import hmac +import os +import socket +import sys +import typing +import warnings +from binascii import unhexlify + +from ..exceptions import ProxySchemeUnsupported, SSLError +from .url import _BRACELESS_IPV6_ADDRZ_RE, _IPV4_RE + +SSLContext = None +SSLTransport = None +HAS_NEVER_CHECK_COMMON_NAME = False +IS_PYOPENSSL = False +ALPN_PROTOCOLS = ["http/1.1"] + +_TYPE_VERSION_INFO = tuple[int, int, int, str, int] + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + length: getattr(hashlib, algorithm, None) + for length, algorithm in ((32, "md5"), (40, "sha1"), (64, "sha256")) +} + + +def _is_bpo_43522_fixed( + implementation_name: str, + version_info: _TYPE_VERSION_INFO, + pypy_version_info: _TYPE_VERSION_INFO | None, +) -> bool: + """Return True for CPython 3.9.3+ or 3.10+ and PyPy 7.3.8+ where + setting SSLContext.hostname_checks_common_name to False works. + + Outside of CPython and PyPy we don't know which implementations work + or not so we conservatively use our hostname matching as we know that works + on all implementations. + + https://github.com/urllib3/urllib3/issues/2192#issuecomment-821832963 + https://foss.heptapod.net/pypy/pypy/-/issues/3539 + """ + if implementation_name == "pypy": + # https://foss.heptapod.net/pypy/pypy/-/issues/3129 + return pypy_version_info >= (7, 3, 8) # type: ignore[operator] + elif implementation_name == "cpython": + major_minor = version_info[:2] + micro = version_info[2] + return (major_minor == (3, 9) and micro >= 3) or major_minor >= (3, 10) + else: # Defensive: + return False + + +def _is_has_never_check_common_name_reliable( + openssl_version: str, + openssl_version_number: int, + implementation_name: str, + version_info: _TYPE_VERSION_INFO, + pypy_version_info: _TYPE_VERSION_INFO | None, +) -> bool: + # As of May 2023, all released versions of LibreSSL fail to reject certificates with + # only common names, see https://github.com/urllib3/urllib3/pull/3024 + is_openssl = openssl_version.startswith("OpenSSL ") + # Before fixing OpenSSL issue #14579, the SSL_new() API was not copying hostflags + # like X509_CHECK_FLAG_NEVER_CHECK_SUBJECT, which tripped up CPython. + # https://github.com/openssl/openssl/issues/14579 + # This was released in OpenSSL 1.1.1l+ (>=0x101010cf) + is_openssl_issue_14579_fixed = openssl_version_number >= 0x101010CF + + return is_openssl and ( + is_openssl_issue_14579_fixed + or _is_bpo_43522_fixed(implementation_name, version_info, pypy_version_info) + ) + + +if typing.TYPE_CHECKING: + from ssl import VerifyMode + from typing import TypedDict + + from .ssltransport import SSLTransport as SSLTransportType + + class _TYPE_PEER_CERT_RET_DICT(TypedDict, total=False): + subjectAltName: tuple[tuple[str, str], ...] + subject: tuple[tuple[tuple[str, str], ...], ...] + serialNumber: str + + +# Mapping from 'ssl.PROTOCOL_TLSX' to 'TLSVersion.X' +_SSL_VERSION_TO_TLS_VERSION: dict[int, int] = {} + +try: # Do we have ssl at all? + import ssl + from ssl import ( # type: ignore[assignment] + CERT_REQUIRED, + HAS_NEVER_CHECK_COMMON_NAME, + OP_NO_COMPRESSION, + OP_NO_TICKET, + OPENSSL_VERSION, + OPENSSL_VERSION_NUMBER, + PROTOCOL_TLS, + PROTOCOL_TLS_CLIENT, + VERIFY_X509_STRICT, + OP_NO_SSLv2, + OP_NO_SSLv3, + SSLContext, + TLSVersion, + ) + + PROTOCOL_SSLv23 = PROTOCOL_TLS + + # Needed for Python 3.9 which does not define this + VERIFY_X509_PARTIAL_CHAIN = getattr(ssl, "VERIFY_X509_PARTIAL_CHAIN", 0x80000) + + # Setting SSLContext.hostname_checks_common_name = False didn't work before CPython + # 3.9.3, and 3.10 (but OK on PyPy) or OpenSSL 1.1.1l+ + if HAS_NEVER_CHECK_COMMON_NAME and not _is_has_never_check_common_name_reliable( + OPENSSL_VERSION, + OPENSSL_VERSION_NUMBER, + sys.implementation.name, + sys.version_info, + sys.pypy_version_info if sys.implementation.name == "pypy" else None, # type: ignore[attr-defined] + ): # Defensive: for Python < 3.9.3 + HAS_NEVER_CHECK_COMMON_NAME = False + + # Need to be careful here in case old TLS versions get + # removed in future 'ssl' module implementations. + for attr in ("TLSv1", "TLSv1_1", "TLSv1_2"): + try: + _SSL_VERSION_TO_TLS_VERSION[getattr(ssl, f"PROTOCOL_{attr}")] = getattr( + TLSVersion, attr + ) + except AttributeError: # Defensive: + continue + + from .ssltransport import SSLTransport # type: ignore[assignment] +except ImportError: + OP_NO_COMPRESSION = 0x20000 # type: ignore[assignment] + OP_NO_TICKET = 0x4000 # type: ignore[assignment] + OP_NO_SSLv2 = 0x1000000 # type: ignore[assignment] + OP_NO_SSLv3 = 0x2000000 # type: ignore[assignment] + PROTOCOL_SSLv23 = PROTOCOL_TLS = 2 # type: ignore[assignment] + PROTOCOL_TLS_CLIENT = 16 # type: ignore[assignment] + VERIFY_X509_PARTIAL_CHAIN = 0x80000 + VERIFY_X509_STRICT = 0x20 # type: ignore[assignment] + + +_TYPE_PEER_CERT_RET = typing.Union["_TYPE_PEER_CERT_RET_DICT", bytes, None] + + +def assert_fingerprint(cert: bytes | None, fingerprint: str) -> None: + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + if cert is None: + raise SSLError("No certificate for the peer.") + + fingerprint = fingerprint.replace(":", "").lower() + digest_length = len(fingerprint) + if digest_length not in HASHFUNC_MAP: + raise SSLError(f"Fingerprint of invalid length: {fingerprint}") + hashfunc = HASHFUNC_MAP.get(digest_length) + if hashfunc is None: + raise SSLError( + f"Hash function implementation unavailable for fingerprint length: {digest_length}" + ) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not hmac.compare_digest(cert_digest, fingerprint_bytes): + raise SSLError( + f'Fingerprints did not match. Expected "{fingerprint}", got "{cert_digest.hex()}"' + ) + + +def resolve_cert_reqs(candidate: None | int | str) -> VerifyMode: + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_REQUIRED`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbreviation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_REQUIRED + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, "CERT_" + candidate) + return res # type: ignore[no-any-return] + + return candidate # type: ignore[return-value] + + +def resolve_ssl_version(candidate: None | int | str) -> int: + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_TLS + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, "PROTOCOL_" + candidate) + return typing.cast(int, res) + + return candidate + + +def create_urllib3_context( + ssl_version: int | None = None, + cert_reqs: int | None = None, + options: int | None = None, + ciphers: str | None = None, + ssl_minimum_version: int | None = None, + ssl_maximum_version: int | None = None, + verify_flags: int | None = None, +) -> ssl.SSLContext: + """Creates and configures an :class:`ssl.SSLContext` instance for use with urllib3. + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + + This parameter is deprecated instead use 'ssl_minimum_version'. + :param ssl_minimum_version: + The minimum version of TLS to be used. Use the 'ssl.TLSVersion' enum for specifying the value. + :param ssl_maximum_version: + The maximum version of TLS to be used. Use the 'ssl.TLSVersion' enum for specifying the value. + Not recommended to set to anything other than 'ssl.TLSVersion.MAXIMUM_SUPPORTED' which is the + default value. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``, and ``ssl.OP_NO_TICKET``. + :param ciphers: + Which cipher suites to allow the server to select. Defaults to either system configured + ciphers if OpenSSL 1.1.1+, otherwise uses a secure default set of ciphers. + :param verify_flags: + The flags for certificate verification operations. These default to + ``ssl.VERIFY_X509_PARTIAL_CHAIN`` and ``ssl.VERIFY_X509_STRICT`` for Python 3.13+. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + if SSLContext is None: + raise TypeError("Can't create an SSLContext object without an ssl module") + + # This means 'ssl_version' was specified as an exact value. + if ssl_version not in (None, PROTOCOL_TLS, PROTOCOL_TLS_CLIENT): + # Disallow setting 'ssl_version' and 'ssl_minimum|maximum_version' + # to avoid conflicts. + if ssl_minimum_version is not None or ssl_maximum_version is not None: + raise ValueError( + "Can't specify both 'ssl_version' and either " + "'ssl_minimum_version' or 'ssl_maximum_version'" + ) + + # 'ssl_version' is deprecated and will be removed in the future. + else: + # Use 'ssl_minimum_version' and 'ssl_maximum_version' instead. + ssl_minimum_version = _SSL_VERSION_TO_TLS_VERSION.get( + ssl_version, TLSVersion.MINIMUM_SUPPORTED + ) + ssl_maximum_version = _SSL_VERSION_TO_TLS_VERSION.get( + ssl_version, TLSVersion.MAXIMUM_SUPPORTED + ) + + # This warning message is pushing users to use 'ssl_minimum_version' + # instead of both min/max. Best practice is to only set the minimum version and + # keep the maximum version to be it's default value: 'TLSVersion.MAXIMUM_SUPPORTED' + warnings.warn( + "'ssl_version' option is deprecated and will be " + "removed in urllib3 v2.6.0. Instead use 'ssl_minimum_version'", + category=DeprecationWarning, + stacklevel=2, + ) + + # PROTOCOL_TLS is deprecated in Python 3.10 so we always use PROTOCOL_TLS_CLIENT + context = SSLContext(PROTOCOL_TLS_CLIENT) + + if ssl_minimum_version is not None: + context.minimum_version = ssl_minimum_version + else: # Python <3.10 defaults to 'MINIMUM_SUPPORTED' so explicitly set TLSv1.2 here + context.minimum_version = TLSVersion.TLSv1_2 + + if ssl_maximum_version is not None: + context.maximum_version = ssl_maximum_version + + # Unless we're given ciphers defer to either system ciphers in + # the case of OpenSSL 1.1.1+ or use our own secure default ciphers. + if ciphers: + context.set_ciphers(ciphers) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + # TLSv1.2 only. Unless set explicitly, do not request tickets. + # This may save some bandwidth on wire, and although the ticket is encrypted, + # there is a risk associated with it being on wire, + # if the server is not rotating its ticketing keys properly. + options |= OP_NO_TICKET + + context.options |= options + + if verify_flags is None: + verify_flags = 0 + # In Python 3.13+ ssl.create_default_context() sets VERIFY_X509_PARTIAL_CHAIN + # and VERIFY_X509_STRICT so we do the same + if sys.version_info >= (3, 13): + verify_flags |= VERIFY_X509_PARTIAL_CHAIN + verify_flags |= VERIFY_X509_STRICT + + context.verify_flags |= verify_flags + + # Enable post-handshake authentication for TLS 1.3, see GH #1634. PHA is + # necessary for conditional client cert authentication with TLS 1.3. + # The attribute is None for OpenSSL <= 1.1.0 or does not exist when using + # an SSLContext created by pyOpenSSL. + if getattr(context, "post_handshake_auth", None) is not None: + context.post_handshake_auth = True + + # The order of the below lines setting verify_mode and check_hostname + # matter due to safe-guards SSLContext has to prevent an SSLContext with + # check_hostname=True, verify_mode=NONE/OPTIONAL. + # We always set 'check_hostname=False' for pyOpenSSL so we rely on our own + # 'ssl.match_hostname()' implementation. + if cert_reqs == ssl.CERT_REQUIRED and not IS_PYOPENSSL: + context.verify_mode = cert_reqs + context.check_hostname = True + else: + context.check_hostname = False + context.verify_mode = cert_reqs + + try: + context.hostname_checks_common_name = False + except AttributeError: # Defensive: for CPython < 3.9.3; for PyPy < 7.3.8 + pass + + sslkeylogfile = os.environ.get("SSLKEYLOGFILE") + if sslkeylogfile: + context.keylog_filename = sslkeylogfile + + return context + + +@typing.overload +def ssl_wrap_socket( + sock: socket.socket, + keyfile: str | None = ..., + certfile: str | None = ..., + cert_reqs: int | None = ..., + ca_certs: str | None = ..., + server_hostname: str | None = ..., + ssl_version: int | None = ..., + ciphers: str | None = ..., + ssl_context: ssl.SSLContext | None = ..., + ca_cert_dir: str | None = ..., + key_password: str | None = ..., + ca_cert_data: None | str | bytes = ..., + tls_in_tls: typing.Literal[False] = ..., +) -> ssl.SSLSocket: ... + + +@typing.overload +def ssl_wrap_socket( + sock: socket.socket, + keyfile: str | None = ..., + certfile: str | None = ..., + cert_reqs: int | None = ..., + ca_certs: str | None = ..., + server_hostname: str | None = ..., + ssl_version: int | None = ..., + ciphers: str | None = ..., + ssl_context: ssl.SSLContext | None = ..., + ca_cert_dir: str | None = ..., + key_password: str | None = ..., + ca_cert_data: None | str | bytes = ..., + tls_in_tls: bool = ..., +) -> ssl.SSLSocket | SSLTransportType: ... + + +def ssl_wrap_socket( + sock: socket.socket, + keyfile: str | None = None, + certfile: str | None = None, + cert_reqs: int | None = None, + ca_certs: str | None = None, + server_hostname: str | None = None, + ssl_version: int | None = None, + ciphers: str | None = None, + ssl_context: ssl.SSLContext | None = None, + ca_cert_dir: str | None = None, + key_password: str | None = None, + ca_cert_data: None | str | bytes = None, + tls_in_tls: bool = False, +) -> ssl.SSLSocket | SSLTransportType: + """ + All arguments except for server_hostname, ssl_context, tls_in_tls, ca_cert_data and + ca_cert_dir have the same meaning as they do when using + :func:`ssl.create_default_context`, :meth:`ssl.SSLContext.load_cert_chain`, + :meth:`ssl.SSLContext.set_ciphers` and :meth:`ssl.SSLContext.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + :param key_password: + Optional password if the keyfile is encrypted. + :param ca_cert_data: + Optional string containing CA certificates in PEM format suitable for + passing as the cadata parameter to SSLContext.load_verify_locations() + :param tls_in_tls: + Use SSLTransport to wrap the existing socket. + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are only used in tests. + # We should consider deprecating and removing this code. + context = create_urllib3_context(ssl_version, cert_reqs, ciphers=ciphers) + + if ca_certs or ca_cert_dir or ca_cert_data: + try: + context.load_verify_locations(ca_certs, ca_cert_dir, ca_cert_data) + except OSError as e: + raise SSLError(e) from e + + elif ssl_context is None and hasattr(context, "load_default_certs"): + # try to load OS default certs; works well on Windows. + context.load_default_certs() + + # Attempt to detect if we get the goofy behavior of the + # keyfile being encrypted and OpenSSL asking for the + # passphrase via the terminal and instead error out. + if keyfile and key_password is None and _is_key_file_encrypted(keyfile): + raise SSLError("Client private key is encrypted, password is required") + + if certfile: + if key_password is None: + context.load_cert_chain(certfile, keyfile) + else: + context.load_cert_chain(certfile, keyfile, key_password) + + context.set_alpn_protocols(ALPN_PROTOCOLS) + + ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname) + return ssl_sock + + +def is_ipaddress(hostname: str | bytes) -> bool: + """Detects whether the hostname given is an IPv4 or IPv6 address. + Also detects IPv6 addresses with Zone IDs. + + :param str hostname: Hostname to examine. + :return: True if the hostname is an IP address, False otherwise. + """ + if isinstance(hostname, bytes): + # IDN A-label bytes are ASCII compatible. + hostname = hostname.decode("ascii") + return bool(_IPV4_RE.match(hostname) or _BRACELESS_IPV6_ADDRZ_RE.match(hostname)) + + +def _is_key_file_encrypted(key_file: str) -> bool: + """Detects if a key file is encrypted or not.""" + with open(key_file) as f: + for line in f: + # Look for Proc-Type: 4,ENCRYPTED + if "ENCRYPTED" in line: + return True + + return False + + +def _ssl_wrap_socket_impl( + sock: socket.socket, + ssl_context: ssl.SSLContext, + tls_in_tls: bool, + server_hostname: str | None = None, +) -> ssl.SSLSocket | SSLTransportType: + if tls_in_tls: + if not SSLTransport: + # Import error, ssl is not available. + raise ProxySchemeUnsupported( + "TLS in TLS requires support for the 'ssl' module" + ) + + SSLTransport._validate_ssl_context_for_tls_in_tls(ssl_context) + return SSLTransport(sock, ssl_context, server_hostname) + + return ssl_context.wrap_socket(sock, server_hostname=server_hostname) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssl_match_hostname.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssl_match_hostname.py new file mode 100644 index 000000000..25d910004 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssl_match_hostname.py @@ -0,0 +1,159 @@ +"""The match_hostname() function from Python 3.5, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html +# It is modified to remove commonName support. + +from __future__ import annotations + +import ipaddress +import re +import typing +from ipaddress import IPv4Address, IPv6Address + +if typing.TYPE_CHECKING: + from .ssl_ import _TYPE_PEER_CERT_RET_DICT + +__version__ = "3.5.0.1" + + +class CertificateError(ValueError): + pass + + +def _dnsname_match( + dn: typing.Any, hostname: str, max_wildcards: int = 1 +) -> typing.Match[str] | None | bool: + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r".") + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count("*") + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn) + ) + + # speed up common case w/o wildcards + if not wildcards: + return bool(dn.lower() == hostname.lower()) + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == "*": + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append("[^.]+") + elif leftmost.startswith("xn--") or hostname.startswith("xn--"): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r"\*", "[^.]*")) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r"\A" + r"\.".join(pats) + r"\Z", re.IGNORECASE) + return pat.match(hostname) + + +def _ipaddress_match(ipname: str, host_ip: IPv4Address | IPv6Address) -> bool: + """Exact matching of IP addresses. + + RFC 9110 section 4.3.5: "A reference identity of IP-ID contains the decoded + bytes of the IP address. An IP version 4 address is 4 octets, and an IP + version 6 address is 16 octets. [...] A reference identity of type IP-ID + matches if the address is identical to an iPAddress value of the + subjectAltName extension of the certificate." + """ + # OpenSSL may add a trailing newline to a subjectAltName's IP address + # Divergence from upstream: ipaddress can't handle byte str + ip = ipaddress.ip_address(ipname.rstrip()) + return bool(ip.packed == host_ip.packed) + + +def match_hostname( + cert: _TYPE_PEER_CERT_RET_DICT | None, + hostname: str, + hostname_checks_common_name: bool = False, +) -> None: + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError( + "empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED" + ) + try: + # Divergence from upstream: ipaddress can't handle byte str + # + # The ipaddress module shipped with Python < 3.9 does not support + # scoped IPv6 addresses so we unconditionally strip the Zone IDs for + # now. Once we drop support for Python 3.9 we can remove this branch. + if "%" in hostname: + host_ip = ipaddress.ip_address(hostname[: hostname.rfind("%")]) + else: + host_ip = ipaddress.ip_address(hostname) + + except ValueError: + # Not an IP address (common case) + host_ip = None + dnsnames = [] + san: tuple[tuple[str, str], ...] = cert.get("subjectAltName", ()) + key: str + value: str + for key, value in san: + if key == "DNS": + if host_ip is None and _dnsname_match(value, hostname): + return + dnsnames.append(value) + elif key == "IP Address": + if host_ip is not None and _ipaddress_match(value, host_ip): + return + dnsnames.append(value) + + # We only check 'commonName' if it's enabled and we're not verifying + # an IP address. IP addresses aren't valid within 'commonName'. + if hostname_checks_common_name and host_ip is None and not dnsnames: + for sub in cert.get("subject", ()): + for key, value in sub: + if key == "commonName": + if _dnsname_match(value, hostname): + return + dnsnames.append(value) # Defensive: for Python < 3.9.3 + + if len(dnsnames) > 1: + raise CertificateError( + "hostname %r " + "doesn't match either of %s" % (hostname, ", ".join(map(repr, dnsnames))) + ) + elif len(dnsnames) == 1: + raise CertificateError(f"hostname {hostname!r} doesn't match {dnsnames[0]!r}") + else: + raise CertificateError("no appropriate subjectAltName fields were found") diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssltransport.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssltransport.py new file mode 100644 index 000000000..6d59bc3bc --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/ssltransport.py @@ -0,0 +1,271 @@ +from __future__ import annotations + +import io +import socket +import ssl +import typing + +from ..exceptions import ProxySchemeUnsupported + +if typing.TYPE_CHECKING: + from typing_extensions import Self + + from .ssl_ import _TYPE_PEER_CERT_RET, _TYPE_PEER_CERT_RET_DICT + + +_WriteBuffer = typing.Union[bytearray, memoryview] +_ReturnValue = typing.TypeVar("_ReturnValue") + +SSL_BLOCKSIZE = 16384 + + +class SSLTransport: + """ + The SSLTransport wraps an existing socket and establishes an SSL connection. + + Contrary to Python's implementation of SSLSocket, it allows you to chain + multiple TLS connections together. It's particularly useful if you need to + implement TLS within TLS. + + The class supports most of the socket API operations. + """ + + @staticmethod + def _validate_ssl_context_for_tls_in_tls(ssl_context: ssl.SSLContext) -> None: + """ + Raises a ProxySchemeUnsupported if the provided ssl_context can't be used + for TLS in TLS. + + The only requirement is that the ssl_context provides the 'wrap_bio' + methods. + """ + + if not hasattr(ssl_context, "wrap_bio"): + raise ProxySchemeUnsupported( + "TLS in TLS requires SSLContext.wrap_bio() which isn't " + "available on non-native SSLContext" + ) + + def __init__( + self, + socket: socket.socket, + ssl_context: ssl.SSLContext, + server_hostname: str | None = None, + suppress_ragged_eofs: bool = True, + ) -> None: + """ + Create an SSLTransport around socket using the provided ssl_context. + """ + self.incoming = ssl.MemoryBIO() + self.outgoing = ssl.MemoryBIO() + + self.suppress_ragged_eofs = suppress_ragged_eofs + self.socket = socket + + self.sslobj = ssl_context.wrap_bio( + self.incoming, self.outgoing, server_hostname=server_hostname + ) + + # Perform initial handshake. + self._ssl_io_loop(self.sslobj.do_handshake) + + def __enter__(self) -> Self: + return self + + def __exit__(self, *_: typing.Any) -> None: + self.close() + + def fileno(self) -> int: + return self.socket.fileno() + + def read(self, len: int = 1024, buffer: typing.Any | None = None) -> int | bytes: + return self._wrap_ssl_read(len, buffer) + + def recv(self, buflen: int = 1024, flags: int = 0) -> int | bytes: + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to recv") + return self._wrap_ssl_read(buflen) + + def recv_into( + self, + buffer: _WriteBuffer, + nbytes: int | None = None, + flags: int = 0, + ) -> None | int | bytes: + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to recv_into") + if nbytes is None: + nbytes = len(buffer) + return self.read(nbytes, buffer) + + def sendall(self, data: bytes, flags: int = 0) -> None: + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to sendall") + count = 0 + with memoryview(data) as view, view.cast("B") as byte_view: + amount = len(byte_view) + while count < amount: + v = self.send(byte_view[count:]) + count += v + + def send(self, data: bytes, flags: int = 0) -> int: + if flags != 0: + raise ValueError("non-zero flags not allowed in calls to send") + return self._ssl_io_loop(self.sslobj.write, data) + + def makefile( + self, + mode: str, + buffering: int | None = None, + *, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, + ) -> typing.BinaryIO | typing.TextIO | socket.SocketIO: + """ + Python's httpclient uses makefile and buffered io when reading HTTP + messages and we need to support it. + + This is unfortunately a copy and paste of socket.py makefile with small + changes to point to the socket directly. + """ + if not set(mode) <= {"r", "w", "b"}: + raise ValueError(f"invalid mode {mode!r} (only r, w, b allowed)") + + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = socket.SocketIO(self, rawmode) # type: ignore[arg-type] + self.socket._io_refs += 1 # type: ignore[attr-defined] + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + buffer: typing.BinaryIO + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) # type: ignore[assignment] + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode # type: ignore[misc] + return text + + def unwrap(self) -> None: + self._ssl_io_loop(self.sslobj.unwrap) + + def close(self) -> None: + self.socket.close() + + @typing.overload + def getpeercert( + self, binary_form: typing.Literal[False] = ... + ) -> _TYPE_PEER_CERT_RET_DICT | None: ... + + @typing.overload + def getpeercert(self, binary_form: typing.Literal[True]) -> bytes | None: ... + + def getpeercert(self, binary_form: bool = False) -> _TYPE_PEER_CERT_RET: + return self.sslobj.getpeercert(binary_form) # type: ignore[return-value] + + def version(self) -> str | None: + return self.sslobj.version() + + def cipher(self) -> tuple[str, str, int] | None: + return self.sslobj.cipher() + + def selected_alpn_protocol(self) -> str | None: + return self.sslobj.selected_alpn_protocol() + + def shared_ciphers(self) -> list[tuple[str, str, int]] | None: + return self.sslobj.shared_ciphers() + + def compression(self) -> str | None: + return self.sslobj.compression() + + def settimeout(self, value: float | None) -> None: + self.socket.settimeout(value) + + def gettimeout(self) -> float | None: + return self.socket.gettimeout() + + def _decref_socketios(self) -> None: + self.socket._decref_socketios() # type: ignore[attr-defined] + + def _wrap_ssl_read(self, len: int, buffer: bytearray | None = None) -> int | bytes: + try: + return self._ssl_io_loop(self.sslobj.read, len, buffer) + except ssl.SSLError as e: + if e.errno == ssl.SSL_ERROR_EOF and self.suppress_ragged_eofs: + return 0 # eof, return 0. + else: + raise + + # func is sslobj.do_handshake or sslobj.unwrap + @typing.overload + def _ssl_io_loop(self, func: typing.Callable[[], None]) -> None: ... + + # func is sslobj.write, arg1 is data + @typing.overload + def _ssl_io_loop(self, func: typing.Callable[[bytes], int], arg1: bytes) -> int: ... + + # func is sslobj.read, arg1 is len, arg2 is buffer + @typing.overload + def _ssl_io_loop( + self, + func: typing.Callable[[int, bytearray | None], bytes], + arg1: int, + arg2: bytearray | None, + ) -> bytes: ... + + def _ssl_io_loop( + self, + func: typing.Callable[..., _ReturnValue], + arg1: None | bytes | int = None, + arg2: bytearray | None = None, + ) -> _ReturnValue: + """Performs an I/O loop between incoming/outgoing and the socket.""" + should_loop = True + ret = None + + while should_loop: + errno = None + try: + if arg1 is None and arg2 is None: + ret = func() + elif arg2 is None: + ret = func(arg1) + else: + ret = func(arg1, arg2) + except ssl.SSLError as e: + if e.errno not in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE): + # WANT_READ, and WANT_WRITE are expected, others are not. + raise e + errno = e.errno + + buf = self.outgoing.read() + self.socket.sendall(buf) + + if errno is None: + should_loop = False + elif errno == ssl.SSL_ERROR_WANT_READ: + buf = self.socket.recv(SSL_BLOCKSIZE) + if buf: + self.incoming.write(buf) + else: + self.incoming.write_eof() + return typing.cast(_ReturnValue, ret) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/timeout.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/timeout.py new file mode 100644 index 000000000..4bb1be11d --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/timeout.py @@ -0,0 +1,275 @@ +from __future__ import annotations + +import time +import typing +from enum import Enum +from socket import getdefaulttimeout + +from ..exceptions import TimeoutStateError + +if typing.TYPE_CHECKING: + from typing import Final + + +class _TYPE_DEFAULT(Enum): + # This value should never be passed to socket.settimeout() so for safety we use a -1. + # socket.settimout() raises a ValueError for negative values. + token = -1 + + +_DEFAULT_TIMEOUT: Final[_TYPE_DEFAULT] = _TYPE_DEFAULT.token + +_TYPE_TIMEOUT = typing.Optional[typing.Union[float, _TYPE_DEFAULT]] + + +class Timeout: + """Timeout configuration. + + Timeouts can be defined as a default for a pool: + + .. code-block:: python + + import urllib3 + + timeout = urllib3.util.Timeout(connect=2.0, read=7.0) + + http = urllib3.PoolManager(timeout=timeout) + + resp = http.request("GET", "https://example.com/") + + print(resp.status) + + Or per-request (which overrides the default for the pool): + + .. code-block:: python + + response = http.request("GET", "https://example.com/", timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``: + + .. code-block:: python + + no_timeout = Timeout(connect=None, read=None) + response = http.request("GET", "https://example.com/", timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: int, float, or None + + :param connect: + The maximum amount of time (in seconds) to wait for a connection + attempt to a server to succeed. Omitting the parameter will default the + connect timeout to the system default, probably `the global default + timeout in socket.py + `_. + None will set an infinite timeout for connection attempts. + + :type connect: int, float, or None + + :param read: + The maximum amount of time (in seconds) to wait between consecutive + read operations for a response from the server. Omitting the parameter + will default the read timeout to the system default, probably `the + global default timeout in socket.py + `_. + None will set an infinite timeout. + + :type read: int, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT + + def __init__( + self, + total: _TYPE_TIMEOUT = None, + connect: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, + read: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT, + ) -> None: + self._connect = self._validate_timeout(connect, "connect") + self._read = self._validate_timeout(read, "read") + self.total = self._validate_timeout(total, "total") + self._start_connect: float | None = None + + def __repr__(self) -> str: + return f"{type(self).__name__}(connect={self._connect!r}, read={self._read!r}, total={self.total!r})" + + # __str__ provided for backwards compatibility + __str__ = __repr__ + + @staticmethod + def resolve_default_timeout(timeout: _TYPE_TIMEOUT) -> float | None: + return getdefaulttimeout() if timeout is _DEFAULT_TIMEOUT else timeout + + @classmethod + def _validate_timeout(cls, value: _TYPE_TIMEOUT, name: str) -> _TYPE_TIMEOUT: + """Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is None or value is _DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError( + "Timeout cannot be a boolean value. It must " + "be an int, float or None." + ) + try: + float(value) + except (TypeError, ValueError): + raise ValueError( + "Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value) + ) from None + + try: + if value <= 0: + raise ValueError( + "Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value) + ) + except TypeError: + raise ValueError( + "Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value) + ) from None + + return value + + @classmethod + def from_float(cls, timeout: _TYPE_TIMEOUT) -> Timeout: + """Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, :attr:`urllib3.util.Timeout.DEFAULT_TIMEOUT`, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self) -> Timeout: + """Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, total=self.total) + + def start_connect(self) -> float: + """Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = time.monotonic() + return self._start_connect + + def get_connect_duration(self) -> float: + """Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time in seconds. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError( + "Can't get connect duration for timer that has not started." + ) + return time.monotonic() - self._start_connect + + @property + def connect_timeout(self) -> _TYPE_TIMEOUT: + """Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is _DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) # type: ignore[type-var] + + @property + def read_timeout(self) -> float | None: + """Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if ( + self.total is not None + and self.total is not _DEFAULT_TIMEOUT + and self._read is not None + and self._read is not _DEFAULT_TIMEOUT + ): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), self._read)) + elif self.total is not None and self.total is not _DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self.resolve_default_timeout(self._read) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/url.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/url.py new file mode 100644 index 000000000..db057f17b --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/url.py @@ -0,0 +1,469 @@ +from __future__ import annotations + +import re +import typing + +from ..exceptions import LocationParseError +from .util import to_str + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +_NORMALIZABLE_SCHEMES = ("http", "https", None) + +# Almost all of these patterns were derived from the +# 'rfc3986' module: https://github.com/python-hyper/rfc3986 +_PERCENT_RE = re.compile(r"%[a-fA-F0-9]{2}") +_SCHEME_RE = re.compile(r"^(?:[a-zA-Z][a-zA-Z0-9+-]*:|/)") +_URI_RE = re.compile( + r"^(?:([a-zA-Z][a-zA-Z0-9+.-]*):)?" + r"(?://([^\\/?#]*))?" + r"([^?#]*)" + r"(?:\?([^#]*))?" + r"(?:#(.*))?$", + re.UNICODE | re.DOTALL, +) + +_IPV4_PAT = r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}" +_HEX_PAT = "[0-9A-Fa-f]{1,4}" +_LS32_PAT = "(?:{hex}:{hex}|{ipv4})".format(hex=_HEX_PAT, ipv4=_IPV4_PAT) +_subs = {"hex": _HEX_PAT, "ls32": _LS32_PAT} +_variations = [ + # 6( h16 ":" ) ls32 + "(?:%(hex)s:){6}%(ls32)s", + # "::" 5( h16 ":" ) ls32 + "::(?:%(hex)s:){5}%(ls32)s", + # [ h16 ] "::" 4( h16 ":" ) ls32 + "(?:%(hex)s)?::(?:%(hex)s:){4}%(ls32)s", + # [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + "(?:(?:%(hex)s:)?%(hex)s)?::(?:%(hex)s:){3}%(ls32)s", + # [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + "(?:(?:%(hex)s:){0,2}%(hex)s)?::(?:%(hex)s:){2}%(ls32)s", + # [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + "(?:(?:%(hex)s:){0,3}%(hex)s)?::%(hex)s:%(ls32)s", + # [ *4( h16 ":" ) h16 ] "::" ls32 + "(?:(?:%(hex)s:){0,4}%(hex)s)?::%(ls32)s", + # [ *5( h16 ":" ) h16 ] "::" h16 + "(?:(?:%(hex)s:){0,5}%(hex)s)?::%(hex)s", + # [ *6( h16 ":" ) h16 ] "::" + "(?:(?:%(hex)s:){0,6}%(hex)s)?::", +] + +_UNRESERVED_PAT = r"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._\-~" +_IPV6_PAT = "(?:" + "|".join([x % _subs for x in _variations]) + ")" +_ZONE_ID_PAT = "(?:%25|%)(?:[" + _UNRESERVED_PAT + "]|%[a-fA-F0-9]{2})+" +_IPV6_ADDRZ_PAT = r"\[" + _IPV6_PAT + r"(?:" + _ZONE_ID_PAT + r")?\]" +_REG_NAME_PAT = r"(?:[^\[\]%:/?#]|%[a-fA-F0-9]{2})*" +_TARGET_RE = re.compile(r"^(/[^?#]*)(?:\?([^#]*))?(?:#.*)?$") + +_IPV4_RE = re.compile("^" + _IPV4_PAT + "$") +_IPV6_RE = re.compile("^" + _IPV6_PAT + "$") +_IPV6_ADDRZ_RE = re.compile("^" + _IPV6_ADDRZ_PAT + "$") +_BRACELESS_IPV6_ADDRZ_RE = re.compile("^" + _IPV6_ADDRZ_PAT[2:-2] + "$") +_ZONE_ID_RE = re.compile("(" + _ZONE_ID_PAT + r")\]$") + +_HOST_PORT_PAT = ("^(%s|%s|%s)(?::0*?(|0|[1-9][0-9]{0,4}))?$") % ( + _REG_NAME_PAT, + _IPV4_PAT, + _IPV6_ADDRZ_PAT, +) +_HOST_PORT_RE = re.compile(_HOST_PORT_PAT, re.UNICODE | re.DOTALL) + +_UNRESERVED_CHARS = set( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-~" +) +_SUB_DELIM_CHARS = set("!$&'()*+,;=") +_USERINFO_CHARS = _UNRESERVED_CHARS | _SUB_DELIM_CHARS | {":"} +_PATH_CHARS = _USERINFO_CHARS | {"@", "/"} +_QUERY_CHARS = _FRAGMENT_CHARS = _PATH_CHARS | {"?"} + + +class Url( + typing.NamedTuple( + "Url", + [ + ("scheme", typing.Optional[str]), + ("auth", typing.Optional[str]), + ("host", typing.Optional[str]), + ("port", typing.Optional[int]), + ("path", typing.Optional[str]), + ("query", typing.Optional[str]), + ("fragment", typing.Optional[str]), + ], + ) +): + """ + Data structure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + + def __new__( # type: ignore[no-untyped-def] + cls, + scheme: str | None = None, + auth: str | None = None, + host: str | None = None, + port: int | None = None, + path: str | None = None, + query: str | None = None, + fragment: str | None = None, + ): + if path and not path.startswith("/"): + path = "/" + path + if scheme is not None: + scheme = scheme.lower() + return super().__new__(cls, scheme, auth, host, port, path, query, fragment) + + @property + def hostname(self) -> str | None: + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self) -> str: + """Absolute path including the query string.""" + uri = self.path or "/" + + if self.query is not None: + uri += "?" + self.query + + return uri + + @property + def authority(self) -> str | None: + """ + Authority component as defined in RFC 3986 3.2. + This includes userinfo (auth), host and port. + + i.e. + userinfo@host:port + """ + userinfo = self.auth + netloc = self.netloc + if netloc is None or userinfo is None: + return netloc + else: + return f"{userinfo}@{netloc}" + + @property + def netloc(self) -> str | None: + """ + Network location including host and port. + + If you need the equivalent of urllib.parse's ``netloc``, + use the ``authority`` property instead. + """ + if self.host is None: + return None + if self.port: + return f"{self.host}:{self.port}" + return self.host + + @property + def url(self) -> str: + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: + + .. code-block:: python + + import urllib3 + + U = urllib3.util.parse_url("https://google.com/mail/") + + print(U.url) + # "https://google.com/mail/" + + print( urllib3.util.Url("https", "username:password", + "host.com", 80, "/path", "query", "fragment" + ).url + ) + # "https://username:password@host.com:80/path?query#fragment" + """ + scheme, auth, host, port, path, query, fragment = self + url = "" + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + "://" + if auth is not None: + url += auth + "@" + if host is not None: + url += host + if port is not None: + url += ":" + str(port) + if path is not None: + url += path + if query is not None: + url += "?" + query + if fragment is not None: + url += "#" + fragment + + return url + + def __str__(self) -> str: + return self.url + + +@typing.overload +def _encode_invalid_chars( + component: str, allowed_chars: typing.Container[str] +) -> str: # Abstract + ... + + +@typing.overload +def _encode_invalid_chars( + component: None, allowed_chars: typing.Container[str] +) -> None: # Abstract + ... + + +def _encode_invalid_chars( + component: str | None, allowed_chars: typing.Container[str] +) -> str | None: + """Percent-encodes a URI component without reapplying + onto an already percent-encoded component. + """ + if component is None: + return component + + component = to_str(component) + + # Normalize existing percent-encoded bytes. + # Try to see if the component we're encoding is already percent-encoded + # so we can skip all '%' characters but still encode all others. + component, percent_encodings = _PERCENT_RE.subn( + lambda match: match.group(0).upper(), component + ) + + uri_bytes = component.encode("utf-8", "surrogatepass") + is_percent_encoded = percent_encodings == uri_bytes.count(b"%") + encoded_component = bytearray() + + for i in range(0, len(uri_bytes)): + # Will return a single character bytestring + byte = uri_bytes[i : i + 1] + byte_ord = ord(byte) + if (is_percent_encoded and byte == b"%") or ( + byte_ord < 128 and byte.decode() in allowed_chars + ): + encoded_component += byte + continue + encoded_component.extend(b"%" + (hex(byte_ord)[2:].encode().zfill(2).upper())) + + return encoded_component.decode() + + +def _remove_path_dot_segments(path: str) -> str: + # See http://tools.ietf.org/html/rfc3986#section-5.2.4 for pseudo-code + segments = path.split("/") # Turn the path into a list of segments + output = [] # Initialize the variable to use to store output + + for segment in segments: + # '.' is the current directory, so ignore it, it is superfluous + if segment == ".": + continue + # Anything other than '..', should be appended to the output + if segment != "..": + output.append(segment) + # In this case segment == '..', if we can, we should pop the last + # element + elif output: + output.pop() + + # If the path starts with '/' and the output is empty or the first string + # is non-empty + if path.startswith("/") and (not output or output[0]): + output.insert(0, "") + + # If the path starts with '/.' or '/..' ensure we add one more empty + # string to add a trailing '/' + if path.endswith(("/.", "/..")): + output.append("") + + return "/".join(output) + + +@typing.overload +def _normalize_host(host: None, scheme: str | None) -> None: ... + + +@typing.overload +def _normalize_host(host: str, scheme: str | None) -> str: ... + + +def _normalize_host(host: str | None, scheme: str | None) -> str | None: + if host: + if scheme in _NORMALIZABLE_SCHEMES: + is_ipv6 = _IPV6_ADDRZ_RE.match(host) + if is_ipv6: + # IPv6 hosts of the form 'a::b%zone' are encoded in a URL as + # such per RFC 6874: 'a::b%25zone'. Unquote the ZoneID + # separator as necessary to return a valid RFC 4007 scoped IP. + match = _ZONE_ID_RE.search(host) + if match: + start, end = match.span(1) + zone_id = host[start:end] + + if zone_id.startswith("%25") and zone_id != "%25": + zone_id = zone_id[3:] + else: + zone_id = zone_id[1:] + zone_id = _encode_invalid_chars(zone_id, _UNRESERVED_CHARS) + return f"{host[:start].lower()}%{zone_id}{host[end:]}" + else: + return host.lower() + elif not _IPV4_RE.match(host): + return to_str( + b".".join([_idna_encode(label) for label in host.split(".")]), + "ascii", + ) + return host + + +def _idna_encode(name: str) -> bytes: + if not name.isascii(): + try: + import idna + except ImportError: + raise LocationParseError( + "Unable to parse URL without the 'idna' module" + ) from None + + try: + return idna.encode(name.lower(), strict=True, std3_rules=True) + except idna.IDNAError: + raise LocationParseError( + f"Name '{name}' is not a valid IDNA label" + ) from None + + return name.lower().encode("ascii") + + +def _encode_target(target: str) -> str: + """Percent-encodes a request target so that there are no invalid characters + + Pre-condition for this function is that 'target' must start with '/'. + If that is the case then _TARGET_RE will always produce a match. + """ + match = _TARGET_RE.match(target) + if not match: # Defensive: + raise LocationParseError(f"{target!r} is not a valid request URI") + + path, query = match.groups() + encoded_target = _encode_invalid_chars(path, _PATH_CHARS) + if query is not None: + query = _encode_invalid_chars(query, _QUERY_CHARS) + encoded_target += "?" + query + return encoded_target + + +def parse_url(url: str) -> Url: + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + This parser is RFC 3986 and RFC 6874 compliant. + + The parser logic and helper functions are based heavily on + work done in the ``rfc3986`` module. + + :param str url: URL to parse into a :class:`.Url` namedtuple. + + Partly backwards-compatible with :mod:`urllib.parse`. + + Example: + + .. code-block:: python + + import urllib3 + + print( urllib3.util.parse_url('http://google.com/mail/')) + # Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + + print( urllib3.util.parse_url('google.com:80')) + # Url(scheme=None, host='google.com', port=80, path=None, ...) + + print( urllib3.util.parse_url('/foo?bar')) + # Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + if not url: + # Empty + return Url() + + source_url = url + if not _SCHEME_RE.search(url): + url = "//" + url + + scheme: str | None + authority: str | None + auth: str | None + host: str | None + port: str | None + port_int: int | None + path: str | None + query: str | None + fragment: str | None + + try: + scheme, authority, path, query, fragment = _URI_RE.match(url).groups() # type: ignore[union-attr] + normalize_uri = scheme is None or scheme.lower() in _NORMALIZABLE_SCHEMES + + if scheme: + scheme = scheme.lower() + + if authority: + auth, _, host_port = authority.rpartition("@") + auth = auth or None + host, port = _HOST_PORT_RE.match(host_port).groups() # type: ignore[union-attr] + if auth and normalize_uri: + auth = _encode_invalid_chars(auth, _USERINFO_CHARS) + if port == "": + port = None + else: + auth, host, port = None, None, None + + if port is not None: + port_int = int(port) + if not (0 <= port_int <= 65535): + raise LocationParseError(url) + else: + port_int = None + + host = _normalize_host(host, scheme) + + if normalize_uri and path: + path = _remove_path_dot_segments(path) + path = _encode_invalid_chars(path, _PATH_CHARS) + if normalize_uri and query: + query = _encode_invalid_chars(query, _QUERY_CHARS) + if normalize_uri and fragment: + fragment = _encode_invalid_chars(fragment, _FRAGMENT_CHARS) + + except (ValueError, AttributeError) as e: + raise LocationParseError(source_url) from e + + # For the sake of backwards compatibility we put empty + # string values for path if there are any defined values + # beyond the path in the URL. + # TODO: Remove this when we break backwards compatibility. + if not path: + if query is not None or fragment is not None: + path = "" + else: + path = None + + return Url( + scheme=scheme, + auth=auth, + host=host, + port=port_int, + path=path, + query=query, + fragment=fragment, + ) diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/util.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/util.py new file mode 100644 index 000000000..35c77e402 --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/util.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +import typing +from types import TracebackType + + +def to_bytes( + x: str | bytes, encoding: str | None = None, errors: str | None = None +) -> bytes: + if isinstance(x, bytes): + return x + elif not isinstance(x, str): + raise TypeError(f"not expecting type {type(x).__name__}") + if encoding or errors: + return x.encode(encoding or "utf-8", errors=errors or "strict") + return x.encode() + + +def to_str( + x: str | bytes, encoding: str | None = None, errors: str | None = None +) -> str: + if isinstance(x, str): + return x + elif not isinstance(x, bytes): + raise TypeError(f"not expecting type {type(x).__name__}") + if encoding or errors: + return x.decode(encoding or "utf-8", errors=errors or "strict") + return x.decode() + + +def reraise( + tp: type[BaseException] | None, + value: BaseException, + tb: TracebackType | None = None, +) -> typing.NoReturn: + try: + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None # type: ignore[assignment] + tb = None diff --git a/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/wait.py b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/wait.py new file mode 100644 index 000000000..aeca0c7ad --- /dev/null +++ b/ESP-IDF_Robot/tutorial/.tutorial/lib/python3.12/site-packages/urllib3/util/wait.py @@ -0,0 +1,124 @@ +from __future__ import annotations + +import select +import socket +from functools import partial + +__all__ = ["wait_for_read", "wait_for_write"] + + +# How should we wait on sockets? +# +# There are two types of APIs you can use for waiting on sockets: the fancy +# modern stateful APIs like epoll/kqueue, and the older stateless APIs like +# select/poll. The stateful APIs are more efficient when you have a lots of +# sockets to keep track of, because you can set them up once and then use them +# lots of times. But we only ever want to wait on a single socket at a time +# and don't want to keep track of state, so the stateless APIs are actually +# more efficient. So we want to use select() or poll(). +# +# Now, how do we choose between select() and poll()? On traditional Unixes, +# select() has a strange calling convention that makes it slow, or fail +# altogether, for high-numbered file descriptors. The point of poll() is to fix +# that, so on Unixes, we prefer poll(). +# +# On Windows, there is no poll() (or at least Python doesn't provide a wrapper +# for it), but that's OK, because on Windows, select() doesn't have this +# strange calling convention; plain select() works fine. +# +# So: on Windows we use select(), and everywhere else we use poll(). We also +# fall back to select() in case poll() is somehow broken or missing. + + +def select_wait_for_socket( + sock: socket.socket, + read: bool = False, + write: bool = False, + timeout: float | None = None, +) -> bool: + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + rcheck = [] + wcheck = [] + if read: + rcheck.append(sock) + if write: + wcheck.append(sock) + # When doing a non-blocking connect, most systems signal success by + # marking the socket writable. Windows, though, signals success by marked + # it as "exceptional". We paper over the difference by checking the write + # sockets for both conditions. (The stdlib selectors module does the same + # thing.) + fn = partial(select.select, rcheck, wcheck, wcheck) + rready, wready, xready = fn(timeout) + return bool(rready or wready or xready) + + +def poll_wait_for_socket( + sock: socket.socket, + read: bool = False, + write: bool = False, + timeout: float | None = None, +) -> bool: + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + mask = 0 + if read: + mask |= select.POLLIN + if write: + mask |= select.POLLOUT + poll_obj = select.poll() + poll_obj.register(sock, mask) + + # For some reason, poll() takes timeout in milliseconds + def do_poll(t: float | None) -> list[tuple[int, int]]: + if t is not None: + t *= 1000 + return poll_obj.poll(t) + + return bool(do_poll(timeout)) + + +def _have_working_poll() -> bool: + # Apparently some systems have a select.poll that fails as soon as you try + # to use it, either due to strange configuration or broken monkeypatching + # from libraries like eventlet/greenlet. + try: + poll_obj = select.poll() + poll_obj.poll(0) + except (AttributeError, OSError): + return False + else: + return True + + +def wait_for_socket( + sock: socket.socket, + read: bool = False, + write: bool = False, + timeout: float | None = None, +) -> bool: + # We delay choosing which implementation to use until the first time we're + # called. We could do it at import time, but then we might make the wrong + # decision if someone goes wild with monkeypatching select.poll after + # we're imported. + global wait_for_socket + if _have_working_poll(): + wait_for_socket = poll_wait_for_socket + elif hasattr(select, "select"): + wait_for_socket = select_wait_for_socket + return wait_for_socket(sock, read, write, timeout) + + +def wait_for_read(sock: socket.socket, timeout: float | None = None) -> bool: + """Waits for reading to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, read=True, timeout=timeout) + + +def wait_for_write(sock: socket.socket, timeout: float | None = None) -> bool: + """Waits for writing to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, write=True, timeout=timeout)

    ' : '\U0001d4ab', + '\\' : '\U0001d4ac', + '\\' : '\U0000211b', + '\\' : '\U0001d4ae', + '\\' : '\U0001d4af', + '\\' : '\U0001d4b0', + '\\' : '\U0001d4b1', + '\\' : '\U0001d4b2', + '\\' : '\U0001d4b3', + '\\' : '\U0001d4b4', + '\\' : '\U0001d4b5', + '\\' : '\U0001d5ba', + '\\' : '\U0001d5bb', + '\\' : '\U0001d5bc', + '\\' : '\U0001d5bd', + '\\' : '\U0001d5be', + '\\' : '\U0001d5bf', + '\\' : '\U0001d5c0', + '\\' : '\U0001d5c1', + '\\' : '\U0001d5c2', + '\\' : '\U0001d5c3', + '\\' : '\U0001d5c4', + '\\' : '\U0001d5c5', + '\\' : '\U0001d5c6', + '\\' : '\U0001d5c7', + '\\' : '\U0001d5c8', + '\\