From 107a98686a105468b5f200ebcbd27343c1210ce4 Mon Sep 17 00:00:00 2001 From: RogueAI42 Date: Sun, 11 Jun 2017 17:34:38 +1000 Subject: ReflectMan Saves The Day.............. Refactored every part in the code that used that damn foreach loop. All assemblies are now loaded on startup into an array, and the results of GetType() on each are concatenated into another array. The parts of the code that were loading the assemblies and scanning them themselves now look to ReflectMan.Types, and all disk I/O is limited to the first time ReflectMan is accessed. While I was there I also replaced some other foreach loops with array comprehensions and such to speed things up - there is a noticeable improvement. It doesn't seem to have broken anything, but I'd appreciate if someone could do more stress testing for me. --- ShiftOS_TheReturn/ReflectMan.cs | 80 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 ShiftOS_TheReturn/ReflectMan.cs (limited to 'ShiftOS_TheReturn/ReflectMan.cs') diff --git a/ShiftOS_TheReturn/ReflectMan.cs b/ShiftOS_TheReturn/ReflectMan.cs new file mode 100644 index 0000000..a0ead60 --- /dev/null +++ b/ShiftOS_TheReturn/ReflectMan.cs @@ -0,0 +1,80 @@ +/* + * MIT License + * + * Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs + * + * 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. + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace ShiftOS.Engine +{ + public static class ReflectMan + { + private static Assembly[] asms = null; + public static Assembly[] Asms + { + get + { + if (asms == null) + LoadAssemblies(); + return asms; + } + } + + private static Type[] types = null; + public static Type[] Types + { + get + { + if (types == null) + FindTypes(); + return types; + } + } + + private static void LoadAssemblies() + { + var ret = new List(); + foreach (var exe in Array.FindAll(System.IO.Directory.GetFiles(Environment.CurrentDirectory), n => n.EndsWith(".exe") || n.EndsWith(".dll"))) + try + { + var asm = Assembly.LoadFile(exe); + if (asm.GetReferencedAssemblies().Contains("ShiftOS.Engine") || asm.FullName.Contains("ShiftOS.Engine")) + ret.Add(asm); + } + catch { } // probably not a managed assembly + asms = ret.ToArray(); + } + + private static void FindTypes() + { + var ret = new List(); + foreach (var asm in Asms) + ret.AddRange(asm.GetTypes()); + types = ret.ToArray(); + } + } +} -- cgit v1.2.3 From 2acfa34596061a9236bb6a9df1e3f3a0c01d6ff0 Mon Sep 17 00:00:00 2001 From: RogueAI42 Date: Tue, 13 Jun 2017 20:06:38 +1000 Subject: Python API It uses a meta-language and a CSharpCodeProvider on startup. I will release a tutorial on the forums soon showing how to use it. This commit also adds an extremely basic loading screen which shows while Desktop is getting everything ready. Which can take a while if you have any Python mods. Thanks, IronPython. --- ModLauncher/App.config | 8 + ShiftOS.MFSProfiler/App.config | 8 + ShiftOS.Modding.VB.LegacySkinConverter/App.config | 8 + ShiftOS.Modding.VirtualMachine/App.config | 8 + ShiftOS.Updater/App.config | 8 + ShiftOS.WinForms/App.config | 8 + ShiftOS.WinForms/MainMenu/Loading.Designer.cs | 66 + ShiftOS.WinForms/MainMenu/Loading.cs | 31 + ShiftOS.WinForms/MainMenu/Loading.resx | 120 + ShiftOS.WinForms/MainMenu/MainMenu.cs | 13 +- ShiftOS.WinForms/Properties/Resources.Designer.cs | 15 +- ShiftOS.WinForms/ShiftOS.WinForms.csproj | 11 + ShiftOS_TheReturn/App.config | 8 + ShiftOS_TheReturn/Commands.cs | 3 +- ShiftOS_TheReturn/Lib/BaseHTTPServer.py | 614 + ShiftOS_TheReturn/Lib/Bastion.py | 180 + ShiftOS_TheReturn/Lib/CGIHTTPServer.py | 378 + ShiftOS_TheReturn/Lib/ConfigParser.py | 753 ++ ShiftOS_TheReturn/Lib/Cookie.py | 773 ++ ShiftOS_TheReturn/Lib/DocXMLRPCServer.py | 279 + ShiftOS_TheReturn/Lib/HTMLParser.py | 475 + ShiftOS_TheReturn/Lib/MimeWriter.py | 186 + ShiftOS_TheReturn/Lib/Queue.py | 244 + ShiftOS_TheReturn/Lib/SimpleHTTPServer.py | 235 + ShiftOS_TheReturn/Lib/SimpleXMLRPCServer.py | 708 + ShiftOS_TheReturn/Lib/SocketServer.py | 731 + ShiftOS_TheReturn/Lib/StringIO.py | 324 + ShiftOS_TheReturn/Lib/UserDict.py | 213 + ShiftOS_TheReturn/Lib/UserList.py | 88 + ShiftOS_TheReturn/Lib/UserString.py | 228 + ShiftOS_TheReturn/Lib/_LWPCookieJar.py | 170 + ShiftOS_TheReturn/Lib/_MozillaCookieJar.py | 149 + ShiftOS_TheReturn/Lib/__future__.py | 128 + ShiftOS_TheReturn/Lib/__phello__.foo.py | 1 + ShiftOS_TheReturn/Lib/_abcoll.py | 695 + ShiftOS_TheReturn/Lib/_osx_support.py | 502 + ShiftOS_TheReturn/Lib/_pyio.py | 2037 +++ ShiftOS_TheReturn/Lib/_strptime.py | 478 + ShiftOS_TheReturn/Lib/_threading_local.py | 251 + ShiftOS_TheReturn/Lib/_weakrefset.py | 204 + ShiftOS_TheReturn/Lib/abc.py | 185 + ShiftOS_TheReturn/Lib/aifc.py | 989 ++ ShiftOS_TheReturn/Lib/antigravity.py | 4 + ShiftOS_TheReturn/Lib/anydbm.py | 85 + ShiftOS_TheReturn/Lib/argparse.py | 2374 ++++ ShiftOS_TheReturn/Lib/ast.py | 311 + ShiftOS_TheReturn/Lib/asynchat.py | 321 + ShiftOS_TheReturn/Lib/asyncore.py | 659 + ShiftOS_TheReturn/Lib/atexit.py | 65 + ShiftOS_TheReturn/Lib/audiodev.py | 260 + ShiftOS_TheReturn/Lib/base64.py | 367 + ShiftOS_TheReturn/Lib/bdb.py | 645 + ShiftOS_TheReturn/Lib/binhex.py | 518 + ShiftOS_TheReturn/Lib/bisect.py | 92 + ShiftOS_TheReturn/Lib/calendar.py | 713 + ShiftOS_TheReturn/Lib/cgi.py | 1059 ++ ShiftOS_TheReturn/Lib/cgitb.py | 323 + ShiftOS_TheReturn/Lib/chunk.py | 169 + ShiftOS_TheReturn/Lib/cmd.py | 404 + ShiftOS_TheReturn/Lib/code.py | 310 + ShiftOS_TheReturn/Lib/codecs.py | 1113 ++ ShiftOS_TheReturn/Lib/codeop.py | 168 + ShiftOS_TheReturn/Lib/collections.py | 742 ++ ShiftOS_TheReturn/Lib/colorsys.py | 156 + ShiftOS_TheReturn/Lib/commands.py | 90 + ShiftOS_TheReturn/Lib/compileall.py | 227 + ShiftOS_TheReturn/Lib/contextlib.py | 154 + ShiftOS_TheReturn/Lib/cookielib.py | 1810 +++ ShiftOS_TheReturn/Lib/copy.py | 433 + ShiftOS_TheReturn/Lib/csv.py | 456 + ShiftOS_TheReturn/Lib/ctypes/__init__.py | 554 + ShiftOS_TheReturn/Lib/ctypes/_endian.py | 61 + ShiftOS_TheReturn/Lib/ctypes/macholib/__init__.py | 9 + ShiftOS_TheReturn/Lib/ctypes/macholib/dyld.py | 166 + ShiftOS_TheReturn/Lib/ctypes/macholib/dylib.py | 63 + ShiftOS_TheReturn/Lib/ctypes/macholib/framework.py | 65 + ShiftOS_TheReturn/Lib/ctypes/util.py | 271 + ShiftOS_TheReturn/Lib/ctypes/wintypes.py | 181 + ShiftOS_TheReturn/Lib/decimal.py | 6214 +++++++++ ShiftOS_TheReturn/Lib/difflib.py | 2057 +++ ShiftOS_TheReturn/Lib/dircache.py | 41 + ShiftOS_TheReturn/Lib/dis.py | 224 + ShiftOS_TheReturn/Lib/distutils/__init__.py | 13 + ShiftOS_TheReturn/Lib/distutils/archive_util.py | 243 + ShiftOS_TheReturn/Lib/distutils/bcppcompiler.py | 394 + ShiftOS_TheReturn/Lib/distutils/ccompiler.py | 1096 ++ ShiftOS_TheReturn/Lib/distutils/cmd.py | 457 + .../Lib/distutils/command/__init__.py | 33 + ShiftOS_TheReturn/Lib/distutils/command/bdist.py | 146 + .../Lib/distutils/command/bdist_dumb.py | 133 + .../Lib/distutils/command/bdist_rpm.py | 588 + .../Lib/distutils/command/bdist_wininst.py | 368 + ShiftOS_TheReturn/Lib/distutils/command/build.py | 147 + .../Lib/distutils/command/build_clib.py | 209 + .../Lib/distutils/command/build_ext.py | 768 ++ .../Lib/distutils/command/build_py.py | 394 + .../Lib/distutils/command/build_scripts.py | 131 + ShiftOS_TheReturn/Lib/distutils/command/check.py | 149 + ShiftOS_TheReturn/Lib/distutils/command/clean.py | 80 + ShiftOS_TheReturn/Lib/distutils/command/config.py | 357 + ShiftOS_TheReturn/Lib/distutils/command/install.py | 672 + .../Lib/distutils/command/install_data.py | 81 + .../Lib/distutils/command/install_egg_info.py | 78 + .../Lib/distutils/command/install_headers.py | 51 + .../Lib/distutils/command/install_lib.py | 219 + .../Lib/distutils/command/install_scripts.py | 64 + .../Lib/distutils/command/register.py | 315 + ShiftOS_TheReturn/Lib/distutils/command/sdist.py | 477 + ShiftOS_TheReturn/Lib/distutils/command/upload.py | 194 + ShiftOS_TheReturn/Lib/distutils/config.py | 116 + ShiftOS_TheReturn/Lib/distutils/core.py | 239 + ShiftOS_TheReturn/Lib/distutils/cygwinccompiler.py | 463 + ShiftOS_TheReturn/Lib/distutils/debug.py | 7 + ShiftOS_TheReturn/Lib/distutils/dep_util.py | 89 + ShiftOS_TheReturn/Lib/distutils/dir_util.py | 214 + ShiftOS_TheReturn/Lib/distutils/dist.py | 1249 ++ ShiftOS_TheReturn/Lib/distutils/emxccompiler.py | 319 + ShiftOS_TheReturn/Lib/distutils/errors.py | 88 + ShiftOS_TheReturn/Lib/distutils/extension.py | 255 + ShiftOS_TheReturn/Lib/distutils/fancy_getopt.py | 484 + ShiftOS_TheReturn/Lib/distutils/file_util.py | 239 + ShiftOS_TheReturn/Lib/distutils/filelist.py | 343 + ShiftOS_TheReturn/Lib/distutils/log.py | 71 + ShiftOS_TheReturn/Lib/distutils/msvccompiler.py | 659 + ShiftOS_TheReturn/Lib/distutils/spawn.py | 226 + ShiftOS_TheReturn/Lib/distutils/sysconfig.py | 483 + ShiftOS_TheReturn/Lib/distutils/text_file.py | 304 + ShiftOS_TheReturn/Lib/distutils/unixccompiler.py | 310 + ShiftOS_TheReturn/Lib/distutils/util.py | 477 + ShiftOS_TheReturn/Lib/distutils/version.py | 299 + .../Lib/distutils/versionpredicate.py | 164 + ShiftOS_TheReturn/Lib/doctest.py | 2817 ++++ ShiftOS_TheReturn/Lib/dumbdbm.py | 249 + ShiftOS_TheReturn/Lib/dummy_thread.py | 145 + ShiftOS_TheReturn/Lib/dummy_threading.py | 78 + ShiftOS_TheReturn/Lib/email/__init__.py | 123 + ShiftOS_TheReturn/Lib/email/_parseaddr.py | 497 + ShiftOS_TheReturn/Lib/email/base64mime.py | 183 + ShiftOS_TheReturn/Lib/email/charset.py | 397 + ShiftOS_TheReturn/Lib/email/encoders.py | 82 + ShiftOS_TheReturn/Lib/email/errors.py | 57 + ShiftOS_TheReturn/Lib/email/feedparser.py | 505 + ShiftOS_TheReturn/Lib/email/generator.py | 371 + ShiftOS_TheReturn/Lib/email/header.py | 514 + ShiftOS_TheReturn/Lib/email/iterators.py | 73 + ShiftOS_TheReturn/Lib/email/message.py | 797 ++ ShiftOS_TheReturn/Lib/email/mime/__init__.py | 0 ShiftOS_TheReturn/Lib/email/mime/application.py | 36 + ShiftOS_TheReturn/Lib/email/mime/audio.py | 73 + ShiftOS_TheReturn/Lib/email/mime/base.py | 26 + ShiftOS_TheReturn/Lib/email/mime/image.py | 46 + ShiftOS_TheReturn/Lib/email/mime/message.py | 34 + ShiftOS_TheReturn/Lib/email/mime/multipart.py | 47 + ShiftOS_TheReturn/Lib/email/mime/nonmultipart.py | 22 + ShiftOS_TheReturn/Lib/email/mime/text.py | 30 + ShiftOS_TheReturn/Lib/email/parser.py | 91 + ShiftOS_TheReturn/Lib/email/quoprimime.py | 336 + ShiftOS_TheReturn/Lib/email/utils.py | 323 + ShiftOS_TheReturn/Lib/encodings/__init__.py | 157 + ShiftOS_TheReturn/Lib/encodings/aliases.py | 527 + ShiftOS_TheReturn/Lib/encodings/ascii.py | 50 + ShiftOS_TheReturn/Lib/encodings/base64_codec.py | 80 + ShiftOS_TheReturn/Lib/encodings/bz2_codec.py | 103 + ShiftOS_TheReturn/Lib/encodings/charmap.py | 69 + ShiftOS_TheReturn/Lib/encodings/cp037.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1006.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1026.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1140.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1250.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1251.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1252.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1253.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1254.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1255.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1256.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1257.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp1258.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp424.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp437.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp500.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp720.py | 309 + ShiftOS_TheReturn/Lib/encodings/cp737.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp775.py | 697 + ShiftOS_TheReturn/Lib/encodings/cp850.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp852.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp855.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp856.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp857.py | 694 + ShiftOS_TheReturn/Lib/encodings/cp858.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp860.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp861.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp862.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp863.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp864.py | 690 + ShiftOS_TheReturn/Lib/encodings/cp865.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp866.py | 698 + ShiftOS_TheReturn/Lib/encodings/cp869.py | 689 + ShiftOS_TheReturn/Lib/encodings/cp874.py | 307 + ShiftOS_TheReturn/Lib/encodings/cp875.py | 307 + ShiftOS_TheReturn/Lib/encodings/hex_codec.py | 80 + ShiftOS_TheReturn/Lib/encodings/hp_roman8.py | 152 + ShiftOS_TheReturn/Lib/encodings/idna.py | 288 + ShiftOS_TheReturn/Lib/encodings/iso8859_1.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_10.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_11.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_13.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_14.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_15.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_16.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_2.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_3.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_4.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_5.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_6.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_7.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_8.py | 307 + ShiftOS_TheReturn/Lib/encodings/iso8859_9.py | 307 + ShiftOS_TheReturn/Lib/encodings/koi8_r.py | 307 + ShiftOS_TheReturn/Lib/encodings/koi8_u.py | 307 + ShiftOS_TheReturn/Lib/encodings/latin_1.py | 50 + ShiftOS_TheReturn/Lib/encodings/mac_arabic.py | 698 + ShiftOS_TheReturn/Lib/encodings/mac_centeuro.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_croatian.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_cyrillic.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_farsi.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_greek.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_iceland.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_latin2.py | 183 + ShiftOS_TheReturn/Lib/encodings/mac_roman.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_romanian.py | 307 + ShiftOS_TheReturn/Lib/encodings/mac_turkish.py | 307 + ShiftOS_TheReturn/Lib/encodings/mbcs.py | 47 + ShiftOS_TheReturn/Lib/encodings/palmos.py | 83 + ShiftOS_TheReturn/Lib/encodings/ptcp154.py | 175 + ShiftOS_TheReturn/Lib/encodings/punycode.py | 238 + ShiftOS_TheReturn/Lib/encodings/quopri_codec.py | 76 + .../Lib/encodings/raw_unicode_escape.py | 45 + ShiftOS_TheReturn/Lib/encodings/rot_13.py | 119 + ShiftOS_TheReturn/Lib/encodings/string_escape.py | 38 + ShiftOS_TheReturn/Lib/encodings/tis_620.py | 307 + ShiftOS_TheReturn/Lib/encodings/undefined.py | 49 + ShiftOS_TheReturn/Lib/encodings/unicode_escape.py | 45 + .../Lib/encodings/unicode_internal.py | 45 + ShiftOS_TheReturn/Lib/encodings/utf_16.py | 126 + ShiftOS_TheReturn/Lib/encodings/utf_16_be.py | 42 + ShiftOS_TheReturn/Lib/encodings/utf_16_le.py | 42 + ShiftOS_TheReturn/Lib/encodings/utf_32.py | 150 + ShiftOS_TheReturn/Lib/encodings/utf_32_be.py | 37 + ShiftOS_TheReturn/Lib/encodings/utf_32_le.py | 37 + ShiftOS_TheReturn/Lib/encodings/utf_7.py | 38 + ShiftOS_TheReturn/Lib/encodings/utf_8.py | 42 + ShiftOS_TheReturn/Lib/encodings/utf_8_sig.py | 117 + ShiftOS_TheReturn/Lib/encodings/uu_codec.py | 130 + ShiftOS_TheReturn/Lib/encodings/zlib_codec.py | 103 + ShiftOS_TheReturn/Lib/ensurepip/__init__.py | 238 + ShiftOS_TheReturn/Lib/ensurepip/__main__.py | 4 + .../_bundled/pip-8.1.1-py2.py3-none-any.whl | Bin 0 -> 1197706 bytes .../setuptools-20.10.1-py2.py3-none-any.whl | Bin 0 -> 509211 bytes ShiftOS_TheReturn/Lib/ensurepip/_uninstall.py | 30 + ShiftOS_TheReturn/Lib/filecmp.py | 296 + ShiftOS_TheReturn/Lib/fileinput.py | 405 + ShiftOS_TheReturn/Lib/fnmatch.py | 120 + ShiftOS_TheReturn/Lib/formatter.py | 445 + ShiftOS_TheReturn/Lib/fpformat.py | 145 + ShiftOS_TheReturn/Lib/fractions.py | 605 + ShiftOS_TheReturn/Lib/ftplib.py | 1078 ++ ShiftOS_TheReturn/Lib/functools.py | 100 + ShiftOS_TheReturn/Lib/genericpath.py | 113 + ShiftOS_TheReturn/Lib/getopt.py | 210 + ShiftOS_TheReturn/Lib/getpass.py | 179 + ShiftOS_TheReturn/Lib/gettext.py | 594 + ShiftOS_TheReturn/Lib/glob.py | 100 + ShiftOS_TheReturn/Lib/gzip.py | 527 + ShiftOS_TheReturn/Lib/hashlib.py | 221 + ShiftOS_TheReturn/Lib/heapq.py | 485 + ShiftOS_TheReturn/Lib/hmac.py | 136 + ShiftOS_TheReturn/Lib/htmlentitydefs.py | 273 + ShiftOS_TheReturn/Lib/htmllib.py | 491 + ShiftOS_TheReturn/Lib/httplib.py | 1445 ++ ShiftOS_TheReturn/Lib/ihooks.py | 554 + ShiftOS_TheReturn/Lib/imaplib.py | 1536 +++ ShiftOS_TheReturn/Lib/imghdr.py | 159 + ShiftOS_TheReturn/Lib/importlib/__init__.py | 38 + ShiftOS_TheReturn/Lib/imputil.py | 725 + ShiftOS_TheReturn/Lib/inspect.py | 1064 ++ ShiftOS_TheReturn/Lib/io.py | 90 + ShiftOS_TheReturn/Lib/json/__init__.py | 352 + ShiftOS_TheReturn/Lib/json/decoder.py | 383 + ShiftOS_TheReturn/Lib/json/encoder.py | 448 + ShiftOS_TheReturn/Lib/json/scanner.py | 67 + ShiftOS_TheReturn/Lib/json/tool.py | 40 + ShiftOS_TheReturn/Lib/keyword.py | 93 + ShiftOS_TheReturn/Lib/lib2to3/__init__.py | 1 + ShiftOS_TheReturn/Lib/lib2to3/__main__.py | 4 + ShiftOS_TheReturn/Lib/lib2to3/btm_matcher.py | 168 + ShiftOS_TheReturn/Lib/lib2to3/btm_utils.py | 283 + ShiftOS_TheReturn/Lib/lib2to3/fixer_base.py | 189 + ShiftOS_TheReturn/Lib/lib2to3/fixer_util.py | 432 + ShiftOS_TheReturn/Lib/lib2to3/fixes/__init__.py | 1 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_apply.py | 59 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_asserts.py | 34 + .../Lib/lib2to3/fixes/fix_basestring.py | 14 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_buffer.py | 22 + .../Lib/lib2to3/fixes/fix_callable.py | 37 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_dict.py | 107 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_except.py | 93 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_exec.py | 40 + .../Lib/lib2to3/fixes/fix_execfile.py | 52 + .../Lib/lib2to3/fixes/fix_exitfunc.py | 72 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_filter.py | 76 + .../Lib/lib2to3/fixes/fix_funcattrs.py | 21 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_future.py | 22 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_getcwdu.py | 19 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_has_key.py | 110 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_idioms.py | 152 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_import.py | 99 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_imports.py | 145 + .../Lib/lib2to3/fixes/fix_imports2.py | 16 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_input.py | 26 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_intern.py | 46 + .../Lib/lib2to3/fixes/fix_isinstance.py | 52 + .../Lib/lib2to3/fixes/fix_itertools.py | 43 + .../Lib/lib2to3/fixes/fix_itertools_imports.py | 57 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_long.py | 19 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_map.py | 91 + .../Lib/lib2to3/fixes/fix_metaclass.py | 228 + .../Lib/lib2to3/fixes/fix_methodattrs.py | 24 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_ne.py | 23 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_next.py | 103 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_nonzero.py | 21 + .../Lib/lib2to3/fixes/fix_numliterals.py | 28 + .../Lib/lib2to3/fixes/fix_operator.py | 96 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_paren.py | 44 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_print.py | 87 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_raise.py | 90 + .../Lib/lib2to3/fixes/fix_raw_input.py | 17 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_reduce.py | 35 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_renames.py | 70 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_repr.py | 23 + .../Lib/lib2to3/fixes/fix_set_literal.py | 53 + .../Lib/lib2to3/fixes/fix_standarderror.py | 18 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_sys_exc.py | 30 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_throw.py | 56 + .../Lib/lib2to3/fixes/fix_tuple_params.py | 175 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_types.py | 62 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_unicode.py | 42 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_urllib.py | 197 + .../Lib/lib2to3/fixes/fix_ws_comma.py | 39 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_xrange.py | 73 + .../Lib/lib2to3/fixes/fix_xreadlines.py | 25 + ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_zip.py | 35 + ShiftOS_TheReturn/Lib/lib2to3/main.py | 269 + ShiftOS_TheReturn/Lib/lib2to3/patcomp.py | 205 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/__init__.py | 4 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/conv.py | 257 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/driver.py | 157 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/grammar.py | 185 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/literals.py | 60 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/parse.py | 201 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/pgen.py | 386 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/token.py | 83 + ShiftOS_TheReturn/Lib/lib2to3/pgen2/tokenize.py | 502 + ShiftOS_TheReturn/Lib/lib2to3/pygram.py | 40 + ShiftOS_TheReturn/Lib/lib2to3/pytree.py | 887 ++ ShiftOS_TheReturn/Lib/lib2to3/refactor.py | 747 ++ ShiftOS_TheReturn/Lib/linecache.py | 139 + ShiftOS_TheReturn/Lib/locale.py | 2064 +++ ShiftOS_TheReturn/Lib/logging/__init__.py | 1744 +++ ShiftOS_TheReturn/Lib/logging/config.py | 919 ++ ShiftOS_TheReturn/Lib/logging/handlers.py | 1227 ++ ShiftOS_TheReturn/Lib/macpath.py | 216 + ShiftOS_TheReturn/Lib/macurl2path.py | 77 + ShiftOS_TheReturn/Lib/mailbox.py | 2240 ++++ ShiftOS_TheReturn/Lib/mailcap.py | 255 + ShiftOS_TheReturn/Lib/markupbase.py | 396 + ShiftOS_TheReturn/Lib/md5.py | 14 + ShiftOS_TheReturn/Lib/mhlib.py | 1005 ++ ShiftOS_TheReturn/Lib/mimetools.py | 250 + ShiftOS_TheReturn/Lib/mimetypes.py | 598 + ShiftOS_TheReturn/Lib/mimify.py | 468 + ShiftOS_TheReturn/Lib/modulefinder.py | 716 + ShiftOS_TheReturn/Lib/multifile.py | 162 + ShiftOS_TheReturn/Lib/multiprocessing/__init__.py | 281 + .../Lib/multiprocessing/connection.py | 477 + .../Lib/multiprocessing/dummy/__init__.py | 153 + .../Lib/multiprocessing/dummy/connection.py | 87 + ShiftOS_TheReturn/Lib/multiprocessing/forking.py | 526 + ShiftOS_TheReturn/Lib/multiprocessing/heap.py | 254 + ShiftOS_TheReturn/Lib/multiprocessing/managers.py | 1117 ++ ShiftOS_TheReturn/Lib/multiprocessing/pool.py | 744 ++ ShiftOS_TheReturn/Lib/multiprocessing/process.py | 323 + ShiftOS_TheReturn/Lib/multiprocessing/queues.py | 395 + ShiftOS_TheReturn/Lib/multiprocessing/reduction.py | 215 + .../Lib/multiprocessing/sharedctypes.py | 271 + .../Lib/multiprocessing/synchronize.py | 344 + ShiftOS_TheReturn/Lib/multiprocessing/util.py | 350 + ShiftOS_TheReturn/Lib/mutex.py | 55 + ShiftOS_TheReturn/Lib/netrc.py | 145 + ShiftOS_TheReturn/Lib/new.py | 17 + ShiftOS_TheReturn/Lib/nntplib.py | 636 + ShiftOS_TheReturn/Lib/ntpath.py | 550 + ShiftOS_TheReturn/Lib/nturl2path.py | 68 + ShiftOS_TheReturn/Lib/numbers.py | 391 + ShiftOS_TheReturn/Lib/opcode.py | 192 + ShiftOS_TheReturn/Lib/optparse.py | 1704 +++ ShiftOS_TheReturn/Lib/os.py | 742 ++ ShiftOS_TheReturn/Lib/os2emxpath.py | 160 + ShiftOS_TheReturn/Lib/pdb.py | 1341 ++ ShiftOS_TheReturn/Lib/pickle.py | 1397 ++ ShiftOS_TheReturn/Lib/pickletools.py | 2274 ++++ ShiftOS_TheReturn/Lib/pipes.py | 278 + ShiftOS_TheReturn/Lib/pkgutil.py | 591 + ShiftOS_TheReturn/Lib/platform.py | 1604 +++ ShiftOS_TheReturn/Lib/plistlib.py | 474 + ShiftOS_TheReturn/Lib/popen2.py | 201 + ShiftOS_TheReturn/Lib/poplib.py | 427 + ShiftOS_TheReturn/Lib/posixfile.py | 237 + ShiftOS_TheReturn/Lib/posixpath.py | 439 + ShiftOS_TheReturn/Lib/pprint.py | 346 + ShiftOS_TheReturn/Lib/profile.py | 610 + ShiftOS_TheReturn/Lib/pstats.py | 705 + ShiftOS_TheReturn/Lib/py_compile.py | 118 + ShiftOS_TheReturn/Lib/pyclbr.py | 344 + ShiftOS_TheReturn/Lib/pydoc.py | 2409 ++++ ShiftOS_TheReturn/Lib/pydoc_data/__init__.py | 0 ShiftOS_TheReturn/Lib/pydoc_data/topics.py | 13325 +++++++++++++++++++ ShiftOS_TheReturn/Lib/quopri.py | 237 + ShiftOS_TheReturn/Lib/random.py | 910 ++ ShiftOS_TheReturn/Lib/repr.py | 132 + ShiftOS_TheReturn/Lib/rexec.py | 588 + ShiftOS_TheReturn/Lib/rfc822.py | 1016 ++ ShiftOS_TheReturn/Lib/rlcompleter.py | 172 + ShiftOS_TheReturn/Lib/robotparser.py | 233 + ShiftOS_TheReturn/Lib/runpy.py | 290 + ShiftOS_TheReturn/Lib/sched.py | 134 + ShiftOS_TheReturn/Lib/sets.py | 557 + ShiftOS_TheReturn/Lib/sgmllib.py | 553 + ShiftOS_TheReturn/Lib/sha.py | 15 + ShiftOS_TheReturn/Lib/shelve.py | 243 + ShiftOS_TheReturn/Lib/shlex.py | 292 + ShiftOS_TheReturn/Lib/shutil.py | 564 + ShiftOS_TheReturn/Lib/site-packages/README.txt | 2 + ShiftOS_TheReturn/Lib/site.py | 604 + ShiftOS_TheReturn/Lib/smtpd.py | 555 + ShiftOS_TheReturn/Lib/smtplib.py | 883 ++ ShiftOS_TheReturn/Lib/sndhdr.py | 228 + ShiftOS_TheReturn/Lib/sqlite3/__init__.py | 32 + ShiftOS_TheReturn/Lib/sqlite3/dbapi2.py | 90 + ShiftOS_TheReturn/Lib/sqlite3/dump.py | 70 + ShiftOS_TheReturn/Lib/sre_compile.py | 596 + ShiftOS_TheReturn/Lib/sre_constants.py | 263 + ShiftOS_TheReturn/Lib/sre_parse.py | 834 ++ ShiftOS_TheReturn/Lib/ssl.py | 1037 ++ ShiftOS_TheReturn/Lib/stat.py | 96 + ShiftOS_TheReturn/Lib/statvfs.py | 18 + ShiftOS_TheReturn/Lib/string.py | 656 + ShiftOS_TheReturn/Lib/stringold.py | 432 + ShiftOS_TheReturn/Lib/stringprep.py | 272 + ShiftOS_TheReturn/Lib/struct.py | 3 + ShiftOS_TheReturn/Lib/subprocess.py | 1748 +++ ShiftOS_TheReturn/Lib/sunau.py | 493 + ShiftOS_TheReturn/Lib/sunaudio.py | 49 + ShiftOS_TheReturn/Lib/symbol.py | 114 + ShiftOS_TheReturn/Lib/sysconfig.py | 642 + ShiftOS_TheReturn/Lib/tabnanny.py | 329 + ShiftOS_TheReturn/Lib/tarfile.py | 2628 ++++ ShiftOS_TheReturn/Lib/telnetlib.py | 791 ++ ShiftOS_TheReturn/Lib/tempfile.py | 640 + ShiftOS_TheReturn/Lib/textwrap.py | 429 + ShiftOS_TheReturn/Lib/this.py | 28 + ShiftOS_TheReturn/Lib/threading.py | 1322 ++ ShiftOS_TheReturn/Lib/timeit.py | 343 + ShiftOS_TheReturn/Lib/toaiff.py | 110 + ShiftOS_TheReturn/Lib/token.py | 140 + ShiftOS_TheReturn/Lib/tokenize.py | 449 + ShiftOS_TheReturn/Lib/trace.py | 819 ++ ShiftOS_TheReturn/Lib/traceback.py | 320 + ShiftOS_TheReturn/Lib/types.py | 86 + ShiftOS_TheReturn/Lib/unittest/__init__.py | 69 + ShiftOS_TheReturn/Lib/unittest/__main__.py | 12 + ShiftOS_TheReturn/Lib/unittest/case.py | 1076 ++ ShiftOS_TheReturn/Lib/unittest/loader.py | 316 + ShiftOS_TheReturn/Lib/unittest/main.py | 236 + ShiftOS_TheReturn/Lib/unittest/result.py | 193 + ShiftOS_TheReturn/Lib/unittest/runner.py | 196 + ShiftOS_TheReturn/Lib/unittest/signals.py | 71 + ShiftOS_TheReturn/Lib/unittest/suite.py | 303 + ShiftOS_TheReturn/Lib/unittest/util.py | 156 + ShiftOS_TheReturn/Lib/urllib.py | 1660 +++ ShiftOS_TheReturn/Lib/urllib2.py | 1489 +++ ShiftOS_TheReturn/Lib/urlparse.py | 428 + ShiftOS_TheReturn/Lib/user.py | 48 + ShiftOS_TheReturn/Lib/uu.py | 196 + ShiftOS_TheReturn/Lib/uuid.py | 597 + ShiftOS_TheReturn/Lib/warnings.py | 422 + ShiftOS_TheReturn/Lib/wave.py | 517 + ShiftOS_TheReturn/Lib/weakref.py | 458 + ShiftOS_TheReturn/Lib/webbrowser.py | 704 + ShiftOS_TheReturn/Lib/whichdb.py | 117 + ShiftOS_TheReturn/Lib/wsgiref/__init__.py | 23 + ShiftOS_TheReturn/Lib/wsgiref/handlers.py | 450 + ShiftOS_TheReturn/Lib/wsgiref/headers.py | 169 + ShiftOS_TheReturn/Lib/wsgiref/simple_server.py | 163 + ShiftOS_TheReturn/Lib/wsgiref/util.py | 165 + ShiftOS_TheReturn/Lib/wsgiref/validate.py | 432 + ShiftOS_TheReturn/Lib/xdrlib.py | 248 + ShiftOS_TheReturn/Lib/xml/__init__.py | 41 + ShiftOS_TheReturn/Lib/xml/dom/NodeFilter.py | 27 + ShiftOS_TheReturn/Lib/xml/dom/__init__.py | 139 + ShiftOS_TheReturn/Lib/xml/dom/domreg.py | 99 + ShiftOS_TheReturn/Lib/xml/dom/minicompat.py | 110 + ShiftOS_TheReturn/Lib/xml/dom/minidom.py | 1941 +++ ShiftOS_TheReturn/Lib/xml/dom/pulldom.py | 351 + ShiftOS_TheReturn/Lib/xml/dom/xmlbuilder.py | 386 + ShiftOS_TheReturn/Lib/xml/etree/ElementInclude.py | 142 + ShiftOS_TheReturn/Lib/xml/etree/ElementPath.py | 303 + ShiftOS_TheReturn/Lib/xml/etree/ElementTree.py | 1684 +++ .../Lib/xml/etree/SimpleXMLTreeBuilder.py | 143 + ShiftOS_TheReturn/Lib/xml/etree/__init__.py | 33 + ShiftOS_TheReturn/Lib/xml/parsers/__init__.py | 8 + ShiftOS_TheReturn/Lib/xml/sax/__init__.py | 108 + ShiftOS_TheReturn/Lib/xml/sax/_exceptions.py | 131 + ShiftOS_TheReturn/Lib/xml/sax/handler.py | 342 + ShiftOS_TheReturn/Lib/xml/sax/saxutils.py | 353 + ShiftOS_TheReturn/Lib/xml/sax/xmlreader.py | 381 + ShiftOS_TheReturn/Lib/xmllib.py | 930 ++ ShiftOS_TheReturn/Lib/xmlrpclib.py | 1656 +++ ShiftOS_TheReturn/Lib/zipfile.py | 1541 +++ ShiftOS_TheReturn/Properties/Resources.Designer.cs | 74 +- ShiftOS_TheReturn/Properties/Resources.resx | 3 + ShiftOS_TheReturn/PythonAPI.cs | 309 + ShiftOS_TheReturn/ReflectMan.cs | 45 +- ShiftOS_TheReturn/Resources/pywintemplate.txt | 68 + ShiftOS_TheReturn/ShiftOS.Engine.csproj | 1575 +++ ShiftOS_TheReturn/packages.config | 4 + 535 files changed, 208623 insertions(+), 65 deletions(-) create mode 100644 ShiftOS.WinForms/MainMenu/Loading.Designer.cs create mode 100644 ShiftOS.WinForms/MainMenu/Loading.cs create mode 100644 ShiftOS.WinForms/MainMenu/Loading.resx create mode 100644 ShiftOS_TheReturn/Lib/BaseHTTPServer.py create mode 100644 ShiftOS_TheReturn/Lib/Bastion.py create mode 100644 ShiftOS_TheReturn/Lib/CGIHTTPServer.py create mode 100644 ShiftOS_TheReturn/Lib/ConfigParser.py create mode 100644 ShiftOS_TheReturn/Lib/Cookie.py create mode 100644 ShiftOS_TheReturn/Lib/DocXMLRPCServer.py create mode 100644 ShiftOS_TheReturn/Lib/HTMLParser.py create mode 100644 ShiftOS_TheReturn/Lib/MimeWriter.py create mode 100644 ShiftOS_TheReturn/Lib/Queue.py create mode 100644 ShiftOS_TheReturn/Lib/SimpleHTTPServer.py create mode 100644 ShiftOS_TheReturn/Lib/SimpleXMLRPCServer.py create mode 100644 ShiftOS_TheReturn/Lib/SocketServer.py create mode 100644 ShiftOS_TheReturn/Lib/StringIO.py create mode 100644 ShiftOS_TheReturn/Lib/UserDict.py create mode 100644 ShiftOS_TheReturn/Lib/UserList.py create mode 100644 ShiftOS_TheReturn/Lib/UserString.py create mode 100644 ShiftOS_TheReturn/Lib/_LWPCookieJar.py create mode 100644 ShiftOS_TheReturn/Lib/_MozillaCookieJar.py create mode 100644 ShiftOS_TheReturn/Lib/__future__.py create mode 100644 ShiftOS_TheReturn/Lib/__phello__.foo.py create mode 100644 ShiftOS_TheReturn/Lib/_abcoll.py create mode 100644 ShiftOS_TheReturn/Lib/_osx_support.py create mode 100644 ShiftOS_TheReturn/Lib/_pyio.py create mode 100644 ShiftOS_TheReturn/Lib/_strptime.py create mode 100644 ShiftOS_TheReturn/Lib/_threading_local.py create mode 100644 ShiftOS_TheReturn/Lib/_weakrefset.py create mode 100644 ShiftOS_TheReturn/Lib/abc.py create mode 100644 ShiftOS_TheReturn/Lib/aifc.py create mode 100644 ShiftOS_TheReturn/Lib/antigravity.py create mode 100644 ShiftOS_TheReturn/Lib/anydbm.py create mode 100644 ShiftOS_TheReturn/Lib/argparse.py create mode 100644 ShiftOS_TheReturn/Lib/ast.py create mode 100644 ShiftOS_TheReturn/Lib/asynchat.py create mode 100644 ShiftOS_TheReturn/Lib/asyncore.py create mode 100644 ShiftOS_TheReturn/Lib/atexit.py create mode 100644 ShiftOS_TheReturn/Lib/audiodev.py create mode 100644 ShiftOS_TheReturn/Lib/base64.py create mode 100644 ShiftOS_TheReturn/Lib/bdb.py create mode 100644 ShiftOS_TheReturn/Lib/binhex.py create mode 100644 ShiftOS_TheReturn/Lib/bisect.py create mode 100644 ShiftOS_TheReturn/Lib/calendar.py create mode 100644 ShiftOS_TheReturn/Lib/cgi.py create mode 100644 ShiftOS_TheReturn/Lib/cgitb.py create mode 100644 ShiftOS_TheReturn/Lib/chunk.py create mode 100644 ShiftOS_TheReturn/Lib/cmd.py create mode 100644 ShiftOS_TheReturn/Lib/code.py create mode 100644 ShiftOS_TheReturn/Lib/codecs.py create mode 100644 ShiftOS_TheReturn/Lib/codeop.py create mode 100644 ShiftOS_TheReturn/Lib/collections.py create mode 100644 ShiftOS_TheReturn/Lib/colorsys.py create mode 100644 ShiftOS_TheReturn/Lib/commands.py create mode 100644 ShiftOS_TheReturn/Lib/compileall.py create mode 100644 ShiftOS_TheReturn/Lib/contextlib.py create mode 100644 ShiftOS_TheReturn/Lib/cookielib.py create mode 100644 ShiftOS_TheReturn/Lib/copy.py create mode 100644 ShiftOS_TheReturn/Lib/csv.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/_endian.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/macholib/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/macholib/dyld.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/macholib/dylib.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/macholib/framework.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/util.py create mode 100644 ShiftOS_TheReturn/Lib/ctypes/wintypes.py create mode 100644 ShiftOS_TheReturn/Lib/decimal.py create mode 100644 ShiftOS_TheReturn/Lib/difflib.py create mode 100644 ShiftOS_TheReturn/Lib/dircache.py create mode 100644 ShiftOS_TheReturn/Lib/dis.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/archive_util.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/bcppcompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/ccompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/cmd.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/bdist.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/bdist_dumb.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/bdist_rpm.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/bdist_wininst.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/build.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/build_clib.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/build_ext.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/build_py.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/build_scripts.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/check.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/clean.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/config.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install_data.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install_egg_info.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install_headers.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install_lib.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/install_scripts.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/register.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/sdist.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/command/upload.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/config.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/core.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/cygwinccompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/debug.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/dep_util.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/dir_util.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/dist.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/emxccompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/errors.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/extension.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/fancy_getopt.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/file_util.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/filelist.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/log.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/msvccompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/spawn.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/sysconfig.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/text_file.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/unixccompiler.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/util.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/version.py create mode 100644 ShiftOS_TheReturn/Lib/distutils/versionpredicate.py create mode 100644 ShiftOS_TheReturn/Lib/doctest.py create mode 100644 ShiftOS_TheReturn/Lib/dumbdbm.py create mode 100644 ShiftOS_TheReturn/Lib/dummy_thread.py create mode 100644 ShiftOS_TheReturn/Lib/dummy_threading.py create mode 100644 ShiftOS_TheReturn/Lib/email/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/email/_parseaddr.py create mode 100644 ShiftOS_TheReturn/Lib/email/base64mime.py create mode 100644 ShiftOS_TheReturn/Lib/email/charset.py create mode 100644 ShiftOS_TheReturn/Lib/email/encoders.py create mode 100644 ShiftOS_TheReturn/Lib/email/errors.py create mode 100644 ShiftOS_TheReturn/Lib/email/feedparser.py create mode 100644 ShiftOS_TheReturn/Lib/email/generator.py create mode 100644 ShiftOS_TheReturn/Lib/email/header.py create mode 100644 ShiftOS_TheReturn/Lib/email/iterators.py create mode 100644 ShiftOS_TheReturn/Lib/email/message.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/application.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/audio.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/base.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/image.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/message.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/multipart.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/nonmultipart.py create mode 100644 ShiftOS_TheReturn/Lib/email/mime/text.py create mode 100644 ShiftOS_TheReturn/Lib/email/parser.py create mode 100644 ShiftOS_TheReturn/Lib/email/quoprimime.py create mode 100644 ShiftOS_TheReturn/Lib/email/utils.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/aliases.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/ascii.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/base64_codec.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/bz2_codec.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/charmap.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp037.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1006.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1026.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1140.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1250.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1251.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1252.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1253.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1254.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1255.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1256.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1257.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp1258.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp424.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp437.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp500.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp720.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp737.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp775.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp850.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp852.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp855.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp856.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp857.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp858.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp860.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp861.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp862.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp863.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp864.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp865.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp866.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp869.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp874.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/cp875.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/hex_codec.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/hp_roman8.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/idna.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_1.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_10.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_11.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_13.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_14.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_15.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_16.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_2.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_3.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_4.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_5.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_6.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_7.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_8.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/iso8859_9.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/koi8_r.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/koi8_u.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/latin_1.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_arabic.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_centeuro.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_croatian.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_cyrillic.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_farsi.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_greek.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_iceland.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_latin2.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_roman.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_romanian.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mac_turkish.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/mbcs.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/palmos.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/ptcp154.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/punycode.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/quopri_codec.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/raw_unicode_escape.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/rot_13.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/string_escape.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/tis_620.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/undefined.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/unicode_escape.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/unicode_internal.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_16.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_16_be.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_16_le.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_32.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_32_be.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_32_le.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_7.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_8.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/utf_8_sig.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/uu_codec.py create mode 100644 ShiftOS_TheReturn/Lib/encodings/zlib_codec.py create mode 100644 ShiftOS_TheReturn/Lib/ensurepip/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/ensurepip/__main__.py create mode 100644 ShiftOS_TheReturn/Lib/ensurepip/_bundled/pip-8.1.1-py2.py3-none-any.whl create mode 100644 ShiftOS_TheReturn/Lib/ensurepip/_bundled/setuptools-20.10.1-py2.py3-none-any.whl create mode 100644 ShiftOS_TheReturn/Lib/ensurepip/_uninstall.py create mode 100644 ShiftOS_TheReturn/Lib/filecmp.py create mode 100644 ShiftOS_TheReturn/Lib/fileinput.py create mode 100644 ShiftOS_TheReturn/Lib/fnmatch.py create mode 100644 ShiftOS_TheReturn/Lib/formatter.py create mode 100644 ShiftOS_TheReturn/Lib/fpformat.py create mode 100644 ShiftOS_TheReturn/Lib/fractions.py create mode 100644 ShiftOS_TheReturn/Lib/ftplib.py create mode 100644 ShiftOS_TheReturn/Lib/functools.py create mode 100644 ShiftOS_TheReturn/Lib/genericpath.py create mode 100644 ShiftOS_TheReturn/Lib/getopt.py create mode 100644 ShiftOS_TheReturn/Lib/getpass.py create mode 100644 ShiftOS_TheReturn/Lib/gettext.py create mode 100644 ShiftOS_TheReturn/Lib/glob.py create mode 100644 ShiftOS_TheReturn/Lib/gzip.py create mode 100644 ShiftOS_TheReturn/Lib/hashlib.py create mode 100644 ShiftOS_TheReturn/Lib/heapq.py create mode 100644 ShiftOS_TheReturn/Lib/hmac.py create mode 100644 ShiftOS_TheReturn/Lib/htmlentitydefs.py create mode 100644 ShiftOS_TheReturn/Lib/htmllib.py create mode 100644 ShiftOS_TheReturn/Lib/httplib.py create mode 100644 ShiftOS_TheReturn/Lib/ihooks.py create mode 100644 ShiftOS_TheReturn/Lib/imaplib.py create mode 100644 ShiftOS_TheReturn/Lib/imghdr.py create mode 100644 ShiftOS_TheReturn/Lib/importlib/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/imputil.py create mode 100644 ShiftOS_TheReturn/Lib/inspect.py create mode 100644 ShiftOS_TheReturn/Lib/io.py create mode 100644 ShiftOS_TheReturn/Lib/json/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/json/decoder.py create mode 100644 ShiftOS_TheReturn/Lib/json/encoder.py create mode 100644 ShiftOS_TheReturn/Lib/json/scanner.py create mode 100644 ShiftOS_TheReturn/Lib/json/tool.py create mode 100644 ShiftOS_TheReturn/Lib/keyword.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/__main__.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/btm_matcher.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/btm_utils.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixer_base.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixer_util.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_apply.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_asserts.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_basestring.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_buffer.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_callable.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_dict.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_except.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_exec.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_execfile.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_exitfunc.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_filter.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_funcattrs.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_future.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_getcwdu.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_has_key.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_idioms.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_import.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_imports.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_imports2.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_input.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_intern.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_isinstance.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_itertools.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_itertools_imports.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_long.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_map.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_metaclass.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_methodattrs.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_ne.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_next.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_nonzero.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_numliterals.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_operator.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_paren.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_print.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_raise.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_raw_input.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_reduce.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_renames.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_repr.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_set_literal.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_standarderror.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_sys_exc.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_throw.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_tuple_params.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_types.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_unicode.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_urllib.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_ws_comma.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_xrange.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_xreadlines.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/fixes/fix_zip.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/main.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/patcomp.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/conv.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/driver.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/grammar.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/literals.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/parse.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/pgen.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/token.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pgen2/tokenize.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pygram.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/pytree.py create mode 100644 ShiftOS_TheReturn/Lib/lib2to3/refactor.py create mode 100644 ShiftOS_TheReturn/Lib/linecache.py create mode 100644 ShiftOS_TheReturn/Lib/locale.py create mode 100644 ShiftOS_TheReturn/Lib/logging/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/logging/config.py create mode 100644 ShiftOS_TheReturn/Lib/logging/handlers.py create mode 100644 ShiftOS_TheReturn/Lib/macpath.py create mode 100644 ShiftOS_TheReturn/Lib/macurl2path.py create mode 100644 ShiftOS_TheReturn/Lib/mailbox.py create mode 100644 ShiftOS_TheReturn/Lib/mailcap.py create mode 100644 ShiftOS_TheReturn/Lib/markupbase.py create mode 100644 ShiftOS_TheReturn/Lib/md5.py create mode 100644 ShiftOS_TheReturn/Lib/mhlib.py create mode 100644 ShiftOS_TheReturn/Lib/mimetools.py create mode 100644 ShiftOS_TheReturn/Lib/mimetypes.py create mode 100644 ShiftOS_TheReturn/Lib/mimify.py create mode 100644 ShiftOS_TheReturn/Lib/modulefinder.py create mode 100644 ShiftOS_TheReturn/Lib/multifile.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/connection.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/dummy/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/dummy/connection.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/forking.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/heap.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/managers.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/pool.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/process.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/queues.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/reduction.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/sharedctypes.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/synchronize.py create mode 100644 ShiftOS_TheReturn/Lib/multiprocessing/util.py create mode 100644 ShiftOS_TheReturn/Lib/mutex.py create mode 100644 ShiftOS_TheReturn/Lib/netrc.py create mode 100644 ShiftOS_TheReturn/Lib/new.py create mode 100644 ShiftOS_TheReturn/Lib/nntplib.py create mode 100644 ShiftOS_TheReturn/Lib/ntpath.py create mode 100644 ShiftOS_TheReturn/Lib/nturl2path.py create mode 100644 ShiftOS_TheReturn/Lib/numbers.py create mode 100644 ShiftOS_TheReturn/Lib/opcode.py create mode 100644 ShiftOS_TheReturn/Lib/optparse.py create mode 100644 ShiftOS_TheReturn/Lib/os.py create mode 100644 ShiftOS_TheReturn/Lib/os2emxpath.py create mode 100644 ShiftOS_TheReturn/Lib/pdb.py create mode 100644 ShiftOS_TheReturn/Lib/pickle.py create mode 100644 ShiftOS_TheReturn/Lib/pickletools.py create mode 100644 ShiftOS_TheReturn/Lib/pipes.py create mode 100644 ShiftOS_TheReturn/Lib/pkgutil.py create mode 100644 ShiftOS_TheReturn/Lib/platform.py create mode 100644 ShiftOS_TheReturn/Lib/plistlib.py create mode 100644 ShiftOS_TheReturn/Lib/popen2.py create mode 100644 ShiftOS_TheReturn/Lib/poplib.py create mode 100644 ShiftOS_TheReturn/Lib/posixfile.py create mode 100644 ShiftOS_TheReturn/Lib/posixpath.py create mode 100644 ShiftOS_TheReturn/Lib/pprint.py create mode 100644 ShiftOS_TheReturn/Lib/profile.py create mode 100644 ShiftOS_TheReturn/Lib/pstats.py create mode 100644 ShiftOS_TheReturn/Lib/py_compile.py create mode 100644 ShiftOS_TheReturn/Lib/pyclbr.py create mode 100644 ShiftOS_TheReturn/Lib/pydoc.py create mode 100644 ShiftOS_TheReturn/Lib/pydoc_data/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/pydoc_data/topics.py create mode 100644 ShiftOS_TheReturn/Lib/quopri.py create mode 100644 ShiftOS_TheReturn/Lib/random.py create mode 100644 ShiftOS_TheReturn/Lib/repr.py create mode 100644 ShiftOS_TheReturn/Lib/rexec.py create mode 100644 ShiftOS_TheReturn/Lib/rfc822.py create mode 100644 ShiftOS_TheReturn/Lib/rlcompleter.py create mode 100644 ShiftOS_TheReturn/Lib/robotparser.py create mode 100644 ShiftOS_TheReturn/Lib/runpy.py create mode 100644 ShiftOS_TheReturn/Lib/sched.py create mode 100644 ShiftOS_TheReturn/Lib/sets.py create mode 100644 ShiftOS_TheReturn/Lib/sgmllib.py create mode 100644 ShiftOS_TheReturn/Lib/sha.py create mode 100644 ShiftOS_TheReturn/Lib/shelve.py create mode 100644 ShiftOS_TheReturn/Lib/shlex.py create mode 100644 ShiftOS_TheReturn/Lib/shutil.py create mode 100644 ShiftOS_TheReturn/Lib/site-packages/README.txt create mode 100644 ShiftOS_TheReturn/Lib/site.py create mode 100644 ShiftOS_TheReturn/Lib/smtpd.py create mode 100644 ShiftOS_TheReturn/Lib/smtplib.py create mode 100644 ShiftOS_TheReturn/Lib/sndhdr.py create mode 100644 ShiftOS_TheReturn/Lib/sqlite3/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/sqlite3/dbapi2.py create mode 100644 ShiftOS_TheReturn/Lib/sqlite3/dump.py create mode 100644 ShiftOS_TheReturn/Lib/sre_compile.py create mode 100644 ShiftOS_TheReturn/Lib/sre_constants.py create mode 100644 ShiftOS_TheReturn/Lib/sre_parse.py create mode 100644 ShiftOS_TheReturn/Lib/ssl.py create mode 100644 ShiftOS_TheReturn/Lib/stat.py create mode 100644 ShiftOS_TheReturn/Lib/statvfs.py create mode 100644 ShiftOS_TheReturn/Lib/string.py create mode 100644 ShiftOS_TheReturn/Lib/stringold.py create mode 100644 ShiftOS_TheReturn/Lib/stringprep.py create mode 100644 ShiftOS_TheReturn/Lib/struct.py create mode 100644 ShiftOS_TheReturn/Lib/subprocess.py create mode 100644 ShiftOS_TheReturn/Lib/sunau.py create mode 100644 ShiftOS_TheReturn/Lib/sunaudio.py create mode 100644 ShiftOS_TheReturn/Lib/symbol.py create mode 100644 ShiftOS_TheReturn/Lib/sysconfig.py create mode 100644 ShiftOS_TheReturn/Lib/tabnanny.py create mode 100644 ShiftOS_TheReturn/Lib/tarfile.py create mode 100644 ShiftOS_TheReturn/Lib/telnetlib.py create mode 100644 ShiftOS_TheReturn/Lib/tempfile.py create mode 100644 ShiftOS_TheReturn/Lib/textwrap.py create mode 100644 ShiftOS_TheReturn/Lib/this.py create mode 100644 ShiftOS_TheReturn/Lib/threading.py create mode 100644 ShiftOS_TheReturn/Lib/timeit.py create mode 100644 ShiftOS_TheReturn/Lib/toaiff.py create mode 100644 ShiftOS_TheReturn/Lib/token.py create mode 100644 ShiftOS_TheReturn/Lib/tokenize.py create mode 100644 ShiftOS_TheReturn/Lib/trace.py create mode 100644 ShiftOS_TheReturn/Lib/traceback.py create mode 100644 ShiftOS_TheReturn/Lib/types.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/__main__.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/case.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/loader.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/main.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/result.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/runner.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/signals.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/suite.py create mode 100644 ShiftOS_TheReturn/Lib/unittest/util.py create mode 100644 ShiftOS_TheReturn/Lib/urllib.py create mode 100644 ShiftOS_TheReturn/Lib/urllib2.py create mode 100644 ShiftOS_TheReturn/Lib/urlparse.py create mode 100644 ShiftOS_TheReturn/Lib/user.py create mode 100644 ShiftOS_TheReturn/Lib/uu.py create mode 100644 ShiftOS_TheReturn/Lib/uuid.py create mode 100644 ShiftOS_TheReturn/Lib/warnings.py create mode 100644 ShiftOS_TheReturn/Lib/wave.py create mode 100644 ShiftOS_TheReturn/Lib/weakref.py create mode 100644 ShiftOS_TheReturn/Lib/webbrowser.py create mode 100644 ShiftOS_TheReturn/Lib/whichdb.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/handlers.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/headers.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/simple_server.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/util.py create mode 100644 ShiftOS_TheReturn/Lib/wsgiref/validate.py create mode 100644 ShiftOS_TheReturn/Lib/xdrlib.py create mode 100644 ShiftOS_TheReturn/Lib/xml/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/NodeFilter.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/domreg.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/minicompat.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/minidom.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/pulldom.py create mode 100644 ShiftOS_TheReturn/Lib/xml/dom/xmlbuilder.py create mode 100644 ShiftOS_TheReturn/Lib/xml/etree/ElementInclude.py create mode 100644 ShiftOS_TheReturn/Lib/xml/etree/ElementPath.py create mode 100644 ShiftOS_TheReturn/Lib/xml/etree/ElementTree.py create mode 100644 ShiftOS_TheReturn/Lib/xml/etree/SimpleXMLTreeBuilder.py create mode 100644 ShiftOS_TheReturn/Lib/xml/etree/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/xml/parsers/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/xml/sax/__init__.py create mode 100644 ShiftOS_TheReturn/Lib/xml/sax/_exceptions.py create mode 100644 ShiftOS_TheReturn/Lib/xml/sax/handler.py create mode 100644 ShiftOS_TheReturn/Lib/xml/sax/saxutils.py create mode 100644 ShiftOS_TheReturn/Lib/xml/sax/xmlreader.py create mode 100644 ShiftOS_TheReturn/Lib/xmllib.py create mode 100644 ShiftOS_TheReturn/Lib/xmlrpclib.py create mode 100644 ShiftOS_TheReturn/Lib/zipfile.py create mode 100644 ShiftOS_TheReturn/PythonAPI.cs create mode 100644 ShiftOS_TheReturn/Resources/pywintemplate.txt (limited to 'ShiftOS_TheReturn/ReflectMan.cs') diff --git a/ModLauncher/App.config b/ModLauncher/App.config index 757ddce..4e65683 100644 --- a/ModLauncher/App.config +++ b/ModLauncher/App.config @@ -13,6 +13,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.MFSProfiler/App.config b/ShiftOS.MFSProfiler/App.config index a0a13df..b899c11 100644 --- a/ShiftOS.MFSProfiler/App.config +++ b/ShiftOS.MFSProfiler/App.config @@ -14,6 +14,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.Modding.VB.LegacySkinConverter/App.config b/ShiftOS.Modding.VB.LegacySkinConverter/App.config index 757ddce..4e65683 100644 --- a/ShiftOS.Modding.VB.LegacySkinConverter/App.config +++ b/ShiftOS.Modding.VB.LegacySkinConverter/App.config @@ -13,6 +13,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.Modding.VirtualMachine/App.config b/ShiftOS.Modding.VirtualMachine/App.config index 757ddce..4e65683 100644 --- a/ShiftOS.Modding.VirtualMachine/App.config +++ b/ShiftOS.Modding.VirtualMachine/App.config @@ -13,6 +13,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.Updater/App.config b/ShiftOS.Updater/App.config index 757ddce..4e65683 100644 --- a/ShiftOS.Updater/App.config +++ b/ShiftOS.Updater/App.config @@ -13,6 +13,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.WinForms/App.config b/ShiftOS.WinForms/App.config index a0a13df..b899c11 100644 --- a/ShiftOS.WinForms/App.config +++ b/ShiftOS.WinForms/App.config @@ -14,6 +14,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS.WinForms/MainMenu/Loading.Designer.cs b/ShiftOS.WinForms/MainMenu/Loading.Designer.cs new file mode 100644 index 0000000..95619d9 --- /dev/null +++ b/ShiftOS.WinForms/MainMenu/Loading.Designer.cs @@ -0,0 +1,66 @@ +namespace ShiftOS.WinForms.MainMenu +{ + partial class Loading + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label + // + this.label.Dock = System.Windows.Forms.DockStyle.Fill; + this.label.Font = new System.Drawing.Font("Tahoma", 72F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label.ForeColor = System.Drawing.Color.White; + this.label.Location = new System.Drawing.Point(0, 0); + this.label.Name = "label"; + this.label.Size = new System.Drawing.Size(284, 262); + this.label.TabIndex = 0; + this.label.Text = "Loading..."; + this.label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // Loading + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Black; + this.ClientSize = new System.Drawing.Size(284, 262); + this.Controls.Add(this.label); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Loading"; + this.Text = "Loading"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.Shown += new System.EventHandler(this.Loading_FormShown); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label; + } +} \ No newline at end of file diff --git a/ShiftOS.WinForms/MainMenu/Loading.cs b/ShiftOS.WinForms/MainMenu/Loading.cs new file mode 100644 index 0000000..555f1d4 --- /dev/null +++ b/ShiftOS.WinForms/MainMenu/Loading.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using ShiftOS.Engine; + +namespace ShiftOS.WinForms.MainMenu +{ + public partial class Loading : Form + { + public Loading() + { + InitializeComponent(); + } + + private void Loading_FormShown(object sender, EventArgs e) + { + // This hideous timer thing is the most reliable way to make the form update + // before it starts doing stuff. + var callback = new Timer(); + callback.Tick += (o, a) => { Desktop.CurrentDesktop.Show(); Hide(); callback.Stop(); }; + callback.Interval = 1; + callback.Start(); + } + } +} diff --git a/ShiftOS.WinForms/MainMenu/Loading.resx b/ShiftOS.WinForms/MainMenu/Loading.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/ShiftOS.WinForms/MainMenu/Loading.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ShiftOS.WinForms/MainMenu/MainMenu.cs b/ShiftOS.WinForms/MainMenu/MainMenu.cs index e11edc2..1936fec 100644 --- a/ShiftOS.WinForms/MainMenu/MainMenu.cs +++ b/ShiftOS.WinForms/MainMenu/MainMenu.cs @@ -15,6 +15,11 @@ namespace ShiftOS.WinForms.MainMenu { public partial class MainMenu : Form { + private void StartGame() + { + new Loading().Show(); + } + public MainMenu(IDesktop desk) { InitializeComponent(); @@ -163,7 +168,7 @@ namespace ShiftOS.WinForms.MainMenu private void button2_Click(object sender, EventArgs e) { (Desktop.CurrentDesktop as WinformsDesktop).IsSandbox = true; - Desktop.CurrentDesktop.Show(); + StartGame(); } private void button3_Click(object sender, EventArgs e) @@ -239,7 +244,7 @@ namespace ShiftOS.WinForms.MainMenu private void btncontinue_Click(object sender, EventArgs e) { - Desktop.CurrentDesktop.Show(); + StartGame(); } @@ -253,13 +258,13 @@ namespace ShiftOS.WinForms.MainMenu if (result == true) { System.IO.File.Delete(path); - Desktop.CurrentDesktop.Show(); + StartGame(); } }); } else { - Desktop.CurrentDesktop.Show(); + StartGame(); } } } diff --git a/ShiftOS.WinForms/Properties/Resources.Designer.cs b/ShiftOS.WinForms/Properties/Resources.Designer.cs index 137db4b..2cba3c9 100644 --- a/ShiftOS.WinForms/Properties/Resources.Designer.cs +++ b/ShiftOS.WinForms/Properties/Resources.Designer.cs @@ -1094,7 +1094,7 @@ namespace ShiftOS.WinForms.Properties { /// Name: "NetXtreme Hyper Edition", /// CostPerMonth: 150, /// DownloadSpeed: 524288, //512 kb/s - /// Description: "It's time to supercharge your Shift [rest of string was truncated]";. + /// Description: "It's time to supercharge your Shiftnet experience. [rest of string was truncated]";. /// internal static string ShiftnetServices { get { @@ -1116,7 +1116,8 @@ namespace ShiftOS.WinForms.Properties { /// Name: "Icon Manager", /// Cost: 450, /// Description: "This tool allows you to add and edit application icons within ShiftOS for the small prive of 450 Codepoints!", - /// Dependencies: "skinning [rest of string was truncated]";. + /// Dependencies: "skinning", + /// Category [rest of string was truncated]";. /// internal static string Shiftorium { get { @@ -1126,7 +1127,7 @@ namespace ShiftOS.WinForms.Properties { /// /// Looks up a localized string similar to {\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} - ///{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}{\fl [rest of string was truncated]";. + ///{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}{\flo [rest of string was truncated]";. /// internal static string ShiftOS { get { @@ -1275,7 +1276,8 @@ namespace ShiftOS.WinForms.Properties { ///Eine kurze Erklärung wie du das Terminal benutzt lautet wiefolgt. Du kannst das command 'sos.help' benutzen um eine Liste aller commands aufzurufen. Schreib es ///einfach in das Terminal und drücke <enter> um alle commands anzuzeigen. /// - ///Commands können mit argumenten versehen werden, indem du ein key-value Paar in einem {} Block hinter dem command angibst. Zum Be [rest of string was truncated]";. + ///Commands können mit argumenten versehen werden, indem du ein key-value Paar in einem {} Block hinter dem command angibst. Zum Beispiel: + /// [rest of string was truncated]";. /// internal static string strings_de { get { @@ -1294,7 +1296,8 @@ namespace ShiftOS.WinForms.Properties { ///Commands can be sent arguments by specifying a key-value pair inside a {} block at the end of the command. For example: /// ///some.command{print:\"hello\"} - ///math.add{op1 [rest of string was truncated]";. + ///math.add{op1:1,op2:2} + /// [rest of string was truncated]";. /// internal static string strings_en { get { @@ -1482,7 +1485,7 @@ namespace ShiftOS.WinForms.Properties { /// "Before you can begin with ShiftOS, you'll need to know a few things about it.", /// "One: Terminal command syntax.", /// "Inside ShiftOS, the bulk of your time is going to be spent within the Terminal.", - /// "The Terminal is an application that starts up when you turn on your computer. It allows you to execute system commands, ope [rest of string was truncated]";. + /// "The Terminal is an application that starts up when you turn on your computer. It allows you to execute system commands, open program [rest of string was truncated]";. /// internal static string sys_shiftoriumstory { get { diff --git a/ShiftOS.WinForms/ShiftOS.WinForms.csproj b/ShiftOS.WinForms/ShiftOS.WinForms.csproj index e0a53ea..31de44e 100644 --- a/ShiftOS.WinForms/ShiftOS.WinForms.csproj +++ b/ShiftOS.WinForms/ShiftOS.WinForms.csproj @@ -37,6 +37,7 @@ ..\packages\CommonMark.NET.0.15.0\lib\net45\CommonMark.dll True + ..\packages\NAudio.1.8.0\lib\net35\NAudio.dll @@ -356,6 +357,12 @@ + + Form + + + Loading.cs + Form @@ -609,6 +616,9 @@ GUILogin.cs + + Loading.cs + MainMenu.cs @@ -875,6 +885,7 @@ + diff --git a/ShiftOS_TheReturn/App.config b/ShiftOS_TheReturn/App.config index a0a13df..b899c11 100644 --- a/ShiftOS_TheReturn/App.config +++ b/ShiftOS_TheReturn/App.config @@ -14,6 +14,14 @@ + + + + + + + + \ No newline at end of file diff --git a/ShiftOS_TheReturn/Commands.cs b/ShiftOS_TheReturn/Commands.cs index da4fb29..6f3ab15 100644 --- a/ShiftOS_TheReturn/Commands.cs +++ b/ShiftOS_TheReturn/Commands.cs @@ -804,8 +804,7 @@ shiftorium.buy{{upgrade:""{upg.ID}""}}"); foreach (var type in Array.FindAll(ReflectMan.Types, t => t.GetInterfaces().Contains(typeof(IShiftOSWindow)) && Shiftorium.UpgradeAttributesUnlocked(t))) foreach (var attr in Array.FindAll(type.GetCustomAttributes(false), a => a is WinOpenAttribute)) - if (Shiftorium.UpgradeAttributesUnlocked(type)) - Console.WriteLine("win.open{app:\"" + (attr as WinOpenAttribute).ID + "\"}"); + Console.WriteLine("win.open{app:\"" + (attr as WinOpenAttribute).ID + "\"}"); return true; diff --git a/ShiftOS_TheReturn/Lib/BaseHTTPServer.py b/ShiftOS_TheReturn/Lib/BaseHTTPServer.py new file mode 100644 index 0000000..3df3323 --- /dev/null +++ b/ShiftOS_TheReturn/Lib/BaseHTTPServer.py @@ -0,0 +1,614 @@ +"""HTTP server base class. + +Note: the class in this module doesn't implement any HTTP request; see +SimpleHTTPServer for simple implementations of GET, HEAD and POST +(including CGI scripts). It does, however, optionally implement HTTP/1.1 +persistent connections, as of version 0.3. + +Contents: + +- BaseHTTPRequestHandler: HTTP request handler base class +- test: test function + +XXX To do: + +- log requests even later (to capture byte count) +- log user-agent header and other interesting goodies +- send error log to separate file +""" + + +# See also: +# +# HTTP Working Group T. Berners-Lee +# INTERNET-DRAFT R. T. Fielding +# H. Frystyk Nielsen +# Expires September 8, 1995 March 8, 1995 +# +# URL: http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-v10-spec-00.txt +# +# and +# +# Network Working Group R. Fielding +# Request for Comments: 2616 et al +# Obsoletes: 2068 June 1999 +# Category: Standards Track +# +# URL: http://www.faqs.org/rfcs/rfc2616.html + +# Log files +# --------- +# +# Here's a quote from the NCSA httpd docs about log file format. +# +# | The logfile format is as follows. Each line consists of: +# | +# | host rfc931 authuser [DD/Mon/YYYY:hh:mm:ss] "request" ddd bbbb +# | +# | host: Either the DNS name or the IP number of the remote client +# | rfc931: Any information returned by identd for this person, +# | - otherwise. +# | authuser: If user sent a userid for authentication, the user name, +# | - otherwise. +# | DD: Day +# | Mon: Month (calendar name) +# | YYYY: Year +# | hh: hour (24-hour format, the machine's timezone) +# | mm: minutes +# | ss: seconds +# | request: The first line of the HTTP request as sent by the client. +# | ddd: the status code returned by the server, - if not available. +# | bbbb: the total number of bytes sent, +# | *not including the HTTP/1.0 header*, - if not available +# | +# | You can determine the name of the file accessed through request. +# +# (Actually, the latter is only true if you know the server configuration +# at the time the request was made!) + +__version__ = "0.3" + +__all__ = ["HTTPServer", "BaseHTTPRequestHandler"] + +import sys +import time +import socket # For gethostbyaddr() +from warnings import filterwarnings, catch_warnings +with catch_warnings(): + if sys.py3kwarning: + filterwarnings("ignore", ".*mimetools has been removed", + DeprecationWarning) + import mimetools +import SocketServer + +# Default error message template +DEFAULT_ERROR_MESSAGE = """\ + +Error response + + +

Error response

+

Error code %(code)d. +

Message: %(message)s. +

Error code explanation: %(code)s = %(explain)s. + +""" + +DEFAULT_ERROR_CONTENT_TYPE = "text/html" + +def _quote_html(html): + return html.replace("&", "&").replace("<", "<").replace(">", ">") + +class HTTPServer(SocketServer.TCPServer): + + allow_reuse_address = 1 # Seems to make sense in testing environment + + def server_bind(self): + """Override server_bind to store the server name.""" + SocketServer.TCPServer.server_bind(self) + host, port = self.socket.getsockname()[:2] + self.server_name = socket.getfqdn(host) + self.server_port = port + + +class BaseHTTPRequestHandler(SocketServer.StreamRequestHandler): + + """HTTP request handler base class. + + The following explanation of HTTP serves to guide you through the + code as well as to expose any misunderstandings I may have about + HTTP (so you don't need to read the code to figure out I'm wrong + :-). + + HTTP (HyperText Transfer Protocol) is an extensible protocol on + top of a reliable stream transport (e.g. TCP/IP). The protocol + recognizes three parts to a request: + + 1. One line identifying the request type and path + 2. An optional set of RFC-822-style headers + 3. An optional data part + + The headers and data are separated by a blank line. + + The first line of the request has the form + + + + where is a (case-sensitive) keyword such as GET or POST, + is a string containing path information for the request, + and should be the string "HTTP/1.0" or "HTTP/1.1". + is encoded using the URL encoding scheme (using %xx to signify + the ASCII character with hex code xx). + + The specification specifies that lines are separated by CRLF but + for compatibility with the widest range of clients recommends + servers also handle LF. Similarly, whitespace in the request line + is treated sensibly (allowing multiple spaces between components + and allowing trailing whitespace). + + Similarly, for output, lines ought to be separated by CRLF pairs + but most clients grok LF characters just fine. + + If the first line of the request has the form + + + + (i.e. is left out) then this is assumed to be an HTTP + 0.9 request; this form has no optional headers and data part and + the reply consists of just the data. + + The reply form of the HTTP 1.x protocol again has three parts: + + 1. One line giving the response code + 2. An optional set of RFC-822-style headers + 3. The data + + Again, the headers and data are separated by a blank line. + + The response code line has the form + + + + where is the protocol version ("HTTP/1.0" or "HTTP/1.1"), + is a 3-digit response code indicating success or + failure of the request, and is an optional + human-readable string explaining what the response code means. + + This server parses the request and the headers, and then calls a + function specific to the request type (). Specifically, + a request SPAM will be handled by a method do_SPAM(). If no + such method exists the server sends an error response to the + client. If it exists, it is called with no arguments: + + do_SPAM() + + Note that the request name is case sensitive (i.e. SPAM and spam + are different requests). + + The various request details are stored in instance variables: + + - client_address is the client IP address in the form (host, + port); + + - command, path and version are the broken-down request line; + + - headers is an instance of mimetools.Message (or a derived + class) containing the header information; + + - rfile is a file object open for reading positioned at the + start of the optional input data part; + + - wfile is a file object open for writing. + + IT IS IMPORTANT TO ADHERE TO THE PROTOCOL FOR WRITING! + + The first thing to be written must be the response line. Then + follow 0 or more header lines, then a blank line, and then the + actual data (if any). The meaning of the header lines depends on + the command executed by the server; in most cases, when data is + returned, there should be at least one header line of the form + + Content-type: / + + where and should be registered MIME types, + e.g. "text/html" or "text/plain". + + """ + + # The Python system version, truncated to its first component. + sys_version = "Python/" + sys.version.split()[0] + + # The server software version. You may want to override this. + # The format is multiple whitespace-separated strings, + # where each string is of the form name[/version]. + server_version = "BaseHTTP/" + __version__ + + # The default request version. This only affects responses up until + # the point where the request line is parsed, so it mainly decides what + # the client gets back when sending a malformed request line. + # Most web servers default to HTTP 0.9, i.e. don't send a status line. + default_request_version = "HTTP/0.9" + + def parse_request(self): + """Parse a request (internal). + + The request should be stored in self.raw_requestline; the results + are in self.command, self.path, self.request_version and + self.headers. + + Return True for success, False for failure; on failure, an + error is sent back. + + """ + self.command = None # set in case of error on the first line + self.request_version = version = self.default_request_version + self.close_connection = 1 + requestline = self.raw_requestline + requestline = requestline.rstrip('\r\n') + self.requestline = requestline + words = requestline.split() + if len(words) == 3: + command, path, version = words + if version[:5] != 'HTTP/': + self.send_error(400, "Bad request version (%r)" % version) + return False + try: + base_version_number = version.split('/', 1)[1] + version_number = base_version_number.split(".") + # RFC 2145 section 3.1 says there can be only one "." and + # - major and minor numbers MUST be treated as + # separate integers; + # - HTTP/2.4 is a lower version than HTTP/2.13, which in + # turn is lower than HTTP/12.3; + # - Leading zeros MUST be ignored by recipients. + if len(version_number) != 2: + raise ValueError + version_number = int(version_number[0]), int(version_number[1]) + except (ValueError, IndexError): + self.send_error(400, "Bad request version (%r)" % version) + return False + if version_number >= (1, 1) and self.protocol_version >= "HTTP/1.1": + self.close_connection = 0 + if version_number >= (2, 0): + self.send_error(505, + "Invalid HTTP Version (%s)" % base_version_number) + return False + elif len(words) == 2: + command, path = words + self.close_connection = 1 + if command != 'GET': + self.send_error(400, + "Bad HTTP/0.9 request type (%r)" % command) + return False + elif not words: + return False + else: + self.send_error(400, "Bad request syntax (%r)" % requestline) + return False + self.command, self.path, self.request_version = command, path, version + + # Examine the headers and look for a Connection directive + self.headers = self.MessageClass(self.rfile, 0) + + conntype = self.headers.get('Connection', "") + if conntype.lower() == 'close': + self.close_connection = 1 + elif (conntype.lower() == 'keep-alive' and + self.protocol_version >= "HTTP/1.1"): + self.close_connection = 0 + return True + + def handle_one_request(self): + """Handle a single HTTP request. + + You normally don't need to override this method; see the class + __doc__ string for information on how to handle specific HTTP + commands such as GET and POST. + + """ + try: + self.raw_requestline = self.rfile.readline(65537) + if len(self.raw_requestline) > 65536: + self.requestline = '' + self.request_version = '' + self.command = '' + self.send_error(414) + return + if not self.raw_requestline: + self.close_connection = 1 + return + if not self.parse_request(): + # An error code has been sent, just exit + return + mname = 'do_' + self.command + if not hasattr(self, mname): + self.send_error(501, "Unsupported method (%r)" % self.command) + return + method = getattr(self, mname) + method() + self.wfile.flush() #actually send the response if not already done. + except socket.timeout, e: + #a read or a write timed out. Discard this connection + self.log_error("Request timed out: %r", e) + self.close_connection = 1 + return + + def handle(self): + """Handle multiple requests if necessary.""" + self.close_connection = 1 + + self.handle_one_request() + while not self.close_connection: + self.handle_one_request() + + def send_error(self, code, message=None): + """Send and log an error reply. + + Arguments are the error code, and a detailed message. + The detailed message defaults to the short entry matching the + response code. + + This sends an error response (so it must be called before any + output has been generated), logs the error, and finally sends + a piece of HTML explaining the error to the user. + + """ + + try: + short, long = self.responses[code] + except KeyError: + short, long = '???', '???' + if message is None: + message = short + explain = long + self.log_error("code %d, message %s", code, message) + self.send_response(code, message) + self.send_header('Connection', 'close') + + # Message body is omitted for cases described in: + # - RFC7230: 3.3. 1xx, 204(No Content), 304(Not Modified) + # - RFC7231: 6.3.6. 205(Reset Content) + content = None + if code >= 200 and code not in (204, 205, 304): + # HTML encode to prevent Cross Site Scripting attacks + # (see bug #1100201) + content = (self.error_message_format % { + 'code': code, + 'message': _quote_html(message), + 'explain': explain + }) + self.send_header("Content-Type", self.error_content_type) + self.end_headers() + + if self.command != 'HEAD' and content: + self.wfile.write(content) + + error_message_format = DEFAULT_ERROR_MESSAGE + error_content_type = DEFAULT_ERROR_CONTENT_TYPE + + def send_response(self, code, message=None): + """Send the response header and log the response code. + + Also send two standard headers with the server software + version and the current date. + + """ + self.log_request(code) + if message is None: + if code in self.responses: + message = self.responses[code][0] + else: + message = '' + if self.request_version != 'HTTP/0.9': + self.wfile.write("%s %d %s\r\n" % + (self.protocol_version, code, message)) + # print (self.protocol_version, code, message) + self.send_header('Server', self.version_string()) + self.send_header('Date', self.date_time_string()) + + def send_header(self, keyword, value): + """Send a MIME header.""" + if self.request_version != 'HTTP/0.9': + self.wfile.write("%s: %s\r\n" % (keyword, value)) + + if keyword.lower() == 'connection': + if value.lower() == 'close': + self.close_connection = 1 + elif value.lower() == 'keep-alive': + self.close_connection = 0 + + def end_headers(self): + """Send the blank line ending the MIME headers.""" + if self.request_version != 'HTTP/0.9': + self.wfile.write("\r\n") + + def log_request(self, code='-', size='-'): + """Log an accepted request. + + This is called by send_response(). + + """ + + self.log_message('"%s" %s %s', + self.requestline, str(code), str(size)) + + def log_error(self, format, *args): + """Log an error. + + This is called when a request cannot be fulfilled. By + default it passes the message on to log_message(). + + Arguments are the same as for log_message(). + + XXX This should go to the separate error log. + + """ + + self.log_message(format, *args) + + def log_message(self, format, *args): + """Log an arbitrary message. + + This is used by all other logging functions. Override + it if you have specific logging wishes. + + The first argument, FORMAT, is a format string for the + message to be logged. If the format string contains + any % escapes requiring parameters, they should be + specified as subsequent arguments (it's just like + printf!). + + The client ip address and current date/time are prefixed to every + message. + + """ + + sys.stderr.write("%s - - [%s] %s\n" % + (self.client_address[0], + self.log_date_time_string(), + format%args)) + + def version_string(self): + """Return the server software version string.""" + return self.server_version + ' ' + self.sys_version + + def date_time_string(self, timestamp=None): + """Return the current date and time formatted for a message header.""" + if timestamp is None: + timestamp = time.time() + year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp) + s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( + self.weekdayname[wd], + day, self.monthname[month], year, + hh, mm, ss) + return s + + def log_date_time_string(self): + """Return the current time formatted for logging.""" + now = time.time() + year, month, day, hh, mm, ss, x, y, z = time.localtime(now) + s = "%02d/%3s/%04d %02d:%02d:%02d" % ( + day, self.monthname[month], year, hh, mm, ss) + return s + + weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] + + monthname = [None, + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] + + def address_string(self): + """Return the client address formatted for logging. + + This version looks up the full hostname using gethostbyaddr(), + and tries to find a name that contains at least one dot. + + """ + + host, port = self.client_address[:2] + return socket.getfqdn(host) + + # Essentially static class variables + + # The version of the HTTP protocol we support. + # Set this to HTTP/1.1 to enable automatic keepalive + protocol_version = "HTTP/1.0" + + # The Message-like class used to parse headers + MessageClass = mimetools.Message + + # Table mapping response codes to messages; entries have the + # form {code: (shortmessage, longmessage)}. + # See RFC 2616. + responses = { + 100: ('Continue', 'Request received, please continue'), + 101: ('Switching Protocols', + 'Switching to new protocol; obey Upgrade header'), + + 200: ('OK', 'Request fulfilled, document follows'), + 201: ('Created', 'Document created, URL follows'), + 202: ('Accepted', + 'Request accepted, processing continues off-line'), + 203: ('Non-Authoritative Information', 'Request fulfilled from cache'), + 204: ('No Content', 'Request fulfilled, nothing follows'), + 205: ('Reset Content', 'Clear input form for further input.'), + 206: ('Partial Content', 'Partial content follows.'), + + 300: ('Multiple Choices', + 'Object has several resources -- see URI list'), + 301: ('Moved Permanently', 'Object moved permanently -- see URI list'), + 302: ('Found', 'Object moved temporarily -- see URI list'), + 303: ('See Other', 'Object moved -- see Method and URL list'), + 304: ('Not Modified', + 'Document has not changed since given time'), + 305: ('Use Proxy', + 'You must use proxy specified in Location to access this ' + 'resource.'), + 307: ('Temporary Redirect', + 'Object moved temporarily -- see URI list'), + + 400: ('Bad Request', + 'Bad request syntax or unsupported method'), + 401: ('Unauthorized', + 'No permission -- see authorization schemes'), + 402: ('Payment Required', + 'No payment -- see charging schemes'), + 403: ('Forbidden', + 'Request forbidden -- authorization will not help'), + 404: ('Not Found', 'Nothing matches the given URI'), + 405: ('Method Not Allowed', + 'Specified method is invalid for this resource.'), + 406: ('Not Acceptable', 'URI not available in preferred format.'), + 407: ('Proxy Authentication Required', 'You must authenticate with ' + 'this proxy before proceeding.'), + 408: ('Request Timeout', 'Request timed out; try again later.'), + 409: ('Conflict', 'Request conflict.'), + 410: ('Gone', + 'URI no longer exists and has been permanently removed.'), + 411: ('Length Required', 'Client must specify Content-Length.'), + 412: ('Precondition Failed', 'Precondition in headers is false.'), + 413: ('Request Entity Too Large', 'Entity is too large.'), + 414: ('Request-URI Too Long', 'URI is too long.'), + 415: ('Unsupported Media Type', 'Entity body in unsupported format.'), + 416: ('Requested Range Not Satisfiable', + 'Cannot satisfy request range.'), + 417: ('Expectation Failed', + 'Expect condition could not be satisfied.'), + + 500: ('Internal Server Error', 'Server got itself in trouble'), + 501: ('Not Implemented', + 'Server does not support this operation'), + 502: ('Bad Gateway', 'Invalid responses from another server/proxy.'), + 503: ('Service Unavailable', + 'The server cannot process the request due to a high load'), + 504: ('Gateway Timeout', + 'The gateway server did not receive a timely response'), + 505: ('HTTP Version Not Supported', 'Cannot fulfill request.'), + } + + +def test(HandlerClass = BaseHTTPRequestHandler, + ServerClass = HTTPServer, protocol="HTTP/1.0"): + """Test the HTTP request handler class. + + This runs an HTTP server on port 8000 (or the first command line + argument). + + """ + + if sys.argv[1:]: + port = int(sys.argv[1]) + else: + port = 8000 + server_address = ('', port) + + HandlerClass.protocol_version = protocol + httpd = ServerClass(server_address, HandlerClass) + + sa = httpd.socket.getsockname() + print "Serving HTTP on", sa[0], "port", sa[1], "..." + httpd.serve_forever() + + +if __name__ == '__main__': + test() diff --git a/ShiftOS_TheReturn/Lib/Bastion.py b/ShiftOS_TheReturn/Lib/Bastion.py new file mode 100644 index 0000000..d0dddbf --- /dev/null +++ b/ShiftOS_TheReturn/Lib/Bastion.py @@ -0,0 +1,180 @@ +"""Bastionification utility. + +A bastion (for another object -- the 'original') is an object that has +the same methods as the original but does not give access to its +instance variables. Bastions have a number of uses, but the most +obvious one is to provide code executing in restricted mode with a +safe interface to an object implemented in unrestricted mode. + +The bastionification routine has an optional second argument which is +a filter function. Only those methods for which the filter method +(called with the method name as argument) returns true are accessible. +The default filter method returns true unless the method name begins +with an underscore. + +There are a number of possible implementations of bastions. We use a +'lazy' approach where the bastion's __getattr__() discipline does all +the work for a particular method the first time it is used. This is +usually fastest, especially if the user doesn't call all available +methods. The retrieved methods are stored as instance variables of +the bastion, so the overhead is only occurred on the first use of each +method. + +Detail: the bastion class has a __repr__() discipline which includes +the repr() of the original object. This is precomputed when the +bastion is created. + +""" +from warnings import warnpy3k +warnpy3k("the Bastion module has been removed in Python 3.0", stacklevel=2) +del warnpy3k + +__all__ = ["BastionClass", "Bastion"] + +from types import MethodType + + +class BastionClass: + + """Helper class used by the Bastion() function. + + You could subclass this and pass the subclass as the bastionclass + argument to the Bastion() function, as long as the constructor has + the same signature (a get() function and a name for the object). + + """ + + def __init__(self, get, name): + """Constructor. + + Arguments: + + get - a function that gets the attribute value (by name) + name - a human-readable name for the original object + (suggestion: use repr(object)) + + """ + self._get_ = get + self._name_ = name + + def __repr__(self): + """Return a representation string. + + This includes the name passed in to the constructor, so that + if you print the bastion during debugging, at least you have + some idea of what it is. + + """ + return "" % self._name_ + + def __getattr__(self, name): + """Get an as-yet undefined attribute value. + + This calls the get() function that was passed to the + constructor. The result is stored as an instance variable so + that the next time the same attribute is requested, + __getattr__() won't be invoked. + + If the get() function raises an exception, this is simply + passed on -- exceptions are not cached. + + """ + attribute = self._get_(name) + self.__dict__[name] = attribute + return attribute + + +def Bastion(object, filter = lambda name: name[:1] != '_', + name=None, bastionclass=BastionClass): + """Create a bastion for an object, using an optional filter. + + See the Bastion module's documentation for background. + + Arguments: + + object - the original object + filter - a predicate that decides whether a function name is OK; + by default all names are OK that don't start with '_' + name - the name of the object; default repr(object) + bastionclass - class used to create the bastion; default BastionClass + + """ + + raise RuntimeError, "This code is not secure in Python 2.2 and later" + + # Note: we define *two* ad-hoc functions here, get1 and get2. + # Both are intended to be called in the same way: get(name). + # It is clear that the real work (getting the attribute + # from the object and calling the filter) is done in get1. + # Why can't we pass get1 to the bastion? Because the user + # would be able to override the filter argument! With get2, + # overriding the default argument is no security loophole: + # all it does is call it. + # Also notice that we can't place the object and filter as + # instance variables on the bastion object itself, since + # the user has full access to all instance variables! + + def get1(name, object=object, filter=filter): + """Internal function for Bastion(). See source comments.""" + if filter(name): + attribute = getattr(object, name) + if type(attribute) == MethodType: + return attribute + raise AttributeError, name + + def get2(name, get1=get1): + """Internal function for Bastion(). See source comments.""" + return get1(name) + + if name is None: + name = repr(object) + return bastionclass(get2, name) + + +def _test(): + """Test the Bastion() function.""" + class Original: + def __init__(self): + self.sum = 0 + def add(self, n): + self._add(n) + def _add(self, n): + self.sum = self.sum + n + def total(self): + return self.sum + o = Original() + b = Bastion(o) + testcode = """if 1: + b.add(81) + b.add(18) + print "b.total() =", b.total() + try: + print "b.sum =", b.sum, + except: + print "inaccessible" + else: + print "accessible" + try: + print "b._add =", b._add, + except: + print "inaccessible" + else: + print "accessible" + try: + print "b._get_.func_defaults =", map(type, b._get_.func_defaults), + except: + print "inaccessible" + else: + print "accessible" + \n""" + exec testcode + print '='*20, "Using rexec:", '='*20 + import rexec + r = rexec.RExec() + m = r.add_module('__main__') + m.b = b + r.r_exec(testcode) + + +if __name__ == '__main__': + _test() diff --git a/ShiftOS_TheReturn/Lib/CGIHTTPServer.py b/ShiftOS_TheReturn/Lib/CGIHTTPServer.py new file mode 100644 index 0000000..5620083 --- /dev/null +++ b/ShiftOS_TheReturn/Lib/CGIHTTPServer.py @@ -0,0 +1,378 @@ +"""CGI-savvy HTTP Server. + +This module builds on SimpleHTTPServer by implementing GET and POST +requests to cgi-bin scripts. + +If the os.fork() function is not present (e.g. on Windows), +os.popen2() is used as a fallback, with slightly altered semantics; if +that function is not present either (e.g. on Macintosh), only Python +scripts are supported, and they are executed by the current process. + +In all cases, the implementation is intentionally naive -- all +requests are executed sychronously. + +SECURITY WARNING: DON'T USE THIS CODE UNLESS YOU ARE INSIDE A FIREWALL +-- it may execute arbitrary Python code or external programs. + +Note that status code 200 is sent prior to execution of a CGI script, so +scripts cannot send other status codes such as 302 (redirect). +""" + + +__version__ = "0.4" + +__all__ = ["CGIHTTPRequestHandler"] + +import os +import sys +import urllib +import BaseHTTPServer +import SimpleHTTPServer +import select +import copy + + +class CGIHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): + + """Complete HTTP server with GET, HEAD and POST commands. + + GET and HEAD also support running CGI scripts. + + The POST command is *only* implemented for CGI scripts. + + """ + + # Determine platform specifics + have_fork = hasattr(os, 'fork') + have_popen2 = hasattr(os, 'popen2') + have_popen3 = hasattr(os, 'popen3') + + # Make rfile unbuffered -- we need to read one line and then pass + # the rest to a subprocess, so we can't use buffered input. + rbufsize = 0 + + def do_POST(self): + """Serve a POST request. + + This is only implemented for CGI scripts. + + """ + + if self.is_cgi(): + self.run_cgi() + else: + self.send_error(501, "Can only POST to CGI scripts") + + def send_head(self): + """Version of send_head that support CGI scripts""" + if self.is_cgi(): + return self.run_cgi() + else: + return SimpleHTTPServer.SimpleHTTPRequestHandler.send_head(self) + + def is_cgi(self): + """Test whether self.path corresponds to a CGI script. + + Returns True and updates the cgi_info attribute to the tuple + (dir, rest) if self.path requires running a CGI script. + Returns False otherwise. + + If any exception is raised, the caller should assume that + self.path was rejected as invalid and act accordingly. + + The default implementation tests whether the normalized url + path begins with one of the strings in self.cgi_directories + (and the next character is a '/' or the end of the string). + """ + collapsed_path = _url_collapse_path(self.path) + dir_sep = collapsed_path.find('/', 1) + head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:] + if head in self.cgi_directories: + self.cgi_info = head, tail + return True + return False + + cgi_directories = ['/cgi-bin', '/htbin'] + + def is_executable(self, path): + """Test whether argument path is an executable file.""" + return executable(path) + + def is_python(self, path): + """Test whether argument path is a Python script.""" + head, tail = os.path.splitext(path) + return tail.lower() in (".py", ".pyw") + + def run_cgi(self): + """Execute a CGI script.""" + dir, rest = self.cgi_info + path = dir + '/' + rest + i = path.find('/', len(dir)+1) + while i >= 0: + nextdir = path[:i] + nextrest = path[i+1:] + + scriptdir = self.translate_path(nextdir) + if os.path.isdir(scriptdir): + dir, rest = nextdir, nextrest + i = path.find('/', len(dir)+1) + else: + break + + # find an explicit query string, if present. + rest, _, query = rest.partition('?') + + # dissect the part after the directory name into a script name & + # a possible additional path, to be stored in PATH_INFO. + i = rest.find('/') + if i >= 0: + script, rest = rest[:i], rest[i:] + else: + script, rest = rest, '' + + scriptname = dir + '/' + script + scriptfile = self.translate_path(scriptname) + if not os.path.exists(scriptfile): + self.send_error(404, "No such CGI script (%r)" % scriptname) + return + if not os.path.isfile(scriptfile): + self.send_error(403, "CGI script is not a plain file (%r)" % + scriptname) + return + ispy = self.is_python(scriptname) + if not ispy: + if not (self.have_fork or self.have_popen2 or self.have_popen3): + self.send_error(403, "CGI script is not a Python script (%r)" % + scriptname) + return + if not self.is_executable(scriptfile): + self.send_error(403, "CGI script is not executable (%r)" % + scriptname) + return + + # Reference: http://hoohoo.ncsa.uiuc.edu/cgi/env.html + # XXX Much of the following could be prepared ahead of time! + env = copy.deepcopy(os.environ) + env['SERVER_SOFTWARE'] = self.version_string() + env['SERVER_NAME'] = self.server.server_name + env['GATEWAY_INTERFACE'] = 'CGI/1.1' + env['SERVER_PROTOCOL'] = self.protocol_version + env['SERVER_PORT'] = str(self.server.server_port) + env['REQUEST_METHOD'] = self.command + uqrest = urllib.unquote(rest) + env['PATH_INFO'] = uqrest + env['PATH_TRANSLATED'] = self.translate_path(uqrest) + env['SCRIPT_NAME'] = scriptname + if query: + env['QUERY_STRING'] = query + host = self.address_string() + if host != self.client_address[0]: + env['REMOTE_HOST'] = host + env['REMOTE_ADDR'] = self.client_address[0] + authorization = self.headers.getheader("authorization") + if authorization: + authorization = authorization.split() + if len(authorization) == 2: + import base64, binascii + env['AUTH_TYPE'] = authorization[0] + if authorization[0].lower() == "basic": + try: + authorization = base64.decodestring(authorization[1]) + except binascii.Error: + pass + else: + authorization = authorization.split(':') + if len(authorization) == 2: + env['REMOTE_USER'] = authorization[0] + # XXX REMOTE_IDENT + if self.headers.typeheader is None: + env['CONTENT_TYPE'] = self.headers.type + else: + env['CONTENT_TYPE'] = self.headers.typeheader + length = self.headers.getheader('content-length') + if length: + env['CONTENT_LENGTH'] = length + referer = self.headers.getheader('referer') + if referer: + env['HTTP_REFERER'] = referer + accept = [] + for line in self.headers.getallmatchingheaders('accept'): + if line[:1] in "\t\n\r ": + accept.append(line.strip()) + else: + accept = accept + line[7:].split(',') + env['HTTP_ACCEPT'] = ','.join(accept) + ua = self.headers.getheader('user-agent') + if ua: + env['HTTP_USER_AGENT'] = ua + co = filter(None, self.headers.getheaders('cookie')) + if co: + env['HTTP_COOKIE'] = ', '.join(co) + # XXX Other HTTP_* headers + # Since we're setting the env in the parent, provide empty + # values to override previously set values + for k in ('QUERY_STRING', 'REMOTE_HOST', 'CONTENT_LENGTH', + 'HTTP_USER_AGENT', 'HTTP_COOKIE', 'HTTP_REFERER'): + env.setdefault(k, "") + + self.send_response(200, "Script output follows") + + decoded_query = query.replace('+', ' ') + + if self.have_fork: + # Unix -- fork as we should + args = [script] + if '=' not in decoded_query: + args.append(decoded_query) + nobody = nobody_uid() + self.wfile.flush() # Always flush before forking + pid = os.fork() + if pid != 0: + # Parent + pid, sts = os.waitpid(pid, 0) + # throw away additional data [see bug #427345] + while select.select([self.rfile], [], [], 0)[0]: + if not self.rfile.read(1): + break + if sts: + self.log_error("CGI script exit status %#x", sts) + return + # Child + try: + try: + os.setuid(nobody) + except os.error: + pass + os.dup2(self.rfile.fileno(), 0) + os.dup2(self.wfile.fileno(), 1) + os.execve(scriptfile, args, env) + except: + self.server.handle_error(self.request, self.client_address) + os._exit(127) + + else: + # Non Unix - use subprocess + import subprocess + cmdline = [scriptfile] + if self.is_python(scriptfile): + interp = sys.executable + if interp.lower().endswith("w.exe"): + # On Windows, use python.exe, not pythonw.exe + interp = interp[:-5] + interp[-4:] + cmdline = [interp, '-u'] + cmdline + if '=' not in query: + cmdline.append(query) + + self.log_message("command: %s", subprocess.list2cmdline(cmdline)) + try: + nbytes = int(length) + except (TypeError, ValueError): + nbytes = 0 + p = subprocess.Popen(cmdline, + stdin = subprocess.PIPE, + stdout = subprocess.PIPE, + stderr = subprocess.PIPE, + env = env + ) + if self.command.lower() == "post" and nbytes > 0: + data = self.rfile.read(nbytes) + else: + data = None + # throw away additional data [see bug #427345] + while select.select([self.rfile._sock], [], [], 0)[0]: + if not self.rfile._sock.recv(1): + break + stdout, stderr = p.communicate(data) + self.wfile.write(stdout) + if stderr: + self.log_error('%s', stderr) + p.stderr.close() + p.stdout.close() + status = p.returncode + if status: + self.log_error("CGI script exit status %#x", status) + else: + self.log_message("CGI script exited OK") + + +def _url_collapse_path(path): + """ + Given a URL path, remove extra '/'s and '.' path elements and collapse + any '..' references and returns a colllapsed path. + + Implements something akin to RFC-2396 5.2 step 6 to parse relative paths. + The utility of this function is limited to is_cgi method and helps + preventing some security attacks. + + Returns: The reconstituted URL, which will always start with a '/'. + + Raises: IndexError if too many '..' occur within the path. + + """ + # Query component should not be involved. + path, _, query = path.partition('?') + path = urllib.unquote(path) + + # Similar to os.path.split(os.path.normpath(path)) but specific to URL + # path semantics rather than local operating system semantics. + path_parts = path.split('/') + head_parts = [] + for part in path_parts[:-1]: + if part == '..': + head_parts.pop() # IndexError if more '..' than prior parts + elif part and part != '.': + head_parts.append( part ) + if path_parts: + tail_part = path_parts.pop() + if tail_part: + if tail_part == '..': + head_parts.pop() + tail_part = '' + elif tail_part == '.': + tail_part = '' + else: + tail_part = '' + + if query: + tail_part = '?'.join((tail_part, query)) + + splitpath = ('/' + '/'.join(head_parts), tail_part) + collapsed_path = "/".join(splitpath) + + return collapsed_path + + +nobody = None + +def nobody_uid(): + """Internal routine to get nobody's uid""" + global nobody + if nobody: + return nobody + try: + import pwd + except ImportError: + return -1 + try: + nobody = pwd.getpwnam('nobody')[2] + except KeyError: + nobody = 1 + max(map(lambda x: x[2], pwd.getpwall())) + return nobody + + +def executable(path): + """Test for executable file.""" + try: + st = os.stat(path) + except os.error: + return False + return st.st_mode & 0111 != 0 + + +def test(HandlerClass = CGIHTTPRequestHandler, + ServerClass = BaseHTTPServer.HTTPServer): + SimpleHTTPServer.test(HandlerClass, ServerClass) + + +if __name__ == '__main__': + test() diff --git a/ShiftOS_TheReturn/Lib/ConfigParser.py b/ShiftOS_TheReturn/Lib/ConfigParser.py new file mode 100644 index 0000000..7e6cdbc --- /dev/null +++ b/ShiftOS_TheReturn/Lib/ConfigParser.py @@ -0,0 +1,753 @@ +"""Configuration file parser. + +A setup file consists of sections, lead by a "[section]" header, +and followed by "name: value" entries, with continuations and such in +the style of RFC 822. + +The option values can contain format strings which refer to other values in +the same section, or values in a special [DEFAULT] section. + +For example: + + something: %(dir)s/whatever + +would resolve the "%(dir)s" to the value of dir. All reference +expansions are done late, on demand. + +Intrinsic defaults can be specified by passing them into the +ConfigParser constructor as a dictionary. + +class: + +ConfigParser -- responsible for parsing a list of + configuration files, and managing the parsed database. + + methods: + + __init__(defaults=None) + create the parser and specify a dictionary of intrinsic defaults. The + keys must be strings, the values must be appropriate for %()s string + interpolation. Note that `__name__' is always an intrinsic default; + its value is the section's name. + + sections() + return all the configuration section names, sans DEFAULT + + has_section(section) + return whether the given section exists + + has_option(section, option) + return whether the given option exists in the given section + + options(section) + return list of configuration options for the named section + + read(filenames) + read and parse the list of named configuration files, given by + name. A single filename is also allowed. Non-existing files + are ignored. Return list of successfully read files. + + readfp(fp, filename=None) + read and parse one configuration file, given as a file object. + The filename defaults to fp.name; it is only used in error + messages (if fp has no `name' attribute, the string `' is used). + + get(section, option, raw=False, vars=None) + return a string value for the named option. All % interpolations are + expanded in the return values, based on the defaults passed into the + constructor and the DEFAULT section. Additional substitutions may be + provided using the `vars' argument, which must be a dictionary whose + contents override any pre-existing defaults. + + getint(section, options) + like get(), but convert value to an integer + + getfloat(section, options) + like get(), but convert value to a float + + getboolean(section, options) + like get(), but convert value to a boolean (currently case + insensitively defined as 0, false, no, off for False, and 1, true, + yes, on for True). Returns False or True. + + items(section, raw=False, vars=None) + return a list of tuples with (name, value) for each option + in the section. + + remove_section(section) + remove the given file section and all its options + + remove_option(section, option) + remove the given option from the given section + + set(section, option, value) + set the given option + + write(fp) + write the configuration state in .ini format +""" + +try: + from collections import OrderedDict as _default_dict +except ImportError: + # fallback for setup.py which hasn't yet built _collections + _default_dict = dict + +import re + +__all__ = ["NoSectionError", "DuplicateSectionError", "NoOptionError", + "InterpolationError", "InterpolationDepthError", + "InterpolationSyntaxError", "ParsingError", + "MissingSectionHeaderError", + "ConfigParser", "SafeConfigParser", "RawConfigParser", + "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"] + +DEFAULTSECT = "DEFAULT" + +MAX_INTERPOLATION_DEPTH = 10 + + + +# exception classes +class Error(Exception): + """Base class for ConfigParser exceptions.""" + + def _get_message(self): + """Getter for 'message'; needed only to override deprecation in + BaseException.""" + return self.__message + + def _set_message(self, value): + """Setter for 'message'; needed only to override deprecation in + BaseException.""" + self.__message = value + + # BaseException.message has been deprecated since Python 2.6. To prevent + # DeprecationWarning from popping up over this pre-existing attribute, use + # a new property that takes lookup precedence. + message = property(_get_message, _set_message) + + def __init__(self, msg=''): + self.message = msg + Exception.__init__(self, msg) + + def __repr__(self): + return self.message + + __str__ = __repr__ + +class NoSectionError(Error): + """Raised when no section matches a requested option.""" + + def __init__(self, section): + Error.__init__(self, 'No section: %r' % (section,)) + self.section = section + self.args = (section, ) + +class DuplicateSectionError(Error): + """Raised when a section is multiply-created.""" + + def __init__(self, section): + Error.__init__(self, "Section %r already exists" % section) + self.section = section + self.args = (section, ) + +class NoOptionError(Error): + """A requested option was not found.""" + + def __init__(self, option, section): + Error.__init__(self, "No option %r in section: %r" % + (option, section)) + self.option = option + self.section = section + self.args = (option, section) + +class InterpolationError(Error): + """Base class for interpolation-related exceptions.""" + + def __init__(self, option, section, msg): + Error.__init__(self, msg) + self.option = option + self.section = section + self.args = (option, section, msg) + +class InterpolationMissingOptionError(InterpolationError): + """A string substitution required a setting which was not available.""" + + def __init__(self, option, section, rawval, reference): + msg = ("Bad value substitution:\n" + "\tsection: [%s]\n" + "\toption : %s\n" + "\tkey : %s\n" + "\trawval : %s\n" + % (section, option, reference, rawval)) + InterpolationError.__init__(self, option, section, msg) + self.reference = reference + self.args = (option, section, rawval, reference) + +class InterpolationSyntaxError(InterpolationError): + """Raised when the source text into which substitutions are made + does not conform to the required syntax.""" + +class InterpolationDepthError(InterpolationError): + """Raised when substitutions are nested too deeply.""" + + def __init__(self, option, section, rawval): + msg = ("Value interpolation too deeply recursive:\n" + "\tsection: [%s]\n" + "\toption : %s\n" + "\trawval : %s\n" + % (section, option, rawval)) + InterpolationError.__init__(self, option, section, msg) + self.args = (option, section, rawval) + +class ParsingError(Error): + """Raised when a configuration file does not follow legal syntax.""" + + def __init__(self, filename): + Error.__init__(self, 'File contains parsing errors: %s' % filename) + self.filename = filename + self.errors = [] + self.args = (filename, ) + + def append(self, lineno, line): + self.errors.append((lineno, line)) + self.message += '\n\t[line %2d]: %s' % (lineno, line) + +class MissingSectionHeaderError(ParsingError): + """Raised when a key-value pair is found before any section header.""" + + def __init__(self, filename, lineno, line): + Error.__init__( + self, + 'File contains no section headers.\nfile: %s, line: %d\n%r' % + (filename, lineno, line)) + self.filename = filename + self.lineno = lineno + self.line = line + self.args = (filename, lineno, line) + + +class RawConfigParser: + def __init__(self, defaults=None, dict_type=_default_dict, + allow_no_value=False): + self._dict = dict_type + self._sections = self._dict() + self._defaults = self._dict() + if allow_no_value: + self._optcre = self.OPTCRE_NV + else: + self._optcre = self.OPTCRE + if defaults: + for key, value in defaults.items(): + self._defaults[self.optionxform(key)] = value + + def defaults(self): + return self._defaults + + def sections(self): + """Return a list of section names, excluding [DEFAULT]""" + # self._sections will never have [DEFAULT] in it + return self._sections.keys() + + def add_section(self, section): + """Create a new section in the configuration. + + Raise DuplicateSectionError if a section by the specified name + already exists. Raise ValueError if name is DEFAULT or any of it's + case-insensitive variants. + """ + if section.lower() == "default": + raise ValueError, 'Invalid section name: %s' % section + + if section in self._sections: + raise DuplicateSectionError(section) + self._sections[section] = self._dict() + + def has_section(self, section): + """Indicate whether the named section is present in the configuration. + + The DEFAULT section is not acknowledged. + """ + return section in self._sections + + def options(self, section): + """Return a list of option names for the given section name.""" + try: + opts = self._sections[section].copy() + except KeyError: + raise NoSectionError(section) + opts.update(self._defaults) + if '__name__' in opts: + del opts['__name__'] + return opts.keys() + + def read(self, filenames): + """Read and parse a filename or a list of filenames. + + Files that cannot be opened are silently ignored; this is + designed so that you can specify a list of potential + configuration file locations (e.g. current directory, user's + home directory, systemwide directory), and all existing + configuration files in the list will be read. A single + filename may also be given. + + Return list of successfully read files. + """ + if isinstance(filenames, basestring): + filenames = [filenames] + read_ok = [] + for filename in filenames: + try: + fp = open(filename) + except IOError: + continue + self._read(fp, filename) + fp.close() + read_ok.append(filename) + return read_ok + + def readfp(self, fp, filename=None): + """Like read() but the argument must be a file-like object. + + The `fp' argument must have a `readline' method. Optional + second argument is the `filename', which if not given, is + taken from fp.name. If fp has no `name' attribute, `' is + used. + + """ + if filename is None: + try: + filename = fp.name + except AttributeError: + filename = '' + self._read(fp, filename) + + def get(self, section, option): + opt = self.optionxform(option) + if section not in self._sections: + if section != DEFAULTSECT: + raise NoSectionError(section) + if opt in self._defaults: + return self._defaults[opt] + else: + raise NoOptionError(option, section) + elif opt in self._sections[section]: + return self._sections[section][opt] + elif opt in self._defaults: + return self._defaults[opt] + else: + raise NoOptionError(option, section) + + def items(self, section): + try: + d2 = self._sections[section] + except KeyError: + if section != DEFAULTSECT: + raise NoSectionError(section) + d2 = self._dict() + d = self._defaults.copy() + d.update(d2) + if "__name__" in d: + del d["__name__"] + return d.items() + + def _get(self, section, conv, option): + return conv(self.get(section, option)) + + def getint(self, section, option): + return self._get(section, int, option) + + def getfloat(self, section, option): + return self._get(section, float, option) + + _boolean_states = {'1': True, 'yes': True, 'true': True, 'on': True, + '0': False, 'no': False, 'false': False, 'off': False} + + def getboolean(self, section, option): + v = self.get(section, option) + if v.lower() not in self._boolean_states: + raise ValueError, 'Not a boolean: %s' % v + return self._boolean_states[v.lower()] + + def optionxform(self, optionstr): + return optionstr.lower() + + def has_option(self, section, option): + """Check for the existence of a given option in a given section.""" + if not section or section == DEFAULTSECT: + option = self.optionxform(option) + return option in self._defaults + elif section not in self._sections: + return False + else: + option = self.optionxform(option) + return (option in self._sections[section] + or option in self._defaults) + + def set(self, section, option, value=None): + """Set an option.""" + if not section or section == DEFAULTSECT: + sectdict = self._defaults + else: + try: + sectdict = self._sections[section] + except KeyError: + raise NoSectionError(section) + sectdict[self.optionxform(option)] = value + + def write(self, fp): + """Write an .ini-format representation of the configuration state.""" + if self._defaults: + fp.write("[%s]\n" % DEFAULTSECT) + for (key, value) in self._defaults.items(): + fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t'))) + fp.write("\n") + for section in self._sections: + fp.write("[%s]\n" % section) + for (key, value) in self._sections[section].items(): + if key == "__name__": + continue + if (value is not None) or (self._optcre == self.OPTCRE): + key = " = ".join((key, str(value).replace('\n', '\n\t'))) + fp.write("%s\n" % (key)) + fp.write("\n") + + def remove_option(self, section, option): + """Remove an option.""" + if not section or section == DEFAULTSECT: + sectdict = self._defaults + else: + try: + sectdict = self._sections[section] + except KeyError: + raise NoSectionError(section) + option = self.optionxform(option) + existed = option in sectdict + if existed: + del sectdict[option] + return existed + + def remove_section(self, section): + """Remove a file section.""" + existed = section in self._sections + if existed: + del self._sections[section] + return existed + + # + # Regular expressions for parsing section headers and options. + # + SECTCRE = re.compile( + r'\[' # [ + r'(?P

[^]]+)' # very permissive! + r'\]' # ] + ) + OPTCRE = re.compile( + r'(?P