(************** Content-type: application/mathematica ************** CreatedBy='Mathematica 5.2' Mathematica-Compatible Notebook This notebook can be used with any Mathematica-compatible application, such as Mathematica, MathReader or Publicon. The data for the notebook starts with the line containing stars above. To get the notebook into a Mathematica-compatible application, do one of the following: * Save the data starting with the line of stars above into a file with a name ending in .nb, then open the file inside the application; * Copy the data starting with the line of stars above to the clipboard, then use the Paste menu command inside the application. Data for notebooks contains only printable 7-bit ASCII and can be sent directly in email or through ftp in text mode. Newlines can be CR, LF or CRLF (Unix, Macintosh or MS-DOS style). NOTE: If you modify the data for this notebook not in a Mathematica- compatible application, you must delete the line below containing the word CacheID, otherwise Mathematica-compatible applications may try to use invalid cache data. For more information on notebooks and Mathematica-compatible applications, contact Wolfram Research: web: http://www.wolfram.com email: info@wolfram.com phone: +1-217-398-0700 (U.S.) Notebook reader applications are available free of charge from Wolfram Research. *******************************************************************) (*CacheID: 232*) (*NotebookFileLineBreakTest NotebookFileLineBreakTest*) (*NotebookOptionsPosition[ 68360, 1986]*) (*NotebookOutlinePosition[ 69894, 2035]*) (* CellTagsIndexPosition[ 69700, 2026]*) (*WindowFrame->Normal*) Notebook[{ Cell[CellGroupData[{ Cell["Reading Date and Time Strings Package", "Title", TextAlignment->Center], Cell["by Harry Bishop", "Subsubtitle", TextAlignment->Center], Cell["\<\ Gettting data in a form that can be used for data analysis can be a \ time consuming project by itself. Data sources can include text based \ documents such as letters, emails and text notes. In recovering the actual \ data content from this type of information, an important data element is a \ date or time that may be part of a text string. This notebook is a package of \ functions related to reading text strings that represent date or time or both \ types of data and converting them to a datatype conducive to using the \ information content. The importing of text informaton containing dates \ and/or times is based on the formats of standard interfaces. In addition, a \ fully customizable output format is available for display of the datatype \ that can also be exported as a string.\ \>", "Text"], Cell["\<\ The datatype date\[EmptyVerySmallSquare]time is constructed and \ parts are selectable. Manipulation consist of differencing, comparisons, and \ additions of a number of days. Numbers can be converted to the datatype where \ the number value is taken in days. Strings can be checked for matching \ allowed formats and for conversion to the datatype. In addition, a string \ consisting of dates and or times such as in a sentence can be separated to \ provide the dates and times matching the built in formats. Examples are \ provided in the last section.\ \>", "Text"], Cell[CellGroupData[{ Cell["Reference", "Section"], Cell[CellGroupData[{ Cell["Title", "Subsubsection"], Cell[TextData[StyleBox["Reading Dates and Times", FontSlant->"Italic"]], "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Author", "Subsubsection"], Cell["\<\ Harold Bishop President and Senior Operations Researcher Process Modeling Solutions, Inc. 200 Park Ave Suite 108 Falls Church, VA 22046 hrbishop@pmsi-va.com\ \>", "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Summary", "Subsubsection"], Cell["\<\ This notebook is a package of functions for reading dates and/or \ times from text strings into a defined datatype \ date\[EmptyVerySmallSquare]time (date EmptyVerySmallSquare time). \ \>", \ "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Copyright", "Subsubsection"], Cell["\<\ Rights reserved by, Harold R. Bishop, Process Modeling Solutions, \ Inc.\ \>", "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Notebook Version", "Subsubsection"], Cell["1.0", "Text"] }, Open ]], Cell[CellGroupData[{ Cell[TextData[{ StyleBox["Mathematica", FontSlant->"Italic"], " Version" }], "Subsubsection"], Cell["5.2", "Text"] }, Open ]], Cell[CellGroupData[{ Cell["History", "Subsubsection"], Cell["\<\ Data recovery efforts involve retrieving date and time data from \ text strings. So importing this data from strings and then displaying and \ exporting it back to strings is a necessary part of data analysis. \ Manipulation of the data is useful in algorithms requiring display of the \ information as well as computations. This package provides a datatype for \ the information and functions for importing, displaying and exporting in a \ desired format. There is such a variety of ways to represent date and time \ that a set of routines for reading these formats is a useful tool if \ available in one package.\ \>", "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Keywords", "Subsubsection"], Cell["\<\ Date, time, format, textstring, display format,, date\ \[EmptyVerySmallSquare]time datatype, overloading, datatype manipulation, \ constructors, selectors, predicates.\ \>", "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Limitations", "Subsubsection"], Cell["\<\ Allowed Symbols for date and time value replacement are \[InvisibleSpace]yyyy, yy, MMM, month, mm, dd, hh, mn, ss, am, pm, AM, PM (note mm = month, MMM = three letter abbreviated month name, month = full \ month name,, mn = minutes)\ \>", "Text"], Cell[TextData[{ StyleBox["\nFor Importing: Only the data formats mentioned are tested. \n", FontSlant->"Italic"], "\[InvisibleSpace]hhmnssPM, hhmnPM, hhmmss(24hr or Military time), hhmn \ (24hr or Military time),\nddMMMyyyy; ddMMMyy; ddMMM; monthyyyy; monthyy; \ month dd, yyyy; mm/dd/yyyy; mm/dd/yy/; mm/dd;\n(note allowed date delimiters \ are {slash, space, hyphen, nospace}; time delimiters are {colon, space})" }], "Text"], Cell[TextData[{ StyleBox["For Display and Export formats:\n", FontSlant->"Italic"], "\[InvisibleSpace]No spaces and ANY other symbols are permitted between \ date and time symbols\nExample: \"month dd, yyyy T hh:mn:ss PM\" represents \ March 6, 2006 T 1:45:23 PM (note the T is optional and used to show the XML \ standard)" }], "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Discussion", "Subsubsection"], Cell[TextData[StyleBox["References:\nNone.", FontSlant->"Italic"]], "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Requirements", "Subsubsection"], Cell[TextData[StyleBox["Uses the built in functions ToDate and FromDate.", FontFamily->"Courier", FontWeight->"Bold", FontSlant->"Italic"]], "Text"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["Interface", "Section", InitializationCell->True], Cell["\<\ This part declares the publicly visible functions, options, and \ values.\ \>", "Text", InitializationCell->True], Cell[CellGroupData[{ Cell["Set up the package context, including public imports", "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell["BeginPackage[\"PMSI`ReadDateTime`\"]", "Input", InitializationCell->True], Cell[BoxData[ \("PMSI`ReadDateTime`"\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \($ContextPath\)], "Input", InitializationCell->True], Cell[BoxData[ \({"PMSI`ReadDateTime`", "System`"}\)], "Output"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["Disable annoying spell warnings", "Subsection", Evaluatable->False, InitializationCell->True, AspectRatioFixed->True], Cell[BoxData[ \(\(Off[General::spell, General::spell1];\)\)], "Input", Evaluatable->False, InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell["\<\ Usage messages for the exported functions and the context \ itself\ \>", "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell["\<\ ReadDateTime::usage = \"ReadDateTime.m is a package of functions \ related to reading date and time information from text strings, constructing \ a datatype date\[EmptyVerySmallSquare]time, datatype manipulation and \ display.\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("ReadDateTime.m is a package of functions related to reading date and \ time information from text strings, constructing a datatype date\ \[EmptyVerySmallSquare]time, datatype manipulation and display."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(epoch::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("epoch is the six tuple for Mathematica's reference date."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(findDateTimeStrings::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("findDateTimeStrings[s_String] finds those parts of s that match date \ formats and time formats and returns dates followed by times. Allowed formats \ are: ddMMMyyyy; ddMMMyy; ddMMM; monthyyyy; monthyy; month dd, yyyy; \ mm/dd/yyyy; mm/dd/yy/; mm/dd; (note allowed date delimiters are {slash, \ hyphen, period and nospace between digits and letters}). Allowed formats are: \ \[InvisibleSpace]hhmnssPM, hhmnPM, hhmmss(24hr or Military time), hhmn (24hr \ or Military time), (note allowed time delimiter is only colon). Allows \ string of '4:16:23 PM 3 Mar 2006' or 'March 6, 2006 5:12' and other \ combinations of date and time. 'March 03, 0444' will be allowed as the \ monthddyyyy is recognized before monthyy."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ deconstructDate::usage = \"deconstructDate[date_String] compares \ date_String with date formats and if a match returns a six tuple consisting \ of {yyyy,mm,dd,0,0,0}. Allowed formats are: ddMMMyyyy; ddMMMyy; ddMMM; \ monthyyyy; monthyy; month dd, yyyy; mm/dd/yyyy; mm/dd/yy/; mm/dd; (note allowed date delimiters are {slash, space, hyphen, and nospace between \ digits and letters}).\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("deconstructDate[date_String] compares date_String with date formats \ and if a match returns a six tuple consisting of {yyyy,mm,dd,0,0,0}. Allowed \ formats are: ddMMMyyyy; ddMMMyy; ddMMM; monthyyyy; monthyy; month dd, yyyy; \ mm/dd/yyyy; mm/dd/yy/; mm/dd; (note allowed date delimiters are {slash, \ space, hyphen, and nospace between digits and letters})."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ deconstructTime::usage = \"deconstructTime[time_String] compares \ time_String with time formats and if a match returns a six tuple consisting \ of {1900,1,1,hh,mn,ss}. Allowed formats are: \[InvisibleSpace]hhmnssPM, \ hhmnPM, hhmmss(24hr or Military time), hhmn (24hr or Military time), (note allowed time delimiters are {colon and space}).\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("deconstructTime[time_String] compares time_String with time formats \ and if a match returns a six tuple consisting of {1900,1,1,hh,mn,ss}. Allowed \ formats are: \[InvisibleSpace]hhmnssPM, hhmnPM, hhmmss(24hr or Military \ time), hhmn (24hr or Military time), (note allowed time delimiters are {colon \ and space})."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ deconstructDateTime::usage = \ \"deconstructDateTime[{date_String,time_String}] calls deconstructDate and \ deconstructTime to form a six tuple consisting of \ {yyyy,mm,dd,hh,mn,ss}.\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("deconstructDateTime[{date_String,time_String}] calls deconstructDate \ and deconstructTime to form a six tuple consisting of {yyyy,mm,dd,hh,mn,ss}."\ \)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(date\[EmptyVerySmallSquare]time::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("datatype used for date and time representation and manipulations."\)], \ "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ make\[Ellipsis]date\[EmptyVerySmallSquare]time::usage = \"make\ \[Ellipsis]date\[EmptyVerySmallSquare]time[{yyyy,mm,dd,hh,mn,ss}]= \ make(Ellipsis)date(EmptyVerySmallSquare)time= constructor for date\ \[EmptyVerySmallSquare]time datatype \ date\[EmptyVerySmallSquare]time[year,month,day,hour,minute,second to the \ nearest $TimeUnit,value in days].\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("make\[Ellipsis]date\[EmptyVerySmallSquare]time[{yyyy,mm,dd,hh,mn,ss}]= \ make(Ellipsis)date(EmptyVerySmallSquare)time= constructor for date\ \[EmptyVerySmallSquare]time datatype \ date\[EmptyVerySmallSquare]time[year,month,day,hour,minute,second to the \ nearest $TimeUnit,value in days]."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ yearDT::usage = \"Selector for date\[EmptyVerySmallSquare]time \ datatype that produces Integer year.\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("Selector for date\[EmptyVerySmallSquare]time datatype that produces \ Integer year."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ monthDT::usage = \"Selector for date\[EmptyVerySmallSquare]time \ datatype that produces Integer month.\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("Selector for date\[EmptyVerySmallSquare]time datatype that produces \ Integer month."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ dayDT::usage = \"Selector for date\[EmptyVerySmallSquare]time \ datatype that produces Integer day.\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("Selector for date\[EmptyVerySmallSquare]time datatype that produces \ Integer day."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ hourDT::usage = \"Selector for date\[EmptyVerySmallSquare]time \ datatype that produces Integer hour.\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("Selector for date\[EmptyVerySmallSquare]time datatype that produces \ Integer hour."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ minuteDT::usage = \"Selector for date\[EmptyVerySmallSquare]time \ datatype that produces Integer minute.\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("Selector for date\[EmptyVerySmallSquare]time datatype that produces \ Integer minute."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ secondDT::usage = \"Selector for date\[EmptyVerySmallSquare]time \ datatype that produces NonNegative seconds.\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("Selector for date\[EmptyVerySmallSquare]time datatype that produces \ NonNegative seconds."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ valueDT::usage = \"Selector for date\[EmptyVerySmallSquare]time \ datatype that produces NonNegative days since Mathematica's reference date.\"\ \ \>", "Input", InitializationCell->True], Cell[BoxData[ \("Selector for date\[EmptyVerySmallSquare]time datatype that produces \ NonNegative days since Mathematica's reference date."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(valueDTtoDT::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("valueDTtoDT[value_] converts a value in days to a six tuple date using \ ToDate. value is truncated to the granularity of $TimeUnit."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ valid\[EmptyVerySmallSquare]dateQ::usage = \"valid\ \[EmptyVerySmallSquare]dateQ[date_String] returns True if the string can be \ made into a usable date\[EmptyVerySmallSquare]time datatype and False \ otherwise.\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("valid\[EmptyVerySmallSquare]dateQ[date_String] returns True if the \ string can be made into a usable date\[EmptyVerySmallSquare]time datatype and \ False otherwise."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ valid\[EmptyVerySmallSquare]timeQ::usage = \"valid\ \[EmptyVerySmallSquare]timeQ[time_String] returns True if the string can be \ made into a usable date\[EmptyVerySmallSquare]time datatype and False \ otherwise. Seconds are retained to a granularity of $TimeUnit.\"\ \>", "Input",\ InitializationCell->True], Cell[BoxData[ \("valid\[EmptyVerySmallSquare]timeQ[time_String] returns True if the \ string can be made into a usable date\[EmptyVerySmallSquare]time datatype and \ False otherwise. Seconds are retained to a granularity of $TimeUnit."\)], \ "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ zero\[EmptyVerySmallSquare]date::usage = \"date\ \[EmptyVerySmallSquare]time datatype constant for Mathematica's reference \ date.\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("date\[EmptyVerySmallSquare]time datatype constant for Mathematica's \ reference date."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ displayDTG::usage = \ \"displayDTG[dt_date\[EmptyVerySmallSquare]time,format_String] produces a \ text string with the symbols \[InvisibleSpace]yyyy, yy, MMM, month, mm, dd, \ hh, mn, ss, am, pm, AM, PM replaced by their data and time values. Can also \ be written as dt|f. \[InvisibleSpace]No spaces and ANY other symbols are permitted between date \ and time symbols\"\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("displayDTG[dt_date\[EmptyVerySmallSquare]time,format_String] produces \ a text string with the symbols \[InvisibleSpace]yyyy, yy, MMM, month, mm, dd, \ hh, mn, ss, am, pm, AM, PM replaced by their data and time values. Can also \ be written as dt|f. \[InvisibleSpace]No spaces and ANY other symbols are \ permitted between date and time symbols"\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(VerticalSeparator::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("VerticalSeparator is used in dt|f as a shorthand for \ displayDTG[dt_date\[EmptyVerySmallSquare]time,format_String] which produces a \ text string with the symbols \[InvisibleSpace]yyyy, yy, MMM, month, mm, dd, \ hh, mn, ss, am, pm, AM, PM replaced by their data and time values."\)], \ "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(ddMMMyyyy::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("ddMMMyyyy[dt_date\[EmptyVerySmallSquare]time] uses Format to produce \ the standard format dd\[CenterDot]MMM\[CenterDot]yyyy."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(ddMMMyy::usage = "\"\)], \ "Input", InitializationCell->True], Cell[BoxData[ \("ddMMMyy[dt_date\[EmptyVerySmallSquare]time] uses Format to produce the \ standard format dd\[CenterDot]MMM\[CenterDot]yy."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(ddMMM::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("ddMMM[dt_date\[EmptyVerySmallSquare]time] uses Format to produce the \ standard format dd\[CenterDot]MMM."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(monthyyyy::usage = "\"\)], \ "Input", InitializationCell->True], Cell[BoxData[ \("monthyyyy[dt_date\[EmptyVerySmallSquare]time] uses Format to produce \ the standard format month\[CenterDot]yyyy."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(monthyy::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("monthyy[dt_date\[EmptyVerySmallSquare]time] uses Format to produce the \ standard format month\[CenterDot]yy."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(monthddyyyy::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("monthddyyyy[dt_date\[EmptyVerySmallSquare]time] uses Format to produce \ the standard format month dd, yyyy."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(mmddyyyy::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("mmddyyyy[dt_date\[EmptyVerySmallSquare]time] uses Format to produce \ the standard format mm/dd/yyyy."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(mmddyy::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("mmddyy[dt_date\[EmptyVerySmallSquare]time] uses Format to produce the \ standard format mm/dd/yy."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(mmdd::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("mmdd[dt_date\[EmptyVerySmallSquare]time] uses Format to produce the \ standard format mm/dd."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(hhmnss::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("hhmnss[dt_date\[EmptyVerySmallSquare]time] uses Format to produce the \ standard format hh:mn:ss."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(hhmn::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("hhmn[dt_date\[EmptyVerySmallSquare]time] uses Format to produce the \ standard format hh:mn."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(hhmnssEXP::usage = \*"\"\\""\)], "Input", InitializationCell->True], Cell[BoxData[ \("hhmnssEXP[dt_date\[EmptyVerySmallSquare]time] uses Format to produce \ the standard format \!\(hh\^\(\(\\ \)\(h\)\)\) \!\(mn\^\(\(\\ \)\(m\)\)\) \ \!\(ss\^\(\(\\ \)\(s\)\)\)."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(hhmnEXP::usage = \*"\"\\""\)], "Input", InitializationCell->True], Cell[BoxData[ \("hhmnEXP[dt_date\[EmptyVerySmallSquare]time] uses Format to produce the \ standard format \!\(hh\^\(\(\\ \)\(h\)\)\) \!\(mn\^\(\(\\ \)\(m\)\)\)."\)], \ "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(hhmnssPM::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("hhmnssPM[dt_date\[EmptyVerySmallSquare]time] uses Format to produce \ the standard format hh:mn:ss PM."\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(hhmnPM::usage = "\"\)], "Input", InitializationCell->True], Cell[BoxData[ \("hhmnPM[dt_date\[EmptyVerySmallSquare]time] uses Format to produce the \ standard format hh:mn PM."\)], "Output"] }, Open ]] }, Open ]], Cell["Error messages for the exported objects", "Subsection", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell["Implementation", "Section", InitializationCell->True], Cell["\<\ This part contains the actual definitions and any auxiliary \ functions that should not be visible outside.\ \>", "Text", InitializationCell->True], Cell[CellGroupData[{ Cell["Begin the private context (implementation part)", "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell["\<\ Begin[\"`Private`\"] {$Context,$ContextPath}\ \>", "Input", InitializationCell->True], Cell[BoxData[ \("PMSI`ReadDateTime`Private`"\)], "Output"], Cell[BoxData[ \({"PMSI`ReadDateTime`Private`", {"PMSI`ReadDateTime`", "System`"}}\)], "Output"] }, Open ]] }, Open ]], Cell["Read in any hidden imports", "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell["\<\ Unprotect exported variables and any system functions for which \ definitions will be made\ \>", "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell["\<\ Unprotect[date\[EmptyVerySmallSquare]time,dayDT,ddMMM,ddMMMyy,\ ddMMMyyyy,deconstructDate,deconstructDateTime,deconstructTime, displayDTG,epoch,hhmn,findDateTimeStrings,hhmnEXP,hhmnPM,hhmnss,hhmnssEXP,\ hhmnssPM,hourDT,make\[Ellipsis]date\[EmptyVerySmallSquare]time,minuteDT, mmdd,mmddyy,mmddyyyy,monthddyyyy,monthDT,monthyy,monthyyyy,ReadDateTime,\ secondDT,valueDT,valueDTtoDT, valid\[EmptyVerySmallSquare]dateQ,valid\[EmptyVerySmallSquare]timeQ,yearDT,\ zero\[EmptyVerySmallSquare]date]\ \>", "Input", InitializationCell->True], Cell[BoxData[ \({"date\[EmptyVerySmallSquare]time", "dayDT", "ddMMM", "ddMMMyy", "ddMMMyyyy", "deconstructDate", "deconstructDateTime", "deconstructTime", "displayDTG", "epoch", "hhmn", "findDateTimeStrings", "hhmnEXP", "hhmnPM", "hhmnss", "hhmnssEXP", "hhmnssPM", "hourDT", "make\[Ellipsis]date\[EmptyVerySmallSquare]time", "minuteDT", "mmdd", "mmddyy", "mmddyyyy", "monthddyyyy", "monthDT", "monthyy", "monthyyyy", "ReadDateTime", "secondDT", "valueDT", "valueDTtoDT", "valid\[EmptyVerySmallSquare]dateQ", "valid\[EmptyVerySmallSquare]timeQ", "yearDT", "zero\[EmptyVerySmallSquare]date"}\)], "Output"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["\<\ Definition of auxiliary functions and local (static) \ variables\ \>", "Subsection", InitializationCell->True], Cell[BoxData[ \(\(delimiters = \({nospace, hyphen, period, comma, slash, colon, space} = {"\<\>", "\<-\>", "\<.\>", "\<,\>", "\", "\<:\>", \ "\< \>"}\);\)\)], "Input", InitializationCell->True], Cell[BoxData[{ \(\(centuryAbbrMark = 50;\)\), "\[IndentingNewLine]", \(epoch = ToDate[0]; \ (*epoch\ is\ the\ zero\ reference\ date\ time\ for\ \ FromDate\ and\ ToDate*) \[IndentingNewLine]macepoch = {1904, 1, 3, 0, 0, 0. }; \ (*macepoch\ is\ the\ zero\ reference\ date\ time\ for\ \ Macintosh*) \), "\[IndentingNewLine]", \(\(epochToMac = FromDate[macepoch];\)\), "\[IndentingNewLine]", \(\(timeResolution = N[$TimeUnit];\)\)}], "Input", InitializationCell->True], Cell[BoxData[{ \(\(digits = Characters["\<0123456789 \>"];\)\), "\[IndentingNewLine]", \(\(periodDigits = Characters["\<0123456789 .\>"];\)\), "\[IndentingNewLine]", \(\(onlyDigits = Characters["\<0123456789\>"];\)\), "\[IndentingNewLine]", \(\(periodonlyDigits = Characters["\<0123456789.\>"];\)\), "\[IndentingNewLine]", \(\(ampm = {"\", "\", "\", "\"};\)\), "\ \[IndentingNewLine]", \(\(amHHstring = Map[ToString, Range[0, 11]];\)\), "\[IndentingNewLine]", \(\(pmHHstring = RotateRight[ Map[ToString, Range[1, 12]]];\)\), "\[IndentingNewLine]", \(\(monthAbbr = {"\", "\", "\", "\", "\", "\ \", "\", "\", "\", "\", "\", \ "\"};\)\), "\[IndentingNewLine]", \(\(monthFullName = {"\", "\", "\", "\", "\", "\", "\", "\", "\", \ "\", "\", "\"};\)\), "\[IndentingNewLine]", \(\(monthName = ToUpperCase[ Join[monthFullName, monthAbbr]];\)\), "\[IndentingNewLine]", \(\(timedelimiters = {colon, space};\)\), "\[IndentingNewLine]", \(\(datedelimiters = {slash, space, hyphen, nospace};\)\), "\[IndentingNewLine]", \(\(ymddelimiters = {slash, hyphen, period};\)\), "\[IndentingNewLine]", \(\(splitdatedelimiters = {comma <> space, slash, hyphen, comma, space};\)\)}], "Input", InitializationCell->True], Cell[BoxData[{ \(\(delimiterQ[char_String] := MemberQ[delimiters, char];\)\), "\n", \(\(delimiterQ[_] := False;\)\)}], "Input", InitializationCell->True], Cell[BoxData[ \(\(timeAccuracy[timeValue_?NumericQ] := With[{n = IntegerPart[timeValue], dn = FractionalPart[timeValue]}, \[IndentingNewLine]n + timeResolution*Round[dn/timeResolution]];\)\)], "Input", InitializationCell->True], Cell[CellGroupData[{ Cell["Time Formats", "Subsubsection", InitializationCell->True], Cell[BoxData[ \(\(timecolonInsert = \((x_ /; StringMatchQ[ x, ___ ~~ \(onlyDigits ~~ ampm\)])\) \[RuleDelayed] StringInsert[x, "\<:\>", \(-3\)];\)\)], "Input", InitializationCell->True], Cell[BoxData[ \(\(separateTimes[t_String] := StringSplit[t /. timecolonInsert, timedelimiters];\)\)], "Input", InitializationCell->True], Cell[BoxData[{ \(\(hhmnssPMformat = StringExpression[onlyDigits .. , colon, onlyDigits .. , colon, periodDigits .. , ampm];\)\), "\n", \(\(hhmnPMformat = StringExpression[onlyDigits .. , colon, onlyDigits .. , ampm];\)\), "\n", \(\(hhmnssMILformat = StringExpression[onlyDigits .. , colon, onlyDigits .. , colon, periodonlyDigits .. ];\)\), "\n", \(\(hhmnMILformat = StringExpression[onlyDigits .. , colon, onlyDigits .. ];\)\)}], "Input", InitializationCell->True], Cell[BoxData[{ \(\(hhmnssPMQ[tstring_String] := StringMatchQ[tstring, hhmnssPMformat];\)\), "\n", \(\(hhmnssPMQ[_] := False;\)\), "\[IndentingNewLine]", \(\(hhmnPMQ[tstring_String] := StringMatchQ[tstring, hhmnPMformat];\)\), "\n", \(\(hhmnPMQ[_] := False;\)\), "\[IndentingNewLine]", \(\(hhmnssMILQ[tstring_String] := StringMatchQ[tstring, hhmnssMILformat];\)\), "\n", \(\(hhmnssMILQ[_] := False;\)\), "\[IndentingNewLine]", \(\(hhmnMILQ[tstring_String] := StringMatchQ[tstring, hhmnMILformat];\)\), "\[IndentingNewLine]", \(\(hhmnMILQ[_] := False;\)\)}], "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell["Date Formats", "Subsubsection", InitializationCell->True], Cell[BoxData[{ \(\(monthNr[m_String] := With[{mNr = Mod[First[Flatten[Position[monthName, ToUpperCase[m]]]], 12]}, If[mNr \[Equal] 0, 12, mNr]];\)\), "\[IndentingNewLine]", \(\(yearAbbr[year_Integer] := With[{y = Mod[year, 100]}, If[y < 10, "\<0\>" <> ToString[y], ToString[y]]];\)\), "\[IndentingNewLine]", \(\(twodigitString[n_Integer] := If[n < 10, "\<0\>" <> ToString[n], ToString[n]];\)\), "\[IndentingNewLine]", \(\(expandYY[yy_String] := With[{ny = ToExpression[yy]}, If[ny > centuryAbbrMark, 1900 + ny, 2000 + ny]];\)\)}], "Input", InitializationCell->True], Cell[BoxData[{ \(\(monthforwardspaceInsert = \((x_ /; StringMatchQ[ x, ___ ~~ \(onlyDigits ~~ \(monthName ~~ ___\)\)])\) \ \[RuleDelayed] StringInsert[x, "\< \>", First[Flatten[ StringPosition[x, monthName, 1]]]];\)\), "\[IndentingNewLine]", \(\(monthafterspaceInsert = \((x_ /; StringMatchQ[ x, ___ ~~ \(monthName ~~ \(onlyDigits ~~ ___\)\)])\) \ \[RuleDelayed] StringInsert[x, "\< \>", Last[Flatten[StringPosition[x, monthName, 1]]] + 1];\)\)}], "Input", InitializationCell->True], Cell[BoxData[ \(\(separateDateParts[d_String] := StringSplit[\(d /. monthforwardspaceInsert\) /. monthafterspaceInsert, splitdatedelimiters];\)\)], "Input", InitializationCell->True], Cell[BoxData[{ \(\(yyyyformat = StringExpression[onlyDigits, onlyDigits, onlyDigits, onlyDigits];\)\), "\[IndentingNewLine]", \(\(yyformat = StringExpression[onlyDigits, onlyDigits];\)\), "\[IndentingNewLine]", \(\(mmformat = \(ddformat = StringExpression[onlyDigits .. ]\);\)\)}], "Input", InitializationCell->True], Cell[BoxData[{ \(\(ddMMMyyyyformat = ddformat ~~ \(datedelimiters ~~ \(monthName ~~ \(datedelimiters ~~ yyyyformat\)\)\);\)\), "\[IndentingNewLine]", \(\(ddMMMyyformat = ddformat ~~ \(datedelimiters ~~ \(monthName ~~ \(datedelimiters ~~ yyformat\)\)\);\)\), "\[IndentingNewLine]", \(\(ddMMMformat = ddformat ~~ \(datedelimiters ~~ monthName\);\)\), "\[IndentingNewLine]", \(\(monthyyyyformat = monthName ~~ \(datedelimiters ~~ yyyyformat\);\)\), "\[IndentingNewLine]", \(\(monthyyformat = monthName ~~ \(datedelimiters ~~ yyformat\);\)\), "\[IndentingNewLine]", \(\(monthddyyyyformat = monthName ~~ \(datedelimiters ~~ \(ddformat ~~ \("\<,\>" ~~ \ \(datedelimiters ~~ yyyyformat\)\)\)\);\)\)}], "Input", InitializationCell->True], Cell[BoxData[{ \(\(mmddyyyyformat = mmformat ~~ \(ymddelimiters ~~ \(ddformat ~~ \(ymddelimiters ~~ yyyyformat\)\)\);\)\), "\[IndentingNewLine]", \(\(mmddyyformat = mmformat ~~ \(ymddelimiters ~~ \(ddformat ~~ \(ymddelimiters ~~ yyformat\)\)\);\)\), "\[IndentingNewLine]", \(\(mmddformat = mmformat ~~ \(ymddelimiters ~~ ddformat\);\)\)}], "Input",\ InitializationCell->True], Cell[BoxData[{ \(\(ddMMMyyyyQ[tstring_String] := StringMatchQ[ToUpperCase[tstring], ddMMMyyyyformat];\)\), "\[IndentingNewLine]", \(\(ddMMMyyyyQ[_] := False;\)\), "\[IndentingNewLine]", \(\(ddMMMyyQ[tstring_String] := StringMatchQ[ToUpperCase[tstring], ddMMMyyformat];\)\), "\[IndentingNewLine]", \(\(ddMMMyyQ[_] := False;\)\), "\[IndentingNewLine]", \(\(ddMMMQ[tstring_String] := StringMatchQ[ToUpperCase[tstring], ddMMMformat];\)\), "\[IndentingNewLine]", \(\(ddMMMQ[_] := False;\)\), "\[IndentingNewLine]", \(\(monthyyyyQ[tstring_String] := StringMatchQ[ToUpperCase[tstring], monthyyyyformat];\)\), "\[IndentingNewLine]", \(\(monthyyyyQ[_] := False;\)\), "\[IndentingNewLine]", \(\(monthyyQ[tstring_String] := StringMatchQ[ToUpperCase[tstring], monthyyformat];\)\), "\[IndentingNewLine]", \(\(monthyyQ[_] := False;\)\), "\[IndentingNewLine]", \(\(monthddyyyyQ[tstring_String] := StringMatchQ[ToUpperCase[tstring], monthddyyyyformat];\)\), "\[IndentingNewLine]", \(\(monthddyyyyQ[_] := False;\)\), "\[IndentingNewLine]", \(\(mmddyyyyQ[tstring_String] := StringMatchQ[tstring, mmddyyyyformat];\)\), "\[IndentingNewLine]", \(\(mmddyyyyQ[_] := False;\)\), "\[IndentingNewLine]", \(\(mmddyyQ[tstring_String] := StringMatchQ[tstring, mmddyyformat];\)\), "\[IndentingNewLine]", \(\(mmddyyQ[_] := False;\)\), "\[IndentingNewLine]", \(\(mmddQ[tstring_String] := StringMatchQ[tstring, mmddformat];\)\), "\[IndentingNewLine]", \(\(mmddQ[_] := False;\)\)}], "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell["Format Conversion Rules", "Subsubsection", InitializationCell->True], Cell[BoxData[ \(\(deconstructTimeFormat = {\[IndentingNewLine]\((timestring_? hhmnssPMQ)\) \[RuleDelayed] \((separateTimes[ timestring] /. {hh_, mn_, ss_, am_} \[RuleDelayed] {0, 0, 0, Mod[ToExpression[hh], 12] + 12\ Boole[\((am \[Equal] "\")\) || \((am \ \[Equal] "\")\)], ToExpression[mn], ToExpression[ss]} + epoch)\), \[IndentingNewLine]\((timestring_? hhmnPMQ)\) \[RuleDelayed] \((separateTimes[ timestring] /. {hh_, mn_, am_} \[RuleDelayed] {0, 0, 0, Mod[ToExpression[hh], 12] + 12\ Boole[\((am \[Equal] "\")\) || \((am \ \[Equal] "\")\)], ToExpression[mn], 0. } + epoch)\), \[IndentingNewLine]\((timestring_? hhmnssMILQ)\) \[RuleDelayed] \((separateTimes[ timestring] /. {hh_, mn_, ss_} \[RuleDelayed] {0, 0, 0, ToExpression[hh], ToExpression[mn], ToExpression[ss]} + epoch)\), \[IndentingNewLine]\((timestring_? hhmnMILQ)\) \[RuleDelayed] \((separateTimes[ timestring] /. {hh_, mn_} \[RuleDelayed] {0, 0, 0, ToExpression[hh], ToExpression[mn], 0. } + epoch)\)\[IndentingNewLine]};\)\)], "Input", InitializationCell->True], Cell[BoxData[ \(\(deconstructDateFormat = {\[IndentingNewLine]\((datestring_? ddMMMyyyyQ)\) \[RuleDelayed] \((separateDateParts[ datestring] /. {dd_, mmText_, yyyy_} \[RuleDelayed] {ToExpression[yyyy], monthNr[mmText], ToExpression[dd], 0, 0, 0})\), \[IndentingNewLine]\((datestring_? ddMMMyyQ)\) \[RuleDelayed] \((separateDateParts[ datestring] /. {dd_, mmText_, yy_} \[RuleDelayed] {expandYY[yy], monthNr[mmText], ToExpression[dd], 0, 0, 0})\), \[IndentingNewLine]\((datestring_? ddMMMQ)\) \[RuleDelayed] \((separateDateParts[ datestring] /. {dd_, mmText_} \[RuleDelayed] {epoch\[LeftDoubleBracket]1\ \[RightDoubleBracket], monthNr[mmText], ToExpression[dd], 0, 0, 0})\), \[IndentingNewLine]\((datestring_? monthyyyyQ)\) \[RuleDelayed] \((separateDateParts[ datestring] /. {mmText_, yyyy_} \[RuleDelayed] {ToExpression[yyyy], monthNr[mmText], 1, 0, 0, 0})\), \[IndentingNewLine]\((datestring_? monthyyQ)\) \[RuleDelayed] \((separateDateParts[ datestring] /. {mmText_, yy_} \[RuleDelayed] {expandYY[yy], monthNr[mmText], 1, 0, 0, 0})\), \[IndentingNewLine]\((datestring_? monthddyyyyQ)\) \[RuleDelayed] \((separateDateParts[ datestring] /. {mmText_, dd_, yyyy_} \[RuleDelayed] {ToExpression[yyyy], monthNr[mmText], ToExpression[dd], 0, 0, 0})\), \[IndentingNewLine]\((datestring_? mmddyyyyQ)\) \[RuleDelayed] \((separateDateParts[ datestring] /. {mm_, dd_, yyyy_} \[RuleDelayed] {ToExpression[yyyy], ToExpression[mm], ToExpression[dd], 0, 0, 0})\), \[IndentingNewLine]\((datestring_? mmddyyQ)\) \[RuleDelayed] \((separateDateParts[ datestring] /. {mm_, dd_, yy_} \[RuleDelayed] {expandYY[yy], ToExpression[mm], ToExpression[dd], 0, 0, 0})\), \[IndentingNewLine]\((datestring_? mmddQ)\) \[RuleDelayed] \((separateDateParts[ datestring] /. {mm_, dd_} \[RuleDelayed] {epoch\[LeftDoubleBracket]1\ \[RightDoubleBracket], ToExpression[mm], ToExpression[dd], 0, 0, 0})\)\[IndentingNewLine]};\)\)], "Input", InitializationCell->True] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["Definition of the exported functions", "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell["String to six tuple conversions", "Subsubsection", InitializationCell->True], Cell[BoxData[{ \(\(deconstructDate[date_String] := ToUpperCase[StringReplace[date, "\< \>" \[Rule] "\< \>"]] /. deconstructDateFormat;\)\), "\[IndentingNewLine]", \(\(deconstructTime[time_String] := time /. deconstructTimeFormat;\)\), "\[IndentingNewLine]", \(\(deconstructDateTime[{date_String, time_String}] := deconstructDate[date] + deconstructTime[time] - epoch;\)\)}], "Input",\ InitializationCell->True], Cell[BoxData[ \(\(findDateTimeStrings[s_String] := Module[{fullStr = ToUpperCase[s], times, dateStr, dates}, \[IndentingNewLine]times = StringCases[fullStr, hhmnssPMformat | hhmnPMformat | hhmnssMILformat | hhmnMILformat]; \[IndentingNewLine]dateStr = StringReplace[fullStr, Map[# \[Rule] "\<\>" &, times]]; \[IndentingNewLine]dates = StringCases[dateStr, ddMMMyyyyformat | ddMMMyyformat | ddMMMformat | monthddyyyyformat | monthyyyyformat | monthyyformat | mmddyyyyformat | mmddyyformat | mmddformat]; \[IndentingNewLine]Flatten[{dates, times}]];\)\)], "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell["Constructors and Selectors", "Subsubsection", InitializationCell->True], Cell[BoxData[ \(\(make\[Ellipsis]date\[EmptyVerySmallSquare]time[{\[IndentingNewLine]\ year_Integer?NonNegative, \[IndentingNewLine]month_Integer /; 0 \[LessEqual] month \[LessEqual] 12, \[IndentingNewLine]day_Integer /; 0 \[LessEqual] day \[LessEqual] 31, \[IndentingNewLine]hour_Integer /; 0 \[LessEqual] hour \[LessEqual] 23, \[IndentingNewLine]minute_Integer /; 0 \[LessEqual] minute \[LessEqual] 59, \[IndentingNewLine]second_?NonNegative /; 0 \[LessEqual] second \[LessEqual] \((60. - timeResolution)\)\[IndentingNewLine]}] := With[{secondedit = timeAccuracy[ second]}, \[IndentingNewLine]date\[EmptyVerySmallSquare]time[ year, month, day, hour, minute, secondedit, FromDate[{year, month, day, hour, minute, secondedit}]/ 86400. ]];\)\)], "Input", InitializationCell->True, CellTags->{"M220:5.4.8-1", "M220.5.3"}], Cell[BoxData[ \(\(datetimeTuple[ date\[EmptyVerySmallSquare]time[y_, m_, d_, h_, mn_, s_, v_]] := {y, m, d, h, mn, s};\)\)], "Input", InitializationCell->True], Cell[BoxData[{ \(\(yearDT[ date\[EmptyVerySmallSquare]time[year_, month_, day_, hour_, minute_, second_, value_]] := year;\)\), "\[IndentingNewLine]", \(\(monthDT[ date\[EmptyVerySmallSquare]time[year_, month_, day_, hour_, minute_, second_, value_]] := month;\)\), "\[IndentingNewLine]", \(\(dayDT[ date\[EmptyVerySmallSquare]time[year_, month_, day_, hour_, minute_, second_, value_]] := day;\)\), "\[IndentingNewLine]", \(\(hourDT[ date\[EmptyVerySmallSquare]time[year_, month_, day_, hour_, minute_, second_, value_]] := hour;\)\), "\[IndentingNewLine]", \(\(minuteDT[ date\[EmptyVerySmallSquare]time[year_, month_, day_, hour_, minute_, second_, value_]] := minute;\)\), "\[IndentingNewLine]", \(\(secondDT[ date\[EmptyVerySmallSquare]time[year_, month_, day_, hour_, minute_, second_, value_]] := second;\)\), "\[IndentingNewLine]", \(\(valueDT[ date\[EmptyVerySmallSquare]time[year_, month_, day_, hour_, minute_, second_, value_]] := value;\)\)}], "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell["date\[EmptyVerySmallSquare]time Constants", "Subsubsection", InitializationCell->True], Cell[BoxData[{ \(\(zero\[EmptyVerySmallSquare]date = make\[Ellipsis]date\[EmptyVerySmallSquare]time[ epoch];\)\), "\[IndentingNewLine]", \(\(valueDT[zero\[EmptyVerySmallSquare]date] = 0;\)\)}], "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell["Operations", "Subsubsection", InitializationCell->True], Cell[BoxData[ \(\(datetimeTuple[zero\[EmptyVerySmallSquare]date] \[Equal] ToDate[valueDT[zero\[EmptyVerySmallSquare]date]];\)\)], "Input", InitializationCell->True], Cell[BoxData[ \( (*adding\ a\ numeric\ value\ to\ date\[EmptyVerySmallSquare]time\ \ treats\ the\ numeric\ as\ seconds*) \)], "Input", InitializationCell->True], Cell[BoxData[{ \(\(date\[EmptyVerySmallSquare]time /: xDT_date\[EmptyVerySmallSquare]time + c_?NumericQ := make\[Ellipsis]date\[EmptyVerySmallSquare]time[ ToDate[86400. *valueDT[xDT] + timeAccuracy[c]]];\)\), "\n", \(\(date\[EmptyVerySmallSquare]time /: xDT_date\[EmptyVerySmallSquare]time - yDT_date\[EmptyVerySmallSquare]time := valueDT[xDT] - valueDT[yDT];\)\), "\[IndentingNewLine]", \(\(date\[EmptyVerySmallSquare]time /: xDT_date\[EmptyVerySmallSquare]time > yDT_date\[EmptyVerySmallSquare]time := valueDT[xDT] > valueDT[yDT];\)\), "\[IndentingNewLine]", \(\(date\[EmptyVerySmallSquare]time /: xDT_date\[EmptyVerySmallSquare]time \[GreaterEqual] yDT_date\[EmptyVerySmallSquare]time := \((Abs[ 86400. \((valueDT[xDT] - valueDT[yDT])\)] < timeResolution)\) || \((xDT > yDT)\);\)\), "\[IndentingNewLine]", \(\(date\[EmptyVerySmallSquare]time /: macDate[xDT_date\[EmptyVerySmallSquare]time] := xDT + epochToMac;\)\)}], "Input", InitializationCell->True], Cell[BoxData[ \(\(valueDTtoDT[xValue_] := zero\[EmptyVerySmallSquare]date + xValue*86400. ;\)\)], "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell["Predicates", "Subsubsection", InitializationCell->True], Cell[BoxData[ \(\(equalDTtuplesQ[xTuple_List, yTuple_List] := With[{diff = \((xTuple - yTuple)\)}, Most[diff] \[Equal] {0, 0, 0, 0, 0} && Abs[Last[diff]] < 1. ];\)\)], "Input", InitializationCell->True], Cell[BoxData[{ \(\(date\[EmptyVerySmallSquare]time /: date\[EmptyVerySmallSquare]timeQ[dt_date\[EmptyVerySmallSquare]time] := equalDTtuplesQ[datetimeTuple[dt], ToDate[Floor[86400. \ valueDT[dt]]]] || equalDTtuplesQ[datetimeTuple[dt], ToDate[Ceiling[ 86400. \ valueDT[dt]]]];\)\), "\[IndentingNewLine]", \(\(valid\[EmptyVerySmallSquare]dateQ[date_String] := date\[EmptyVerySmallSquare]timeQ[ make\[Ellipsis]date\[EmptyVerySmallSquare]time[ deconstructDate[date]]];\)\), "\[IndentingNewLine]", \(\(valid\[EmptyVerySmallSquare]timeQ[time_String] := date\[EmptyVerySmallSquare]timeQ[ make\[Ellipsis]date\[EmptyVerySmallSquare]time[ deconstructTime[time]]];\)\), "\[IndentingNewLine]", \(\(date\[EmptyVerySmallSquare]timeQ[_] := False;\)\), "\[IndentingNewLine]", \(\(valid\[EmptyVerySmallSquare]dateQ[_] := False;\)\), "\[IndentingNewLine]", \(\(valid\[EmptyVerySmallSquare]timeQ[_] := False;\)\)}], "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell["Ouput Formatting", "Subsubsection", InitializationCell->True], Cell[BoxData[ \(\(displayDTG[dt_date\[EmptyVerySmallSquare]time, format_String] := Module[{hr, ampmIndicator, fAMPM, xAMPM}, \[IndentingNewLine]hr = hourDT[dt]; \[IndentingNewLine]ampmIndicator = StringCount[format, ampm] > 0; \[IndentingNewLine]fAMPM = If[ampmIndicator, First[StringCases[format, ampm]], "\"]; \[IndentingNewLine]xAMPM = Which[ampmIndicator && \((hr < 12)\), "\", \[IndentingNewLine]ampmIndicator && \ \((hr \[GreaterEqual] 12)\), "\", \[IndentingNewLine]\(! ampmIndicator\), \ "\"]; \[IndentingNewLine]StringReplace[ format, {\[IndentingNewLine]"\" \[Rule] ToString[yearDT[dt]], \[IndentingNewLine]"\" \[Rule] yearAbbr[yearDT[dt]], \[IndentingNewLine]"\" \[Rule] monthAbbr\[LeftDoubleBracket] monthDT[ dt]\[RightDoubleBracket], \[IndentingNewLine]"\" \ \[Rule] monthFullName\[LeftDoubleBracket] monthDT[ dt]\[RightDoubleBracket], \[IndentingNewLine]"\" \ \[Rule] ToString[monthDT[dt]], \[IndentingNewLine]"\" \[Rule] ToString[dayDT[dt]], \[IndentingNewLine]"\" \[Rule] Which[xAMPM \[Equal] "\", amHHstring\[LeftDoubleBracket] Mod[hr, 12] + 1\[RightDoubleBracket], \[IndentingNewLine]xAMPM \ \[Equal] "\", pmHHstring\[LeftDoubleBracket] Mod[hr, 12] + 1\[RightDoubleBracket], \[IndentingNewLine]xAMPM \ \[Equal] "\", twodigitString[hr]], \[IndentingNewLine]"\" \[Rule] twodigitString[ minuteDT[dt]], \[IndentingNewLine]"\" \[Rule] twodigitString[ Round[secondDT[dt]]], \[IndentingNewLine]fAMPM \[Rule] xAMPM}]];\)\)], "Input", InitializationCell->True], Cell[BoxData[ \(\(date\[EmptyVerySmallSquare]time /: xDT_date\[EmptyVerySmallSquare]time \[VerticalSeparator] f_String := displayDTG[xDT, f];\)\)], "Input", InitializationCell->True], Cell[BoxData[{ \(\(Format[ddMMMyyyy[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm["\<`3`\[CenterDot]`2`\[CenterDot]`1`\>", yearDT[dt], monthAbbr\[LeftDoubleBracket]monthDT[dt]\[RightDoubleBracket], dayDT[dt]];\)\), "\n", \(\(Format[ddMMMyy[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm["\<`3`\[CenterDot]`2`\[CenterDot]`1`\>", yearAbbr[yearDT[dt]], monthAbbr\[LeftDoubleBracket]monthDT[dt]\[RightDoubleBracket], dayDT[dt]];\)\), "\n", \(\(Format[ddMMM[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm["\<`2`\[CenterDot]`1`\>", monthAbbr\[LeftDoubleBracket]monthDT[dt]\[RightDoubleBracket], dayDT[dt]];\)\), "\n", \(\(Format[monthyyyy[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm["\<`2`\[CenterDot]`1`\>", yearDT[dt], monthFullName\[LeftDoubleBracket] monthDT[dt]\[RightDoubleBracket]];\)\), "\n", \(\(Format[monthyy[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm["\<`2`\[CenterDot]`1`\>", yearAbbr[yearDT[dt]], monthFullName\[LeftDoubleBracket] monthDT[dt]\[RightDoubleBracket]];\)\), "\n", \(\(Format[monthddyyyy[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm["\<`2` `3`, `1`\>", yearDT[dt], monthFullName\[LeftDoubleBracket]monthDT[dt]\[RightDoubleBracket], dayDT[dt]];\)\), "\n", \(\(Format[mmddyyyy[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm["\<`2`/`3`/`1`\>", yearDT[dt], monthDT[dt], dayDT[dt]];\)\), "\n", \(\(Format[mmddyy[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm["\<`2`/`3`/`1`\>", yearAbbr[yearDT[dt]], monthDT[dt], dayDT[dt]];\)\), "\n", \(\(Format[mmdd[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm["\<`1`/`2`\>", monthDT[dt], dayDT[dt]];\)\)}], "Input", InitializationCell->True], Cell[BoxData[{ \(\(Format[hhmnss[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm["\<`1`:`2`:`3`\>", twodigitString[hourDT[dt]], twodigitString[minuteDT[dt]], twodigitString[Round[secondDT[dt]]]];\)\), "\[IndentingNewLine]", \(\(Format[hhmn[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm["\<`1`:`2`\>", twodigitString[hourDT[dt]], twodigitString[minuteDT[dt]]];\)\), "\[IndentingNewLine]", \(\(Format[hhmnssEXP[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm[\*"\"\<\!\(`1`\^\(\(\\\ \)\(h\)\)\) \!\(`2`\^\(\(\\\ \)\(m\ \)\)\) \!\(`3`\^\(\(\\\ \)\(s\)\)\)\>\"", hourDT[dt], minuteDT[dt], Round[secondDT[dt]]];\)\), "\[IndentingNewLine]", \(\(Format[hhmnEXP[dt_date\[EmptyVerySmallSquare]time], StandardForm] := StringForm[\*"\"\<\!\(`1`\^\(\(\\\ \)\(h\)\)\) \!\(`2`\^\(\(\\\ \)\(m\ \)\)\)\>\"", hourDT[dt], minuteDT[dt]];\)\), "\[IndentingNewLine]", \(\(\(Format[hhmnssPM[dt_date\[EmptyVerySmallSquare]time], StandardForm] := With[{hr = hourDT[dt]}, StringForm["\<`1`:`2`:`3` `4`\>", Apply[Sequence, \[IndentingNewLine]If[ hr < 12, {amHHstring\[LeftDoubleBracket] Mod[hr, 12] + 1\[RightDoubleBracket], twodigitString[minuteDT[dt]], twodigitString[ Round[secondDT[ dt]]], "\"}, {pmHHstring\[LeftDoubleBracket] Mod[hr, 12] + 1\[RightDoubleBracket], twodigitString[minuteDT[dt]], twodigitString[ Round[secondDT[ dt]]], "\"}]]]];\)\(\[IndentingNewLine]\) \)\), "\[IndentingNewLine]", \(\(Format[hhmnPM[dt_date\[EmptyVerySmallSquare]time], StandardForm] := With[{hr = hourDT[dt]}, StringForm["\<`1`:`2` `3`\>", Apply[Sequence, \[IndentingNewLine]If[ hr < 12, {amHHstring\[LeftDoubleBracket] Mod[hr, 12] + 1\[RightDoubleBracket], twodigitString[ minuteDT[dt]], "\"}, {pmHHstring\[LeftDoubleBracket] Mod[hr, 12] + 1\[RightDoubleBracket], twodigitString[minuteDT[dt]], "\"}]]]];\)\)}], "Input",\ InitializationCell->True] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["End the private context", "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell["End[ ]", "Input", InitializationCell->True], Cell[BoxData[ \("PMSI`ReadDateTime`Private`"\)], "Output"] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["Epilog", "Section", InitializationCell->True], Cell["This section protects exported symbols and ends the package.", "Text", InitializationCell->True], Cell[CellGroupData[{ Cell["Protect exported symbol", "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell["\<\ Protect[date\[EmptyVerySmallSquare]time,dayDT,ddMMM,ddMMMyy,\ ddMMMyyyy,deconstructDate,deconstructDateTime,deconstructTime, displayDTG,epoch,findDateTimeStrings,hhmn,hhmnEXP,hhmnPM,hhmnss,hhmnssEXP,\ hhmnssPM,hourDT,make\[Ellipsis]date\[EmptyVerySmallSquare]time,minuteDT, mmdd,mmddyy,mmddyyyy,monthddyyyy,monthDT,monthyy,monthyyyy,ReadDateTime,\ secondDT,valueDT,valueDTtoDT, valid\[EmptyVerySmallSquare]dateQ,valid\[EmptyVerySmallSquare]timeQ,yearDT,\ zero\[EmptyVerySmallSquare]date]\ \>", "Input", InitializationCell->True], Cell[BoxData[ \({"date\[EmptyVerySmallSquare]time", "dayDT", "ddMMM", "ddMMMyy", "ddMMMyyyy", "deconstructDate", "deconstructDateTime", "deconstructTime", "displayDTG", "epoch", "findDateTimeStrings", "hhmn", "hhmnEXP", "hhmnPM", "hhmnss", "hhmnssEXP", "hhmnssPM", "hourDT", "make\[Ellipsis]date\[EmptyVerySmallSquare]time", "minuteDT", "mmdd", "mmddyy", "mmddyyyy", "monthddyyyy", "monthDT", "monthyy", "monthyyyy", "ReadDateTime", "secondDT", "valueDT", "valueDTtoDT", "valid\[EmptyVerySmallSquare]dateQ", "valid\[EmptyVerySmallSquare]timeQ", "yearDT", "zero\[EmptyVerySmallSquare]date"}\)], "Output"] }, Open ]], Cell["Alternative: protect all exported symbols", "Text", InitializationCell->True], Cell["(*Protect[Evaluate[$Context <> \"*\"]]*)", "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell["Re-able annoying spell warnings", "Subsection", Evaluatable->False, InitializationCell->True, AspectRatioFixed->True], Cell["On[General::spell,General::spell1];", "Input", Evaluatable->False, InitializationCell->True, AspectRatioFixed->True] }, Open ]], Cell[CellGroupData[{ Cell["End the package context", "Subsection", InitializationCell->True], Cell["EndPackage[ ]", "Input", InitializationCell->True] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["Examples, Tests", "Section"], Cell[CellGroupData[{ Cell[TextData[StyleBox["Examples, tests for the use of the package can go \ here.", FontSlant->"Italic"]], "Subsection"], Cell[CellGroupData[{ Cell[BoxData[ \(Map[ deconstructTime, {"\<1:35PM\>", "\<2:23:45 pm\>", "\<13:22:55.1\>", \ "\<1:35\>"}]\)], "Input"], Cell[BoxData[ \({{1900, 1, 1, 13, 35, 0.`}, {1900, 1, 1, 14, 23, 45.`}, {1900, 1, 1, 13, 22, 55.1`}, {1900, 1, 1, 1, 35, 0.`}}\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(Map[ deconstructDate, {"\<20-dec-2006\>", "\<15nov05\>", "\<13-Mar\>", \ "\", "\<12/5/2001\>", "\<12/4/01\>", "\", \ "\<3/12\>"}]\)], "Input"], Cell[BoxData[ \({{2006, 12, 20, 0, 0, 0}, {2005, 11, 15, 0, 0, 0}, {1900, 3, 13, 0, 0, 0}, {2003, 10, 1, 0, 0, 0}, {2001, 12, 5, 0, 0, 0}, {2001, 12, 4, 0, 0, 0}, {2005, 8, 1, 0, 0, 0}, {1900, 3, 12, 0, 0, 0}}\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(deconstructDateTime[{"\", "\<13:35:17.3\>"}]\)], "Input"], Cell[BoxData[ \({2005, 3, 3, 13, 35, 17.3`}\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(deconstructDateTime[{"\<3/12\>", "\<13:35:17.3\>"}]\)], "Input"], Cell[BoxData[ \({1900, 3, 12, 13, 35, 17.3`}\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(Map[ valid\[EmptyVerySmallSquare]dateQ, {"\<20-dec-2006\>", "\<15nov05\>", "\ \<13-Mar\>", "\", "\<12/30/2001\>", "\<12/4/01\>", "\", "\ \<3/12\>", "\"}]\)], "Input"], Cell[BoxData[ \({True, True, True, True, True, True, True, True, False}\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(Map[ valid\[EmptyVerySmallSquare]timeQ, {"\<1:35PM\>", "\<2:23:45 pm\>", \ "\<13:22:55.1\>", "\<1:35\>", "\<24:35:59\>"}]\)], "Input"], Cell[BoxData[ \({True, True, True, True, False}\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(test = make\[Ellipsis]date\[EmptyVerySmallSquare]time[Date[]]\)], "Input"], Cell[BoxData[ \(date\[EmptyVerySmallSquare]time[2006, 4, 18, 14, 46, 7.08`, 38823.61535972222`]\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(test + 86400.9999999999999999999999\)], "Input"], Cell[BoxData[ \(date\[EmptyVerySmallSquare]time[2006, 4, 19, 14, 46, 8.08`, 38824.61537129629`]\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(monthddyyyy[test]\)], "Input"], Cell[BoxData[ InterpretationBox["\<\"April \\!\\(18\\), \\!\\(2006\\)\"\>", StringForm[ "`2` `3`, `1`", 2006, "April", 18], Editable->False]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ \(monthyyyy[test]\), "\[IndentingNewLine]", \(monthyy[test]\)}], "Input"], Cell[BoxData[ InterpretationBox["\<\"April\[CenterDot]\\!\\(2006\\)\"\>", StringForm[ "`2`\[CenterDot]`1`", 2006, "April"], Editable->False]], "Output"], Cell[BoxData[ InterpretationBox["\<\"April\[CenterDot]06\"\>", StringForm[ "`2`\[CenterDot]`1`", "06", "April"], Editable->False]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ \(ddMMMyyyy[test]\), "\[IndentingNewLine]", \(ddMMMyy[test]\), "\[IndentingNewLine]", \(ddMMM[test]\)}], "Input"], Cell[BoxData[ InterpretationBox["\<\"\\!\\(18\\)\[CenterDot]Apr\[CenterDot]\\!\\(2006\\)\ \"\>", StringForm[ "`3`\[CenterDot]`2`\[CenterDot]`1`", 2006, "Apr", 18], Editable->False]], "Output"], Cell[BoxData[ InterpretationBox["\<\"\\!\\(18\\)\[CenterDot]Apr\[CenterDot]06\"\>", StringForm[ "`3`\[CenterDot]`2`\[CenterDot]`1`", "06", "Apr", 18], Editable->False]], "Output"], Cell[BoxData[ InterpretationBox["\<\"\\!\\(18\\)\[CenterDot]Apr\"\>", StringForm[ "`2`\[CenterDot]`1`", "Apr", 18], Editable->False]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ \(mmddyyyy[test]\), "\[IndentingNewLine]", \(mmddyy[test]\), "\[IndentingNewLine]", \(mmdd[test]\)}], "Input"], Cell[BoxData[ InterpretationBox["\<\"\\!\\(4\\)/\\!\\(18\\)/\\!\\(2006\\)\"\>", StringForm[ "`2`/`3`/`1`", 2006, 4, 18], Editable->False]], "Output"], Cell[BoxData[ InterpretationBox["\<\"\\!\\(4\\)/\\!\\(18\\)/06\"\>", StringForm[ "`2`/`3`/`1`", "06", 4, 18], Editable->False]], "Output"], Cell[BoxData[ InterpretationBox["\<\"\\!\\(4\\)/\\!\\(18\\)\"\>", StringForm[ "`1`/`2`", 4, 18], Editable->False]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(testam = make\[Ellipsis]date\[EmptyVerySmallSquare]time[{2006, 3, 31, 9, 25, 16}]\)], "Input"], Cell[BoxData[ \(date\[EmptyVerySmallSquare]time[2006, 3, 31, 9, 25, 16, 38805.392546296294`]\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ \(hhmnss[testam]\), "\[IndentingNewLine]", \(hhmn[testam]\), "\[IndentingNewLine]", \(hhmnssEXP[testam]\), "\[IndentingNewLine]", \(hhmnEXP[testam]\), "\[IndentingNewLine]", \(hhmnssPM[testam]\), "\[IndentingNewLine]", \(hhmnPM[testam]\)}], "Input"], Cell[BoxData[ InterpretationBox["\<\"09:25:16\"\>", StringForm[ "`1`:`2`:`3`", "09", "25", "16"], Editable->False]], "Output"], Cell[BoxData[ InterpretationBox["\<\"09:25\"\>", StringForm[ "`1`:`2`", "09", "25"], Editable->False]], "Output"], Cell[BoxData[ InterpretationBox["\<\"\\!\\(\\!\\(9\\)\\^\\(\\(\\\\ \\)\\(h\\)\\)\\) \\!\ \\(\\!\\(25\\)\\^\\(\\(\\\\ \\)\\(m\\)\\)\\) \\!\\(\\!\\(16\\)\\^\\(\\(\\\\ \ \\)\\(s\\)\\)\\)\"\>", StringForm[ "\!\(`1`\^\(\(\\ \)\(h\)\)\) \!\(`2`\^\(\(\\ \)\(m\)\)\) \ \!\(`3`\^\(\(\\ \)\(s\)\)\)", 9, 25, 16], Editable->False]], "Output"], Cell[BoxData[ InterpretationBox["\<\"\\!\\(\\!\\(9\\)\\^\\(\\(\\\\ \\)\\(h\\)\\)\\) \\!\ \\(\\!\\(25\\)\\^\\(\\(\\\\ \\)\\(m\\)\\)\\)\"\>", StringForm[ "\!\(`1`\^\(\(\\ \)\(h\)\)\) \!\(`2`\^\(\(\\ \)\(m\)\)\)", 9, 25], Editable->False]], "Output"], Cell[BoxData[ InterpretationBox["\<\"9:25:16 AM\"\>", StringForm[ "`1`:`2`:`3` `4`", "9", "25", "16", "AM"], Editable->False]], "Output"], Cell[BoxData[ InterpretationBox["\<\"9:25 AM\"\>", StringForm[ "`1`:`2` `3`", "9", "25", "AM"], Editable->False]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(testam \[VerticalSeparator] "\"\)], "Input"], Cell[BoxData[ \("9:25:16 AM"\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(Context[make\[Ellipsis]date\[EmptyVerySmallSquare]time]\)], "Input"], Cell[BoxData[ \("PMSI`ReadDateTime`"\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ \(testdays = make\[Ellipsis]date\[EmptyVerySmallSquare]time[{1850, 3, 31, 9, 25, 16}]\), "\[IndentingNewLine]", \(valueDTtoDT[valueDT[testdays]]\)}], "Input"], Cell[BoxData[ \(date\[EmptyVerySmallSquare]time[1850, 3, 31, 9, 25, 16, \(-18172.607453703702`\)]\)], "Output"], Cell[BoxData[ \(date\[EmptyVerySmallSquare]time[1850, 3, 31, 9, 25, 16, \(-18172.607453703702`\)]\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(findDateTimeStrings["\<4:16:23 pm March 27, 2006 1440 16:23\>"]\)], \ "Input"], Cell[BoxData[ \({"MARCH 27, 2006", "4:16:23 PM", "16:23"}\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(FullForm[testam \[VerticalSeparator] "\"]\)], "Input"], Cell[BoxData[ TagBox[ StyleBox["\"\<9:25:16 AM\>\"", ShowSpecialCharacters->False, ShowStringCharacters->True, NumberMarks->True], FullForm]], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(Attributes[VerticalSeparator]\)], "Input"], Cell[BoxData[ \({}\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(displayDTG[testam, "\"]\)], "Input"], Cell[BoxData[ \("9:25:16 AM"\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(?? Plus\)], "Input"], Cell[BoxData[ RowBox[{"\<\"x + y + z represents a sum of terms.\"\>", " ", ButtonBox[ StyleBox["More\[Ellipsis]", "SR"], ButtonData:>"Plus", Active->True, ButtonStyle->"RefGuideLink"]}]], "Print", CellTags->"Info3354360814-2011077"], Cell[BoxData[ InterpretationBox[GridBox[{ {\(Attributes[Plus] = {Flat, Listable, NumericFunction, OneIdentity, Orderless, Protected}\)}, {" "}, {GridBox[{ {\(Default[Plus] := 0\)} }, GridBaseline->{Baseline, {1, 1}}, ColumnWidths->0.999, ColumnAlignments->{Left}]} }, GridBaseline->{Baseline, {1, 1}}, ColumnAlignments->{Left}], Definition[ "Plus"], Editable->False]], "Print", CellTags->"Info3354360814-2011077"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ \(\(?UpValues\)\)], "Input"], Cell[BoxData[ RowBox[{"\<\"UpValues[f] gives a list of transformation rules \ corresponding to all upvalues defined for the symbol f.\"\>", " ", ButtonBox[ StyleBox["More\[Ellipsis]", "SR"], ButtonData:>"UpValues", Active->True, ButtonStyle->"RefGuideLink"]}]], "Print", CellTags->"Info3354360843-6845925"] }, Open ]] }, Open ]] }, Open ]] }, Open ]] }, FrontEndVersion->"5.2 for Macintosh", ScreenRectangle->{{0, 1680}, {0, 953}}, AutoGeneratedPackage->Automatic, WindowToolbars->"EditBar", WindowSize->{1238, 983}, WindowMargins->{{Automatic, 130}, {Automatic, 0}}, PrintingCopies->1, PrintingPageRange->{1, Automatic}, ShowSelection->True ] (******************************************************************* Cached data follows. If you edit this Notebook file directly, not using Mathematica, you must remove the line containing CacheID at the top of the file. The cache data will then be recreated when you save this file from within Mathematica. *******************************************************************) (*CellTagsOutline CellTagsIndex->{ "M220:5.4.8-1"->{ Cell[43356, 1253, 1088, 21, 155, "Input", InitializationCell->True, CellTags->{"M220:5.4.8-1", "M220.5.3"}]}, "M220.5.3"->{ Cell[43356, 1253, 1088, 21, 155, "Input", InitializationCell->True, CellTags->{"M220:5.4.8-1", "M220.5.3"}]}, "Info3354360814-2011077"->{ Cell[66993, 1937, 287, 8, 23, "Print", CellTags->"Info3354360814-2011077"], Cell[67283, 1947, 578, 16, 54, "Print", CellTags->"Info3354360814-2011077"]}, "Info3354360843-6845925"->{ Cell[67947, 1971, 361, 9, 23, "Print", CellTags->"Info3354360843-6845925"]} } *) (*CellTagsIndex CellTagsIndex->{ {"M220:5.4.8-1", 69086, 2006}, {"M220.5.3", 69228, 2010}, {"Info3354360814-2011077", 69384, 2014}, {"Info3354360843-6845925", 69588, 2019} } *) (*NotebookFileOutline Notebook[{ Cell[CellGroupData[{ Cell[1776, 53, 79, 1, 88, "Title"], Cell[1858, 56, 63, 1, 28, "Subsubtitle"], Cell[1924, 59, 821, 12, 78, "Text"], Cell[2748, 73, 582, 9, 62, "Text"], Cell[CellGroupData[{ Cell[3355, 86, 28, 0, 69, "Section"], Cell[CellGroupData[{ Cell[3408, 90, 30, 0, 28, "Subsubsection"], Cell[3441, 92, 82, 1, 32, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[3560, 98, 31, 0, 28, "Subsubsection"], Cell[3594, 100, 181, 7, 110, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[3812, 112, 32, 0, 28, "Subsubsection"], Cell[3847, 114, 210, 5, 30, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[4094, 124, 34, 0, 28, "Subsubsection"], Cell[4131, 126, 96, 3, 30, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[4264, 134, 41, 0, 28, "Subsubsection"], Cell[4308, 136, 19, 0, 30, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[4364, 141, 101, 4, 28, "Subsubsection"], Cell[4468, 147, 19, 0, 30, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[4524, 152, 32, 0, 28, "Subsubsection"], Cell[4559, 154, 642, 10, 62, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[5238, 169, 33, 0, 28, "Subsubsection"], Cell[5274, 171, 191, 4, 30, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[5502, 180, 36, 0, 28, "Subsubsection"], Cell[5541, 182, 256, 5, 62, "Text"], Cell[5800, 189, 435, 7, 98, "Text"], Cell[6238, 198, 344, 7, 64, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[6619, 210, 35, 0, 28, "Subsubsection"], Cell[6657, 212, 77, 1, 50, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[6771, 218, 37, 0, 28, "Subsubsection"], Cell[6811, 220, 154, 3, 31, "Text"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[7014, 229, 56, 1, 69, "Section", InitializationCell->True], Cell[7073, 232, 125, 4, 30, "Text", InitializationCell->True], Cell[CellGroupData[{ Cell[7223, 240, 102, 1, 38, "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell[7350, 245, 81, 1, 27, "Input", InitializationCell->True], Cell[7434, 248, 54, 1, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[7525, 254, 73, 2, 27, "Input", InitializationCell->True], Cell[7601, 258, 67, 1, 27, "Output"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[7717, 265, 129, 3, 38, "Subsection", Evaluatable->False, InitializationCell->True], Cell[7849, 270, 124, 3, 27, "Input", Evaluatable->False, InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell[8010, 278, 124, 4, 38, "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell[8159, 286, 281, 6, 42, "Input", InitializationCell->True], Cell[8443, 294, 236, 3, 43, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[8716, 302, 140, 3, 27, "Input", InitializationCell->True], Cell[8859, 307, 92, 1, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[8988, 313, 807, 12, 123, "Input", InitializationCell->True], Cell[9798, 327, 749, 10, 91, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[10584, 342, 439, 8, 72, "Input", InitializationCell->True], Cell[11026, 352, 393, 5, 59, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[11456, 362, 396, 7, 57, "Input", InitializationCell->True], Cell[11855, 371, 352, 5, 43, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[12244, 381, 237, 6, 42, "Input", InitializationCell->True], Cell[12484, 389, 185, 3, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[12706, 397, 175, 3, 27, "Input", InitializationCell->True], Cell[12884, 402, 103, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[13024, 409, 403, 8, 42, "Input", InitializationCell->True], Cell[13430, 419, 324, 5, 43, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[13791, 429, 156, 4, 27, "Input", InitializationCell->True], Cell[13950, 435, 119, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[14106, 442, 158, 4, 27, "Input", InitializationCell->True], Cell[14267, 448, 120, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[14424, 455, 154, 4, 27, "Input", InitializationCell->True], Cell[14581, 461, 118, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[14736, 468, 156, 4, 27, "Input", InitializationCell->True], Cell[14895, 474, 119, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[15051, 481, 160, 4, 27, "Input", InitializationCell->True], Cell[15214, 487, 121, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[15372, 494, 165, 4, 27, "Input", InitializationCell->True], Cell[15540, 500, 126, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[15703, 507, 198, 5, 27, "Input", InitializationCell->True], Cell[15904, 514, 158, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[16099, 521, 223, 4, 43, "Input", InitializationCell->True], Cell[16325, 527, 169, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[16531, 534, 267, 6, 42, "Input", InitializationCell->True], Cell[16801, 542, 201, 3, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[17039, 550, 321, 7, 42, "Input", InitializationCell->True], Cell[17363, 559, 255, 4, 43, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[17655, 568, 185, 5, 27, "Input", InitializationCell->True], Cell[17843, 575, 121, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[18001, 582, 426, 9, 57, "Input", InitializationCell->True], Cell[18430, 593, 383, 5, 43, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[18850, 603, 376, 6, 59, "Input", InitializationCell->True], Cell[19229, 611, 318, 5, 43, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[19584, 621, 213, 4, 27, "Input", InitializationCell->True], Cell[19800, 627, 161, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[19998, 634, 207, 4, 27, "Input", InitializationCell->True], Cell[20208, 640, 157, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[20402, 647, 187, 3, 27, "Input", InitializationCell->True], Cell[20592, 652, 141, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[20770, 659, 201, 4, 27, "Input", InitializationCell->True], Cell[20974, 665, 149, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[21160, 672, 193, 3, 27, "Input", InitializationCell->True], Cell[21356, 677, 145, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[21538, 684, 196, 3, 27, "Input", InitializationCell->True], Cell[21737, 689, 144, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[21918, 696, 186, 3, 27, "Input", InitializationCell->True], Cell[22107, 701, 137, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[22281, 708, 180, 3, 27, "Input", InitializationCell->True], Cell[22464, 713, 133, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[22634, 720, 173, 3, 27, "Input", InitializationCell->True], Cell[22810, 725, 128, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[22975, 732, 180, 3, 27, "Input", InitializationCell->True], Cell[23158, 737, 133, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[23328, 744, 173, 3, 27, "Input", InitializationCell->True], Cell[23504, 749, 128, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[23669, 756, 269, 4, 29, "Input", InitializationCell->True], Cell[23941, 762, 210, 3, 29, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[24188, 770, 237, 4, 29, "Input", InitializationCell->True], Cell[24428, 776, 181, 3, 29, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[24646, 784, 187, 3, 27, "Input", InitializationCell->True], Cell[24836, 789, 138, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[25011, 796, 180, 3, 27, "Input", InitializationCell->True], Cell[25194, 801, 133, 2, 27, "Output"] }, Open ]] }, Open ]], Cell[25354, 807, 89, 1, 38, "Subsection", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell[25480, 813, 61, 1, 69, "Section", InitializationCell->True], Cell[25544, 816, 159, 4, 30, "Text", InitializationCell->True], Cell[CellGroupData[{ Cell[25728, 824, 97, 1, 38, "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell[25850, 829, 97, 4, 42, "Input", InitializationCell->True], Cell[25950, 835, 62, 1, 27, "Output"], Cell[26015, 838, 108, 2, 27, "Output"] }, Open ]] }, Open ]], Cell[26150, 844, 76, 1, 38, "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell[26251, 849, 148, 4, 38, "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell[26424, 857, 542, 10, 72, "Input", InitializationCell->True], Cell[26969, 869, 670, 10, 59, "Output"] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[27688, 885, 122, 4, 38, "Subsection", InitializationCell->True], Cell[27813, 891, 216, 4, 27, "Input", InitializationCell->True], Cell[28032, 897, 503, 9, 91, "Input", InitializationCell->True], Cell[28538, 908, 1565, 30, 235, "Input", InitializationCell->True], Cell[30106, 940, 164, 3, 43, "Input", InitializationCell->True], Cell[30273, 945, 268, 5, 43, "Input", InitializationCell->True], Cell[CellGroupData[{ Cell[30566, 954, 65, 1, 28, "Subsubsection", InitializationCell->True], Cell[30634, 957, 233, 5, 27, "Input", InitializationCell->True], Cell[30870, 964, 151, 3, 27, "Input", InitializationCell->True], Cell[31024, 969, 566, 13, 75, "Input", InitializationCell->True], Cell[31593, 984, 668, 13, 139, "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell[32298, 1002, 65, 1, 28, "Subsubsection", InitializationCell->True], Cell[32366, 1005, 694, 15, 75, "Input", InitializationCell->True], Cell[33063, 1022, 653, 16, 75, "Input", InitializationCell->True], Cell[33719, 1040, 210, 4, 27, "Input", InitializationCell->True], Cell[33932, 1046, 383, 9, 59, "Input", InitializationCell->True], Cell[34318, 1057, 887, 19, 107, "Input", InitializationCell->True], Cell[35208, 1078, 444, 9, 59, "Input", InitializationCell->True], Cell[35655, 1089, 1721, 34, 299, "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell[37413, 1128, 76, 1, 28, "Subsubsection", InitializationCell->True], Cell[37492, 1131, 1501, 26, 187, "Input", InitializationCell->True], Cell[38996, 1159, 2742, 46, 235, "Input", InitializationCell->True] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[41787, 1211, 86, 1, 38, "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell[41898, 1216, 84, 1, 28, "Subsubsection", InitializationCell->True], Cell[41985, 1219, 466, 9, 59, "Input", InitializationCell->True], Cell[42454, 1230, 783, 15, 107, "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell[43274, 1250, 79, 1, 28, "Subsubsection", InitializationCell->True], Cell[43356, 1253, 1088, 21, 155, "Input", InitializationCell->True, CellTags->{"M220:5.4.8-1", "M220.5.3"}], Cell[44447, 1276, 188, 4, 27, "Input", InitializationCell->True], Cell[44638, 1282, 1205, 24, 123, "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell[45880, 1311, 94, 1, 28, "Subsubsection", InitializationCell->True], Cell[45977, 1314, 258, 5, 43, "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell[46272, 1324, 63, 1, 28, "Subsubsection", InitializationCell->True], Cell[46338, 1327, 179, 3, 27, "Input", InitializationCell->True], Cell[46520, 1332, 166, 3, 27, "Input", InitializationCell->True], Cell[46689, 1337, 1152, 22, 91, "Input", InitializationCell->True], Cell[47844, 1361, 147, 3, 27, "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell[48028, 1369, 63, 1, 28, "Subsubsection", InitializationCell->True], Cell[48094, 1372, 241, 5, 27, "Input", InitializationCell->True], Cell[48338, 1379, 1112, 21, 123, "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell[49487, 1405, 69, 1, 28, "Subsubsection", InitializationCell->True], Cell[49559, 1408, 2088, 38, 331, "Input", InitializationCell->True], Cell[51650, 1448, 206, 4, 27, "Input", InitializationCell->True], Cell[51859, 1454, 2072, 35, 155, "Input", InitializationCell->True], Cell[53934, 1491, 2399, 42, 212, "Input", InitializationCell->True] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[56382, 1539, 73, 1, 38, "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell[56480, 1544, 51, 1, 27, "Input", InitializationCell->True], Cell[56534, 1547, 62, 1, 27, "Output"] }, Open ]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[56657, 1555, 53, 1, 69, "Section", InitializationCell->True], Cell[56713, 1558, 104, 1, 30, "Text", InitializationCell->True], Cell[CellGroupData[{ Cell[56842, 1563, 73, 1, 38, "Subsection", InitializationCell->True], Cell[CellGroupData[{ Cell[56940, 1568, 540, 10, 72, "Input", InitializationCell->True], Cell[57483, 1580, 670, 10, 59, "Output"] }, Open ]], Cell[58168, 1593, 85, 1, 30, "Text", InitializationCell->True], Cell[58256, 1596, 85, 1, 27, "Input", InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell[58378, 1602, 129, 3, 38, "Subsection", Evaluatable->False, InitializationCell->True], Cell[58510, 1607, 128, 3, 27, "Input", Evaluatable->False, InitializationCell->True] }, Open ]], Cell[CellGroupData[{ Cell[58675, 1615, 73, 1, 38, "Subsection", InitializationCell->True], Cell[58751, 1618, 58, 1, 27, "Input", InitializationCell->True] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[58858, 1625, 34, 0, 69, "Section"], Cell[CellGroupData[{ Cell[58917, 1629, 122, 2, 38, "Subsection"], Cell[CellGroupData[{ Cell[59064, 1635, 126, 3, 27, "Input"], Cell[59193, 1640, 153, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[59383, 1647, 188, 4, 27, "Input"], Cell[59574, 1653, 245, 3, 43, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[59856, 1661, 93, 1, 27, "Input"], Cell[59952, 1664, 61, 1, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[60050, 1670, 84, 1, 27, "Input"], Cell[60137, 1673, 62, 1, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[60236, 1679, 227, 4, 27, "Input"], Cell[60466, 1685, 89, 1, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[60592, 1691, 160, 3, 27, "Input"], Cell[60755, 1696, 65, 1, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[60857, 1702, 101, 2, 27, "Input"], Cell[60961, 1706, 120, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[61118, 1713, 68, 1, 27, "Input"], Cell[61189, 1716, 120, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[61346, 1723, 50, 1, 27, "Input"], Cell[61399, 1726, 168, 3, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[61604, 1734, 97, 2, 43, "Input"], Cell[61704, 1738, 168, 3, 27, "Output"], Cell[61875, 1743, 157, 3, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[62069, 1751, 142, 3, 59, "Input"], Cell[62214, 1756, 208, 4, 27, "Output"], Cell[62425, 1762, 195, 3, 27, "Output"], Cell[62623, 1767, 160, 3, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[62820, 1775, 139, 3, 59, "Input"], Cell[62962, 1780, 165, 3, 27, "Output"], Cell[63130, 1785, 154, 3, 27, "Output"], Cell[63287, 1790, 141, 3, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[63465, 1798, 132, 3, 27, "Input"], Cell[63600, 1803, 117, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[63754, 1810, 293, 6, 107, "Input"], Cell[64050, 1818, 142, 3, 27, "Output"], Cell[64195, 1823, 129, 3, 27, "Output"], Cell[64327, 1828, 354, 7, 29, "Output"], Cell[64684, 1837, 270, 5, 29, "Output"], Cell[64957, 1844, 153, 3, 27, "Output"], Cell[65113, 1849, 140, 3, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[65290, 1857, 78, 1, 27, "Input"], Cell[65371, 1860, 46, 1, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[65454, 1866, 88, 1, 27, "Input"], Cell[65545, 1869, 54, 1, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[65636, 1875, 200, 4, 43, "Input"], Cell[65839, 1881, 122, 2, 27, "Output"], Cell[65964, 1885, 122, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[66123, 1892, 98, 2, 27, "Input"], Cell[66224, 1896, 75, 1, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[66336, 1902, 88, 1, 27, "Input"], Cell[66427, 1905, 192, 6, 39, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[66656, 1916, 62, 1, 27, "Input"], Cell[66721, 1919, 36, 1, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[66794, 1925, 70, 1, 27, "Input"], Cell[66867, 1928, 46, 1, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[66950, 1934, 40, 1, 27, "Input"], Cell[66993, 1937, 287, 8, 23, "Print", CellTags->"Info3354360814-2011077"], Cell[67283, 1947, 578, 16, 54, "Print", CellTags->"Info3354360814-2011077"] }, Open ]], Cell[CellGroupData[{ Cell[67898, 1968, 46, 1, 27, "Input"], Cell[67947, 1971, 361, 9, 23, "Print", CellTags->"Info3354360843-6845925"] }, Open ]] }, Open ]] }, Open ]] }, Open ]] } ] *) (******************************************************************* End of Mathematica Notebook file. *******************************************************************)