diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2021-06-08 05:06:21 +0300 | 
|---|---|---|
| committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2021-06-08 05:06:21 +0300 | 
| commit | 0a745b47880fb16b1db8cd3327377a383dbfe6a8 (patch) | |
| tree | e96e11b0083858ce6f70d67f3ea818c13bc43b29 | |
| parent | 4cec2d689f9a7d1791f7ea3933cc1cdc59e972ab (diff) | |
Revert "Merge branch 'DRTVWR-520-apple-notarization' into DRTVWR-540-maint"
This reverts commit 681298dd726b2d00910fe71646147fadd1aba980, reversing
changes made to 323f41f4892248762fc8505d8df17d70bd833cf3.
51 files changed, 6525 insertions, 315 deletions
diff --git a/autobuild.xml b/autobuild.xml index fc7226c346..2470b2e5aa 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -76,9 +76,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>b6357ef3a0ec37877a5831820f25094e</string> +              <string>9b8bcc3be6dbe40a04c9c81c313f70dc</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80557/759704/apr_suite-1.4.5.558565-darwin64-558565.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68333/658209/apr_suite-1.4.5.548882-darwin64-548882.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -112,9 +112,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>cb48ac069440f6dcd564cfa9fd02a4c2</string> +              <string>6bdf460c18ee004b41a46afc80041a92</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80556/759710/apr_suite-1.4.5.558565-windows-558565.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68334/658225/apr_suite-1.4.5.548882-windows-548882.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -124,16 +124,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>646dc3828d9c39fb1e77c4eec44ed739</string> +              <string>83104bfa4dabb77cd70d185e38a95b49</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80555/759709/apr_suite-1.4.5.558565-windows64-558565.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68332/658215/apr_suite-1.4.5.548882-windows64-548882.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>1.4.5.558565</string> +        <string>1.4.5.548882</string>        </map>        <key>boost</key>        <map> @@ -166,9 +166,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>35cc090d942b85c9126ceac9912d52d6</string> +              <string>3cc73623c9a976b4f8346a3837f7a916</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78585/744021/boost-1.72-darwin64-557045.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64088/601256/boost-1.72-darwin64-545361.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -202,9 +202,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>9aa4ce32df5f5e36124c990e2d77b885</string> +              <string>7d4b2511976449e9a4ec7be41dc8310f</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78586/743982/boost-1.72-windows-557045.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64092/601270/boost-1.72-windows-545361.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -214,9 +214,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>a79511c9d8b956767ebaa405155d4238</string> +              <string>4ad8df0700745201cddf6b71d7b0949f</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78584/743961/boost-1.72-windows64-557045.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64091/601265/boost-1.72-windows64-545361.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string> @@ -308,9 +308,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>1d063cf1783e7788f17486c234adb1db</string> +              <string>02e6a8207dcdaf243dcb6da19b8c3534</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78635/744249/colladadom-2.3.557064-darwin64-557064.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64099/601302/colladadom-2.3.545362-darwin64-545362.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -344,9 +344,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>e78ecf919eee01567556787c3a358d15</string> +              <string>8a02a10fc69c8f504dc5335644db184a</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78637/744269/colladadom-2.3.557064-windows-557064.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64104/601313/colladadom-2.3.545362-windows-545362.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -356,16 +356,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>7e63a212c8909a25236138422fe01298</string> +              <string>742180324fca7ab92b6a61a36aab4f9d</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78636/744273/colladadom-2.3.557064-windows64-557064.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64103/601314/colladadom-2.3.545362-windows64-545362.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>2.3.557064</string> +        <string>2.3.545362</string>        </map>        <key>curl</key>        <map> @@ -398,9 +398,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>13f74f43a6363ec998569f731fd869c5</string> +              <string>f5ae57117a6518d11f49ccfbfbe0969d</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82637/774617/curl-7.54.1.560191-darwin64-560191.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64131/601402/curl-7.54.1.545369-darwin64-545369.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -434,11 +434,11 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>0df99bd685dc3561ca8ea347b2921987</string> +              <string>2796ae7b09e730a55ac03f74ed669520</string>                <key>hash_algorithm</key>                <string>md5</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82639/774610/curl-7.54.1.560191-windows-560191.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64130/601396/curl-7.54.1.545369-windows-545369.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -448,16 +448,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>50db2a9e6b74ec4b0c38b1ea8f135735</string> +              <string>a8f96e5cdb8128b23d49ff4c3f2233a4</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82638/774608/curl-7.54.1.560191-windows64-560191.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64129/601382/curl-7.54.1.545369-windows64-545369.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>7.54.1.560191</string> +        <string>7.54.1.545369</string>        </map>        <key>db</key>        <map> @@ -580,9 +580,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>77d2bc0c26c5047ac9f8126f8fa5aa0f</string> +              <string>856ba0e5b7be4bf683cf2849bce845e0</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80680/760744/dullahan-1.7.0.202104220619_81.3.10_gb223419_chromium-81.0.4044.138-darwin64-558653.tar.bz2</string> +              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/72458/699860/dullahan-1.7.0.202011160759_81.3.10_gb223419_chromium-81.0.4044.138-darwin64-552313.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -592,9 +592,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>6a110e6b902617bab404b259110824bc</string> +              <string>515950c911a53ff910b18c7c417ea984</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80683/760762/dullahan-1.7.0.202104220629_81.3.10_gb223419_chromium-81.0.4044.138-windows-558653.tar.bz2</string> +              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/72460/699870/dullahan-1.7.0.202011161603_81.3.10_gb223419_chromium-81.0.4044.138-windows-552313.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -604,16 +604,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>3826abcf9dd5a2b137aa69f4a2a881d1</string> +              <string>f1dccbdfe0603f488eeee4c8f518c959</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80684/760763/dullahan-1.7.0.202104220629_81.3.10_gb223419_chromium-81.0.4044.138-windows64-558653.tar.bz2</string> +              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/72459/699874/dullahan-1.7.0.202011161603_81.3.10_gb223419_chromium-81.0.4044.138-windows64-552313.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>1.7.0.202104220629_81.3.10_gb223419_chromium-81.0.4044.138</string> +        <string>1.7.0.202011161603_81.3.10_gb223419_chromium-81.0.4044.138</string>        </map>        <key>elfio</key>        <map> @@ -670,9 +670,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>f4e80e0dfcab713a3da90cd8f7f23e7b</string> +              <string>3656b7f7b655cb267fd94f089d2e145c</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76341/727265/expat-2.1.1.555519-darwin64-555519.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54860/510198/expat-2.1.1.538990-darwin64-538990.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -706,9 +706,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>cd4fe03473076c324d80ae3bd91a85bb</string> +              <string>c509f8afa1e02f4c16232cce7f6855f8</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76343/727273/expat-2.1.1.555519-windows-555519.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55056/512080/expat-2.1.1.538990-windows-538990.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -718,16 +718,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>d2d74d73b914150982b1883a3b96e60b</string> +              <string>aba97cfdf44c04dbfcac89c7cb472580</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76344/727279/expat-2.1.1.555519-windows64-555519.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55054/512068/expat-2.1.1.538990-windows64-538990.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>2.1.1.555519</string> +        <string>2.1.1.538990</string>        </map>        <key>fmodstudio</key>        <map> @@ -748,9 +748,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>d5528538e67c710387ae0c061a90cb23</string> +              <string>89c37441a806ed80c0102d380eec6fd0</string>                <key>url</key> -              <string>https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/76868/730756/fmodstudio-2.01.07.555883-darwin64-555883.tar.bz2</string> +              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/65400/612632/fmodstudio-2.00.11.546392-darwin64-546392.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -784,9 +784,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>a2bb6eaf51f933993b26a5fe7503a761</string> +              <string>0f44323b0d03b7d0d8a17eec83e103ce</string>                <key>url</key> -              <string>https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/76869/730763/fmodstudio-2.01.07.555883-windows-555883.tar.bz2</string> +              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/65401/612647/fmodstudio-2.00.11.546392-windows-546392.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -796,16 +796,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>138d07dd516a9ad5b9787192fe6134dd</string> +              <string>462d28eacf731a5d36ab031e7071c32a</string>                <key>url</key> -              <string>https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/76867/730751/fmodstudio-2.01.07.555883-windows64-555883.tar.bz2</string> +              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/65402/612648/fmodstudio-2.00.11.546392-windows64-546392.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>2.01.07.555883</string> +        <string>2.00.11.546392</string>        </map>        <key>fontconfig</key>        <map> @@ -880,9 +880,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>3a478d6c8a10d49d9161ef864394b03c</string> +              <string>81a2e9aca3e33c4eecf0081854540b07</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78592/744013/freetype-2.4.4.557047-darwin64-557047.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56309/526711/freetype-2.4.4.539865-darwin64-539865.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -916,9 +916,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>7ee200d6b5fa282c7f973ade5615aa86</string> +              <string>1d1c7b60f71a5152ced60bee87f5bba8</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78594/744011/freetype-2.4.4.557047-windows-557047.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56312/526734/freetype-2.4.4.539865-windows-539865.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -928,16 +928,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>69307aaba16ac71531c9c4d930ace993</string> +              <string>53e78d4a607e959637e98a82a3cf5bea</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78593/744010/freetype-2.4.4.557047-windows64-557047.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56310/526723/freetype-2.4.4.539865-windows64-539865.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>2.4.4.557047</string> +        <string>2.4.4.539865</string>        </map>        <key>glext</key>        <map> @@ -1078,9 +1078,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>a9eaa005ff9d387f946283fbcb69b3c8</string> +              <string>343913fe1434da228c2210c23d2e3a1a</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76353/727324/glod-1.0pre3.555522-darwin64-555522.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54850/510134/glod-1.0pre3.538980-darwin64-538980.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -1139,7 +1139,97 @@            </map>          </map>          <key>version</key> -        <string>1.0pre3.555522</string> +        <string>1.0pre3.538980</string> +      </map> +      <key>google_breakpad</key> +      <map> +        <key>copyright</key> +        <string>Copyright (c) 2006, Google Inc.</string> +        <key>description</key> +        <string>Breakpad is a crossplatform library for capturing crash callstacks and runtime data.</string> +        <key>license</key> +        <string>bsd</string> +        <key>license_file</key> +        <string>LICENSES/google_breakpad.txt</string> +        <key>name</key> +        <string>google_breakpad</string> +        <key>platforms</key> +        <map> +          <key>darwin</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>171b39db6d0702535b41fad5b476e39d</string> +              <key>url</key> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-breakpad_3p-update-google-breakpad/rev/298033/arch/Darwin/installer/google_breakpad-1413.298033-darwin-298033.tar.bz2</string> +            </map> +            <key>name</key> +            <string>darwin</string> +          </map> +          <key>darwin64</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>ca33f234aae399b9e704e262f7e15d35</string> +              <key>url</key> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56338/526869/google_breakpad-1413.539880-darwin64-539880.tar.bz2</string> +            </map> +            <key>name</key> +            <string>darwin64</string> +          </map> +          <key>linux</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>352e673897e8f36f8470150b8ace6ce9</string> +              <key>url</key> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-google-breakpad/rev/314225/arch/Linux/installer/google_breakpad-1413.314225-linux-314225.tar.bz2</string> +            </map> +            <key>name</key> +            <string>linux</string> +          </map> +          <key>linux64</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>6bddcc1ac470dd5eab459220102df9e9</string> +              <key>url</key> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1835/4114/google_breakpad-1413.501824-linux64-501824.tar.bz2</string> +            </map> +            <key>name</key> +            <string>linux64</string> +          </map> +          <key>windows</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>bfee0438617f57f02f7e8515a801cb20</string> +              <key>url</key> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56359/526982/google_breakpad-1413.539880-windows-539880.tar.bz2</string> +            </map> +            <key>name</key> +            <string>windows</string> +          </map> +          <key>windows64</key> +          <map> +            <key>archive</key> +            <map> +              <key>hash</key> +              <string>6f983e754bb3046f065806b510b408c5</string> +              <key>url</key> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56358/526975/google_breakpad-1413.539880-windows64-539880.tar.bz2</string> +            </map> +            <key>name</key> +            <string>windows64</string> +          </map> +        </map> +        <key>version</key> +        <string>1413.539880</string>        </map>        <key>googlemock</key>        <map> @@ -1172,9 +1262,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>19e925604bc1a91efb4b130e1edd8bf2</string> +              <string>f9831360ced94943ab9dfb3fbf5256d3</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78620/744140/googlemock-1.7.0.557057-darwin64-557057.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64101/601290/googlemock-1.7.0.545363-darwin64-545363.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -1208,9 +1298,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>eed7b41d0d1f41b24f315349ef78c728</string> +              <string>8149e46b4f7abb3ac284415cfe1366e1</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78622/744148/googlemock-1.7.0.557057-windows-557057.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64102/601296/googlemock-1.7.0.545363-windows-545363.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -1220,16 +1310,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>a6ad6fe722d2fe4e8137495af3f374c9</string> +              <string>f3851eba809ead2810d702041569d36d</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78621/744152/googlemock-1.7.0.557057-windows64-557057.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64100/601284/googlemock-1.7.0.545363-windows64-545363.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>1.7.0.557057</string> +        <string>1.7.0.545363</string>        </map>        <key>gstreamer</key>        <map> @@ -1702,9 +1792,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>2021ea3a19b81c82993e733709683303</string> +              <string>c327e6d6573fc0a808677de47f08acd9</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76371/727419/libhunspell-1.3.2.555528-darwin64-555528.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54844/510092/libhunspell-1.3.2.538974-darwin64-538974.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -1738,9 +1828,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>2253ec09136cc7c208481030d78d9dd7</string> +              <string>ec22ec25160bcfd2a74f1c7bc8ff6133</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76369/727412/libhunspell-1.3.2.555528-windows-555528.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54986/511824/libhunspell-1.3.2.538974-windows-538974.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -1750,16 +1840,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>858d1708f6b3a74738a3d57a5387e20f</string> +              <string>f470c6f3f7b0559e95e76467b808de10</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76370/727413/libhunspell-1.3.2.555528-windows64-555528.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54985/511817/libhunspell-1.3.2.538974-windows64-538974.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>1.3.2.555528</string> +        <string>1.3.2.538974</string>        </map>        <key>libndofdev</key>        <map> @@ -1792,9 +1882,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>a487fff84208a45844602c4a1f68c974</string> +              <string>bf765dfe0b928ef3c531cd9618fee89b</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76356/727333/libndofdev-0.1.555523-darwin64-555523.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54843/510085/libndofdev-0.1.538973-darwin64-538973.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -1804,9 +1894,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>4c839555bf0ed9ae60ffc3f8a7c96f9b</string> +              <string>8abb7d216535009f6c0a7e43b0734b1e</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76354/727340/libndofdev-0.1.555523-windows-555523.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54984/511810/libndofdev-0.1.538973-windows-538973.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -1816,16 +1906,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>cbc033ae3b034b992b59f6de1034247c</string> +              <string>9da7aed5a914174dcb2be12ecd4a656f</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76355/727341/libndofdev-0.1.555523-windows64-555523.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54983/511803/libndofdev-0.1.538973-windows64-538973.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>0.1.555523</string> +        <string>0.1.538973</string>        </map>        <key>libpng</key>        <map> @@ -1858,9 +1948,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>2a41acc3116ce19a443873216cb882ad</string> +              <string>0932b19bb6a8e2641706afd13d92951d</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78587/743948/libpng-1.6.8.557046-darwin64-557046.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56313/526740/libpng-1.6.8.539868-darwin64-539868.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -1894,9 +1984,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>b935b440947f63c69700bdcf5095a8e1</string> +              <string>f498782698428888113b64a7505c8f7f</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78591/743970/libpng-1.6.8.557046-windows-557046.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56319/526770/libpng-1.6.8.539868-windows-539868.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -1906,16 +1996,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>d1cc8354ac4e877eefedf16b1be3aac6</string> +              <string>f8ac4f690a2925418866bccf6eba3cf4</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78589/743991/libpng-1.6.8.557046-windows64-557046.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56317/526762/libpng-1.6.8.539868-windows64-539868.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>1.6.8.557046</string> +        <string>1.6.8.539868</string>        </map>        <key>libuuid</key>        <map> @@ -1990,9 +2080,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>6677173bbbb0ea32369b5e9b6c9aa641</string> +              <string>0706b9c3889d767af9f5105d9ffa9b51</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78631/744225/libxml2-2.9.4.557062-darwin64-557062.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56327/526819/libxml2-2.9.4.539866-darwin64-539866.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -2026,9 +2116,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>ad6a596fbf0e83a21d95762da78437bc</string> +              <string>1b7b979a8387fbb0f278dc681558b9ef</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78633/744239/libxml2-2.9.4.557062-windows-557062.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56316/526755/libxml2-2.9.4.539866-windows-539866.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -2038,16 +2128,16 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>6b5bb230684ecf28386d7c91c47bb6e1</string> +              <string>4f8ff97d6a9ab350306b62eec8adc810</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78634/744240/libxml2-2.9.4.557062-windows64-557062.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56314/526748/libxml2-2.9.4.539866-windows64-539866.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>2.9.4.557062</string> +        <string>2.9.4.539866</string>        </map>        <key>llappearance_utility</key>        <map> @@ -2324,9 +2414,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>e4f784d8a035c51921a1562ca7a1bab6</string> +              <string>937ce1a2158c0cfff37f5989f5b24aba</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76357/727350/nghttp2-1.40.0.555524-darwin64-555524.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64066/601156/nghttp2-1.40.0.545354-darwin64-545354.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -2360,9 +2450,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>af05aa2994c9845308fecd094b7b2d25</string> +              <string>138b881bdf37dff4e626e022a50dd11f</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76359/727360/nghttp2-1.40.0.555524-windows-555524.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64069/601181/nghttp2-1.40.0.545354-windows-545354.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -2372,9 +2462,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>5a55cede40eef16b9d1e47c418a2b77a</string> +              <string>c23c6480c7cbea60a2bd26e257adc0a7</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76358/727359/nghttp2-1.40.0.555524-windows64-555524.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64068/601177/nghttp2-1.40.0.545354-windows64-545354.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string> @@ -2383,7 +2473,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>          <key>source_type</key>          <string>hg</string>          <key>version</key> -        <string>1.40.0.555524</string> +        <string>1.40.0.545354</string>        </map>        <key>nvapi</key>        <map> @@ -2738,9 +2828,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>5503e4928bcdb0a29685b3242c4a409b</string> +              <string>18aef0c8fc471b6539addbdc019aea25</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82619/774464/openssl-1.1.1l.560177-darwin64-560177.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56325/526804/openssl-1.0.2l.539874-darwin64-539874.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -2774,9 +2864,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>d2153f20dc2d35c609b876a9f019a748</string> +              <string>2b2f61313b1cbd2893c1ba5bf15061fa</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82623/774521/openssl-1.1.1l.560177-windows-560177.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56328/526826/openssl-1.0.2l.539874-windows-539874.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -2786,16 +2876,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>f40b8622ba38084b0962e273988d748f</string> +              <string>59aae854155bc7119e0dca25e65828c0</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82624/774520/openssl-1.1.1l.560177-windows64-560177.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56326/526811/openssl-1.0.2l.539874-windows64-539874.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>1.1.1l.560177</string> +        <string>1.0.2l.539874</string>        </map>        <key>pcre</key>        <map> @@ -2918,9 +3008,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>6ce3cbaed968a69fb7a2cca80220874d</string> +              <string>321a8542e7b693fbe8e44ebface06087</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80380/758537/slvoice-4.10.0000.32327.5fc3fe7c.558436-darwin64-558436.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55966/524403/slvoice-4.10.0000.32327.5fc3fe7c.539691-darwin64-539691.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -2954,9 +3044,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>2eb38c5eff4d0f18fbb89d0c30c4f0a4</string> +              <string>fb1a57a1cf5e38a3d51b32307b93ffba</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80382/758550/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows-558436.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55968/524423/slvoice-4.10.0000.32327.5fc3fe7c.539691-windows-539691.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -2966,16 +3056,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>9ee8f3cbc5369c598a998c61961ed16d</string> +              <string>81df970eb0c97d415d7bd12049c82042</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80381/758551/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows64-558436.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55967/524409/slvoice-4.10.0000.32327.5fc3fe7c.539691-windows64-539691.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>4.10.0000.32327.5fc3fe7c.558436</string> +        <string>4.10.0000.32327.5fc3fe7c.539691</string>        </map>        <key>tut</key>        <map> @@ -3038,9 +3128,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>c42575ac8997de979eadb082c33a578e</string> +              <string>60f008c5fd31641ad4e61ac751ce15d1</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81322/765512/uriparser-0.9.4-darwin64-559132.tar.bz2</string> +              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75748/723495/uriparser-0.9.4-darwin64-555117.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -3074,9 +3164,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>901b1063556fc6b2575e745eef2bf744</string> +              <string>00aff37a6f5e1fe08456702d28706cf6</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81323/765528/uriparser-0.9.4-windows-559132.tar.bz2</string> +              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75751/723507/uriparser-0.9.4-windows-555117.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -3086,9 +3176,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>962c01d553f286c430102998129fb0d6</string> +              <string>ff27a91f3941c7bef5e1613a064cb048</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81324/765527/uriparser-0.9.4-windows64-559132.tar.bz2</string> +              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75750/723506/uriparser-0.9.4-windows64-555117.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string> @@ -3172,9 +3262,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>b639d0035f4a8c9b4973be428a1b7e61</string> +              <string>5e553a4358203f283c74744aed2fcd8c</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69569/671323/vlc_bin-3.0.9.549888-darwin64-549888.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54836/510036/vlc_bin-2.2.8.538966-darwin64-538966.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -3196,9 +3286,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>4f50b0c47daa081dd4fcb83763d5b0b2</string> +              <string>ca84b7c5f86e702fb35727eed8f0c8c4</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69567/671314/vlc_bin-3.0.9.549888-windows-549888.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54958/511725/vlc_bin-2.2.8.538966-windows-538966.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -3208,16 +3298,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>c2f8c01fb6c261b72beb07f0c4cd423f</string> +              <string>93cd88d90cb8aedbed5cd90ff9262409</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69568/671315/vlc_bin-3.0.9.549888-windows64-549888.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54954/511718/vlc_bin-2.2.8.538966-windows64-538966.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>3.0.9.549888</string> +        <string>2.2.8.538966</string>        </map>        <key>xmlrpc-epi</key>        <map> @@ -3250,9 +3340,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>922a0dea32266897ed1911200438e1e1</string> +              <string>99ea1808ee9f5b55029daa9fdef86776</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76372/727426/xmlrpc_epi-0.54.1.555529-darwin64-555529.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55063/512104/xmlrpc_epi-0.54.1.539072-darwin64-539072.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -3286,9 +3376,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>34b847e6b280048465fe7c6ce67fe05c</string> +              <string>94643b7cebb449f049fa9e32ae682bcd</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76374/727436/xmlrpc_epi-0.54.1.555529-windows-555529.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55138/512288/xmlrpc_epi-0.54.1.539072-windows-539072.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -3298,16 +3388,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>8fbe7c4ea22bb7f23a93c73884ebb34c</string> +              <string>c409de1974a879291ce7daaf52348d85</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76373/727435/xmlrpc_epi-0.54.1.555529-windows64-555529.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55137/512279/xmlrpc_epi-0.54.1.539072-windows64-539072.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>0.54.1.555529</string> +        <string>0.54.1.539072</string>        </map>        <key>zlib</key>        <map> @@ -3340,9 +3430,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>9181bc8229f1a8e480d2a40a2744ec28</string> +              <string>9785bda5b4d3b41bf391b33d0da78c9e</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78578/743913/zlib-1.2.11.557041-darwin64-557041.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54858/510190/zlib-1.2.8.538988-darwin64-538988.tar.bz2</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -3378,9 +3468,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>8308cbd2ea0fe290541698b0f63482e2</string> +              <string>ebdb07d4aaa5312005a8773f625032a4</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78579/743926/zlib-1.2.11.557041-windows-557041.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55048/512031/zlib-1.2.8.538988-windows-538988.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> @@ -3390,16 +3480,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>              <key>archive</key>              <map>                <key>hash</key> -              <string>36bdc34f67d3ad3c57125dc1b16a3129</string> +              <string>0ac95f3dece7d575ba45cf5728f53eea</string>                <key>url</key> -              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78577/743920/zlib-1.2.11.557041-windows64-557041.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55047/512024/zlib-1.2.8.538988-windows64-538988.tar.bz2</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map>          <key>version</key> -        <string>1.2.11.557041</string> +        <string>1.2.8.538988</string>        </map>      </map>      <key>package_description</key> diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index eb205ccb11..53e5d7b6a5 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -70,11 +70,17 @@ if (LINUX)        add_subdirectory(${LLAPPEARANCEUTILITY_SRC_DIR} ${LLAPPEARANCEUTILITY_BIN_DIR})    endif (INSTALL_PROPRIETARY)    add_dependencies(viewer linux-crash-logger-strip-target) +elseif (DARWIN) +  add_subdirectory(${VIEWER_PREFIX}mac_crash_logger) +  add_dependencies(viewer mac-crash-logger)  elseif (WINDOWS) +  add_subdirectory(${VIEWER_PREFIX}win_crash_logger)    # cmake EXISTS requires an absolute path, see indra/cmake/Variables.cmake    if (EXISTS ${VIEWER_DIR}win_setup)      add_subdirectory(${VIEWER_DIR}win_setup)    endif (EXISTS ${VIEWER_DIR}win_setup) +  # add_dependencies(viewer windows-setup windows-crash-logger) +  add_dependencies(viewer windows-crash-logger)  endif (LINUX)  add_subdirectory(${VIEWER_PREFIX}newview) diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake index 7d8bfb1b0f..b8e569d3a8 100644 --- a/indra/cmake/CEFPlugin.cmake +++ b/indra/cmake/CEFPlugin.cmake @@ -24,7 +24,7 @@ elseif (DARWIN)          message(FATAL_ERROR "AppKit not found")      endif() -    set(CEF_LIBRARY "'${ARCH_PREBUILT_DIRS_RELEASE}/Chromium\ Embedded\ Framework.framework'") +    FIND_LIBRARY(CEF_LIBRARY "Chromium Embedded Framework" ${ARCH_PREBUILT_DIRS_RELEASE})      if (NOT CEF_LIBRARY)          message(FATAL_ERROR "CEF not found")      endif() @@ -33,7 +33,7 @@ elseif (DARWIN)          ${ARCH_PREBUILT_DIRS_RELEASE}/libcef_dll_wrapper.a          ${ARCH_PREBUILT_DIRS_RELEASE}/libdullahan.a          ${APPKIT_LIBRARY} -        "-F ${CEF_LIBRARY}" +        ${CEF_LIBRARY}         )  elseif (LINUX) diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index cca305c741..a17e37cd32 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -28,6 +28,7 @@ set(cmake_SOURCE_FILES      FindAutobuild.cmake      FindBerkeleyDB.cmake      FindGLH.cmake +    FindGoogleBreakpad.cmake      FindHUNSPELL.cmake      FindJsonCpp.cmake      FindNDOF.cmake @@ -42,6 +43,7 @@ set(cmake_SOURCE_FILES      GLH.cmake      GLOD.cmake  ##  GStreamer010Plugin.cmake +    GoogleBreakpad.cmake      GoogleMock.cmake      Havok.cmake      Hunspell.cmake diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 848547f2a2..de81512eef 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -56,21 +56,14 @@ if(WINDOWS)          libapr-1.dll          libaprutil-1.dll          libapriconv-1.dll +        ssleay32.dll +        libeay32.dll          nghttp2.dll          glod.dll          libhunspell.dll          uriparser.dll          ) -    # OpenSSL -    if(ADDRESS_SIZE EQUAL 64) -        set(release_files ${release_files} libcrypto-1_1-x64.dll) -        set(release_files ${release_files} libssl-1_1-x64.dll) -    else(ADDRESS_SIZE EQUAL 64) -        set(release_files ${release_files} libcrypto-1_1.dll) -        set(release_files ${release_files} libssl-1_1.dll) -    endif(ADDRESS_SIZE EQUAL 64) -      # Filenames are different for 32/64 bit BugSplat file and we don't      # have any control over them so need to branch.      if (BUGSPLAT_DB) @@ -165,6 +158,7 @@ elseif(DARWIN)          libapr-1.dylib          libaprutil-1.0.dylib          libaprutil-1.dylib +        libexception_handler.dylib          ${EXPAT_COPY}          libGLOD.dylib          libhunspell-1.3.0.dylib diff --git a/indra/cmake/FindGoogleBreakpad.cmake b/indra/cmake/FindGoogleBreakpad.cmake new file mode 100644 index 0000000000..1a0493be5e --- /dev/null +++ b/indra/cmake/FindGoogleBreakpad.cmake @@ -0,0 +1,40 @@ +# -*- cmake -*- + +# - Find Google BreakPad +# Find the Google BreakPad includes and library +# This module defines +#  BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR, where to find exception_handler.h, etc. +#  BREAKPAD_EXCEPTION_HANDLER_LIBRARIES, the libraries needed to use Google BreakPad. +#  BREAKPAD_EXCEPTION_HANDLER_FOUND, If false, do not try to use Google BreakPad. +# also defined, but not for general use are +#  BREAKPAD_EXCEPTION_HANDLER_LIBRARY, where to find the Google BreakPad library. + +FIND_PATH(BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR google_breakpad/exception_handler.h) + +SET(BREAKPAD_EXCEPTION_HANDLER_NAMES ${BREAKPAD_EXCEPTION_HANDLER_NAMES} breakpad_client) +FIND_LIBRARY(BREAKPAD_EXCEPTION_HANDLER_LIBRARY +  NAMES ${BREAKPAD_EXCEPTION_HANDLER_NAMES} +  ) + +IF (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) +    SET(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES ${BREAKPAD_EXCEPTION_HANDLER_LIBRARY}) +    SET(BREAKPAD_EXCEPTION_HANDLER_FOUND "YES") +ELSE (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) +    SET(BREAKPAD_EXCEPTION_HANDLER_FOUND "NO") +ENDIF (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) + + +IF (BREAKPAD_EXCEPTION_HANDLER_FOUND) +   IF (NOT BREAKPAD_EXCEPTION_HANDLER_FIND_QUIETLY) +      MESSAGE(STATUS "Found Google BreakPad: ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES}") +   ENDIF (NOT BREAKPAD_EXCEPTION_HANDLER_FIND_QUIETLY) +ELSE (BREAKPAD_EXCEPTION_HANDLER_FOUND) +   IF (BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED) +      MESSAGE(FATAL_ERROR "Could not find Google BreakPad library") +   ENDIF (BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED) +ENDIF (BREAKPAD_EXCEPTION_HANDLER_FOUND) + +MARK_AS_ADVANCED( +  BREAKPAD_EXCEPTION_HANDLER_LIBRARY +  BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR +  ) diff --git a/indra/cmake/GoogleBreakpad.cmake b/indra/cmake/GoogleBreakpad.cmake new file mode 100644 index 0000000000..829e1ac08a --- /dev/null +++ b/indra/cmake/GoogleBreakpad.cmake @@ -0,0 +1,22 @@ +# -*- cmake -*- +include(Prebuilt) + +if (USESYSTEMLIBS) +  set(BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED ON) +  include(FindGoogleBreakpad) +else (USESYSTEMLIBS) +  use_prebuilt_binary(google_breakpad) +  if (DARWIN) +    set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler) +  endif (DARWIN) +  if (LINUX) +    set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES breakpad_client) +  endif (LINUX) +  if (WINDOWS) +    set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler crash_generation_client crash_generation_server common) +  endif (WINDOWS) +  # yes, this does look dumb, no, it's not incorrect +  # +  set(BREAKPAD_INCLUDE_DIRECTORIES "${LIBS_PREBUILT_DIR}/include/google_breakpad" "${LIBS_PREBUILT_DIR}/include/google_breakpad/google_breakpad") +endif (USESYSTEMLIBS) + diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake index 32400f5e4e..eb548bdcc1 100644 --- a/indra/cmake/OpenSSL.cmake +++ b/indra/cmake/OpenSSL.cmake @@ -9,7 +9,7 @@ if (USESYSTEMLIBS)  else (USESYSTEMLIBS)    use_prebuilt_binary(openssl)    if (WINDOWS) -    set(OPENSSL_LIBRARIES libssl libcrypto) +    set(OPENSSL_LIBRARIES ssleay32 libeay32)    else (WINDOWS)      set(OPENSSL_LIBRARIES ssl crypto)    endif (WINDOWS) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index b16fedfc3e..cecfadcd91 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -8,6 +8,7 @@ include(Linking)  include(Boost)  include(LLSharedLibs)  include(JsonCpp) +include(GoogleBreakpad)  include(Copy3rdPartyLibs)  include(ZLIB)  include(URIPARSER) @@ -17,6 +18,7 @@ include_directories(      ${LLCOMMON_INCLUDE_DIRS}      ${JSONCPP_INCLUDE_DIR}      ${ZLIB_INCLUDE_DIRS} +    ${BREAKPAD_INCLUDE_DIRECTORIES}      ${URIPARSER_INCLUDE_DIRS}      ) @@ -285,6 +287,7 @@ endif(LLCOMMON_LINK_SHARED)  target_link_libraries(      llcommon +    ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES}      ${APRUTIL_LIBRARIES}      ${APR_LIBRARIES}      ${EXPAT_LIBRARIES} diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 72dd0ea048..a90b294550 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -46,6 +46,7 @@  #include "llstl.h" // for DeletePointer()  #include "llstring.h"  #include "lleventtimer.h" +#include "google_breakpad/exception_handler.h"  #include "stringize.h"  #include "llcleanup.h"  #include "llevents.h" @@ -61,6 +62,12 @@  LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop);  BOOL ConsoleCtrlHandler(DWORD fdwCtrlType); +bool windows_post_minidump_callback(const wchar_t* dump_path, +									const wchar_t* minidump_id, +									void* context, +									EXCEPTION_POINTERS* exinfo, +									MDRawAssertionInfo* assertion, +									bool succeeded);  #else  # include <signal.h>  # include <unistd.h> // for fork() @@ -139,6 +146,8 @@ void LLApp::commonCtor()  	// Set the application to this instance.  	sApplication = this; + +	mExceptionHandler = 0;  	// initialize the buffer to write the minidump filename to  	// (this is used to avoid allocating memory in the crash handler) @@ -168,6 +177,8 @@ LLApp::~LLApp()  		delete mThreadErrorp;  		mThreadErrorp = NULL;  	} +	 +	if(mExceptionHandler != 0) delete mExceptionHandler;  	SUBSYSTEM_CLEANUP_DBG(LLCommon);  } @@ -383,18 +394,139 @@ void LLApp::setupErrorHandling(bool second_instance)  #if LL_WINDOWS +#if LL_SEND_CRASH_REPORTS && ! defined(LL_BUGSPLAT) +	EnableCrashingOnCrashes(); + +	// This sets a callback to handle w32 signals to the console window. +	// The viewer shouldn't be affected, sicne its a windowed app. +	SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ConsoleCtrlHandler, TRUE); + +	// Install the Google Breakpad crash handler for Windows +	if(mExceptionHandler == 0) +	{ +		if ( second_instance )  //BUG-5707 Firing teleport from a web browser causes second  +		{ +			mExceptionHandler = new google_breakpad::ExceptionHandler( +															L"C:\\Temp\\",		 +															0,		//No filter +															windows_post_minidump_callback, +															0, +															google_breakpad::ExceptionHandler::HANDLER_ALL);  //No custom client info. +		} +		else +		{ +			LL_WARNS() << "adding breakpad exception handler" << LL_ENDL; + +			std::wstring wpipe_name; +			wpipe_name =  mCrashReportPipeStr + wstringize(getPid()); + +			const std::wstring wdump_path(utf8str_to_utf16str(mDumpPath)); + +			int retries = 30; +			for (; retries > 0; --retries) +			{ +				if (mExceptionHandler != 0) delete mExceptionHandler; + +				mExceptionHandler = new google_breakpad::ExceptionHandler( +															wdump_path,		 +															NULL,		//No filter +															windows_post_minidump_callback, +															0, +															google_breakpad::ExceptionHandler::HANDLER_ALL, +															MiniDumpNormal, //Generate a 'normal' minidump. +															wpipe_name.c_str(), +															NULL);  //No custom client info. +				if (mExceptionHandler->IsOutOfProcess()) +				{ +					LL_INFOS("CRASHREPORT") << "Successfully attached to Out of Process exception handler." << LL_ENDL; +					break; +				} +				else +				{ +					LL_WARNS("CRASHREPORT") << "Unable to attach to Out of Process exception handler.  " << retries << " retries remaining." << LL_ENDL;  +					::Sleep(100);  //Wait a tick and try again. +				} +			} + +			if (retries == 0) LL_WARNS("CRASHREPORT") << "Unable to attach to Out of Process exception handler." << LL_ENDL; +		} + +		if (mExceptionHandler) +		{ +			mExceptionHandler->set_handle_debug_exceptions(true); +		} +	} +#endif // LL_SEND_CRASH_REPORTS && ! defined(LL_BUGSPLAT)  #else  // ! LL_WINDOWS -#if ! defined(LL_BUGSPLAT) -    // -    // Start up signal handling. -    // -    // There are two different classes of signals.  Synchronous signals are delivered to a specific -    // thread, asynchronous signals can be delivered to any thread (in theory) -    // -    setup_signals(); +#if defined(LL_BUGSPLAT) +	// Don't install our own signal handlers -- BugSplat needs to hook them, +	// or it's completely ineffectual. +	bool installHandler = false; + +#else // ! LL_BUGSPLAT +	// +	// Start up signal handling. +	// +	// There are two different classes of signals.  Synchronous signals are delivered to a specific +	// thread, asynchronous signals can be delivered to any thread (in theory) +	// +	setup_signals(); + +	// Add google breakpad exception handler configured for Darwin/Linux. +	bool installHandler = true;  #endif // ! LL_BUGSPLAT +#if LL_DARWIN +	// For the special case of Darwin, we do not want to install the handler if +	// the process is being debugged as the app will exit with value ABRT (6) if +	// we do.  Unfortunately, the code below which performs that test relies on +	// the structure kinfo_proc which has been tagged by apple as an unstable +	// API.  We disable this test for shipping versions to avoid conflicts with +	// future releases of Darwin.  This test is really only needed for developers +	// starting the app from a debugger anyway. +	#ifndef LL_RELEASE_FOR_DOWNLOAD +    int mib[4]; +	mib[0] = CTL_KERN; +	mib[1] = KERN_PROC; +	mib[2] = KERN_PROC_PID; +	mib[3] = getpid(); +	 +	struct kinfo_proc info; +	memset(&info, 0, sizeof(info)); +	 +	size_t size = sizeof(info); +	int result = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); +	if((result == 0) || (errno == ENOMEM)) +	{ +		// P_TRACED flag is set, so this process is being debugged; do not install +		// the handler +		if(info.kp_proc.p_flag & P_TRACED) installHandler = false; +	} +	else +	{ +		// Failed to discover if the process is being debugged; default to +		// installing the handler. +		installHandler = true; +	} +	#endif // ! LL_RELEASE_FOR_DOWNLOAD + +	if(installHandler && (mExceptionHandler == 0)) +	{ +		mExceptionHandler = new google_breakpad::ExceptionHandler(mDumpPath, 0, &unix_post_minidump_callback, 0, true, 0); +	} +#elif LL_LINUX +	if(installHandler && (mExceptionHandler == 0)) +	{ +		if (mDumpPath.empty()) +		{ +			mDumpPath = "/tmp"; +		} +		google_breakpad::MinidumpDescriptor desc(mDumpPath); +	    mExceptionHandler = new google_breakpad::ExceptionHandler(desc, NULL, unix_minidump_callback, NULL, true, -1); +	} +#endif // LL_LINUX +  #endif // ! LL_WINDOWS  	startErrorThread();  } @@ -477,6 +609,31 @@ void LLApp::setError()  	setStatus(APP_STATUS_ERROR);  } +void LLApp::setMiniDumpDir(const std::string &path) +{ +	if (path.empty()) +	{ +		mDumpPath = "/tmp"; +	} +	else +	{ +		mDumpPath = path; +	} + +	if(mExceptionHandler == 0) return; +#ifdef LL_WINDOWS +	std::wstring buffer(utf8str_to_utf16str(mDumpPath)); +	if (buffer.size() > MAX_MINDUMP_PATH_LENGTH) buffer.resize(MAX_MINDUMP_PATH_LENGTH); +	mExceptionHandler->set_dump_path(buffer); +#elif LL_LINUX +        //google_breakpad::MinidumpDescriptor desc("/tmp");	//path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched. +        google_breakpad::MinidumpDescriptor desc(mDumpPath);	//path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched. +	mExceptionHandler->set_minidump_descriptor(desc); +#else +	mExceptionHandler->set_dump_path(mDumpPath); +#endif +} +  void LLApp::setDebugFileNames(const std::string &path)  {    	mStaticDebugFileName = path + "static_debug_info.log"; @@ -485,6 +642,8 @@ void LLApp::setDebugFileNames(const std::string &path)  void LLApp::writeMiniDump()  { +	if(mExceptionHandler == 0) return; +	mExceptionHandler->WriteMinidump();  }  // static @@ -541,6 +700,13 @@ bool LLApp::isExiting()  void LLApp::disableCrashlogger()  { +	// Disable Breakpad exception handler. +	if (mExceptionHandler != 0) +	{ +		delete mExceptionHandler; +		mExceptionHandler = 0; +	} +  	sDisableCrashlogger = TRUE;  } @@ -929,3 +1095,64 @@ bool unix_post_minidump_callback(const char *dump_dir,  }  #endif // !WINDOWS +#ifdef LL_WINDOWS +bool windows_post_minidump_callback(const wchar_t* dump_path, +									const wchar_t* minidump_id, +									void* context, +									EXCEPTION_POINTERS* exinfo, +									MDRawAssertionInfo* assertion, +									bool succeeded) +{ +	char * path = LLApp::instance()->getMiniDumpFilename(); +	S32 remaining = LLApp::MAX_MINDUMP_PATH_LENGTH; +	size_t bytesUsed; + +	LL_INFOS("MINIDUMPCALLBACK") << "Dump file was generated." << LL_ENDL; +	bytesUsed = wcstombs(path, dump_path, static_cast<size_t>(remaining)); +	remaining -= bytesUsed; +	path += bytesUsed; +	if(remaining > 0 && bytesUsed > 0 && path[-1] != '\\') +	{ +		*path++ = '\\'; +		--remaining; +	} +	if(remaining > 0) +	{ +		bytesUsed = wcstombs(path, minidump_id, static_cast<size_t>(remaining)); +		remaining -= bytesUsed; +		path += bytesUsed; +	} +	if(remaining > 0) +	{ +		strncpy(path, ".dmp", remaining); +	} + +	LL_INFOS("CRASHREPORT") << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << LL_ENDL; +   // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. +	//OSMessageBox("Attach Debugger Now", "Error", OSMB_OK); +   // *TODO: Translate the signals/exceptions into cross-platform stuff +	// Windows implementation +	LL_INFOS() << "Entering Windows Exception Handler..." << LL_ENDL; + +	if (LLApp::isError()) +	{ +		LL_WARNS() << "Got another fatal signal while in the error handler, die now!" << LL_ENDL; +	} + +	// Flag status to error, so thread_error starts its work +	LLApp::setError(); + +	// Block in the exception handler until the app has stopped +	// This is pretty sketchy, but appears to work just fine +	while (!LLApp::isStopped()) +	{ +		ms_sleep(10); +	} + +#ifndef LL_RELEASE_FOR_DOWNLOAD +	return false; +#else +	return true; +#endif +} +#endif diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index e590e5eafd..245c73e3a2 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -49,6 +49,10 @@ void clear_signals();  #endif +namespace google_breakpad { +	class ExceptionHandler; // See exception_handler.h +} +  class LL_COMMON_API LLApp  {  	friend class LLErrorThread; @@ -232,6 +236,7 @@ public:  	static const U32 MAX_MINDUMP_PATH_LENGTH = 256;  	// change the directory where Breakpad minidump files are written to +	void setMiniDumpDir(const std::string &path);      void setDebugFileNames(const std::string &path);  	// Return the Google Breakpad minidump filename after a crash. @@ -307,6 +312,9 @@ private:  private:  	// the static application instance if it was created.  	static LLApp* sApplication; +	 +	google_breakpad::ExceptionHandler * mExceptionHandler; +  #if !LL_WINDOWS  	friend void default_unix_signal_handler(int signum, siginfo_t *info, void *); diff --git a/indra/llcorehttp/CMakeLists.txt b/indra/llcorehttp/CMakeLists.txt index d90d148ee6..240ea2da83 100644 --- a/indra/llcorehttp/CMakeLists.txt +++ b/indra/llcorehttp/CMakeLists.txt @@ -176,6 +176,7 @@ if (DARWIN)    set(copy_dylibs      libapr-1.0.dylib      libaprutil-1.0.dylib +    libexception_handler.dylib      libnghttp2*.dylib      liburiparser*.dylib      ${EXPAT_COPY} diff --git a/indra/llcorehttp/httpcommon.cpp b/indra/llcorehttp/httpcommon.cpp index bbf23a6d70..e37a38b05f 100644 --- a/indra/llcorehttp/httpcommon.cpp +++ b/indra/llcorehttp/httpcommon.cpp @@ -23,6 +23,13 @@   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ +#if LL_WINDOWS +#define SAFE_SSL 1 +#elif LL_DARWIN +#define SAFE_SSL 1 +#else +#define SAFE_SSL 1 +#endif  #include "linden_common.h"		// Modifies curl/curl.h interfaces  #include "httpcommon.h" @@ -31,6 +38,10 @@  #include <curl/curl.h>  #include <string>  #include <sstream> +#if SAFE_SSL +#include <openssl/crypto.h> +#include <functional>               // std::hash +#endif  namespace LLCore @@ -337,6 +348,34 @@ void deallocateEasyCurl(CURL *curlp)  } +#if SAFE_SSL +//static +void ssl_locking_callback(int mode, int type, const char *file, int line) +{ +    if (type >= sSSLMutex.size()) +    { +        LL_WARNS() << "Attempt to get unknown MUTEX in SSL Lock." << LL_ENDL; +    } + +    if (mode & CRYPTO_LOCK) +    { +        sSSLMutex[type]->lock(); +    } +    else +    { +        sSSLMutex[type]->unlock(); +    } +} + +//static +unsigned long ssl_thread_id(void) +{ +    // std::thread::id is very deliberately opaque, but we can hash it +    return std::hash<LLThread::id_t>()(LLThread::currentID()); +} +#endif + +  }  void initialize() @@ -348,11 +387,27 @@ void initialize()      check_curl_code(code, CURL_GLOBAL_ALL); +#if SAFE_SSL +    S32 mutex_count = CRYPTO_num_locks(); +    for (S32 i = 0; i < mutex_count; i++) +    { +        sSSLMutex.push_back(LLMutex_ptr(new LLMutex())); +    } +    CRYPTO_set_id_callback(&ssl_thread_id); +    CRYPTO_set_locking_callback(&ssl_locking_callback); +#endif +  }  void cleanup()  { +#if SAFE_SSL +    CRYPTO_set_id_callback(NULL); +    CRYPTO_set_locking_callback(NULL); +    sSSLMutex.clear(); +#endif +      curl_global_cleanup();  } diff --git a/indra/llmessage/llblowfishcipher.cpp b/indra/llmessage/llblowfishcipher.cpp index 949d4cc0c7..0b5025a422 100644 --- a/indra/llmessage/llblowfishcipher.cpp +++ b/indra/llmessage/llblowfishcipher.cpp @@ -52,28 +52,24 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len)  	if (src_len > dst_len) return 0;  	// OpenSSL uses "cipher contexts" to hold encryption parameters. -    EVP_CIPHER_CTX *context = EVP_CIPHER_CTX_new(); -    if (!context) -    { -        LL_WARNS() << "LLBlowfishCipher::encrypt EVP_CIPHER_CTX initiation failure" << LL_ENDL; -        return 0; -    } +    EVP_CIPHER_CTX context; +    EVP_CIPHER_CTX_init(&context);  	// We want a blowfish cyclic block chain cipher, but need to set   	// the key length before we pass in a key, so call EncryptInit   	// first with NULLs. -	EVP_EncryptInit_ex(context, EVP_bf_cbc(), NULL, NULL, NULL); -	EVP_CIPHER_CTX_set_key_length(context, (int)mSecretSize); +	EVP_EncryptInit_ex(&context, EVP_bf_cbc(), NULL, NULL, NULL); +	EVP_CIPHER_CTX_set_key_length(&context, (int)mSecretSize);  	// Complete initialization.  Per EVP_EncryptInit man page, the  	// cipher pointer must be NULL.  Apparently initial_vector must  	// be 8 bytes for blowfish, as this is the block size.      unsigned char initial_vector[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; -	EVP_EncryptInit_ex(context, NULL, NULL, mSecret, initial_vector); +	EVP_EncryptInit_ex(&context, NULL, NULL, mSecret, initial_vector); -    int blocksize = EVP_CIPHER_CTX_block_size(context); -    int keylen = EVP_CIPHER_CTX_key_length(context); -    int iv_length = EVP_CIPHER_CTX_iv_length(context); +    int blocksize = EVP_CIPHER_CTX_block_size(&context); +    int keylen = EVP_CIPHER_CTX_key_length(&context); +    int iv_length = EVP_CIPHER_CTX_iv_length(&context);      LL_DEBUGS() << "LLBlowfishCipher blocksize " << blocksize  		<< " keylen " << keylen  		<< " iv_len " << iv_length @@ -81,7 +77,7 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len)  	int output_len = 0;  	int temp_len = 0; -	if (!EVP_EncryptUpdate(context, +	if (!EVP_EncryptUpdate(&context,  			dst,  			&output_len,  			src, @@ -93,18 +89,18 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len)  	// There may be some final data left to encrypt if the input is  	// not an exact multiple of the block size. -	if (!EVP_EncryptFinal_ex(context, (unsigned char*)(dst + output_len), &temp_len)) +	if (!EVP_EncryptFinal_ex(&context, (unsigned char*)(dst + output_len), &temp_len))  	{  		LL_WARNS() << "LLBlowfishCipher::encrypt EVP_EncryptFinal failure" << LL_ENDL;  		goto ERROR;  	}  	output_len += temp_len; -	EVP_CIPHER_CTX_free(context); +	EVP_CIPHER_CTX_cleanup(&context);  	return output_len;  ERROR: -	EVP_CIPHER_CTX_free(context); +	EVP_CIPHER_CTX_cleanup(&context);  	return 0;  } diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index e5b4dec1bd..7d18bae947 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -154,9 +154,9 @@ void LLPluginProcessParent::shutdown()      {          EState state = (*it).second->mState;          if (state != STATE_CLEANUP -            && state != STATE_EXITING -            && state != STATE_DONE -            && state != STATE_ERROR) +            || state != STATE_EXITING +            || state != STATE_DONE +            || state != STATE_ERROR)          {              (*it).second->setState(STATE_GOODBYE);          } diff --git a/indra/mac_crash_logger/CMakeLists.txt b/indra/mac_crash_logger/CMakeLists.txt new file mode 100644 index 0000000000..95637c9a28 --- /dev/null +++ b/indra/mac_crash_logger/CMakeLists.txt @@ -0,0 +1,95 @@ +# -*- cmake -*- + +project(mac_crash_logger) + +include(00-Common) +include(LLCommon) +include(LLCoreHttp) +include(LLCrashLogger) +include(LLMath) +include(LLMessage) +include(LLVFS) +include(LLXML) +include(Linking) +include(LLSharedLibs) +include(Boost) + +include_directories( +    ${LLCOREHTTP_INCLUDE_DIRS} +    ${LLCOMMON_INCLUDE_DIRS} +    ${LLCRASHLOGGER_INCLUDE_DIRS} +    ${LLMATH_INCLUDE_DIRS} +    ${LLVFS_INCLUDE_DIRS} +    ${LLXML_INCLUDE_DIRS} +    ) +include_directories(SYSTEM +    ${LLCOMMON_SYSTEM_INCLUDE_DIRS} +    ${LLXML_SYSTEM_INCLUDE_DIRS} +    ) + +set(mac_crash_logger_SOURCE_FILES +    mac_crash_logger.cpp +    llcrashloggermac.cpp +    llcrashloggermacdelegate.mm +    ) + +set(mac_crash_logger_HEADER_FILES +    CMakeLists.txt + +    llcrashloggermac.h +    llcrashloggermacdelegate.h +    ) + +set_source_files_properties(${mac_crash_logger_HEADER_FILES} +                            PROPERTIES HEADER_FILE_ONLY TRUE) +list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_HEADER_FILES}) + +set(mac_crash_logger_RESOURCE_FILES +  CrashReporter.nib/ +  ) +set_source_files_properties( +  ${mac_crash_logger_RESOURCE_FILES} +  PROPERTIES +  HEADER_FILE_ONLY TRUE +  ) +SOURCE_GROUP("Resources" FILES ${mac_crash_logger_RESOURCE_FILES}) +list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_RESOURCE_FILES}) + +add_executable(mac-crash-logger +  MACOSX_BUNDLE +  ${mac_crash_logger_SOURCE_FILES}) + +set_target_properties(mac-crash-logger +  PROPERTIES +  MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist +  ) + +find_library(COCOA_LIBRARY Cocoa) + +target_link_libraries(mac-crash-logger +    ${LLCRASHLOGGER_LIBRARIES} +    ${LLVFS_LIBRARIES} +    ${COCOA_LIBRARIES} +    ${LLXML_LIBRARIES} +    ${LLMESSAGE_LIBRARIES} +    ${LLVFS_LIBRARIES} +    ${LLMATH_LIBRARIES} +    ${LLCOREHTTP_LIBRARIES} +    ${LLCOMMON_LIBRARIES} +    ${BOOST_CONTEXT_LIBRARY} +    ${BOOST_FIBER_LIBRARY} +    ) + +add_custom_command( +  TARGET mac-crash-logger POST_BUILD +  COMMAND ${CMAKE_COMMAND} +  ARGS +    -E +    copy_if_different +    ${CMAKE_CURRENT_SOURCE_DIR}/CrashReporter.nib +    ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-crash-logger.app/Contents/Resources/CrashReporter.nib +  ) + +ll_deploy_sharedlibs_command(mac-crash-logger) + + diff --git a/indra/mac_crash_logger/CrashReporter.nib b/indra/mac_crash_logger/CrashReporter.nib Binary files differnew file mode 100755 index 0000000000..e9d9e05985 --- /dev/null +++ b/indra/mac_crash_logger/CrashReporter.nib diff --git a/indra/mac_crash_logger/CrashReporter.xib b/indra/mac_crash_logger/CrashReporter.xib new file mode 100755 index 0000000000..f6d4776d51 --- /dev/null +++ b/indra/mac_crash_logger/CrashReporter.xib @@ -0,0 +1,3895 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00"> +	<data> +		<int key="IBDocument.SystemTarget">1070</int> +		<string key="IBDocument.SystemVersion">11G63</string> +		<string key="IBDocument.InterfaceBuilderVersion">2182</string> +		<string key="IBDocument.AppKitVersion">1138.51</string> +		<string key="IBDocument.HIToolboxVersion">569.00</string> +		<object class="NSMutableDictionary" key="IBDocument.PluginVersions"> +			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> +			<string key="NS.object.0">2182</string> +		</object> +		<array key="IBDocument.IntegratedClassDependencies"> +			<string>NSTextField</string> +			<string>NSView</string> +			<string>NSWindowTemplate</string> +			<string>NSMenu</string> +			<string>NSMenuItem</string> +			<string>NSTextFieldCell</string> +			<string>NSButtonCell</string> +			<string>IBNSLayoutConstraint</string> +			<string>NSButton</string> +			<string>NSCustomObject</string> +		</array> +		<array key="IBDocument.PluginDependencies"> +			<string>com.apple.InterfaceBuilder.CocoaPlugin</string> +		</array> +		<object class="NSMutableDictionary" key="IBDocument.Metadata"> +			<string key="NS.key.0">PluginDependencyRecalculationVersion</string> +			<integer value="1" key="NS.object.0"/> +		</object> +		<array class="NSMutableArray" key="IBDocument.RootObjects" id="1048"> +			<object class="NSCustomObject" id="1021"> +				<string key="NSClassName">NSApplication</string> +			</object> +			<object class="NSCustomObject" id="1014"> +				<string key="NSClassName">FirstResponder</string> +			</object> +			<object class="NSCustomObject" id="1050"> +				<string key="NSClassName">NSApplication</string> +			</object> +			<object class="NSMenu" id="649796088"> +				<string key="NSTitle">AMainMenu</string> +				<array class="NSMutableArray" key="NSMenuItems"> +					<object class="NSMenuItem" id="694149608"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">Second Life Crash Logger</string> +						<string key="NSKeyEquiv"/> +						<int key="NSKeyEquivModMask">1048576</int> +						<int key="NSMnemonicLoc">2147483647</int> +						<object class="NSCustomResource" key="NSOnImage" id="35465992"> +							<string key="NSClassName">NSImage</string> +							<string key="NSResourceName">NSMenuCheckmark</string> +						</object> +						<object class="NSCustomResource" key="NSMixedImage" id="502551668"> +							<string key="NSClassName">NSImage</string> +							<string key="NSResourceName">NSMenuMixedState</string> +						</object> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="110575045"> +							<string key="NSTitle">Second Life Crash Logger</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="238522557"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">About Second Life Crash Logger</string> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="304266470"> +									<reference key="NSMenu" ref="110575045"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="609285721"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Preferences…</string> +									<string key="NSKeyEquiv">,</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="481834944"> +									<reference key="NSMenu" ref="110575045"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="1046388886"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Services</string> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +									<string key="NSAction">submenuAction:</string> +									<object class="NSMenu" key="NSSubmenu" id="752062318"> +										<string key="NSTitle">Services</string> +										<array class="NSMutableArray" key="NSMenuItems"/> +										<string key="NSName">_NSServicesMenu</string> +									</object> +								</object> +								<object class="NSMenuItem" id="646227648"> +									<reference key="NSMenu" ref="110575045"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="755159360"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Hide Second Life Crash Logger</string> +									<string key="NSKeyEquiv">h</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="342932134"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Hide Others</string> +									<string key="NSKeyEquiv">h</string> +									<int key="NSKeyEquivModMask">1572864</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="908899353"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Show All</string> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="1056857174"> +									<reference key="NSMenu" ref="110575045"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="632727374"> +									<reference key="NSMenu" ref="110575045"/> +									<string key="NSTitle">Quit Second Life Crash Logger</string> +									<string key="NSKeyEquiv">q</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +							</array> +							<string key="NSName">_NSAppleMenu</string> +						</object> +					</object> +					<object class="NSMenuItem" id="379814623"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">File</string> +						<string key="NSKeyEquiv"/> +						<int key="NSKeyEquivModMask">1048576</int> +						<int key="NSMnemonicLoc">2147483647</int> +						<reference key="NSOnImage" ref="35465992"/> +						<reference key="NSMixedImage" ref="502551668"/> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="720053764"> +							<string key="NSTitle">File</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="705341025"> +									<reference key="NSMenu" ref="720053764"/> +									<string key="NSTitle">New</string> +									<string key="NSKeyEquiv">n</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="722745758"> +									<reference key="NSMenu" ref="720053764"/> +									<string key="NSTitle">Open…</string> +									<string key="NSKeyEquiv">o</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="1025936716"> +									<reference key="NSMenu" ref="720053764"/> +									<string key="NSTitle">Open Recent</string> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +									<string key="NSAction">submenuAction:</string> +									<object class="NSMenu" key="NSSubmenu" id="1065607017"> +										<string key="NSTitle">Open Recent</string> +										<array class="NSMutableArray" key="NSMenuItems"> +											<object class="NSMenuItem" id="759406840"> +												<reference key="NSMenu" ref="1065607017"/> +												<string key="NSTitle">Clear Menu</string> +												<string key="NSKeyEquiv"/> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +										</array> +										<string key="NSName">_NSRecentDocumentsMenu</string> +									</object> +								</object> +								<object class="NSMenuItem" id="425164168"> +									<reference key="NSMenu" ref="720053764"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="776162233"> +									<reference key="NSMenu" ref="720053764"/> +									<string key="NSTitle">Close</string> +									<string key="NSKeyEquiv">w</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="1023925487"> +									<reference key="NSMenu" ref="720053764"/> +									<string key="NSTitle">Save…</string> +									<string key="NSKeyEquiv">s</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="579971712"> +									<reference key="NSMenu" ref="720053764"/> +									<string key="NSTitle">Revert to Saved</string> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="1010469920"> +									<reference key="NSMenu" ref="720053764"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="294629803"> +									<reference key="NSMenu" ref="720053764"/> +									<string key="NSTitle">Page Setup...</string> +									<string key="NSKeyEquiv">P</string> +									<int key="NSKeyEquivModMask">1179648</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +									<string key="NSToolTip"/> +								</object> +								<object class="NSMenuItem" id="49223823"> +									<reference key="NSMenu" ref="720053764"/> +									<string key="NSTitle">Print…</string> +									<string key="NSKeyEquiv">p</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +							</array> +						</object> +					</object> +					<object class="NSMenuItem" id="952259628"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">Edit</string> +						<string key="NSKeyEquiv"/> +						<int key="NSKeyEquivModMask">1048576</int> +						<int key="NSMnemonicLoc">2147483647</int> +						<reference key="NSOnImage" ref="35465992"/> +						<reference key="NSMixedImage" ref="502551668"/> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="789758025"> +							<string key="NSTitle">Edit</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="1058277027"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Undo</string> +									<string key="NSKeyEquiv">z</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="790794224"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Redo</string> +									<string key="NSKeyEquiv">Z</string> +									<int key="NSKeyEquivModMask">1179648</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="1040322652"> +									<reference key="NSMenu" ref="789758025"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="296257095"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Cut</string> +									<string key="NSKeyEquiv">x</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="860595796"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Copy</string> +									<string key="NSKeyEquiv">c</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="29853731"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Paste</string> +									<string key="NSKeyEquiv">v</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="82994268"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Paste and Match Style</string> +									<string key="NSKeyEquiv">V</string> +									<int key="NSKeyEquivModMask">1572864</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="437104165"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Delete</string> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="583158037"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Select All</string> +									<string key="NSKeyEquiv">a</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="212016141"> +									<reference key="NSMenu" ref="789758025"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="892235320"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Find</string> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +									<string key="NSAction">submenuAction:</string> +									<object class="NSMenu" key="NSSubmenu" id="963351320"> +										<string key="NSTitle">Find</string> +										<array class="NSMutableArray" key="NSMenuItems"> +											<object class="NSMenuItem" id="447796847"> +												<reference key="NSMenu" ref="963351320"/> +												<string key="NSTitle">Find…</string> +												<string key="NSKeyEquiv">f</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">1</int> +											</object> +											<object class="NSMenuItem" id="738670835"> +												<reference key="NSMenu" ref="963351320"/> +												<string key="NSTitle">Find and Replace…</string> +												<string key="NSKeyEquiv">f</string> +												<int key="NSKeyEquivModMask">1572864</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">12</int> +											</object> +											<object class="NSMenuItem" id="326711663"> +												<reference key="NSMenu" ref="963351320"/> +												<string key="NSTitle">Find Next</string> +												<string key="NSKeyEquiv">g</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">2</int> +											</object> +											<object class="NSMenuItem" id="270902937"> +												<reference key="NSMenu" ref="963351320"/> +												<string key="NSTitle">Find Previous</string> +												<string key="NSKeyEquiv">G</string> +												<int key="NSKeyEquivModMask">1179648</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">3</int> +											</object> +											<object class="NSMenuItem" id="159080638"> +												<reference key="NSMenu" ref="963351320"/> +												<string key="NSTitle">Use Selection for Find</string> +												<string key="NSKeyEquiv">e</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">7</int> +											</object> +											<object class="NSMenuItem" id="88285865"> +												<reference key="NSMenu" ref="963351320"/> +												<string key="NSTitle">Jump to Selection</string> +												<string key="NSKeyEquiv">j</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +										</array> +									</object> +								</object> +								<object class="NSMenuItem" id="972420730"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Spelling and Grammar</string> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +									<string key="NSAction">submenuAction:</string> +									<object class="NSMenu" key="NSSubmenu" id="769623530"> +										<string key="NSTitle">Spelling and Grammar</string> +										<array class="NSMutableArray" key="NSMenuItems"> +											<object class="NSMenuItem" id="679648819"> +												<reference key="NSMenu" ref="769623530"/> +												<string key="NSTitle">Show Spelling and Grammar</string> +												<string key="NSKeyEquiv">:</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="96193923"> +												<reference key="NSMenu" ref="769623530"/> +												<string key="NSTitle">Check Document Now</string> +												<string key="NSKeyEquiv">;</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="859480356"> +												<reference key="NSMenu" ref="769623530"/> +												<bool key="NSIsDisabled">YES</bool> +												<bool key="NSIsSeparator">YES</bool> +												<string key="NSTitle"/> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="948374510"> +												<reference key="NSMenu" ref="769623530"/> +												<string key="NSTitle">Check Spelling While Typing</string> +												<string key="NSKeyEquiv"/> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="967646866"> +												<reference key="NSMenu" ref="769623530"/> +												<string key="NSTitle">Check Grammar With Spelling</string> +												<string key="NSKeyEquiv"/> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="795346622"> +												<reference key="NSMenu" ref="769623530"/> +												<string key="NSTitle">Correct Spelling Automatically</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +										</array> +									</object> +								</object> +								<object class="NSMenuItem" id="507821607"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Substitutions</string> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +									<string key="NSAction">submenuAction:</string> +									<object class="NSMenu" key="NSSubmenu" id="698887838"> +										<string key="NSTitle">Substitutions</string> +										<array class="NSMutableArray" key="NSMenuItems"> +											<object class="NSMenuItem" id="65139061"> +												<reference key="NSMenu" ref="698887838"/> +												<string key="NSTitle">Show Substitutions</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="19036812"> +												<reference key="NSMenu" ref="698887838"/> +												<bool key="NSIsDisabled">YES</bool> +												<bool key="NSIsSeparator">YES</bool> +												<string key="NSTitle"/> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="605118523"> +												<reference key="NSMenu" ref="698887838"/> +												<string key="NSTitle">Smart Copy/Paste</string> +												<string key="NSKeyEquiv">f</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">1</int> +											</object> +											<object class="NSMenuItem" id="197661976"> +												<reference key="NSMenu" ref="698887838"/> +												<string key="NSTitle">Smart Quotes</string> +												<string key="NSKeyEquiv">g</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">2</int> +											</object> +											<object class="NSMenuItem" id="672708820"> +												<reference key="NSMenu" ref="698887838"/> +												<string key="NSTitle">Smart Dashes</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="708854459"> +												<reference key="NSMenu" ref="698887838"/> +												<string key="NSTitle">Smart Links</string> +												<string key="NSKeyEquiv">G</string> +												<int key="NSKeyEquivModMask">1179648</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">3</int> +											</object> +											<object class="NSMenuItem" id="537092702"> +												<reference key="NSMenu" ref="698887838"/> +												<string key="NSTitle">Text Replacement</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +										</array> +									</object> +								</object> +								<object class="NSMenuItem" id="288088188"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Transformations</string> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +									<string key="NSAction">submenuAction:</string> +									<object class="NSMenu" key="NSSubmenu" id="579392910"> +										<string key="NSTitle">Transformations</string> +										<array class="NSMutableArray" key="NSMenuItems"> +											<object class="NSMenuItem" id="1060694897"> +												<reference key="NSMenu" ref="579392910"/> +												<string key="NSTitle">Make Upper Case</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="879586729"> +												<reference key="NSMenu" ref="579392910"/> +												<string key="NSTitle">Make Lower Case</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="56570060"> +												<reference key="NSMenu" ref="579392910"/> +												<string key="NSTitle">Capitalize</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +										</array> +									</object> +								</object> +								<object class="NSMenuItem" id="676164635"> +									<reference key="NSMenu" ref="789758025"/> +									<string key="NSTitle">Speech</string> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +									<string key="NSAction">submenuAction:</string> +									<object class="NSMenu" key="NSSubmenu" id="785027613"> +										<string key="NSTitle">Speech</string> +										<array class="NSMutableArray" key="NSMenuItems"> +											<object class="NSMenuItem" id="731782645"> +												<reference key="NSMenu" ref="785027613"/> +												<string key="NSTitle">Start Speaking</string> +												<string key="NSKeyEquiv"/> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="680220178"> +												<reference key="NSMenu" ref="785027613"/> +												<string key="NSTitle">Stop Speaking</string> +												<string key="NSKeyEquiv"/> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +										</array> +									</object> +								</object> +							</array> +						</object> +					</object> +					<object class="NSMenuItem" id="302598603"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">Format</string> +						<string key="NSKeyEquiv"/> +						<int key="NSMnemonicLoc">2147483647</int> +						<reference key="NSOnImage" ref="35465992"/> +						<reference key="NSMixedImage" ref="502551668"/> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="941447902"> +							<string key="NSTitle">Format</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="792887677"> +									<reference key="NSMenu" ref="941447902"/> +									<string key="NSTitle">Font</string> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +									<string key="NSAction">submenuAction:</string> +									<object class="NSMenu" key="NSSubmenu" id="786677654"> +										<string key="NSTitle">Font</string> +										<array class="NSMutableArray" key="NSMenuItems"> +											<object class="NSMenuItem" id="159677712"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Show Fonts</string> +												<string key="NSKeyEquiv">t</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="305399458"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Bold</string> +												<string key="NSKeyEquiv">b</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">2</int> +											</object> +											<object class="NSMenuItem" id="814362025"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Italic</string> +												<string key="NSKeyEquiv">i</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">1</int> +											</object> +											<object class="NSMenuItem" id="330926929"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Underline</string> +												<string key="NSKeyEquiv">u</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="533507878"> +												<reference key="NSMenu" ref="786677654"/> +												<bool key="NSIsDisabled">YES</bool> +												<bool key="NSIsSeparator">YES</bool> +												<string key="NSTitle"/> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="158063935"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Bigger</string> +												<string key="NSKeyEquiv">+</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">3</int> +											</object> +											<object class="NSMenuItem" id="885547335"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Smaller</string> +												<string key="NSKeyEquiv">-</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<int key="NSTag">4</int> +											</object> +											<object class="NSMenuItem" id="901062459"> +												<reference key="NSMenu" ref="786677654"/> +												<bool key="NSIsDisabled">YES</bool> +												<bool key="NSIsSeparator">YES</bool> +												<string key="NSTitle"/> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="767671776"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Kern</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<string key="NSAction">submenuAction:</string> +												<object class="NSMenu" key="NSSubmenu" id="175441468"> +													<string key="NSTitle">Kern</string> +													<array class="NSMutableArray" key="NSMenuItems"> +														<object class="NSMenuItem" id="252969304"> +															<reference key="NSMenu" ref="175441468"/> +															<string key="NSTitle">Use Default</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="766922938"> +															<reference key="NSMenu" ref="175441468"/> +															<string key="NSTitle">Use None</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="677519740"> +															<reference key="NSMenu" ref="175441468"/> +															<string key="NSTitle">Tighten</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="238351151"> +															<reference key="NSMenu" ref="175441468"/> +															<string key="NSTitle">Loosen</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +													</array> +												</object> +											</object> +											<object class="NSMenuItem" id="691570813"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Ligature</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<string key="NSAction">submenuAction:</string> +												<object class="NSMenu" key="NSSubmenu" id="1058217995"> +													<string key="NSTitle">Ligature</string> +													<array class="NSMutableArray" key="NSMenuItems"> +														<object class="NSMenuItem" id="706297211"> +															<reference key="NSMenu" ref="1058217995"/> +															<string key="NSTitle">Use Default</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="568384683"> +															<reference key="NSMenu" ref="1058217995"/> +															<string key="NSTitle">Use None</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="663508465"> +															<reference key="NSMenu" ref="1058217995"/> +															<string key="NSTitle">Use All</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +													</array> +												</object> +											</object> +											<object class="NSMenuItem" id="769124883"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Baseline</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<string key="NSAction">submenuAction:</string> +												<object class="NSMenu" key="NSSubmenu" id="18263474"> +													<string key="NSTitle">Baseline</string> +													<array class="NSMutableArray" key="NSMenuItems"> +														<object class="NSMenuItem" id="257962622"> +															<reference key="NSMenu" ref="18263474"/> +															<string key="NSTitle">Use Default</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="644725453"> +															<reference key="NSMenu" ref="18263474"/> +															<string key="NSTitle">Superscript</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="1037576581"> +															<reference key="NSMenu" ref="18263474"/> +															<string key="NSTitle">Subscript</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="941806246"> +															<reference key="NSMenu" ref="18263474"/> +															<string key="NSTitle">Raise</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="1045724900"> +															<reference key="NSMenu" ref="18263474"/> +															<string key="NSTitle">Lower</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +													</array> +												</object> +											</object> +											<object class="NSMenuItem" id="739652853"> +												<reference key="NSMenu" ref="786677654"/> +												<bool key="NSIsDisabled">YES</bool> +												<bool key="NSIsSeparator">YES</bool> +												<string key="NSTitle"/> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="1012600125"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Show Colors</string> +												<string key="NSKeyEquiv">C</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="214559597"> +												<reference key="NSMenu" ref="786677654"/> +												<bool key="NSIsDisabled">YES</bool> +												<bool key="NSIsSeparator">YES</bool> +												<string key="NSTitle"/> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="596732606"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Copy Style</string> +												<string key="NSKeyEquiv">c</string> +												<int key="NSKeyEquivModMask">1572864</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="393423671"> +												<reference key="NSMenu" ref="786677654"/> +												<string key="NSTitle">Paste Style</string> +												<string key="NSKeyEquiv">v</string> +												<int key="NSKeyEquivModMask">1572864</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +										</array> +										<string key="NSName">_NSFontMenu</string> +									</object> +								</object> +								<object class="NSMenuItem" id="215659978"> +									<reference key="NSMenu" ref="941447902"/> +									<string key="NSTitle">Text</string> +									<string key="NSKeyEquiv"/> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +									<string key="NSAction">submenuAction:</string> +									<object class="NSMenu" key="NSSubmenu" id="446991534"> +										<string key="NSTitle">Text</string> +										<array class="NSMutableArray" key="NSMenuItems"> +											<object class="NSMenuItem" id="875092757"> +												<reference key="NSMenu" ref="446991534"/> +												<string key="NSTitle">Align Left</string> +												<string key="NSKeyEquiv">{</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="630155264"> +												<reference key="NSMenu" ref="446991534"/> +												<string key="NSTitle">Center</string> +												<string key="NSKeyEquiv">|</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="945678886"> +												<reference key="NSMenu" ref="446991534"/> +												<string key="NSTitle">Justify</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="512868991"> +												<reference key="NSMenu" ref="446991534"/> +												<string key="NSTitle">Align Right</string> +												<string key="NSKeyEquiv">}</string> +												<int key="NSKeyEquivModMask">1048576</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="163117631"> +												<reference key="NSMenu" ref="446991534"/> +												<bool key="NSIsDisabled">YES</bool> +												<bool key="NSIsSeparator">YES</bool> +												<string key="NSTitle"/> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="31516759"> +												<reference key="NSMenu" ref="446991534"/> +												<string key="NSTitle">Writing Direction</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +												<string key="NSAction">submenuAction:</string> +												<object class="NSMenu" key="NSSubmenu" id="956096989"> +													<string key="NSTitle">Writing Direction</string> +													<array class="NSMutableArray" key="NSMenuItems"> +														<object class="NSMenuItem" id="257099033"> +															<reference key="NSMenu" ref="956096989"/> +															<bool key="NSIsDisabled">YES</bool> +															<string key="NSTitle">Paragraph</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="551969625"> +															<reference key="NSMenu" ref="956096989"/> +															<string type="base64-UTF8" key="NSTitle">CURlZmF1bHQ</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="249532473"> +															<reference key="NSMenu" ref="956096989"/> +															<string type="base64-UTF8" key="NSTitle">CUxlZnQgdG8gUmlnaHQ</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="607364498"> +															<reference key="NSMenu" ref="956096989"/> +															<string type="base64-UTF8" key="NSTitle">CVJpZ2h0IHRvIExlZnQ</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="508151438"> +															<reference key="NSMenu" ref="956096989"/> +															<bool key="NSIsDisabled">YES</bool> +															<bool key="NSIsSeparator">YES</bool> +															<string key="NSTitle"/> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="981751889"> +															<reference key="NSMenu" ref="956096989"/> +															<bool key="NSIsDisabled">YES</bool> +															<string key="NSTitle">Selection</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="380031999"> +															<reference key="NSMenu" ref="956096989"/> +															<string type="base64-UTF8" key="NSTitle">CURlZmF1bHQ</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="825984362"> +															<reference key="NSMenu" ref="956096989"/> +															<string type="base64-UTF8" key="NSTitle">CUxlZnQgdG8gUmlnaHQ</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +														<object class="NSMenuItem" id="560145579"> +															<reference key="NSMenu" ref="956096989"/> +															<string type="base64-UTF8" key="NSTitle">CVJpZ2h0IHRvIExlZnQ</string> +															<string key="NSKeyEquiv"/> +															<int key="NSMnemonicLoc">2147483647</int> +															<reference key="NSOnImage" ref="35465992"/> +															<reference key="NSMixedImage" ref="502551668"/> +														</object> +													</array> +												</object> +											</object> +											<object class="NSMenuItem" id="908105787"> +												<reference key="NSMenu" ref="446991534"/> +												<bool key="NSIsDisabled">YES</bool> +												<bool key="NSIsSeparator">YES</bool> +												<string key="NSTitle"/> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="644046920"> +												<reference key="NSMenu" ref="446991534"/> +												<string key="NSTitle">Show Ruler</string> +												<string key="NSKeyEquiv"/> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="231811626"> +												<reference key="NSMenu" ref="446991534"/> +												<string key="NSTitle">Copy Ruler</string> +												<string key="NSKeyEquiv">c</string> +												<int key="NSKeyEquivModMask">1310720</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +											<object class="NSMenuItem" id="883618387"> +												<reference key="NSMenu" ref="446991534"/> +												<string key="NSTitle">Paste Ruler</string> +												<string key="NSKeyEquiv">v</string> +												<int key="NSKeyEquivModMask">1310720</int> +												<int key="NSMnemonicLoc">2147483647</int> +												<reference key="NSOnImage" ref="35465992"/> +												<reference key="NSMixedImage" ref="502551668"/> +											</object> +										</array> +									</object> +								</object> +							</array> +						</object> +					</object> +					<object class="NSMenuItem" id="586577488"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">View</string> +						<string key="NSKeyEquiv"/> +						<int key="NSKeyEquivModMask">1048576</int> +						<int key="NSMnemonicLoc">2147483647</int> +						<reference key="NSOnImage" ref="35465992"/> +						<reference key="NSMixedImage" ref="502551668"/> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="466310130"> +							<string key="NSTitle">View</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="102151532"> +									<reference key="NSMenu" ref="466310130"/> +									<string key="NSTitle">Show Toolbar</string> +									<string key="NSKeyEquiv">t</string> +									<int key="NSKeyEquivModMask">1572864</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="237841660"> +									<reference key="NSMenu" ref="466310130"/> +									<string key="NSTitle">Customize Toolbar…</string> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +							</array> +						</object> +					</object> +					<object class="NSMenuItem" id="713487014"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">Window</string> +						<string key="NSKeyEquiv"/> +						<int key="NSKeyEquivModMask">1048576</int> +						<int key="NSMnemonicLoc">2147483647</int> +						<reference key="NSOnImage" ref="35465992"/> +						<reference key="NSMixedImage" ref="502551668"/> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="835318025"> +							<string key="NSTitle">Window</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="1011231497"> +									<reference key="NSMenu" ref="835318025"/> +									<string key="NSTitle">Minimize</string> +									<string key="NSKeyEquiv">m</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="575023229"> +									<reference key="NSMenu" ref="835318025"/> +									<string key="NSTitle">Zoom</string> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="299356726"> +									<reference key="NSMenu" ref="835318025"/> +									<bool key="NSIsDisabled">YES</bool> +									<bool key="NSIsSeparator">YES</bool> +									<string key="NSTitle"/> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +								<object class="NSMenuItem" id="625202149"> +									<reference key="NSMenu" ref="835318025"/> +									<string key="NSTitle">Bring All to Front</string> +									<string key="NSKeyEquiv"/> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +							</array> +							<string key="NSName">_NSWindowsMenu</string> +						</object> +					</object> +					<object class="NSMenuItem" id="448692316"> +						<reference key="NSMenu" ref="649796088"/> +						<string key="NSTitle">Help</string> +						<string key="NSKeyEquiv"/> +						<int key="NSMnemonicLoc">2147483647</int> +						<reference key="NSOnImage" ref="35465992"/> +						<reference key="NSMixedImage" ref="502551668"/> +						<string key="NSAction">submenuAction:</string> +						<object class="NSMenu" key="NSSubmenu" id="992780483"> +							<string key="NSTitle">Help</string> +							<array class="NSMutableArray" key="NSMenuItems"> +								<object class="NSMenuItem" id="105068016"> +									<reference key="NSMenu" ref="992780483"/> +									<string key="NSTitle">Second Life Crash Logger Help</string> +									<string key="NSKeyEquiv">?</string> +									<int key="NSKeyEquivModMask">1048576</int> +									<int key="NSMnemonicLoc">2147483647</int> +									<reference key="NSOnImage" ref="35465992"/> +									<reference key="NSMixedImage" ref="502551668"/> +								</object> +							</array> +							<string key="NSName">_NSHelpMenu</string> +						</object> +					</object> +				</array> +				<string key="NSName">_NSMainMenu</string> +			</object> +			<object class="NSWindowTemplate" id="972006081"> +				<int key="NSWindowStyleMask">15</int> +				<int key="NSWindowBacking">2</int> +				<string key="NSWindowRect">{{335, 390}, {508, 477}}</string> +				<int key="NSWTFlags">1954021376</int> +				<string key="NSWindowTitle">Second Life Crash Logger</string> +				<string key="NSWindowClass">NSWindow</string> +				<nil key="NSViewClass"/> +				<nil key="NSUserInterfaceItemIdentifier"/> +				<object class="NSView" key="NSWindowView" id="439893737"> +					<reference key="NSNextResponder"/> +					<int key="NSvFlags">256</int> +					<array class="NSMutableArray" key="NSSubviews"> +						<object class="NSTextField" id="242877095"> +							<reference key="NSNextResponder" ref="439893737"/> +							<int key="NSvFlags">268</int> +							<string key="NSFrame">{{17, 228}, {474, 229}}</string> +							<reference key="NSSuperview" ref="439893737"/> +							<reference key="NSWindow"/> +							<reference key="NSNextKeyView" ref="1018085422"/> +							<string key="NSReuseIdentifierKey">_NS:9</string> +							<string key="NSAntiCompressionPriority">{250, 750}</string> +							<bool key="NSEnabled">YES</bool> +							<object class="NSTextFieldCell" key="NSCell" id="502956757"> +								<int key="NSCellFlags">67239424</int> +								<int key="NSCellFlags2">272891904</int> +								<object class="NSMutableString" key="NSContents"> +									<bytes key="NS.bytes">U2Vjb25kIExpZmUgYXBwZWFycyB0byBoYXZlIGNyYXNoZWQgb3IgZnJvemVuIHRoZSBsYXN0IHRpbWUg +aXQgcmFuLgoKVGhpcyBjcmFzaCByZXBvcnRlciBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCB5b3Vy +IGNvbXB1dGVyJ3MgaGFyZHdhcmUgY29uZmlndXJhdGlvbiwgb3BlcmF0aW5nIHN5c3RlbSwgYW5kIHNv +bWUgU2Vjb25kIExpZmUgbG9ncywgYWxsIG9mIHdoaWNoIGFyZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVy +cG9zZXMgb25seS4KCkluIHRoZSBzcGFjZSBiZWxvdywgcGxlYXNlIGJyaWVmbHkgZGVzY3JpYmUgd2hh +dCB5b3Ugd2VyZSBkb2luZyBvciB0cnlpbmcgdG8gZG8ganVzdCBwcmlvciB0byB0aGUgY3Jhc2guICBU +aGFuayB5b3UgZm9yIHlvdXIgaGVscCEKClRoaXMgcmVwb3J0IGlzIE5PVCByZWFkIGJ5IEN1c3RvbWVy +IFN1cHBvcnQuICBJZiB5b3UgaGF2ZSBiaWxsaW5nIG9yIG90aGVyIHF1ZXN0aW9ucywgcGxlYXNlIGdv +IHRvOiBodHRwOi8vd3d3LnNlY29uZGxpZmUuY29tL3N1cHBvcnQvCgpJZiB5b3UgZG9uJ3Qgd2lzaCB0 +byBzZW5kIExpbmRlbiBMYWIgYSBjcmFzaCByZXBvcnQsIHByZXNzIENhbmNlbC4</bytes> +								</object> +								<object class="NSFont" key="NSSupport" id="1010806345"> +									<string key="NSName">LucidaGrande</string> +									<double key="NSSize">13</double> +									<int key="NSfFlags">16</int> +								</object> +								<string key="NSCellIdentifier">_NS:9</string> +								<reference key="NSControlView" ref="242877095"/> +								<object class="NSColor" key="NSBackgroundColor"> +									<int key="NSColorSpace">6</int> +									<string key="NSCatalogName">System</string> +									<string key="NSColorName">controlColor</string> +									<object class="NSColor" key="NSColor"> +										<int key="NSColorSpace">3</int> +										<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> +									</object> +								</object> +								<object class="NSColor" key="NSTextColor"> +									<int key="NSColorSpace">6</int> +									<string key="NSCatalogName">System</string> +									<string key="NSColorName">controlTextColor</string> +									<object class="NSColor" key="NSColor" id="355388215"> +										<int key="NSColorSpace">3</int> +										<bytes key="NSWhite">MAA</bytes> +									</object> +								</object> +							</object> +						</object> +						<object class="NSTextField" id="1018085422"> +							<reference key="NSNextResponder" ref="439893737"/> +							<int key="NSvFlags">268</int> +							<string key="NSFrame">{{20, 64}, {468, 163}}</string> +							<reference key="NSSuperview" ref="439893737"/> +							<reference key="NSWindow"/> +							<reference key="NSNextKeyView" ref="688522420"/> +							<string key="NSReuseIdentifierKey">_NS:9</string> +							<string key="NSAntiCompressionPriority">{250, 750}</string> +							<bool key="NSEnabled">YES</bool> +							<object class="NSTextFieldCell" key="NSCell" id="867418359"> +								<int key="NSCellFlags">-1805517311</int> +								<int key="NSCellFlags2">272891904</int> +								<string key="NSContents"/> +								<object class="NSFont" key="NSSupport"> +									<string key="NSName">LucidaGrande</string> +									<double key="NSSize">9</double> +									<int key="NSfFlags">3614</int> +								</object> +								<string key="NSCellIdentifier">_NS:9</string> +								<reference key="NSControlView" ref="1018085422"/> +								<bool key="NSDrawsBackground">YES</bool> +								<object class="NSColor" key="NSBackgroundColor"> +									<int key="NSColorSpace">6</int> +									<string key="NSCatalogName">System</string> +									<string key="NSColorName">textBackgroundColor</string> +									<object class="NSColor" key="NSColor"> +										<int key="NSColorSpace">3</int> +										<bytes key="NSWhite">MQA</bytes> +									</object> +								</object> +								<object class="NSColor" key="NSTextColor"> +									<int key="NSColorSpace">6</int> +									<string key="NSCatalogName">System</string> +									<string key="NSColorName">textColor</string> +									<reference key="NSColor" ref="355388215"/> +								</object> +							</object> +						</object> +						<object class="NSButton" id="688522420"> +							<reference key="NSNextResponder" ref="439893737"/> +							<int key="NSvFlags">268</int> +							<string key="NSFrame">{{16, 18}, {189, 30}}</string> +							<reference key="NSSuperview" ref="439893737"/> +							<reference key="NSWindow"/> +							<reference key="NSNextKeyView" ref="93467784"/> +							<string key="NSReuseIdentifierKey">_NS:9</string> +							<bool key="NSEnabled">YES</bool> +							<object class="NSButtonCell" key="NSCell" id="445379790"> +								<int key="NSCellFlags">-2080244224</int> +								<int key="NSCellFlags2">262144</int> +								<string key="NSContents">Remember This Choice</string> +								<reference key="NSSupport" ref="1010806345"/> +								<string key="NSCellIdentifier">_NS:9</string> +								<reference key="NSControlView" ref="688522420"/> +								<int key="NSButtonFlags">1211912703</int> +								<int key="NSButtonFlags2">2</int> +								<object class="NSCustomResource" key="NSNormalImage"> +									<string key="NSClassName">NSImage</string> +									<string key="NSResourceName">NSSwitch</string> +								</object> +								<object class="NSButtonImageSource" key="NSAlternateImage"> +									<string key="NSImageName">NSSwitch</string> +								</object> +								<string key="NSAlternateContents"/> +								<string key="NSKeyEquivalent"/> +								<int key="NSPeriodicDelay">200</int> +								<int key="NSPeriodicInterval">25</int> +							</object> +						</object> +						<object class="NSButton" id="93467784"> +							<reference key="NSNextResponder" ref="439893737"/> +							<int key="NSvFlags">268</int> +							<string key="NSFrame">{{285, 23}, {91, 17}}</string> +							<reference key="NSSuperview" ref="439893737"/> +							<reference key="NSWindow"/> +							<reference key="NSNextKeyView" ref="46276252"/> +							<string key="NSReuseIdentifierKey">_NS:9</string> +							<bool key="NSEnabled">YES</bool> +							<object class="NSButtonCell" key="NSCell" id="623922320"> +								<int key="NSCellFlags">-2080244224</int> +								<int key="NSCellFlags2">134479872</int> +								<string key="NSContents">Send Report</string> +								<reference key="NSSupport" ref="1010806345"/> +								<string key="NSCellIdentifier">_NS:9</string> +								<reference key="NSControlView" ref="93467784"/> +								<int key="NSButtonFlags">-2038152961</int> +								<int key="NSButtonFlags2">164</int> +								<string key="NSAlternateContents"/> +								<string key="NSKeyEquivalent"/> +								<int key="NSPeriodicDelay">400</int> +								<int key="NSPeriodicInterval">75</int> +							</object> +						</object> +						<object class="NSButton" id="46276252"> +							<reference key="NSNextResponder" ref="439893737"/> +							<int key="NSvFlags">268</int> +							<string key="NSFrame">{{388, 23}, {100, 17}}</string> +							<reference key="NSSuperview" ref="439893737"/> +							<reference key="NSWindow"/> +							<reference key="NSNextKeyView"/> +							<string key="NSReuseIdentifierKey">_NS:9</string> +							<bool key="NSEnabled">YES</bool> +							<object class="NSButtonCell" key="NSCell" id="398179500"> +								<int key="NSCellFlags">-2080244224</int> +								<int key="NSCellFlags2">134479872</int> +								<string key="NSContents">Don't Send</string> +								<reference key="NSSupport" ref="1010806345"/> +								<string key="NSCellIdentifier">_NS:9</string> +								<reference key="NSControlView" ref="46276252"/> +								<int key="NSButtonFlags">-2038152961</int> +								<int key="NSButtonFlags2">164</int> +								<string key="NSAlternateContents"/> +								<string key="NSKeyEquivalent"/> +								<int key="NSPeriodicDelay">400</int> +								<int key="NSPeriodicInterval">75</int> +							</object> +						</object> +					</array> +					<string key="NSFrameSize">{508, 477}</string> +					<reference key="NSSuperview"/> +					<reference key="NSWindow"/> +					<reference key="NSNextKeyView" ref="242877095"/> +				</object> +				<string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string> +				<string key="NSMaxSize">{10000000000000, 10000000000000}</string> +				<bool key="NSWindowIsRestorable">YES</bool> +			</object> +			<object class="NSCustomObject" id="976324537"> +				<string key="NSClassName">LLCrashLoggerMacDelegate</string> +			</object> +		</array> +		<object class="IBObjectContainer" key="IBDocument.Objects"> +			<array class="NSMutableArray" key="connectionRecords"> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">terminate:</string> +						<reference key="source" ref="1050"/> +						<reference key="destination" ref="632727374"/> +					</object> +					<int key="connectionID">449</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">orderFrontStandardAboutPanel:</string> +						<reference key="source" ref="1021"/> +						<reference key="destination" ref="238522557"/> +					</object> +					<int key="connectionID">142</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBOutletConnection" key="connection"> +						<string key="label">delegate</string> +						<reference key="source" ref="1021"/> +						<reference key="destination" ref="976324537"/> +					</object> +					<int key="connectionID">495</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">performMiniaturize:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="1011231497"/> +					</object> +					<int key="connectionID">37</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">arrangeInFront:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="625202149"/> +					</object> +					<int key="connectionID">39</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">print:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="49223823"/> +					</object> +					<int key="connectionID">86</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">runPageLayout:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="294629803"/> +					</object> +					<int key="connectionID">87</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">clearRecentDocuments:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="759406840"/> +					</object> +					<int key="connectionID">127</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">performClose:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="776162233"/> +					</object> +					<int key="connectionID">193</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">toggleContinuousSpellChecking:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="948374510"/> +					</object> +					<int key="connectionID">222</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">undo:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="1058277027"/> +					</object> +					<int key="connectionID">223</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">copy:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="860595796"/> +					</object> +					<int key="connectionID">224</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">checkSpelling:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="96193923"/> +					</object> +					<int key="connectionID">225</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">paste:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="29853731"/> +					</object> +					<int key="connectionID">226</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">stopSpeaking:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="680220178"/> +					</object> +					<int key="connectionID">227</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">cut:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="296257095"/> +					</object> +					<int key="connectionID">228</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">showGuessPanel:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="679648819"/> +					</object> +					<int key="connectionID">230</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">redo:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="790794224"/> +					</object> +					<int key="connectionID">231</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">selectAll:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="583158037"/> +					</object> +					<int key="connectionID">232</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">startSpeaking:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="731782645"/> +					</object> +					<int key="connectionID">233</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">delete:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="437104165"/> +					</object> +					<int key="connectionID">235</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">performZoom:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="575023229"/> +					</object> +					<int key="connectionID">240</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">performFindPanelAction:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="447796847"/> +					</object> +					<int key="connectionID">241</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">centerSelectionInVisibleArea:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="88285865"/> +					</object> +					<int key="connectionID">245</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">toggleGrammarChecking:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="967646866"/> +					</object> +					<int key="connectionID">347</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">toggleSmartInsertDelete:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="605118523"/> +					</object> +					<int key="connectionID">355</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">toggleAutomaticQuoteSubstitution:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="197661976"/> +					</object> +					<int key="connectionID">356</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">toggleAutomaticLinkDetection:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="708854459"/> +					</object> +					<int key="connectionID">357</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">saveDocument:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="1023925487"/> +					</object> +					<int key="connectionID">362</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">revertDocumentToSaved:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="579971712"/> +					</object> +					<int key="connectionID">364</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">runToolbarCustomizationPalette:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="237841660"/> +					</object> +					<int key="connectionID">365</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">toggleToolbarShown:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="102151532"/> +					</object> +					<int key="connectionID">366</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">hide:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="755159360"/> +					</object> +					<int key="connectionID">367</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">hideOtherApplications:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="342932134"/> +					</object> +					<int key="connectionID">368</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">unhideAllApplications:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="908899353"/> +					</object> +					<int key="connectionID">370</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">newDocument:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="705341025"/> +					</object> +					<int key="connectionID">373</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">openDocument:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="722745758"/> +					</object> +					<int key="connectionID">374</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">raiseBaseline:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="941806246"/> +					</object> +					<int key="connectionID">426</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">lowerBaseline:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="1045724900"/> +					</object> +					<int key="connectionID">427</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">copyFont:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="596732606"/> +					</object> +					<int key="connectionID">428</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">subscript:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="1037576581"/> +					</object> +					<int key="connectionID">429</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">superscript:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="644725453"/> +					</object> +					<int key="connectionID">430</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">tightenKerning:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="677519740"/> +					</object> +					<int key="connectionID">431</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">underline:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="330926929"/> +					</object> +					<int key="connectionID">432</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">orderFrontColorPanel:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="1012600125"/> +					</object> +					<int key="connectionID">433</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">useAllLigatures:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="663508465"/> +					</object> +					<int key="connectionID">434</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">loosenKerning:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="238351151"/> +					</object> +					<int key="connectionID">435</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">pasteFont:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="393423671"/> +					</object> +					<int key="connectionID">436</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">unscript:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="257962622"/> +					</object> +					<int key="connectionID">437</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">useStandardKerning:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="252969304"/> +					</object> +					<int key="connectionID">438</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">useStandardLigatures:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="706297211"/> +					</object> +					<int key="connectionID">439</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">turnOffLigatures:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="568384683"/> +					</object> +					<int key="connectionID">440</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">turnOffKerning:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="766922938"/> +					</object> +					<int key="connectionID">441</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">toggleAutomaticSpellingCorrection:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="795346622"/> +					</object> +					<int key="connectionID">456</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">orderFrontSubstitutionsPanel:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="65139061"/> +					</object> +					<int key="connectionID">458</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">toggleAutomaticDashSubstitution:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="672708820"/> +					</object> +					<int key="connectionID">461</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">toggleAutomaticTextReplacement:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="537092702"/> +					</object> +					<int key="connectionID">463</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">uppercaseWord:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="1060694897"/> +					</object> +					<int key="connectionID">464</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">capitalizeWord:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="56570060"/> +					</object> +					<int key="connectionID">467</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">lowercaseWord:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="879586729"/> +					</object> +					<int key="connectionID">468</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">pasteAsPlainText:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="82994268"/> +					</object> +					<int key="connectionID">486</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">performFindPanelAction:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="326711663"/> +					</object> +					<int key="connectionID">487</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">performFindPanelAction:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="270902937"/> +					</object> +					<int key="connectionID">488</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">performFindPanelAction:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="159080638"/> +					</object> +					<int key="connectionID">489</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">showHelp:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="105068016"/> +					</object> +					<int key="connectionID">493</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">alignCenter:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="630155264"/> +					</object> +					<int key="connectionID">518</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">pasteRuler:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="883618387"/> +					</object> +					<int key="connectionID">519</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">toggleRuler:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="644046920"/> +					</object> +					<int key="connectionID">520</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">alignRight:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="512868991"/> +					</object> +					<int key="connectionID">521</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">copyRuler:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="231811626"/> +					</object> +					<int key="connectionID">522</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">alignJustified:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="945678886"/> +					</object> +					<int key="connectionID">523</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">alignLeft:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="875092757"/> +					</object> +					<int key="connectionID">524</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">makeBaseWritingDirectionNatural:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="551969625"/> +					</object> +					<int key="connectionID">525</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">makeBaseWritingDirectionLeftToRight:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="249532473"/> +					</object> +					<int key="connectionID">526</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">makeBaseWritingDirectionRightToLeft:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="607364498"/> +					</object> +					<int key="connectionID">527</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">makeTextWritingDirectionNatural:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="380031999"/> +					</object> +					<int key="connectionID">528</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">makeTextWritingDirectionLeftToRight:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="825984362"/> +					</object> +					<int key="connectionID">529</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">makeTextWritingDirectionRightToLeft:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="560145579"/> +					</object> +					<int key="connectionID">530</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">performFindPanelAction:</string> +						<reference key="source" ref="1014"/> +						<reference key="destination" ref="738670835"/> +					</object> +					<int key="connectionID">535</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBOutletConnection" key="connection"> +						<string key="label">window</string> +						<reference key="source" ref="976324537"/> +						<reference key="destination" ref="972006081"/> +					</object> +					<int key="connectionID">532</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">remember:</string> +						<reference key="source" ref="976324537"/> +						<reference key="destination" ref="688522420"/> +					</object> +					<int key="connectionID">1176</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">send:</string> +						<reference key="source" ref="976324537"/> +						<reference key="destination" ref="93467784"/> +					</object> +					<int key="connectionID">1177</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBActionConnection" key="connection"> +						<string key="label">cancel:</string> +						<reference key="source" ref="976324537"/> +						<reference key="destination" ref="46276252"/> +					</object> +					<int key="connectionID">1178</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBOutletConnection" key="connection"> +						<string key="label">crashText</string> +						<reference key="source" ref="976324537"/> +						<reference key="destination" ref="1018085422"/> +					</object> +					<int key="connectionID">1179</int> +				</object> +				<object class="IBConnectionRecord"> +					<object class="IBOutletConnection" key="connection"> +						<string key="label">rememberCheck</string> +						<reference key="source" ref="976324537"/> +						<reference key="destination" ref="688522420"/> +					</object> +					<int key="connectionID">1187</int> +				</object> +			</array> +			<object class="IBMutableOrderedSet" key="objectRecords"> +				<array key="orderedObjects"> +					<object class="IBObjectRecord"> +						<int key="objectID">0</int> +						<array key="object" id="0"/> +						<reference key="children" ref="1048"/> +						<nil key="parent"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">-2</int> +						<reference key="object" ref="1021"/> +						<reference key="parent" ref="0"/> +						<string key="objectName">File's Owner</string> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">-1</int> +						<reference key="object" ref="1014"/> +						<reference key="parent" ref="0"/> +						<string key="objectName">First Responder</string> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">-3</int> +						<reference key="object" ref="1050"/> +						<reference key="parent" ref="0"/> +						<string key="objectName">Application</string> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">29</int> +						<reference key="object" ref="649796088"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="713487014"/> +							<reference ref="694149608"/> +							<reference ref="952259628"/> +							<reference ref="379814623"/> +							<reference ref="586577488"/> +							<reference ref="302598603"/> +							<reference ref="448692316"/> +						</array> +						<reference key="parent" ref="0"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">19</int> +						<reference key="object" ref="713487014"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="835318025"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">56</int> +						<reference key="object" ref="694149608"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="110575045"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">217</int> +						<reference key="object" ref="952259628"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="789758025"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">83</int> +						<reference key="object" ref="379814623"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="720053764"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">81</int> +						<reference key="object" ref="720053764"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="1023925487"/> +							<reference ref="49223823"/> +							<reference ref="722745758"/> +							<reference ref="705341025"/> +							<reference ref="1025936716"/> +							<reference ref="294629803"/> +							<reference ref="776162233"/> +							<reference ref="425164168"/> +							<reference ref="579971712"/> +							<reference ref="1010469920"/> +						</array> +						<reference key="parent" ref="379814623"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">75</int> +						<reference key="object" ref="1023925487"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">78</int> +						<reference key="object" ref="49223823"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">72</int> +						<reference key="object" ref="722745758"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">82</int> +						<reference key="object" ref="705341025"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">124</int> +						<reference key="object" ref="1025936716"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="1065607017"/> +						</array> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">77</int> +						<reference key="object" ref="294629803"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">73</int> +						<reference key="object" ref="776162233"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">79</int> +						<reference key="object" ref="425164168"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">112</int> +						<reference key="object" ref="579971712"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">74</int> +						<reference key="object" ref="1010469920"/> +						<reference key="parent" ref="720053764"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">125</int> +						<reference key="object" ref="1065607017"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="759406840"/> +						</array> +						<reference key="parent" ref="1025936716"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">126</int> +						<reference key="object" ref="759406840"/> +						<reference key="parent" ref="1065607017"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">205</int> +						<reference key="object" ref="789758025"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="437104165"/> +							<reference ref="583158037"/> +							<reference ref="1058277027"/> +							<reference ref="212016141"/> +							<reference ref="296257095"/> +							<reference ref="29853731"/> +							<reference ref="860595796"/> +							<reference ref="1040322652"/> +							<reference ref="790794224"/> +							<reference ref="892235320"/> +							<reference ref="972420730"/> +							<reference ref="676164635"/> +							<reference ref="507821607"/> +							<reference ref="288088188"/> +							<reference ref="82994268"/> +						</array> +						<reference key="parent" ref="952259628"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">202</int> +						<reference key="object" ref="437104165"/> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">198</int> +						<reference key="object" ref="583158037"/> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">207</int> +						<reference key="object" ref="1058277027"/> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">214</int> +						<reference key="object" ref="212016141"/> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">199</int> +						<reference key="object" ref="296257095"/> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">203</int> +						<reference key="object" ref="29853731"/> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">197</int> +						<reference key="object" ref="860595796"/> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">206</int> +						<reference key="object" ref="1040322652"/> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">215</int> +						<reference key="object" ref="790794224"/> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">218</int> +						<reference key="object" ref="892235320"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="963351320"/> +						</array> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">216</int> +						<reference key="object" ref="972420730"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="769623530"/> +						</array> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">200</int> +						<reference key="object" ref="769623530"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="948374510"/> +							<reference ref="96193923"/> +							<reference ref="679648819"/> +							<reference ref="967646866"/> +							<reference ref="859480356"/> +							<reference ref="795346622"/> +						</array> +						<reference key="parent" ref="972420730"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">219</int> +						<reference key="object" ref="948374510"/> +						<reference key="parent" ref="769623530"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">201</int> +						<reference key="object" ref="96193923"/> +						<reference key="parent" ref="769623530"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">204</int> +						<reference key="object" ref="679648819"/> +						<reference key="parent" ref="769623530"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">220</int> +						<reference key="object" ref="963351320"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="270902937"/> +							<reference ref="88285865"/> +							<reference ref="159080638"/> +							<reference ref="326711663"/> +							<reference ref="447796847"/> +							<reference ref="738670835"/> +						</array> +						<reference key="parent" ref="892235320"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">213</int> +						<reference key="object" ref="270902937"/> +						<reference key="parent" ref="963351320"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">210</int> +						<reference key="object" ref="88285865"/> +						<reference key="parent" ref="963351320"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">221</int> +						<reference key="object" ref="159080638"/> +						<reference key="parent" ref="963351320"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">208</int> +						<reference key="object" ref="326711663"/> +						<reference key="parent" ref="963351320"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">209</int> +						<reference key="object" ref="447796847"/> +						<reference key="parent" ref="963351320"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">57</int> +						<reference key="object" ref="110575045"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="238522557"/> +							<reference ref="755159360"/> +							<reference ref="908899353"/> +							<reference ref="632727374"/> +							<reference ref="646227648"/> +							<reference ref="609285721"/> +							<reference ref="481834944"/> +							<reference ref="304266470"/> +							<reference ref="1046388886"/> +							<reference ref="1056857174"/> +							<reference ref="342932134"/> +						</array> +						<reference key="parent" ref="694149608"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">58</int> +						<reference key="object" ref="238522557"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">134</int> +						<reference key="object" ref="755159360"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">150</int> +						<reference key="object" ref="908899353"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">136</int> +						<reference key="object" ref="632727374"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">144</int> +						<reference key="object" ref="646227648"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">129</int> +						<reference key="object" ref="609285721"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">143</int> +						<reference key="object" ref="481834944"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">236</int> +						<reference key="object" ref="304266470"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">131</int> +						<reference key="object" ref="1046388886"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="752062318"/> +						</array> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">149</int> +						<reference key="object" ref="1056857174"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">145</int> +						<reference key="object" ref="342932134"/> +						<reference key="parent" ref="110575045"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">130</int> +						<reference key="object" ref="752062318"/> +						<reference key="parent" ref="1046388886"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">24</int> +						<reference key="object" ref="835318025"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="299356726"/> +							<reference ref="625202149"/> +							<reference ref="575023229"/> +							<reference ref="1011231497"/> +						</array> +						<reference key="parent" ref="713487014"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">92</int> +						<reference key="object" ref="299356726"/> +						<reference key="parent" ref="835318025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">5</int> +						<reference key="object" ref="625202149"/> +						<reference key="parent" ref="835318025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">239</int> +						<reference key="object" ref="575023229"/> +						<reference key="parent" ref="835318025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">23</int> +						<reference key="object" ref="1011231497"/> +						<reference key="parent" ref="835318025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">295</int> +						<reference key="object" ref="586577488"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="466310130"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">296</int> +						<reference key="object" ref="466310130"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="102151532"/> +							<reference ref="237841660"/> +						</array> +						<reference key="parent" ref="586577488"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">297</int> +						<reference key="object" ref="102151532"/> +						<reference key="parent" ref="466310130"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">298</int> +						<reference key="object" ref="237841660"/> +						<reference key="parent" ref="466310130"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">211</int> +						<reference key="object" ref="676164635"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="785027613"/> +						</array> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">212</int> +						<reference key="object" ref="785027613"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="680220178"/> +							<reference ref="731782645"/> +						</array> +						<reference key="parent" ref="676164635"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">195</int> +						<reference key="object" ref="680220178"/> +						<reference key="parent" ref="785027613"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">196</int> +						<reference key="object" ref="731782645"/> +						<reference key="parent" ref="785027613"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">346</int> +						<reference key="object" ref="967646866"/> +						<reference key="parent" ref="769623530"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">348</int> +						<reference key="object" ref="507821607"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="698887838"/> +						</array> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">349</int> +						<reference key="object" ref="698887838"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="605118523"/> +							<reference ref="197661976"/> +							<reference ref="708854459"/> +							<reference ref="65139061"/> +							<reference ref="19036812"/> +							<reference ref="672708820"/> +							<reference ref="537092702"/> +						</array> +						<reference key="parent" ref="507821607"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">350</int> +						<reference key="object" ref="605118523"/> +						<reference key="parent" ref="698887838"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">351</int> +						<reference key="object" ref="197661976"/> +						<reference key="parent" ref="698887838"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">354</int> +						<reference key="object" ref="708854459"/> +						<reference key="parent" ref="698887838"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">371</int> +						<reference key="object" ref="972006081"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="439893737"/> +						</array> +						<reference key="parent" ref="0"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">372</int> +						<reference key="object" ref="439893737"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="242877095"/> +							<reference ref="1018085422"/> +							<reference ref="688522420"/> +							<object class="IBNSLayoutConstraint" id="109434655"> +								<reference key="firstItem" ref="242877095"/> +								<int key="firstAttribute">3</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="439893737"/> +								<int key="secondAttribute">3</int> +								<float key="multiplier">1</float> +								<object class="IBNSLayoutSymbolicConstant" key="constant"> +									<double key="value">20</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">8</int> +								<float key="scoringTypeFloat">29</float> +								<int key="contentType">3</int> +								<reference key="containingView" ref="439893737"/> +							</object> +							<reference ref="46276252"/> +							<reference ref="93467784"/> +							<object class="IBNSLayoutConstraint" id="166525974"> +								<reference key="firstItem" ref="439893737"/> +								<int key="firstAttribute">6</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="242877095"/> +								<int key="secondAttribute">6</int> +								<float key="multiplier">1</float> +								<object class="IBNSLayoutSymbolicConstant" key="constant"> +									<double key="value">20</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">8</int> +								<float key="scoringTypeFloat">29</float> +								<int key="contentType">3</int> +								<reference key="containingView" ref="439893737"/> +							</object> +							<object class="IBNSLayoutConstraint" id="229833409"> +								<reference key="firstItem" ref="242877095"/> +								<int key="firstAttribute">5</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="439893737"/> +								<int key="secondAttribute">5</int> +								<float key="multiplier">1</float> +								<object class="IBNSLayoutSymbolicConstant" key="constant"> +									<double key="value">20</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">8</int> +								<float key="scoringTypeFloat">29</float> +								<int key="contentType">3</int> +								<reference key="containingView" ref="439893737"/> +							</object> +							<object class="IBNSLayoutConstraint" id="992363278"> +								<reference key="firstItem" ref="439893737"/> +								<int key="firstAttribute">6</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="1018085422"/> +								<int key="secondAttribute">6</int> +								<float key="multiplier">1</float> +								<object class="IBNSLayoutSymbolicConstant" key="constant"> +									<double key="value">20</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">8</int> +								<float key="scoringTypeFloat">29</float> +								<int key="contentType">3</int> +								<reference key="containingView" ref="439893737"/> +							</object> +							<object class="IBNSLayoutConstraint" id="646866003"> +								<reference key="firstItem" ref="1018085422"/> +								<int key="firstAttribute">5</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="439893737"/> +								<int key="secondAttribute">5</int> +								<float key="multiplier">1</float> +								<object class="IBNSLayoutSymbolicConstant" key="constant"> +									<double key="value">20</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">8</int> +								<float key="scoringTypeFloat">29</float> +								<int key="contentType">3</int> +								<reference key="containingView" ref="439893737"/> +							</object> +							<object class="IBNSLayoutConstraint" id="98217052"> +								<reference key="firstItem" ref="439893737"/> +								<int key="firstAttribute">4</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="1018085422"/> +								<int key="secondAttribute">4</int> +								<float key="multiplier">1</float> +								<object class="IBLayoutConstant" key="constant"> +									<double key="value">64</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">3</int> +								<float key="scoringTypeFloat">9</float> +								<int key="contentType">3</int> +								<reference key="containingView" ref="439893737"/> +							</object> +							<object class="IBNSLayoutConstraint" id="578918264"> +								<reference key="firstItem" ref="439893737"/> +								<int key="firstAttribute">6</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="46276252"/> +								<int key="secondAttribute">6</int> +								<float key="multiplier">1</float> +								<object class="IBNSLayoutSymbolicConstant" key="constant"> +									<double key="value">20</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">8</int> +								<float key="scoringTypeFloat">29</float> +								<int key="contentType">3</int> +								<reference key="containingView" ref="439893737"/> +							</object> +							<object class="IBNSLayoutConstraint" id="591594339"> +								<reference key="firstItem" ref="688522420"/> +								<int key="firstAttribute">5</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="439893737"/> +								<int key="secondAttribute">5</int> +								<float key="multiplier">1</float> +								<object class="IBNSLayoutSymbolicConstant" key="constant"> +									<double key="value">20</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">8</int> +								<float key="scoringTypeFloat">29</float> +								<int key="contentType">3</int> +								<reference key="containingView" ref="439893737"/> +							</object> +							<object class="IBNSLayoutConstraint" id="432526715"> +								<reference key="firstItem" ref="439893737"/> +								<int key="firstAttribute">4</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="688522420"/> +								<int key="secondAttribute">4</int> +								<float key="multiplier">1</float> +								<object class="IBLayoutConstant" key="constant"> +									<double key="value">21</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">3</int> +								<float key="scoringTypeFloat">9</float> +								<int key="contentType">3</int> +								<reference key="containingView" ref="439893737"/> +							</object> +							<object class="IBNSLayoutConstraint" id="891430181"> +								<reference key="firstItem" ref="439893737"/> +								<int key="firstAttribute">6</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="93467784"/> +								<int key="secondAttribute">6</int> +								<float key="multiplier">1</float> +								<object class="IBLayoutConstant" key="constant"> +									<double key="value">132</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">3</int> +								<float key="scoringTypeFloat">9</float> +								<int key="contentType">3</int> +								<reference key="containingView" ref="439893737"/> +							</object> +							<object class="IBNSLayoutConstraint" id="833183002"> +								<reference key="firstItem" ref="93467784"/> +								<int key="firstAttribute">11</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="46276252"/> +								<int key="secondAttribute">11</int> +								<float key="multiplier">1</float> +								<object class="IBLayoutConstant" key="constant"> +									<double key="value">0.0</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">6</int> +								<float key="scoringTypeFloat">24</float> +								<int key="contentType">2</int> +								<reference key="containingView" ref="439893737"/> +							</object> +							<object class="IBNSLayoutConstraint" id="670714078"> +								<reference key="firstItem" ref="93467784"/> +								<int key="firstAttribute">10</int> +								<int key="relation">0</int> +								<reference key="secondItem" ref="688522420"/> +								<int key="secondAttribute">10</int> +								<float key="multiplier">1</float> +								<object class="IBLayoutConstant" key="constant"> +									<double key="value">0.0</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">6</int> +								<float key="scoringTypeFloat">24</float> +								<int key="contentType">2</int> +								<reference key="containingView" ref="439893737"/> +							</object> +						</array> +						<reference key="parent" ref="972006081"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">375</int> +						<reference key="object" ref="302598603"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="941447902"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">376</int> +						<reference key="object" ref="941447902"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="792887677"/> +							<reference ref="215659978"/> +						</array> +						<reference key="parent" ref="302598603"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">377</int> +						<reference key="object" ref="792887677"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="786677654"/> +						</array> +						<reference key="parent" ref="941447902"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">388</int> +						<reference key="object" ref="786677654"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="159677712"/> +							<reference ref="305399458"/> +							<reference ref="814362025"/> +							<reference ref="330926929"/> +							<reference ref="533507878"/> +							<reference ref="158063935"/> +							<reference ref="885547335"/> +							<reference ref="901062459"/> +							<reference ref="767671776"/> +							<reference ref="691570813"/> +							<reference ref="769124883"/> +							<reference ref="739652853"/> +							<reference ref="1012600125"/> +							<reference ref="214559597"/> +							<reference ref="596732606"/> +							<reference ref="393423671"/> +						</array> +						<reference key="parent" ref="792887677"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">389</int> +						<reference key="object" ref="159677712"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">390</int> +						<reference key="object" ref="305399458"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">391</int> +						<reference key="object" ref="814362025"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">392</int> +						<reference key="object" ref="330926929"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">393</int> +						<reference key="object" ref="533507878"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">394</int> +						<reference key="object" ref="158063935"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">395</int> +						<reference key="object" ref="885547335"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">396</int> +						<reference key="object" ref="901062459"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">397</int> +						<reference key="object" ref="767671776"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="175441468"/> +						</array> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">398</int> +						<reference key="object" ref="691570813"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="1058217995"/> +						</array> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">399</int> +						<reference key="object" ref="769124883"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="18263474"/> +						</array> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">400</int> +						<reference key="object" ref="739652853"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">401</int> +						<reference key="object" ref="1012600125"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">402</int> +						<reference key="object" ref="214559597"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">403</int> +						<reference key="object" ref="596732606"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">404</int> +						<reference key="object" ref="393423671"/> +						<reference key="parent" ref="786677654"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">405</int> +						<reference key="object" ref="18263474"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="257962622"/> +							<reference ref="644725453"/> +							<reference ref="1037576581"/> +							<reference ref="941806246"/> +							<reference ref="1045724900"/> +						</array> +						<reference key="parent" ref="769124883"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">406</int> +						<reference key="object" ref="257962622"/> +						<reference key="parent" ref="18263474"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">407</int> +						<reference key="object" ref="644725453"/> +						<reference key="parent" ref="18263474"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">408</int> +						<reference key="object" ref="1037576581"/> +						<reference key="parent" ref="18263474"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">409</int> +						<reference key="object" ref="941806246"/> +						<reference key="parent" ref="18263474"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">410</int> +						<reference key="object" ref="1045724900"/> +						<reference key="parent" ref="18263474"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">411</int> +						<reference key="object" ref="1058217995"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="706297211"/> +							<reference ref="568384683"/> +							<reference ref="663508465"/> +						</array> +						<reference key="parent" ref="691570813"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">412</int> +						<reference key="object" ref="706297211"/> +						<reference key="parent" ref="1058217995"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">413</int> +						<reference key="object" ref="568384683"/> +						<reference key="parent" ref="1058217995"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">414</int> +						<reference key="object" ref="663508465"/> +						<reference key="parent" ref="1058217995"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">415</int> +						<reference key="object" ref="175441468"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="252969304"/> +							<reference ref="766922938"/> +							<reference ref="677519740"/> +							<reference ref="238351151"/> +						</array> +						<reference key="parent" ref="767671776"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">416</int> +						<reference key="object" ref="252969304"/> +						<reference key="parent" ref="175441468"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">417</int> +						<reference key="object" ref="766922938"/> +						<reference key="parent" ref="175441468"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">418</int> +						<reference key="object" ref="677519740"/> +						<reference key="parent" ref="175441468"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">419</int> +						<reference key="object" ref="238351151"/> +						<reference key="parent" ref="175441468"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">450</int> +						<reference key="object" ref="288088188"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="579392910"/> +						</array> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">451</int> +						<reference key="object" ref="579392910"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="1060694897"/> +							<reference ref="879586729"/> +							<reference ref="56570060"/> +						</array> +						<reference key="parent" ref="288088188"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">452</int> +						<reference key="object" ref="1060694897"/> +						<reference key="parent" ref="579392910"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">453</int> +						<reference key="object" ref="859480356"/> +						<reference key="parent" ref="769623530"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">454</int> +						<reference key="object" ref="795346622"/> +						<reference key="parent" ref="769623530"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">457</int> +						<reference key="object" ref="65139061"/> +						<reference key="parent" ref="698887838"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">459</int> +						<reference key="object" ref="19036812"/> +						<reference key="parent" ref="698887838"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">460</int> +						<reference key="object" ref="672708820"/> +						<reference key="parent" ref="698887838"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">462</int> +						<reference key="object" ref="537092702"/> +						<reference key="parent" ref="698887838"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">465</int> +						<reference key="object" ref="879586729"/> +						<reference key="parent" ref="579392910"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">466</int> +						<reference key="object" ref="56570060"/> +						<reference key="parent" ref="579392910"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">485</int> +						<reference key="object" ref="82994268"/> +						<reference key="parent" ref="789758025"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">490</int> +						<reference key="object" ref="448692316"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="992780483"/> +						</array> +						<reference key="parent" ref="649796088"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">491</int> +						<reference key="object" ref="992780483"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="105068016"/> +						</array> +						<reference key="parent" ref="448692316"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">492</int> +						<reference key="object" ref="105068016"/> +						<reference key="parent" ref="992780483"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">494</int> +						<reference key="object" ref="976324537"/> +						<reference key="parent" ref="0"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">496</int> +						<reference key="object" ref="215659978"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="446991534"/> +						</array> +						<reference key="parent" ref="941447902"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">497</int> +						<reference key="object" ref="446991534"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="875092757"/> +							<reference ref="630155264"/> +							<reference ref="945678886"/> +							<reference ref="512868991"/> +							<reference ref="163117631"/> +							<reference ref="31516759"/> +							<reference ref="908105787"/> +							<reference ref="644046920"/> +							<reference ref="231811626"/> +							<reference ref="883618387"/> +						</array> +						<reference key="parent" ref="215659978"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">498</int> +						<reference key="object" ref="875092757"/> +						<reference key="parent" ref="446991534"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">499</int> +						<reference key="object" ref="630155264"/> +						<reference key="parent" ref="446991534"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">500</int> +						<reference key="object" ref="945678886"/> +						<reference key="parent" ref="446991534"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">501</int> +						<reference key="object" ref="512868991"/> +						<reference key="parent" ref="446991534"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">502</int> +						<reference key="object" ref="163117631"/> +						<reference key="parent" ref="446991534"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">503</int> +						<reference key="object" ref="31516759"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="956096989"/> +						</array> +						<reference key="parent" ref="446991534"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">504</int> +						<reference key="object" ref="908105787"/> +						<reference key="parent" ref="446991534"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">505</int> +						<reference key="object" ref="644046920"/> +						<reference key="parent" ref="446991534"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">506</int> +						<reference key="object" ref="231811626"/> +						<reference key="parent" ref="446991534"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">507</int> +						<reference key="object" ref="883618387"/> +						<reference key="parent" ref="446991534"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">508</int> +						<reference key="object" ref="956096989"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="257099033"/> +							<reference ref="551969625"/> +							<reference ref="249532473"/> +							<reference ref="607364498"/> +							<reference ref="508151438"/> +							<reference ref="981751889"/> +							<reference ref="380031999"/> +							<reference ref="825984362"/> +							<reference ref="560145579"/> +						</array> +						<reference key="parent" ref="31516759"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">509</int> +						<reference key="object" ref="257099033"/> +						<reference key="parent" ref="956096989"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">510</int> +						<reference key="object" ref="551969625"/> +						<reference key="parent" ref="956096989"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">511</int> +						<reference key="object" ref="249532473"/> +						<reference key="parent" ref="956096989"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">512</int> +						<reference key="object" ref="607364498"/> +						<reference key="parent" ref="956096989"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">513</int> +						<reference key="object" ref="508151438"/> +						<reference key="parent" ref="956096989"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">514</int> +						<reference key="object" ref="981751889"/> +						<reference key="parent" ref="956096989"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">515</int> +						<reference key="object" ref="380031999"/> +						<reference key="parent" ref="956096989"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">516</int> +						<reference key="object" ref="825984362"/> +						<reference key="parent" ref="956096989"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">517</int> +						<reference key="object" ref="560145579"/> +						<reference key="parent" ref="956096989"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">534</int> +						<reference key="object" ref="738670835"/> +						<reference key="parent" ref="963351320"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">536</int> +						<reference key="object" ref="242877095"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="502956757"/> +							<object class="IBNSLayoutConstraint" id="697106875"> +								<reference key="firstItem" ref="242877095"/> +								<int key="firstAttribute">8</int> +								<int key="relation">0</int> +								<nil key="secondItem"/> +								<int key="secondAttribute">0</int> +								<float key="multiplier">1</float> +								<object class="IBLayoutConstant" key="constant"> +									<double key="value">229</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">3</int> +								<float key="scoringTypeFloat">9</float> +								<int key="contentType">1</int> +								<reference key="containingView" ref="242877095"/> +							</object> +						</array> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">537</int> +						<reference key="object" ref="502956757"/> +						<reference key="parent" ref="242877095"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">593</int> +						<reference key="object" ref="1018085422"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="867418359"/> +							<object class="IBNSLayoutConstraint" id="276483890"> +								<reference key="firstItem" ref="1018085422"/> +								<int key="firstAttribute">8</int> +								<int key="relation">0</int> +								<nil key="secondItem"/> +								<int key="secondAttribute">0</int> +								<float key="multiplier">1</float> +								<object class="IBLayoutConstant" key="constant"> +									<double key="value">163</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">3</int> +								<float key="scoringTypeFloat">9</float> +								<int key="contentType">1</int> +								<reference key="containingView" ref="1018085422"/> +							</object> +						</array> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">594</int> +						<reference key="object" ref="867418359"/> +						<reference key="parent" ref="1018085422"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">727</int> +						<reference key="object" ref="688522420"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="445379790"/> +							<object class="IBNSLayoutConstraint" id="337680523"> +								<reference key="firstItem" ref="688522420"/> +								<int key="firstAttribute">7</int> +								<int key="relation">0</int> +								<nil key="secondItem"/> +								<int key="secondAttribute">0</int> +								<float key="multiplier">1</float> +								<object class="IBLayoutConstant" key="constant"> +									<double key="value">183</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">3</int> +								<float key="scoringTypeFloat">9</float> +								<int key="contentType">1</int> +								<reference key="containingView" ref="688522420"/> +							</object> +							<object class="IBNSLayoutConstraint" id="73036966"> +								<reference key="firstItem" ref="688522420"/> +								<int key="firstAttribute">8</int> +								<int key="relation">0</int> +								<nil key="secondItem"/> +								<int key="secondAttribute">0</int> +								<float key="multiplier">1</float> +								<object class="IBLayoutConstant" key="constant"> +									<double key="value">22</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">3</int> +								<float key="scoringTypeFloat">9</float> +								<int key="contentType">1</int> +								<reference key="containingView" ref="688522420"/> +							</object> +						</array> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">728</int> +						<reference key="object" ref="445379790"/> +						<reference key="parent" ref="688522420"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">775</int> +						<reference key="object" ref="93467784"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="623922320"/> +						</array> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">776</int> +						<reference key="object" ref="623922320"/> +						<reference key="parent" ref="93467784"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">780</int> +						<reference key="object" ref="46276252"/> +						<array class="NSMutableArray" key="children"> +							<reference ref="398179500"/> +							<object class="IBNSLayoutConstraint" id="944606221"> +								<reference key="firstItem" ref="46276252"/> +								<int key="firstAttribute">7</int> +								<int key="relation">0</int> +								<nil key="secondItem"/> +								<int key="secondAttribute">0</int> +								<float key="multiplier">1</float> +								<object class="IBLayoutConstant" key="constant"> +									<double key="value">100</double> +								</object> +								<float key="priority">1000</float> +								<int key="scoringType">3</int> +								<float key="scoringTypeFloat">9</float> +								<int key="contentType">1</int> +								<reference key="containingView" ref="46276252"/> +							</object> +						</array> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">781</int> +						<reference key="object" ref="398179500"/> +						<reference key="parent" ref="46276252"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">884</int> +						<reference key="object" ref="109434655"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">981</int> +						<reference key="object" ref="229833409"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">982</int> +						<reference key="object" ref="992363278"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">1022</int> +						<reference key="object" ref="98217052"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">1026</int> +						<reference key="object" ref="276483890"/> +						<reference key="parent" ref="1018085422"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">979</int> +						<reference key="object" ref="166525974"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">985</int> +						<reference key="object" ref="646866003"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">977</int> +						<reference key="object" ref="697106875"/> +						<reference key="parent" ref="242877095"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">1099</int> +						<reference key="object" ref="337680523"/> +						<reference key="parent" ref="688522420"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">1093</int> +						<reference key="object" ref="578918264"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">1100</int> +						<reference key="object" ref="73036966"/> +						<reference key="parent" ref="688522420"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">1098</int> +						<reference key="object" ref="432526715"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">1168</int> +						<reference key="object" ref="670714078"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">1167</int> +						<reference key="object" ref="833183002"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">1095</int> +						<reference key="object" ref="591594339"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">1166</int> +						<reference key="object" ref="891430181"/> +						<reference key="parent" ref="439893737"/> +					</object> +					<object class="IBObjectRecord"> +						<int key="objectID">1076</int> +						<reference key="object" ref="944606221"/> +						<reference key="parent" ref="46276252"/> +					</object> +				</array> +			</object> +			<dictionary class="NSMutableDictionary" key="flattenedProperties"> +				<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="1022.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="1026.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="1076.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="1093.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="1095.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="1098.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="1099.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="1100.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="112.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="1166.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="1167.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="1168.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="124.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="125.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="126.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="195.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="196.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="197.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="198.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="199.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="200.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="201.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="202.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="204.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="205.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="206.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="207.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="208.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="209.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="210.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="211.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="212.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="213.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="214.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="215.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="216.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="217.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="218.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="219.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="220.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="221.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="236.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="239.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="295.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="296.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="297.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="298.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="346.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="348.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="349.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="350.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="351.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="354.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="371.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="371.IBWindowTemplateEditedContentRect">{{380, 496}, {480, 360}}</string> +				<integer value="1" key="371.NSWindowTemplate.visibleAtLaunch"/> +				<array class="NSMutableArray" key="372.IBNSViewMetadataConstraints"> +					<reference ref="109434655"/> +					<reference ref="166525974"/> +					<reference ref="229833409"/> +					<reference ref="992363278"/> +					<reference ref="646866003"/> +					<reference ref="98217052"/> +					<reference ref="578918264"/> +					<reference ref="591594339"/> +					<reference ref="432526715"/> +					<reference ref="891430181"/> +					<reference ref="833183002"/> +					<reference ref="670714078"/> +				</array> +				<string key="372.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<reference key="372.IBUserGuides" ref="0"/> +				<string key="375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="377.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="388.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="389.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="390.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="391.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="392.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="393.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="394.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="395.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="396.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="397.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="398.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="399.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="400.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="401.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="402.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="403.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="404.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="405.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="406.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="407.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="408.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="409.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="410.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="411.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="412.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="413.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="414.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="415.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="416.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="417.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="418.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="419.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="450.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="451.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="452.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="453.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="454.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="457.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="459.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="460.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="462.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="465.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="466.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="485.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="490.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="491.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="492.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="494.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="496.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="497.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="498.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="499.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="500.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="501.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="502.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="503.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="504.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="505.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="506.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="507.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="508.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="509.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="510.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="511.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="512.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="513.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="514.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="515.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="516.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="517.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="534.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<array class="NSMutableArray" key="536.IBNSViewMetadataConstraints"> +					<reference ref="697106875"/> +				</array> +				<boolean value="NO" key="536.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/> +				<string key="536.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="537.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<array class="NSMutableArray" key="593.IBNSViewMetadataConstraints"> +					<reference ref="276483890"/> +				</array> +				<boolean value="NO" key="593.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/> +				<string key="593.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="594.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="72.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<array class="NSMutableArray" key="727.IBNSViewMetadataConstraints"> +					<reference ref="337680523"/> +					<reference ref="73036966"/> +				</array> +				<boolean value="NO" key="727.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/> +				<string key="727.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="728.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="73.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="74.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="75.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="77.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<boolean value="NO" key="775.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/> +				<string key="775.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="776.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="78.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<array class="NSMutableArray" key="780.IBNSViewMetadataConstraints"> +					<reference ref="944606221"/> +				</array> +				<boolean value="NO" key="780.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/> +				<string key="780.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="781.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="79.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="81.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="82.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="83.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="884.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="977.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="979.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="981.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="982.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +				<string key="985.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> +			</dictionary> +			<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> +			<nil key="activeLocalization"/> +			<dictionary class="NSMutableDictionary" key="localizations"/> +			<nil key="sourceID"/> +			<int key="maxID">1187</int> +		</object> +		<object class="IBClassDescriber" key="IBDocument.Classes"> +			<array class="NSMutableArray" key="referencedPartialClassDescriptions"> +				<object class="IBPartialClassDescription"> +					<string key="className">LLCrashLoggerMacDelegate</string> +					<string key="superclassName">NSObject</string> +					<dictionary class="NSMutableDictionary" key="actions"> +						<string key="cancel:">id</string> +						<string key="remember:">id</string> +						<string key="send:">id</string> +					</dictionary> +					<dictionary class="NSMutableDictionary" key="actionInfosByName"> +						<object class="IBActionInfo" key="cancel:"> +							<string key="name">cancel:</string> +							<string key="candidateClassName">id</string> +						</object> +						<object class="IBActionInfo" key="remember:"> +							<string key="name">remember:</string> +							<string key="candidateClassName">id</string> +						</object> +						<object class="IBActionInfo" key="send:"> +							<string key="name">send:</string> +							<string key="candidateClassName">id</string> +						</object> +					</dictionary> +					<dictionary class="NSMutableDictionary" key="outlets"> +						<string key="crashText">NSTextField</string> +						<string key="rememberCheck">NSButton</string> +						<string key="window">NSWindow</string> +					</dictionary> +					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName"> +						<object class="IBToOneOutletInfo" key="crashText"> +							<string key="name">crashText</string> +							<string key="candidateClassName">NSTextField</string> +						</object> +						<object class="IBToOneOutletInfo" key="rememberCheck"> +							<string key="name">rememberCheck</string> +							<string key="candidateClassName">NSButton</string> +						</object> +						<object class="IBToOneOutletInfo" key="window"> +							<string key="name">window</string> +							<string key="candidateClassName">NSWindow</string> +						</object> +					</dictionary> +					<object class="IBClassDescriptionSource" key="sourceIdentifier"> +						<string key="majorKey">IBProjectSource</string> +						<string key="minorKey">./Classes/LLCrashLoggerMacDelegate.h</string> +					</object> +				</object> +				<object class="IBPartialClassDescription"> +					<string key="className">NSLayoutConstraint</string> +					<string key="superclassName">NSObject</string> +					<object class="IBClassDescriptionSource" key="sourceIdentifier"> +						<string key="majorKey">IBProjectSource</string> +						<string key="minorKey">./Classes/NSLayoutConstraint.h</string> +					</object> +				</object> +			</array> +		</object> +		<int key="IBDocument.localizationMode">0</int> +		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> +		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> +			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> +			<integer value="1070" key="NS.object.0"/> +		</object> +		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> +		<int key="IBDocument.defaultPropertyAccessControl">3</int> +		<dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> +			<string key="NSMenuCheckmark">{11, 11}</string> +			<string key="NSMenuMixedState">{10, 3}</string> +			<string key="NSSwitch">{15, 15}</string> +		</dictionary> +		<bool key="IBDocument.UseAutolayout">YES</bool> +	</data> +</archive> diff --git a/indra/mac_crash_logger/Info.plist b/indra/mac_crash_logger/Info.plist new file mode 100644 index 0000000000..2ebed11c3f --- /dev/null +++ b/indra/mac_crash_logger/Info.plist @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> +	<key>CFBundleDevelopmentRegion</key> +	<string>English</string> +	<key>CFBundleExecutable</key> +	<string>mac-crash-logger</string> +	<key>CFBundleGetInfoString</key> +	<string></string> +	<key>CFBundleIconFile</key> +	<string></string> +	<key>CFBundleInfoDictionaryVersion</key> +	<string>6.0</string> +	<key>CFBundlePackageType</key> +	<string>APPL</string> +	<key>CFBundleShortVersionString</key> +	<string></string> +	<key>CFBundleSignature</key> +	<string>????</string> +	<key>CFBundleVersion</key> +	<string>1.0.0</string> +	<key>NSMainNibFile</key> +	<string>CrashReporter</string> +	<key>NSPrincipalClass</key> +	<string>NSApplication</string> +</dict> +</plist> diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp new file mode 100644 index 0000000000..ec3616e26a --- /dev/null +++ b/indra/mac_crash_logger/llcrashloggermac.cpp @@ -0,0 +1,91 @@ +/**  + * @file llcrashloggermac.cpp + * @brief Mac OSX crash logger implementation + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + + +#include "llcrashloggermac.h" + +#include <iostream> + +#include "indra_constants.h"	// CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME +#include "llerror.h" +#include "llfile.h" +#include "lltimer.h" +#include "llstring.h" +#include "lldir.h" +#include "llsdserialize.h" + +// Windows Message Handlers + +BOOL gFirstDialog = TRUE;	 +LLFILE *gDebugFile = NULL; + +std::string gUserNotes = ""; +bool gSendReport = false; +bool gRememberChoice = false; + +LLCrashLoggerMac::LLCrashLoggerMac(void) +{ +} + +LLCrashLoggerMac::~LLCrashLoggerMac(void) +{ +} + +bool LLCrashLoggerMac::init(void) +{	 +	bool ok = LLCrashLogger::init(); +    return ok; +} + +void LLCrashLoggerMac::gatherPlatformSpecificFiles() +{ +} + +bool LLCrashLoggerMac::frame() +{ + +    if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND) +	{ +		gSendReport = true; +	} +	 +	if(gSendReport) +	{ +		setUserText(gUserNotes); +		sendCrashLogs(); +	}	 + +	LL_INFOS() << "Sending of logs complete" << LL_ENDL; +		 +	return true; +} + +bool LLCrashLoggerMac::cleanup() +{ +	commonCleanup(); +    mKeyMaster.releaseMaster(); +	return true; +} diff --git a/indra/mac_crash_logger/llcrashloggermac.h b/indra/mac_crash_logger/llcrashloggermac.h new file mode 100644 index 0000000000..05ef8c9f53 --- /dev/null +++ b/indra/mac_crash_logger/llcrashloggermac.h @@ -0,0 +1,45 @@ +/**  + * @file llcrashloggermac.h + * @brief Mac OSX crash logger definition + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LLCRASHLOGGERMAC_H +#define LLCRASHLOGGERMAC_H + +#include "linden_common.h" +#include "llcrashlogger.h" +#include "llstring.h" + +class LLCrashLoggerMac : public LLCrashLogger +{ +public: +	LLCrashLoggerMac(void); +	~LLCrashLoggerMac(void); +	virtual bool init(); +	virtual bool frame(); +	virtual bool cleanup(); +	virtual void gatherPlatformSpecificFiles(); +}; + +#endif diff --git a/indra/mac_crash_logger/llcrashloggermacdelegate.h b/indra/mac_crash_logger/llcrashloggermacdelegate.h new file mode 100644 index 0000000000..c998a8efe2 --- /dev/null +++ b/indra/mac_crash_logger/llcrashloggermacdelegate.h @@ -0,0 +1,52 @@ +/**  + * @file llcrashloggermacdelegate.h + * @brief Mac OSX crash logger implementation + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +/* +#import <Cocoa/Cocoa.h> + +@interface LLCrashLoggerMacDelegate : NSObject <NSApplicationDelegate> +{ +    IBOutlet NSTextField *crashText; +    IBOutlet NSButton *rememberCheck; +     +    NSWindow *_window; +    bool mRemember; + +} + +- (void)setWindow:(NSWindow *)newWindow; +- (NSWindow *)window; + +- (IBAction)remember:(id)sender; +- (IBAction)send:(id)sender; +- (IBAction)cancel:(id)sender; + +@property (assign) IBOutlet NSWindow *window; + +@end +*/ + + diff --git a/indra/mac_crash_logger/llcrashloggermacdelegate.mm b/indra/mac_crash_logger/llcrashloggermacdelegate.mm new file mode 100644 index 0000000000..b2af76a47c --- /dev/null +++ b/indra/mac_crash_logger/llcrashloggermacdelegate.mm @@ -0,0 +1,75 @@ +/**  + * @file llcrashloggermacdelegate.mm + * @brief Mac OSX crash logger implementation + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + + +/* +#import "llcrashloggermacdelegate.h" +#include <iostream> + +extern std::string gUserNotes; +extern bool gSendReport; +extern bool gRememberChoice; + +@implementation LLCrashLoggerMacDelegate + +- (void)setWindow:(NSWindow *)window +{ +    _window = window; +} + +- (NSWindow *)window +{ +    return _window; +} + +- (void)dealloc +{ +    [super dealloc]; +} + +std::string* NSToString( NSString *ns_str ) +{ +    return ( new std::string([ns_str UTF8String]) ); +} + +- (IBAction)remember:(id)sender +{ +    gRememberChoice = [rememberCheck state]; +} + +- (IBAction)send:(id)sender +{ +    std::string* user_input = NSToString([crashText stringValue]); +    gUserNotes = *user_input; +    gSendReport = true; +} + +- (IBAction)cancel:(id)sender +{ +    [ _window close]; +} +@end +*/
\ No newline at end of file diff --git a/indra/mac_crash_logger/mac_crash_logger.cpp b/indra/mac_crash_logger/mac_crash_logger.cpp new file mode 100644 index 0000000000..54e41a1954 --- /dev/null +++ b/indra/mac_crash_logger/mac_crash_logger.cpp @@ -0,0 +1,58 @@ +/**  + * @file mac_crash_logger.cpp + * @brief Mac OSX crash logger implementation + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "llcrashloggermac.h" +#include "indra_constants.h" +#include "llpidlock.h" + +#include <iostream> +     +int main(int argc, char **argv) +{ +	LLCrashLoggerMac app; +	app.parseCommandOptions(argc, argv); + +    LLSD options = LLApp::instance()->getOptionData( +                        LLApp::PRIORITY_COMMAND_LINE); +     +	if (! app.init()) +	{ +		LL_WARNS() << "Unable to initialize application." << LL_ENDL; +		return 1; +	} + +    if (app.getCrashBehavior() != CRASH_BEHAVIOR_ALWAYS_SEND) +    { +//        return NSApplicationMain(argc, (const char **)argv); +    } +	app.frame(); +	app.cleanup(); + +	LL_INFOS() << "Crash reporter finished normally." << LL_ENDL; +     +	return 0; +} diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp index 5d4a488e64..f7d35b33c2 100644 --- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp +++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp @@ -34,11 +34,6 @@  #include "llpluginmessageclasses.h"  #include "media_plugin_base.h" -#if defined(_MSC_VER) -#include <basetsd.h> -typedef SSIZE_T ssize_t; -#endif -  #include "vlc/vlc.h"  #include "vlc/libvlc_version.h" diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b6fb2dccba..fc8d8b805b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1829,27 +1829,28 @@ if (WINDOWS)        ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt        ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt        ${CMAKE_CURRENT_SOURCE_DIR}/featuretable_xp.txt +      ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll +      ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll +      ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll +      ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll        ${viewer_APPSETTINGS_FILES}        SLPlugin        media_plugin_cef        media_plugin_libvlc        media_plugin_example        winmm_shim +      windows-crash-logger        )      if (ADDRESS_SIZE EQUAL 64)          list(APPEND COPY_INPUT_DEPENDENCIES              ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk_x64.dll              ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp_x64.dll -           ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto-1_1-x64.dll -           ${ARCH_PREBUILT_DIRS_RELEASE}/libssl-1_1-x64.dll              )      else (ADDRESS_SIZE EQUAL 64)          list(APPEND COPY_INPUT_DEPENDENCIES              ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll              ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll -            ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto-1_1.dll -            ${ARCH_PREBUILT_DIRS_RELEASE}/libssl-1_1.dll              )      endif (ADDRESS_SIZE EQUAL 64) @@ -1905,6 +1906,7 @@ if (WINDOWS)      add_dependencies(${VIEWER_BINARY_NAME}        SLPlugin +      windows-crash-logger      )      # sets the 'working directory' for debugging from visual studio. @@ -2209,7 +2211,8 @@ if (DARWIN)        ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py      ) -  add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef) +  add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef mac-crash-logger) +  add_dependencies(${VIEWER_BINARY_NAME} mac-crash-logger)    if (ENABLE_SIGNING)        set(SIGNING_SETTING "--signature=${SIGNING_IDENTITY}") @@ -2252,7 +2255,62 @@ endif (INSTALL)  # Note that the conventional VIEWER_SYMBOL_FILE is set by ../../build.sh  if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIEWER_SYMBOL_FILE) -  if (BUGSPLAT_DB) +  if (NOT BUGSPLAT_DB) +    # Breakpad symbol-file generation +    set(SYMBOL_SEARCH_DIRS "") +    if (WINDOWS) +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") +      # slplugin.exe failing symbols dump - need to debug, might have to do with updated version of google breakpad +      # set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe") +      set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX}") +      set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}") +      set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest) +    endif (WINDOWS) +    if (DARWIN) +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") +      # *TODO: Generate these search dirs in the cmake files related to each binary. +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}") +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}") +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}") +      set(VIEWER_EXE_GLOBS "'${product}' SLPlugin mac-crash-logger") +      set(VIEWER_EXE_GLOBS "'${product}' mac-crash-logger") +      set(VIEWER_LIB_GLOB "*.dylib") +    endif (DARWIN) +    if (LINUX) +      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged") +      set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin") +      set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin") +      set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*") +      set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) +    endif (LINUX) + +    if(CMAKE_CFG_INTDIR STREQUAL ".") +        set(LLBUILD_CONFIG ${CMAKE_BUILD_TYPE}) +    else(CMAKE_CFG_INTDIR STREQUAL ".") +        # set LLBUILD_CONFIG to be a shell variable evaluated at build time +        # reflecting the configuration we are currently building. +        set(LLBUILD_CONFIG ${CMAKE_CFG_INTDIR}) +    endif(CMAKE_CFG_INTDIR STREQUAL ".") +    add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" +      COMMAND "${PYTHON_EXECUTABLE}" +      ARGS +        "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py" +        "${LLBUILD_CONFIG}" +        "${SYMBOL_SEARCH_DIRS}" +        "${VIEWER_EXE_GLOBS}" +        "${VIEWER_LIB_GLOB}" +        "${AUTOBUILD_INSTALL_DIR}/bin/dump_syms" +        "${VIEWER_SYMBOL_FILE}" +      DEPENDS generate_breakpad_symbols.py +          VERBATIM) + +    add_custom_target(generate_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" ${VIEWER_BINARY_NAME} "${VIEWER_COPY_MANIFEST}") +    add_dependencies(generate_symbols ${VIEWER_BINARY_NAME}) +    if (WINDOWS OR LINUX) +      add_dependencies(generate_symbols "${VIEWER_COPY_MANIFEST}") +    endif (WINDOWS OR LINUX) + +  else (NOT BUGSPLAT_DB)      # BugSplat symbol-file generation      if (WINDOWS)        # Just pack up a tarball containing only the .pdb file for the @@ -2336,7 +2394,7 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE      if (LINUX)        # TBD      endif (LINUX) -  endif (BUGSPLAT_DB) +  endif (NOT BUGSPLAT_DB)    # for both BUGSPLAT_DB and Breakpad    add_dependencies(llpackage generate_symbols) diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py new file mode 100755 index 0000000000..d351c406bc --- /dev/null +++ b/indra/newview/generate_breakpad_symbols.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python +"""\ +@file generate_breakpad_symbols.py +@author Brad Kittenbrink <brad@lindenlab.com> +@brief Simple tool for generating google_breakpad symbol information +       for the crash reporter. + +$LicenseInfo:firstyear=2010&license=viewerlgpl$ +Second Life Viewer Source Code +Copyright (C) 2010-2011, Linden Research, Inc. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; +version 2.1 of the License only. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + +Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +$/LicenseInfo$ +""" + + +import collections +import fnmatch +import itertools +import os +import re +import sys +import shlex +import subprocess +import tarfile +import StringIO +import pprint + +DEBUG=False + +def usage(): +    print >>sys.stderr, "usage: %s search_dirs viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0] + +class MissingModuleError(Exception): +    def __init__(self, modules): +        Exception.__init__(self, "Failed to find required modules: %r" % modules) +        self.modules = modules + +def main(configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file): +    print "generate_breakpad_symbols run with args: %s" % str((configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file)) + +    if not re.match("release", configuration, re.IGNORECASE): +        print "skipping breakpad symbol generation for non-release build." +        return 0 + +    # split up list of viewer_exes +    # "'Second Life' SLPlugin" becomes ['Second Life', 'SLPlugin'] +    viewer_exes = shlex.split(viewer_exes) + +    found_required = dict([(module, False) for module in viewer_exes]) + +    def matches(f): +        if f in viewer_exes: +            found_required[f] = True +            return True +        return fnmatch.fnmatch(f, libs_suffix) + +    search_dirs = search_dirs.split(";") + +    def list_files(): +        for search_dir in search_dirs: +            for (dirname, subdirs, filenames) in os.walk(search_dir): +                if DEBUG: +                    print "scanning '%s' for modules..." % dirname +                for f in itertools.ifilter(matches, filenames): +                    yield os.path.join(dirname, f) + +    def dump_module(m): +        print "dumping module '%s' with '%s'..." % (m, dump_syms_tool) +        dsym_full_path = m +        child = subprocess.Popen([dump_syms_tool, dsym_full_path] , stdout=subprocess.PIPE) +        out, err = child.communicate() +        return (m,child.returncode, out, err) + +     +    modules = {} +         +    for m in list_files(): +        if DEBUG: +            print "examining module '%s' ... " % m, +        filename=os.path.basename(m) +        if -1 != m.find("DWARF"): +            # Just use this module; it has the symbols we want. +            modules[filename] = m +            if DEBUG: +                print "found dSYM entry" +        elif filename not in modules: +            # Only use this if we don't already have a (possibly better) entry. +            modules[filename] = m +            if DEBUG: +                print "found new entry" +        elif DEBUG: +            print "ignoring entry" + + +    print "Found these following modules:" +    pprint.pprint( modules ) + +    out = tarfile.open(viewer_symbol_file, 'w:bz2') +    for (filename,status,symbols,err) in itertools.imap(dump_module, modules.values()): +        if status == 0: +            module_line = symbols[:symbols.index('\n')] +            module_line = module_line.split() +            hash_id = module_line[3] +            module = ' '.join(module_line[4:]) +            if sys.platform in ['win32', 'cygwin']: +                mod_name = module[:module.rindex('.pdb')] +            else: +                mod_name = module +            symbolfile = StringIO.StringIO(symbols) +            info = tarfile.TarInfo("%(module)s/%(hash_id)s/%(mod_name)s.sym" % dict(module=module, hash_id=hash_id, mod_name=mod_name)) +            info.size = symbolfile.len +            out.addfile(info, symbolfile) +        else: +            print >>sys.stderr, "warning: failed to dump symbols for '%s': %s" % (filename, err) + +    out.close() + +    missing_modules = [m for (m,_) in +        itertools.ifilter(lambda (k,v): not v, found_required.iteritems()) +    ] +    if missing_modules: +        print >> sys.stderr, "failed to generate %s" % viewer_symbol_file +        os.remove(viewer_symbol_file) +        raise MissingModuleError(missing_modules) + +    symbols = tarfile.open(viewer_symbol_file, 'r:bz2') +    tarfile_members = symbols.getnames() +    symbols.close() + +    for required_module in viewer_exes: +        def match_module_basename(m): +            return os.path.splitext(required_module)[0].lower() \ +                   == os.path.splitext(os.path.basename(m))[0].lower() +        # there must be at least one .sym file in tarfile_members that matches +        # each required module (ignoring file extensions) +        if not any(itertools.imap(match_module_basename, tarfile_members)): +            print >> sys.stderr, "failed to find required %s in generated %s" \ +                    % (required_module, viewer_symbol_file) +            os.remove(viewer_symbol_file) +            raise MissingModuleError([required_module]) + +    print "successfully generated %s including required modules '%s'" % (viewer_symbol_file, viewer_exes) + +    return 0 + +if __name__ == "__main__": +    if len(sys.argv) != 7: +        usage() +        sys.exit(1) +    sys.exit(main(*sys.argv[1:])) + diff --git a/indra/newview/installers/darwin/apple-notarize.sh b/indra/newview/installers/darwin/apple-notarize.sh deleted file mode 100755 index b953af81af..0000000000 --- a/indra/newview/installers/darwin/apple-notarize.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh -CONFIG_FILE="$build_secrets_checkout/code-signing-osx/notarize_creds.sh" -if [ -f "$CONFIG_FILE" ]; then -    source $CONFIG_FILE -    app_file="$1" -    zip_file=${app_file/app/zip} -    ditto -c -k --keepParent "$app_file" "$zip_file" -    if [ -f "$zip_file" ]; then -        requestUUID=$(xcrun altool --notarize-app --primary-bundle-id "com.secondlife.viewer" \ -                                --username $USERNAME \ -                                --password $PASSWORD \ -                                --asc-provider $ASC_PROVIDER \ -                                --file "$zip_file" 2>&1 \ -                    | awk '/RequestUUID/ { print $NF; }') - -        echo "Apple Notarization RequestUUID: $requestUUID" - -        if [[ -n $requestUUID ]]; then -            status="in progress" -            while [[ "$status" == "in progress" ]]; do -                sleep 30 -                status=$(xcrun altool --notarization-info "$requestUUID" \ -                                            --username $USERNAME \ -                                            --password $PASSWORD 2>&1 \ -                                | awk -F ': ' '/Status:/ { print $2; }' ) -                echo "$status" -            done -            # log results -            xcrun altool --notarization-info "$requestUUID" \ -                        --username $USERNAME \ -                        --password $PASSWORD - -            #remove temporary file -            rm "$zip_file" - -            if [["$status" == "success"]]; then -                xcrun stapler staple "$app_file" -            elif [["$status" == "invalid"]]; then -                exit 1 -            fi -        fi -    fi -fi - diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 66a33ed6ae..053c0a5ab7 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -738,7 +738,7 @@ LLAppViewer::LLAppViewer()  	std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, "");  #endif // ! LL_BUGSPLAT  	mDumpPath = logdir; - +	setMiniDumpDir(logdir);  	setDebugFileNames(logdir);  } diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index e9c467bd01..5ceb540784 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -108,6 +108,7 @@ public:  	virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism.  	                                     // return false if the error trap needed restoration. +	virtual void initCrashReporting(bool reportFreeze = false) = 0; // What to do with crash report?  	static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon.      void checkForCrash(); diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 862e2b45df..662164af2d 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -240,7 +240,17 @@ LLAppViewerMacOSX::~LLAppViewerMacOSX()  bool LLAppViewerMacOSX::init()  { -    return LLAppViewer::init(); +	bool success = LLAppViewer::init(); +     +#if LL_SEND_CRASH_REPORTS +    if (success) +    { +        LLAppViewer* pApp = LLAppViewer::instance(); +        pApp->initCrashReporting(); +    } +#endif +     +    return success;  }  // MacOSX may add and addition command line arguement for the process serial number. @@ -357,6 +367,21 @@ bool LLAppViewerMacOSX::restoreErrorTrap()  	return reset_count == 0;  } +void LLAppViewerMacOSX::initCrashReporting(bool reportFreeze) +{ +	std::string command_str = "mac-crash-logger.app"; +     +    std::stringstream pid_str; +    pid_str <<  LLApp::getPid(); +    std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, ""); +    std::string appname = gDirUtilp->getExecutableFilename(); +    std::string str[] = { "-pid", pid_str.str(), "-dumpdir", logdir, "-procname", appname.c_str() }; +    std::vector< std::string > args( str, str + ( sizeof ( str ) /  sizeof ( std::string ) ) ); +    LL_WARNS() << "about to launch mac-crash-logger" << pid_str.str() +               << " " << logdir << " " << appname << LL_ENDL; +    launchApplication(&command_str, &args); +} +  std::string LLAppViewerMacOSX::generateSerialNumber()  {  	char serial_md5[MD5HEX_STR_SIZE];		// Flawfinder: ignore diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h index b0e325a955..d5a80864be 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -44,6 +44,7 @@ public:  protected:  	virtual bool restoreErrorTrap(); +	virtual void initCrashReporting(bool reportFreeze);  	std::string generateSerialNumber();  	virtual bool initParseCommandLine(LLCommandLineParser& clp); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index f0bede5321..9b1c0d1f8b 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -603,6 +603,9 @@ bool LLAppViewerWin32::init()  #if ! defined(LL_BUGSPLAT)  #pragma message("Building without BugSplat") +	LLAppViewer* pApp = LLAppViewer::instance(); +	pApp->initCrashReporting(); +  #else // LL_BUGSPLAT  #pragma message("Building with BugSplat") @@ -814,6 +817,57 @@ bool LLAppViewerWin32::restoreErrorTrap()  	//return LLWinDebug::checkExceptionHandler();  } +void LLAppViewerWin32::initCrashReporting(bool reportFreeze) +{ +	if (isSecondInstance()) return; //BUG-5707 do not start another crash reporter for second instance. + +	const char* logger_name = "win_crash_logger.exe"; +	std::string exe_path = gDirUtilp->getExecutableDir(); +	exe_path += gDirUtilp->getDirDelimiter(); +	exe_path += logger_name; + +    std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, ""); +    std::string appname = gDirUtilp->getExecutableFilename(); + +	S32 slen = logdir.length() -1; +	S32 end = slen; +	while (logdir.at(end) == '/' || logdir.at(end) == '\\') end--; +	 +	if (slen !=end) +	{ +		logdir = logdir.substr(0,end+1); +	} +	//std::string arg_str = "\"" + exe_path + "\" -dumpdir \"" + logdir + "\" -procname \"" + appname + "\" -pid " + stringize(LLApp::getPid()); +	//_spawnl(_P_NOWAIT, exe_path.c_str(), arg_str.c_str(), NULL); +	std::string arg_str =  "\"" + exe_path + "\" -dumpdir \"" + logdir + "\" -procname \"" + appname + "\" -pid " + stringize(LLApp::getPid());  + +	STARTUPINFO startInfo={sizeof(startInfo)}; +	PROCESS_INFORMATION processInfo; + +	std::wstring exe_wstr; +	exe_wstr = utf8str_to_utf16str(exe_path); + +	std::wstring arg_wstr; +	arg_wstr = utf8str_to_utf16str(arg_str); + +	LL_INFOS("CrashReport") << "Creating crash reporter process " << exe_path << " with params: " << arg_str << LL_ENDL; +    if(CreateProcess(exe_wstr.c_str(),      +                     &arg_wstr[0],                 // Application arguments +                     0, +                     0, +                     FALSE, +                     CREATE_DEFAULT_ERROR_MODE, +                     0, +                     0,                              // Working directory +                     &startInfo, +                     &processInfo) == FALSE) +      // Could not start application -> call 'GetLastError()' +	{ +        LL_WARNS("CrashReport") << "CreateProcess failed " << GetLastError() << LL_ENDL; +        return; +    } +} +  //virtual  bool LLAppViewerWin32::sendURLToOtherInstance(const std::string& url)  { diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 2699224e58..c5fae6a3a3 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -51,6 +51,7 @@ protected:  	virtual bool beingDebugged();  	virtual bool restoreErrorTrap(); +	virtual void initCrashReporting(bool reportFreeze);   	virtual bool sendURLToOtherInstance(const std::string& url); diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h index 1e6f2154bc..14059f828a 100644 --- a/indra/newview/llsecapi.h +++ b/indra/newview/llsecapi.h @@ -452,7 +452,7 @@ public:  	virtual LLPointer<LLCertificate> getCertificate(X509* openssl_cert)=0;  	// instantiate a chain from an X509_STORE_CTX -	virtual LLPointer<LLCertificateChain> getCertificateChain(X509_STORE_CTX* chain)=0; +	virtual LLPointer<LLCertificateChain> getCertificateChain(const X509_STORE_CTX* chain)=0;  	// instantiate a cert store given it's id.  if a persisted version  	// exists, it'll be loaded.  If not, one will be created (but not diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 94331fddfa..737ef30ada 100644 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -95,7 +95,7 @@ LLBasicCertificate::LLBasicCertificate(const std::string& pem_cert,  LLBasicCertificate::LLBasicCertificate(X509* pCert,                                         const LLSD* validation_params)   { -	if (!pCert) +	if (!pCert || !pCert->cert_info)  	{  		LLTHROW(LLInvalidCertificate(LLSD::emptyMap()));  	}	 @@ -355,8 +355,8 @@ LLSD cert_name_from_X509_NAME(X509_NAME* name)  		char buffer[32];  		X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, entry_index); -		std::string name_value = std::string((const char*)ASN1_STRING_data(X509_NAME_ENTRY_get_data(entry)),  -											 ASN1_STRING_length(X509_NAME_ENTRY_get_data(entry))); +		std::string name_value = std::string((const char*)M_ASN1_STRING_data(X509_NAME_ENTRY_get_data(entry)),  +											 M_ASN1_STRING_length(X509_NAME_ENTRY_get_data(entry)));  		ASN1_OBJECT* name_obj = X509_NAME_ENTRY_get_object(entry);		  		OBJ_obj2txt(buffer, sizeof(buffer), name_obj, 0); @@ -683,29 +683,29 @@ std::string LLBasicCertificateStore::storeId() const  // LLBasicCertificateChain  // This class represents a chain of certs, each cert being signed by the next cert  // in the chain.  Certs must be properly signed by the parent -LLBasicCertificateChain::LLBasicCertificateChain(X509_STORE_CTX* store) +LLBasicCertificateChain::LLBasicCertificateChain(const X509_STORE_CTX* store)  {  	// we're passed in a context, which contains a cert, and a blob of untrusted  	// certificates which compose the chain. -	if((store == NULL) || X509_STORE_CTX_get0_cert(store) == NULL) +	if((store == NULL) || (store->cert == NULL))  	{  		LL_WARNS("SECAPI") << "An invalid store context was passed in when trying to create a certificate chain" << LL_ENDL;  		return;  	}  	// grab the child cert -	LLPointer<LLCertificate> current = new LLBasicCertificate(X509_STORE_CTX_get0_cert(store)); +	LLPointer<LLCertificate> current = new LLBasicCertificate(store->cert);  	add(current); -	if(X509_STORE_CTX_get0_untrusted(store) != NULL) +	if(store->untrusted != NULL)  	{  		// if there are other certs in the chain, we build up a vector  		// of untrusted certs so we can search for the parents of each  		// consecutive cert.  		LLBasicCertificateVector untrusted_certs; -		for(int i = 0; i < sk_X509_num(X509_STORE_CTX_get0_untrusted(store)); i++) +		for(int i = 0; i < sk_X509_num(store->untrusted); i++)  		{ -			LLPointer<LLCertificate> cert = new LLBasicCertificate(sk_X509_value(X509_STORE_CTX_get0_untrusted(store), i)); +			LLPointer<LLCertificate> cert = new LLBasicCertificate(sk_X509_value(store->untrusted, i));  			untrusted_certs.add(cert);  		}		 @@ -1340,10 +1340,9 @@ void LLSecAPIBasicHandler::_readProtectedData()  		// read in the rest of the file. -		EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); -        // todo: ctx error handling - -		EVP_DecryptInit(ctx, EVP_rc4(), salt, NULL); +		EVP_CIPHER_CTX ctx; +		EVP_CIPHER_CTX_init(&ctx); +		EVP_DecryptInit(&ctx, EVP_rc4(), salt, NULL);  		// allocate memory:  		std::string decrypted_data;	 @@ -1351,14 +1350,14 @@ void LLSecAPIBasicHandler::_readProtectedData()  			// read data as a block:  			protected_data_stream.read((char *)buffer, BUFFER_READ_SIZE); -			EVP_DecryptUpdate(ctx, decrypted_buffer, &decrypted_length,  +			EVP_DecryptUpdate(&ctx, decrypted_buffer, &decrypted_length,   							  buffer, protected_data_stream.gcount());  			decrypted_data.append((const char *)decrypted_buffer, protected_data_stream.gcount());  		}  		// RC4 is a stream cipher, so we don't bother to EVP_DecryptFinal, as there is  		// no block padding. -        EVP_CIPHER_CTX_free(ctx); +		EVP_CIPHER_CTX_cleanup(&ctx);  		std::istringstream parse_stream(decrypted_data);  		if (parser->parse(parse_stream, mProtectedDataMap,   						  LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) @@ -1394,14 +1393,12 @@ void LLSecAPIBasicHandler::_writeProtectedData()  	llofstream protected_data_stream(tmp_filename.c_str(),                                        std::ios_base::binary); -    EVP_CIPHER_CTX *ctx = NULL;  	try  	{ -		ctx = EVP_CIPHER_CTX_new(); -        // todo: ctx error handling - -		EVP_EncryptInit(ctx, EVP_rc4(), salt, NULL); +		EVP_CIPHER_CTX ctx; +		EVP_CIPHER_CTX_init(&ctx); +		EVP_EncryptInit(&ctx, EVP_rc4(), salt, NULL);  		unsigned char unique_id[MAC_ADDRESS_BYTES];          LLMachineID::getUniqueID(unique_id, sizeof(unique_id));  		LLXORCipher cipher(unique_id, sizeof(unique_id)); @@ -1416,13 +1413,13 @@ void LLSecAPIBasicHandler::_writeProtectedData()  				break;  			}  			int encrypted_length; -			EVP_EncryptUpdate(ctx, encrypted_buffer, &encrypted_length,  +			EVP_EncryptUpdate(&ctx, encrypted_buffer, &encrypted_length,   						  buffer, formatted_data_istream.gcount());  			protected_data_stream.write((const char *)encrypted_buffer, encrypted_length);  		}  		// no EVP_EncrypteFinal, as this is a stream cipher -        EVP_CIPHER_CTX_free(ctx); +		EVP_CIPHER_CTX_cleanup(&ctx);  		protected_data_stream.close();  	} @@ -1434,11 +1431,6 @@ void LLSecAPIBasicHandler::_writeProtectedData()  		// it may be, however.  		LLFile::remove(tmp_filename); -        if (ctx) -        { -            EVP_CIPHER_CTX_free(ctx); -        } -  		// EXP-1825 crash in LLSecAPIBasicHandler::_writeProtectedData()  		// Decided throwing an exception here was overkill until we figure out why this happens  		//LLTHROW(LLProtectedDataException("Error writing Protected Data Store")); @@ -1491,7 +1483,7 @@ LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(X509* openssl_cert  }  // instantiate a chain from an X509_STORE_CTX -LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(X509_STORE_CTX* chain) +LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain)  {  	LLPointer<LLCertificateChain> result = new LLBasicCertificateChain(chain);  	return result; diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h index 82670f9083..0bc7f5230f 100644 --- a/indra/newview/llsechandler_basic.h +++ b/indra/newview/llsechandler_basic.h @@ -197,7 +197,7 @@ class LLBasicCertificateChain : virtual public LLBasicCertificateVector, public  {  public: -	LLBasicCertificateChain(X509_STORE_CTX * store); +	LLBasicCertificateChain(const X509_STORE_CTX * store);  	virtual ~LLBasicCertificateChain() {} @@ -241,7 +241,7 @@ public:  	virtual LLPointer<LLCertificate> getCertificate(X509* openssl_cert);  	// instantiate a chain from an X509_STORE_CTX -	virtual LLPointer<LLCertificateChain> getCertificateChain(X509_STORE_CTX* chain); +	virtual LLPointer<LLCertificateChain> getCertificateChain(const X509_STORE_CTX* chain);  	// instantiate a cert store given it's id.  if a persisted version  	// exists, it'll be loaded.  If not, one will be created (but not diff --git a/indra/newview/tests/llsecapi_test.cpp b/indra/newview/tests/llsecapi_test.cpp index 37fbbb449b..caa3016d2e 100644 --- a/indra/newview/tests/llsecapi_test.cpp +++ b/indra/newview/tests/llsecapi_test.cpp @@ -57,7 +57,7 @@ void LLSecAPIBasicHandler::init() {}  LLSecAPIBasicHandler::~LLSecAPIBasicHandler() {}  LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(const std::string& pem_cert) { return NULL; }  LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(X509* openssl_cert) { return NULL; } -LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(X509_STORE_CTX* chain) { return NULL; } +LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain) { return NULL; }  LLPointer<LLCertificateStore> LLSecAPIBasicHandler::getCertificateStore(const std::string& store_id) { return NULL; }  void LLSecAPIBasicHandler::setProtectedData(const std::string& data_type, const std::string& data_id, const LLSD& data) {}  void LLSecAPIBasicHandler::addToProtectedMap(const std::string& data_type, const std::string& data_id, const std::string& map_elem, const LLSD& data) {} diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp index 4c8d6c51b0..e5d226a2a4 100644 --- a/indra/newview/tests/llsechandler_basic_test.cpp +++ b/indra/newview/tests/llsechandler_basic_test.cpp @@ -1217,8 +1217,8 @@ namespace tut  		// Single cert in the chain.  		X509_STORE_CTX *test_store = X509_STORE_CTX_new(); -        X509_STORE_CTX_set_cert(test_store, mX509ChildCert); -        X509_STORE_CTX_set0_untrusted(test_store, NULL); +		test_store->cert = mX509ChildCert;		 +		test_store->untrusted = NULL;  		test_chain = new LLBasicCertificateChain(test_store);  		X509_STORE_CTX_free(test_store);  		ensure_equals("two elements in store", test_chain->size(), 1);		 @@ -1229,9 +1229,9 @@ namespace tut  		// cert + CA  		test_store = X509_STORE_CTX_new(); -        X509_STORE_CTX_set_cert(test_store, mX509ChildCert); -        X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); -		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert); +		test_store->cert = mX509ChildCert; +		test_store->untrusted = sk_X509_new_null(); +		sk_X509_push(test_store->untrusted, mX509IntermediateCert);  		test_chain = new LLBasicCertificateChain(test_store);  		X509_STORE_CTX_free(test_store);  		ensure_equals("two elements in store", test_chain->size(), 2);	 @@ -1245,9 +1245,9 @@ namespace tut  		// cert + nonrelated  		test_store = X509_STORE_CTX_new(); -        X509_STORE_CTX_set_cert(test_store, mX509ChildCert); -        X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); -		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509TestCert); +		test_store->cert = mX509ChildCert; +		test_store->untrusted = sk_X509_new_null(); +		sk_X509_push(test_store->untrusted, mX509TestCert);  		test_chain = new LLBasicCertificateChain(test_store);  		X509_STORE_CTX_free(test_store);  		ensure_equals("two elements in store", test_chain->size(), 1);	 @@ -1257,10 +1257,10 @@ namespace tut  		// cert + CA + nonrelated  		test_store = X509_STORE_CTX_new(); -        X509_STORE_CTX_set_cert(test_store, mX509ChildCert); -        X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); -		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert); -		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509TestCert); +		test_store->cert = mX509ChildCert; +		test_store->untrusted = sk_X509_new_null(); +		sk_X509_push(test_store->untrusted, mX509IntermediateCert); +		sk_X509_push(test_store->untrusted, mX509TestCert);  		test_chain = new LLBasicCertificateChain(test_store);  		X509_STORE_CTX_free(test_store);  		ensure_equals("two elements in store", test_chain->size(), 2);	 @@ -1273,10 +1273,10 @@ namespace tut  		// cert + intermediate + CA   		test_store = X509_STORE_CTX_new(); -        X509_STORE_CTX_set_cert(test_store, mX509ChildCert); -        X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); -		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert); -		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509RootCert); +		test_store->cert = mX509ChildCert; +		test_store->untrusted = sk_X509_new_null(); +		sk_X509_push(test_store->untrusted, mX509IntermediateCert); +		sk_X509_push(test_store->untrusted, mX509RootCert);  		test_chain = new LLBasicCertificateChain(test_store);  		X509_STORE_CTX_free(test_store);  		ensure_equals("three elements in store", test_chain->size(), 3);	 diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index c0a0a7ec46..adac7af712 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -553,13 +553,9 @@ class WindowsManifest(ViewerManifest):                  self.path("vivoxsdk.dll")                  self.path("ortp.dll") -            # OpenSSL -            if (self.address_size == 64): -                self.path("libcrypto-1_1-x64.dll") -                self.path("libssl-1_1-x64.dll") -            else: -                self.path("libcrypto-1_1.dll") -                self.path("libssl-1_1.dll") +            # Security +            self.path("ssleay32.dll") +            self.path("libeay32.dll")              # HTTP/2              self.path("nghttp2.dll") @@ -687,6 +683,11 @@ class WindowsManifest(ViewerManifest):                  self.path("libvlccore.dll")                  self.path("plugins/") +        # pull in the crash logger from other projects +        # tag:"crash-logger" here as a cue to the exporter +        self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'], +                  dst="win_crash_logger.exe") +          if not self.is_packaging_viewer():              self.package_file = "copied_deps"     @@ -1031,6 +1032,7 @@ class DarwinManifest(ViewerManifest):                                  "libapr-1.0.dylib",                                  "libaprutil-1.0.dylib",                                  "libexpat.1.dylib", +                                "libexception_handler.dylib",                                  "libGLOD.dylib",                                  # libnghttp2.dylib is a symlink to                                  # libnghttp2.major.dylib, which is a symlink to @@ -1066,15 +1068,21 @@ class DarwinManifest(ViewerManifest):                  # our apps                  executable_path = {} -                self.path2basename(os.path.join(os.pardir, os.path.join("llplugin", "slplugin"), self.args['configuration']), "SLPlugin.app") -                executable_path["SLPlugin.app"] = \ -                    self.dst_path_of(os.path.join("SLPlugin.app", "Contents", "MacOS")) - -                # our apps dependencies on shared libs -                # for each app, for each dylib we collected in dylibs, -                # create a symlink to the real copy of the dylib. -                with self.prefix(dst=os.path.join("SLPlugin.app", "Contents", "Resources")): -                    for libfile in dylibs: +                for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"), +                                         # plugin launcher +                                         (os.path.join("llplugin", "slplugin"), "SLPlugin.app"), +                                         ): +                    self.path2basename(os.path.join(os.pardir, +                                                    app_bld_dir, self.args['configuration']), +                                       app) +                    executable_path[app] = \ +                        self.dst_path_of(os.path.join(app, "Contents", "MacOS")) + +                    # our apps dependencies on shared libs +                    # for each app, for each dylib we collected in dylibs, +                    # create a symlink to the real copy of the dylib. +                    with self.prefix(dst=os.path.join(app, "Contents", "Resources")): +                        for libfile in dylibs:                              self.relsymlinkf(os.path.join(libfile_parent, libfile))                  # Dullahan helper apps go inside SLPlugin.app @@ -1295,19 +1303,14 @@ class DarwinManifest(ViewerManifest):                      signed=False                      sign_attempts=3                      sign_retry_wait=15 -                    libvlc_path = app_in_dmg + "/Contents/Resources/llplugin/media_plugin_libvlc.dylib" -                    cef_path = app_in_dmg + "/Contents/Resources/llplugin/media_plugin_cef.dylib" -                    slplugin_path = app_in_dmg + "/Contents/Resources/SLPlugin.app/Contents/MacOS/SLPlugin" -                    greenlet_path = app_in_dmg + "/Contents/Resources/updater/greenlet/_greenlet.so"                      while (not signed) and (sign_attempts > 0):                          try: -                            sign_attempts-=1 -                            # Note: See blurb above about names of keychains -                            self.run_command(['codesign', '--force', '--timestamp','--keychain', viewer_keychain, '--sign', identity, libvlc_path]) -                            self.run_command(['codesign', '--force', '--timestamp', '--keychain', viewer_keychain, '--sign', identity, cef_path]) -                            self.run_command(['codesign', '--force', '--timestamp', '--keychain', viewer_keychain, '--sign', identity, greenlet_path]) -                            self.run_command(['codesign', '--verbose', '--deep', '--force', '--options', 'runtime', '--keychain', viewer_keychain, '--sign', identity, slplugin_path]) -                            self.run_command(['codesign', '--verbose', '--deep', '--force', '--options', 'runtime', '--keychain', viewer_keychain, '--sign', identity, app_in_dmg]) +                            sign_attempts-=1; +                            self.run_command( +                                # Note: See blurb above about names of keychains +                               ['codesign', '--verbose', '--deep', '--force', +                                '--keychain', viewer_keychain, '--sign', identity, +                                app_in_dmg])                              signed=True # if no exception was raised, the codesign worked                          except ManifestError as err:                              if sign_attempts: @@ -1318,7 +1321,6 @@ class DarwinManifest(ViewerManifest):                                  print >> sys.stderr, "Maximum codesign attempts exceeded; giving up"                                  raise                      self.run_command(['spctl', '-a', '-texec', '-vvvv', app_in_dmg]) -                    self.run_command([self.src_path_of("installers/darwin/apple-notarize.sh"), app_in_dmg])          finally:              # Unmount the image even if exceptions from any of the above  @@ -1371,7 +1373,7 @@ class LinuxManifest(ViewerManifest):          with self.prefix(dst="bin"):              self.path("secondlife-bin","do-not-directly-run-secondlife-bin")              self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") -            self.path2basename("../llplugin/slplugin", "SLPlugin") +            self.path2basename("../llplugin/slplugin", "SLPlugin")               #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323              with self.prefix(src="../viewer_components/manager", dst=""):                  self.path("*.py") diff --git a/indra/win_crash_logger/CMakeLists.txt b/indra/win_crash_logger/CMakeLists.txt new file mode 100644 index 0000000000..86aa655f03 --- /dev/null +++ b/indra/win_crash_logger/CMakeLists.txt @@ -0,0 +1,105 @@ +# -*- cmake -*- + +project(win_crash_logger) + +include(00-Common) +include(LLCommon) +include(LLCoreHttp) +include(LLCrashLogger) +include(LLMath) +include(LLMessage) +include(LLVFS) +include(LLWindow) +include(LLXML) +include(Linking) +include(LLSharedLibs) +include(GoogleBreakpad) +include(Boost) + +include_directories( +    ${LLCOREHTTP_INCLUDE_DIRS} +    ${LLCOMMON_INCLUDE_DIRS} +    ${LLCRASHLOGGER_INCLUDE_DIRS} +    ${LLMATH_INCLUDE_DIRS} +    ${LLWINDOW_INCLUDE_DIRS} +    ${LLXML_INCLUDE_DIRS} +    ${LLVFS_INCLUDE_DIRS} +    ${BREAKPAD_INCLUDE_DIRECTORIES} +    ) +include_directories(SYSTEM +    ${LLCOMMON_SYSTEM_INCLUDE_DIRS} +    ${LLXML_SYSTEM_INCLUDE_DIRS} +    ) + +set(win_crash_logger_SOURCE_FILES +    win_crash_logger.cpp +    llcrashloggerwindows.cpp +    ) + +set(win_crash_logger_HEADER_FILES +    CMakeLists.txt + +    llcrashloggerwindows.h +    resource.h +    StdAfx.h +    win_crash_logger.h +    ) + +set_source_files_properties(${win_crash_logger_HEADER_FILES} +                            PROPERTIES HEADER_FILE_ONLY TRUE) + +set(win_crash_logger_RESOURCE_FILES +    ll_icon.ico +    ) + +set_source_files_properties(${win_crash_logger_RESOURCE_FILES} +                            PROPERTIES HEADER_FILE_ONLY TRUE) + +set(win_crash_logger_RESOURCE_FILES  +    win_crash_logger.rc +    ${win_crash_logger_RESOURCE_FILES} +    ) + +SOURCE_GROUP("Resource Files" FILES ${win_crash_logger_RESOURCE_FILES}) + +list(APPEND  +    win_crash_logger_SOURCE_FILES  +    ${win_crash_logger_HEADER_FILES}  +    ${win_crash_logger_RESOURCE_FILES} +    ) + +add_executable(windows-crash-logger WIN32 ${win_crash_logger_SOURCE_FILES}) + + +target_link_libraries(windows-crash-logger +    ${LEGACY_STDIO_LIBS} +    ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES} +    ${LLCRASHLOGGER_LIBRARIES} +    ${LLWINDOW_LIBRARIES} +    ${LLVFS_LIBRARIES} +    ${LLXML_LIBRARIES} +    ${LLMESSAGE_LIBRARIES} +    ${LLMATH_LIBRARIES} +    ${LLCOREHTTP_LIBRARIES} +    ${LLCOMMON_LIBRARIES} +    ${BOOST_CONTEXT_LIBRARY} +    ${BOOST_FIBER_LIBRARY} +    ${WINDOWS_LIBRARIES} +    dxguid +    ${GOOGLE_PERFTOOLS_LIBRARIES} +    user32 +    gdi32 +    oleaut32 +    wininet +    Wldap32 +    ) +     +if (WINDOWS) +    set_target_properties(windows-crash-logger +        PROPERTIES  +        LINK_FLAGS "/NODEFAULTLIB:LIBCMT" +        LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" +        ) +endif (WINDOWS) + +ll_deploy_sharedlibs_command(windows-crash-logger) diff --git a/indra/win_crash_logger/StdAfx.cpp b/indra/win_crash_logger/StdAfx.cpp new file mode 100644 index 0000000000..f56711af73 --- /dev/null +++ b/indra/win_crash_logger/StdAfx.cpp @@ -0,0 +1,34 @@ +/**  + * @file StdAfx.cpp + * @brief windows crash logger source file for includes + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +// stdafx.cpp : source file that includes just the standard includes +//	win_crash_logger.pch will be the pre-compiled header +//	stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/indra/win_crash_logger/StdAfx.h b/indra/win_crash_logger/StdAfx.h new file mode 100644 index 0000000000..35976658ac --- /dev/null +++ b/indra/win_crash_logger/StdAfx.h @@ -0,0 +1,56 @@ +/**  + * @file StdAfx.h + * @brief standard system includes + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +// stdafx.h : include file for standard system include files, +//  or project specific include files that are used frequently, but +//      are changed infrequently +// + +#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) +#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers + +// Windows Header Files: +#include <windows.h> + +// C RunTime Header Files +#include <stdlib.h> +#include <malloc.h> +#include <memory.h> + +// Local Header Files + +// TODO: reference additional headers your program requires here + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) diff --git a/indra/win_crash_logger/ll_icon.ico b/indra/win_crash_logger/ll_icon.ico Binary files differnew file mode 100644 index 0000000000..566346dfe3 --- /dev/null +++ b/indra/win_crash_logger/ll_icon.ico diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp new file mode 100644 index 0000000000..267224a79b --- /dev/null +++ b/indra/win_crash_logger/llcrashloggerwindows.cpp @@ -0,0 +1,536 @@ +/**  +* @file llcrashloggerwindows.cpp +* @brief Windows crash logger implementation +* +* $LicenseInfo:firstyear=2003&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2010, Linden Research, Inc. +*  +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +*  +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +*  +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +*  +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#include "linden_common.h" + +#include "stdafx.h" +#include "resource.h" +#include "llcrashloggerwindows.h" + +#include <sstream> + +#include "boost/tokenizer.hpp" + +#include "indra_constants.h"	// CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME +#include "llerror.h" +#include "llfile.h" +#include "lltimer.h" +#include "llstring.h" +#include "lldxhardware.h" +#include "lldir.h" +#include "llsdserialize.h" +#include "llsdutil.h" +#include "stringize.h" + +#include <client/windows/crash_generation/crash_generation_server.h> +#include <client/windows/crash_generation/client_info.h> + +#define MAX_LOADSTRING 100 +#define MAX_STRING 2048 +const char* const SETTINGS_FILE_HEADER = "version"; +const S32 SETTINGS_FILE_VERSION = 101; + +// Windows Message Handlers + +// Global Variables: +HINSTANCE hInst= NULL;					// current instance +TCHAR szTitle[MAX_LOADSTRING];				/* Flawfinder: ignore */		// The title bar text +TCHAR szWindowClass[MAX_LOADSTRING];		/* Flawfinder: ignore */		// The title bar text + +std::string gProductName; +HWND gHwndReport = NULL;	// Send/Don't Send dialog +HWND gHwndProgress = NULL;	// Progress window +HCURSOR gCursorArrow = NULL; +HCURSOR gCursorWait = NULL; +BOOL gFirstDialog = TRUE;	// Are we currently handling the Send/Don't Send dialog? +std::stringstream gDXInfo; +bool gSendLogs = false; + +LLCrashLoggerWindows* LLCrashLoggerWindows::sInstance = NULL; + +//Conversion from char* to wchar* +//Replacement for ATL macros, doesn't allocate memory +//For more info see: http://www.codeguru.com/forum/showthread.php?t=337247 +void ConvertLPCSTRToLPWSTR (const char* pCstring, WCHAR* outStr) +{ +    if (pCstring != NULL) +    { +        int nInputStrLen = strlen (pCstring); +        // Double NULL Termination +        int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0, pCstring, nInputStrLen, NULL, 0) + 2; +        if (outStr) +        { +            memset (outStr, 0x00, sizeof (WCHAR)*nOutputStrLen); +            MultiByteToWideChar (CP_ACP, 0, pCstring, nInputStrLen, outStr, nInputStrLen); +        } +    } +} + +void write_debug(const char *str) +{ +	gDXInfo << str;		/* Flawfinder: ignore */ +} + +void write_debug(std::string& str) +{ +	write_debug(str.c_str()); +} + +void show_progress(const std::string& message) +{ +	std::wstring msg = wstring_to_utf16str(utf8str_to_wstring(message)); +	if (gHwndProgress) +	{ +		SendDlgItemMessage(gHwndProgress,       // handle to destination window  +							IDC_LOG, +							WM_SETTEXT,			// message to send +							FALSE,				// undo option +							(LPARAM)msg.c_str()); +	} +} + +void update_messages() +{ +	MSG msg; +	while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) +	{ +		if (msg.message == WM_QUIT) +		{ +			exit(0); +		} +		TranslateMessage(&msg); +		DispatchMessage(&msg); +	} +} + +void sleep_and_pump_messages( U32 seconds ) +{ +	const U32 CYCLES_PER_SECOND = 10; +	U32 cycles = seconds * CYCLES_PER_SECOND; +	while( cycles-- ) +	{ +		update_messages(); +		ms_sleep(1000 / CYCLES_PER_SECOND); +	} +} + +// Include product name in the window caption. +void LLCrashLoggerWindows::ProcessCaption(HWND hWnd) +{ +	TCHAR templateText[MAX_STRING];		/* Flawfinder: ignore */ +	TCHAR header[MAX_STRING]; +	std::string final; +	GetWindowText(hWnd, templateText, sizeof(templateText)); +	final = llformat(ll_convert_wide_to_string(templateText, CP_ACP).c_str(), gProductName.c_str()); +	ConvertLPCSTRToLPWSTR(final.c_str(), header); +	SetWindowText(hWnd, header); +} + + +// Include product name in the diaog item text. +void LLCrashLoggerWindows::ProcessDlgItemText(HWND hWnd, int nIDDlgItem) +{ +	TCHAR templateText[MAX_STRING];		/* Flawfinder: ignore */ +	TCHAR header[MAX_STRING]; +	std::string final; +	GetDlgItemText(hWnd, nIDDlgItem, templateText, sizeof(templateText)); +	final = llformat(ll_convert_wide_to_string(templateText, CP_ACP).c_str(), gProductName.c_str()); +	ConvertLPCSTRToLPWSTR(final.c_str(), header); +	SetDlgItemText(hWnd, nIDDlgItem, header); +} + +bool handle_button_click(WORD button_id) +{ +	// Is this something other than Send or Don't Send? +	if (button_id != IDOK +		&& button_id != IDCANCEL) +	{ +		return false; +	} + +	// We're done with this dialog. +	gFirstDialog = FALSE; + +	// Send the crash report if requested +	if (button_id == IDOK) +	{ +		gSendLogs = TRUE; +		WCHAR wbuffer[20000]; +		GetDlgItemText(gHwndReport, // handle to dialog box +						IDC_EDIT1,  // control identifier +						wbuffer, // pointer to buffer for text +						20000 // maximum size of string +						); +		std::string user_text(ll_convert_wide_to_string(wbuffer, CP_ACP)); +		// Activate and show the window. +		ShowWindow(gHwndProgress, SW_SHOW);  +		// Try doing this second to make the progress window go frontmost. +		ShowWindow(gHwndReport, SW_HIDE); +		((LLCrashLoggerWindows*)LLCrashLogger::instance())->setUserText(user_text); +		((LLCrashLoggerWindows*)LLCrashLogger::instance())->sendCrashLogs(); +	} +	// Quit the app +	LLApp::setQuitting(); +	return true; +} + + +LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) +{ +	switch( message ) +	{ +	case WM_CREATE: +		return 0; + +	case WM_COMMAND: +		if( gFirstDialog ) +		{ +			WORD button_id = LOWORD(wParam); +			bool handled = handle_button_click(button_id); +			if (handled) +			{ +				return 0; +			} +		} +		break; + +	case WM_DESTROY: +		// Closing the window cancels +		LLApp::setQuitting(); +		PostQuitMessage(0); +		return 0; +	} + +	return DefWindowProc(hwnd, message, wParam, lParam); +} + + +LLCrashLoggerWindows::LLCrashLoggerWindows(void) +{ +	if (LLCrashLoggerWindows::sInstance==NULL) +	{ +		sInstance = this;  +	} +} + +LLCrashLoggerWindows::~LLCrashLoggerWindows(void) +{ +	sInstance = NULL; +} + +bool LLCrashLoggerWindows::getMessageWithTimeout(MSG *msg, UINT to) +{ +    bool res; +	UINT_PTR timerID = SetTimer(NULL, NULL, to, NULL); +    res = GetMessage(msg, NULL, 0, 0); +    KillTimer(NULL, timerID); +    if (!res) +        return false; +    if (msg->message == WM_TIMER && msg->hwnd == NULL && msg->wParam == 1) +        return false; //TIMEOUT! You could call SetLastError() or something... +    return true; +} + +int LLCrashLoggerWindows::processingLoop() { +	const int millisecs=1000; +	int retries = 0; +	const int max_retries = 60; + +	LL_DEBUGS("CRASHREPORT") << "Entering processing loop for OOP server" << LL_ENDL; + +	LLSD options = getOptionData( LLApp::PRIORITY_COMMAND_LINE ); + +	MSG msg; +	 +	bool result; + +    while (1)  +	{ +		result = getMessageWithTimeout(&msg, millisecs); +		if ( result )  +		{ +			TranslateMessage(&msg); +			DispatchMessage(&msg); +		} + +		if ( retries < max_retries )  //Wait up to 1 minute for the viewer to say hello. +		{ +			if (mClientsConnected == 0)  +			{ +				LL_DEBUGS("CRASHREPORT") << "Waiting for client to connect." << LL_ENDL; +				++retries; +			} +			else +			{ +				LL_INFOS("CRASHREPORT") << "Client has connected!" << LL_ENDL; +				retries = max_retries; +			} +		}  +		else  +		{ +			if (mClientsConnected == 0) +			{ +				break; +			} +			if (!mKeyMaster.isProcessAlive(mPID, mProcName) ) +			{ +				break; +			} +		}  +    } +     +    LL_INFOS() << "session ending.." << LL_ENDL; +     +    std::string per_run_dir = options["dumpdir"].asString(); +	std::string per_run_file = per_run_dir + "\\SecondLife.log"; +    std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.log"); + +	if (gDirUtilp->fileExists(per_run_dir))   +	{ +		LL_INFOS ("CRASHREPORT") << "Copying " << log_file << " to " << per_run_file << LL_ENDL; +	    LLFile::copy(log_file, per_run_file); +	} +	return 0; +} + + +void LLCrashLoggerWindows::OnClientConnected(void* context, +				const google_breakpad::ClientInfo* client_info)  +{ +	sInstance->mClientsConnected++; +	LL_INFOS("CRASHREPORT") << "Client connected. pid = " << client_info->pid() << " total clients " << sInstance->mClientsConnected << LL_ENDL; +} + +void LLCrashLoggerWindows::OnClientExited(void* context, +		const google_breakpad::ClientInfo* client_info)  +{ +	sInstance->mClientsConnected--; +	LL_INFOS("CRASHREPORT") << "Client disconnected. pid = " << client_info->pid() << " total clients " << sInstance->mClientsConnected << LL_ENDL; +} + + +void LLCrashLoggerWindows::OnClientDumpRequest(void* context, +	const google_breakpad::ClientInfo* client_info, +	const std::wstring* file_path)  +{ +	if (!file_path)  +	{ +		LL_WARNS() << "dump with no file path" << LL_ENDL; +		return; +	} +	if (!client_info)  +	{ +		LL_WARNS() << "dump with no client info" << LL_ENDL; +		return; +	} + +	LLCrashLoggerWindows* self = static_cast<LLCrashLoggerWindows*>(context); +	if (!self)  +	{ +		LL_WARNS() << "dump with no context" << LL_ENDL; +		return; +	} + +	//DWORD pid = client_info->pid(); +} + + +bool LLCrashLoggerWindows::initCrashServer() +{ +	//For Breakpad on Windows we need a full Out of Process service to get good data. +	//This routine starts up the service on a named pipe that the viewer will then +	//communicate with.  +	using namespace google_breakpad; + +	LLSD options = getOptionData( LLApp::PRIORITY_COMMAND_LINE ); +	std::string dump_path = options["dumpdir"].asString(); +	mClientsConnected = 0; +	mPID = options["pid"].asInteger(); +	mProcName = options["procname"].asString(); + +	//Generate a quasi-uniq name for the named pipe.  For our purposes +	//this is unique-enough with least hassle.  Worst case for duplicate name +	//is a second instance of the viewer will not do crash reporting.  +	std::wstring wpipe_name; +	wpipe_name = mCrashReportPipeStr + std::wstring(wstringize(mPID)); + +	std::wstring wdump_path(utf8str_to_utf16str(dump_path)); +		 +	//Pipe naming conventions:  http://msdn.microsoft.com/en-us/library/aa365783%28v=vs.85%29.aspx +	mCrashHandler = new CrashGenerationServer( wpipe_name, +		NULL,  + 		&LLCrashLoggerWindows::OnClientConnected, this, +		/*NULL, NULL,    */ &LLCrashLoggerWindows::OnClientDumpRequest, this, + 		&LLCrashLoggerWindows::OnClientExited, this, + 		NULL, NULL, + 		true, &wdump_path); +	 + 	if (!mCrashHandler) { +		//Failed to start the crash server. + 		LL_WARNS() << "Failed to init crash server." << LL_ENDL; +		return false;  + 	} + +	// Start servicing clients. +    if (!mCrashHandler->Start()) { +		LL_WARNS() << "Failed to start crash server." << LL_ENDL; +		return false; +	} + +	LL_INFOS("CRASHREPORT") << "Initialized OOP server with pipe named " << stringize(wpipe_name) << LL_ENDL; +	return true; +} + +bool LLCrashLoggerWindows::init(void) +{	 +	bool ok = LLCrashLogger::init(); +	if(!ok) return false; + +	initCrashServer(); + +	/* +	mbstowcs( gProductName, mProductName.c_str(), LL_ARRAY_SIZE(gProductName) ); +	gProductName[ LL_ARRY_SIZE(gProductName) - 1 ] = 0; +	swprintf(gProductName, L"Second Life");  +	*/ + +	LL_INFOS() << "Loading dialogs" << LL_ENDL; + +	// Initialize global strings +	LoadString(mhInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); +	LoadString(mhInst, IDC_WIN_CRASH_LOGGER, szWindowClass, MAX_LOADSTRING); + +	gCursorArrow = LoadCursor(NULL, IDC_ARROW); +	gCursorWait = LoadCursor(NULL, IDC_WAIT); + +	// Register a window class that will be used by our dialogs +	WNDCLASS wndclass; +	wndclass.style = CS_HREDRAW | CS_VREDRAW; +	wndclass.lpfnWndProc = WndProc; +	wndclass.cbClsExtra = 0; +	wndclass.cbWndExtra = DLGWINDOWEXTRA;  // Required, since this is used for dialogs! +	wndclass.hInstance = mhInst; +	wndclass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE( IDI_WIN_CRASH_LOGGER ) ); +	wndclass.hCursor = gCursorArrow; +	wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); +	wndclass.lpszMenuName = NULL; +	wndclass.lpszClassName = szWindowClass; +	RegisterClass( &wndclass ); +	 +	return true; +} + +void LLCrashLoggerWindows::gatherPlatformSpecificFiles() +{ +	updateApplication("Gathering hardware information. App may appear frozen."); +	// DX hardware probe blocks, so we can't cancel during it +	//Generate our dx_info.log file  +	SetCursor(gCursorWait); +	// At this point we're responsive enough the user could click the close button +	SetCursor(gCursorArrow); +	//mDebugLog["DisplayDeviceInfo"] = gDXHardware.getDisplayInfo();  //Not initialized. +} + +bool LLCrashLoggerWindows::frame() +{	 +	LL_INFOS() << "CrashSubmitBehavior is " << mCrashBehavior << LL_ENDL; + +	// Note: parent hwnd is 0 (the desktop).  No dlg proc.  See Petzold (5th ed) HexCalc example, Chapter 11, p529 +	// win_crash_logger.rc has been edited by hand. +	// Dialogs defined with CLASS "WIN_CRASH_LOGGER" (must be same as szWindowClass) +	gProductName = mProductName; +	gHwndProgress = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PROGRESS), 0, NULL); +	ProcessCaption(gHwndProgress); +	ShowWindow(gHwndProgress, SW_HIDE ); + +	if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND) +	{ +		LL_INFOS() << "Showing crash report submit progress window." << LL_ENDL; +		//ShowWindow(gHwndProgress, SW_SHOW );   Maint-5707 +		sendCrashLogs(); +	} +	else if (mCrashBehavior == CRASH_BEHAVIOR_ASK) +	{ +		gHwndReport = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PREVREPORTBOX), 0, NULL); +		// Ignore result +		(void) SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_SETCHECK, 0, 0); +		// Include the product name in the caption and various dialog items. +		ProcessCaption(gHwndReport); +		ProcessDlgItemText(gHwndReport, IDC_STATIC_MSG); + +		// Update the header to include whether or not we crashed on the last run. +		std::string headerStr; +		TCHAR header[MAX_STRING]; +		if (mCrashInPreviousExec) +		{ +			headerStr = llformat("%s appears to have crashed or frozen the last time it ran.", mProductName.c_str()); +		} +		else +		{ +			headerStr = llformat("%s appears to have crashed.", mProductName.c_str()); +		} +		ConvertLPCSTRToLPWSTR(headerStr.c_str(), header); +		SetDlgItemText(gHwndReport, IDC_STATIC_HEADER, header);		 +		ShowWindow(gHwndReport, SW_SHOW ); +		 +		MSG msg; +		memset(&msg, 0, sizeof(msg)); +		while (!LLApp::isQuitting() && GetMessage(&msg, NULL, 0, 0)) +		{ +			TranslateMessage(&msg); +			DispatchMessage(&msg); +		} +		return true; // msg.wParam; +	} +	else +	{ +		LL_WARNS() << "Unknown crash behavior " << mCrashBehavior << LL_ENDL; +		return true; // 1; +	} +	return true; // 0; +} + +void LLCrashLoggerWindows::updateApplication(const std::string& message) +{ +	LLCrashLogger::updateApplication(message); +	if(!message.empty()) show_progress(message); +	update_messages(); +} + +bool LLCrashLoggerWindows::cleanup() +{ +	if(gSendLogs) +	{ +		if(mSentCrashLogs) show_progress("Done"); +		else show_progress("Could not connect to servers, logs not sent"); +		sleep_and_pump_messages(3); +	} +	PostQuitMessage(0); +	commonCleanup(); +	mKeyMaster.releaseMaster(); +	return true; +} + diff --git a/indra/win_crash_logger/llcrashloggerwindows.h b/indra/win_crash_logger/llcrashloggerwindows.h new file mode 100644 index 0000000000..f89b8708dc --- /dev/null +++ b/indra/win_crash_logger/llcrashloggerwindows.h @@ -0,0 +1,86 @@ +/**  +* @file llcrashloggerwindows.h +* @brief Windows crash logger definition +* +* $LicenseInfo:firstyear=2003&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2010, Linden Research, Inc. +*  +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +*  +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +*  +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +*  +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#ifndef LLCRASHLOGGERWINDOWS_H +#define LLCRASHLOGGERWINDOWS_H + +#include "llcrashlogger.h" +#include "windows.h" +#include "llstring.h" + +class LLSD; + +namespace google_breakpad { +	class CrashGenerationServer;  +	class ClientInfo; +} + +class LLCrashLoggerWindows : public LLCrashLogger +{ +public: +	LLCrashLoggerWindows(void); +	~LLCrashLoggerWindows(void); +	static LLCrashLoggerWindows* sInstance;  + +	virtual bool init(); +	virtual bool frame(); +	virtual void updateApplication(const std::string& message = LLStringUtil::null); +	virtual bool cleanup(); +	virtual void gatherPlatformSpecificFiles(); +	void setHandle(HINSTANCE hInst) { mhInst = hInst; } +    int clients_connected() const { +        return mClientsConnected; +    } +	bool getMessageWithTimeout(MSG *msg, UINT to); +     +    // Starts the processing loop. This function does not return unless the +    // user is logging off or the user closes the crash service window. The +    // return value is a good number to pass in ExitProcess(). +    int processingLoop(); +private: +	void ProcessDlgItemText(HWND hWnd, int nIDDlgItem); +	void ProcessCaption(HWND hWnd); +	bool initCrashServer(); +	google_breakpad::CrashGenerationServer* mCrashHandler; +	static void OnClientConnected(void* context, + 					const google_breakpad::ClientInfo* client_info); + 	 + 	static void OnClientDumpRequest( + 					void* context, + 					const google_breakpad::ClientInfo* client_info, + 					const std::wstring* file_path); + 	 + 	static void OnClientExited(void* context, +		 			const google_breakpad::ClientInfo* client_info); +    int mClientsConnected; +	int mPID; +	std::string mProcName; +     +	HINSTANCE mhInst; + +}; + +#endif diff --git a/indra/win_crash_logger/resource.h b/indra/win_crash_logger/resource.h new file mode 100644 index 0000000000..37a387275e --- /dev/null +++ b/indra/win_crash_logger/resource.h @@ -0,0 +1,63 @@ +/**  +* @file resource.h +* @brief Windows crash logger windows resources +* +* $LicenseInfo:firstyear=2003&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2010, Linden Research, Inc. +*  +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +*  +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +*  +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +*  +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by win_crash_logger.rc +// +#define IDC_MYICON                      2 +#define IDD_REPORT                      9 +#define IDD_WIN_CRASH_LOGGER_DIALOG     102 +#define IDD_ABOUTBOX                    103 +#define IDS_APP_TITLE                   103 +#define IDM_ABOUT                       104 +#define IDM_EXIT                        105 +#define IDS_HELLO                       106 +#define IDI_WIN_CRASH_LOGGER            107 +#define IDI_SMALL                       108 +#define IDC_WIN_CRASH_LOGGER            109 +#define IDR_MAINFRAME                   128 +#define IDD_PROGRESS                    129 +#define IDD_PREVREPORTBOX               130 +#define IDC_EDIT1                       1000 +#define IDC_LOG                         1004 +#define IDC_CHECK_AUTO                  1006 +#define IDC_STATIC_HEADER               1007 +#define IDC_STATIC_WHATINFO             1008 +#define IDC_STATIC_MOTIVATION           1009 +#define IDC_STATIC_MSG                  1010 +#define IDC_STATIC                      -1 + +// Next default values for new objects +//  +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE        131 +#define _APS_NEXT_COMMAND_VALUE         32771 +#define _APS_NEXT_CONTROL_VALUE         1011 +#define _APS_NEXT_SYMED_VALUE           110 +#endif +#endif diff --git a/indra/win_crash_logger/win_crash_logger.cpp b/indra/win_crash_logger/win_crash_logger.cpp new file mode 100644 index 0000000000..58746eba02 --- /dev/null +++ b/indra/win_crash_logger/win_crash_logger.cpp @@ -0,0 +1,70 @@ +/**  + * @file win_crash_logger.cpp + * @brief Windows crash logger implementation + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "stdafx.h" +#include <stdlib.h> +#include "llcrashloggerwindows.h" + +#ifdef _UNICODE +int APIENTRY wWinMain(HINSTANCE hInstance, +                      HINSTANCE hPrevInstance, +                      LPWSTR    lpCmdLine, +                      int       nCmdShow) +#else +int APIENTRY WinMain(HINSTANCE hInstance, +                     HINSTANCE hPrevInstance, +                     LPSTR     lpCmdLine, +                     int       nCmdShow) +#endif //_UNICODE +{ +	LL_INFOS() << "Starting crash reporter with args" << &lpCmdLine << LL_ENDL; +	LLCrashLoggerWindows app; +	app.setHandle(hInstance); +#ifdef _UNICODE +	app.parseCommandOptions(__argc, __wargv); +#else +	app.parseCommandOptions(__argc, __argv); +#endif //_UNICODE + +	LLSD options = LLApp::instance()->getOptionData( +                   LLApp::PRIORITY_COMMAND_LINE); +    if (!(options.has("pid") && options.has("dumpdir"))) +    { +        LL_WARNS() << "Insufficient parameters to crash report." << LL_ENDL;  +    } +	if (! app.init()) +	{ +		LL_WARNS() << "Unable to initialize application." << LL_ENDL; +		return -1; +	} + +	app.processingLoop(); +	app.frame(); +	app.cleanup(); +	LL_INFOS() << "Crash reporter finished normally." << LL_ENDL; +	return 0; +} diff --git a/indra/win_crash_logger/win_crash_logger.h b/indra/win_crash_logger/win_crash_logger.h new file mode 100644 index 0000000000..2cc2cf3dcf --- /dev/null +++ b/indra/win_crash_logger/win_crash_logger.h @@ -0,0 +1,38 @@ +/**  + * @file win_crash_logger.h + * @brief Windows crash logger project includes + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + + +#if !defined(AFX_WIN_CRASH_LOGGER_H__79802F4B_7C37_4F63_A2BB_0768788C3A27__INCLUDED_) +#define AFX_WIN_CRASH_LOGGER_H__79802F4B_7C37_4F63_A2BB_0768788C3A27__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "resource.h" + + +#endif // !defined(AFX_WIN_CRASH_LOGGER_H__79802F4B_7C37_4F63_A2BB_0768788C3A27__INCLUDED_) diff --git a/indra/win_crash_logger/win_crash_logger.ico b/indra/win_crash_logger/win_crash_logger.ico Binary files differnew file mode 100644 index 0000000000..386883523b --- /dev/null +++ b/indra/win_crash_logger/win_crash_logger.ico diff --git a/indra/win_crash_logger/win_crash_logger.rc b/indra/win_crash_logger/win_crash_logger.rc new file mode 100755 index 0000000000..2819722f63 --- /dev/null +++ b/indra/win_crash_logger/win_crash_logger.rc @@ -0,0 +1,188 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS +#include "resource.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_WIN_CRASH_LOGGER    ICON                    "ll_icon.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDC_WIN_CRASH_LOGGER MENU  +BEGIN +    POPUP "&File" +    BEGIN +        MENUITEM "E&xit",                       IDM_EXIT +    END +    POPUP "&Help" +    BEGIN +        MENUITEM "&About ...",                  IDM_ABOUT +    END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_PROGRESS DIALOGEX 100, 100, 234, 33 +STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU +CAPTION "%s Crash Logger" +CLASS "WIN_CRASH_LOGGER" +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN +    LTEXT           "Static",IDC_LOG,7,7,220,8 +END + +IDD_REPORT DIALOGEX 100, 100, 297, 125 +STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU +CAPTION "%s Crash Logger" +CLASS "WIN_CRASH_LOGGER" +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN +    DEFPUSHBUTTON   "Send",IDOK,198,104,45,15,WS_GROUP +    PUSHBUTTON      "Don't Send",IDCANCEL,247,104,45,15,WS_GROUP +    LTEXT           "%s appears to have crashed.",IDC_STATIC_HEADER,4,4,288,14 +    LTEXT           "This crash reporter collects information about your computer's hardware, operating system, and some %s logs, which are used for debugging purposes only.",IDC_STATIC_WHATINFO,4,23,288,19,NOT WS_GROUP +    CONTROL         "Remember this choice",IDC_CHECK_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,106,89,13 +    LTEXT           "Sending crash reports is the best way to help us improve the quality of %s.",IDC_STATIC_MOTIVATION,4,43,288,8 +    LTEXT           "If you continue to experience this problem, please try:",IDC_STATIC,4,57,251,8 +    LTEXT           "- Contacting support by visiting http://www.secondlife.com/support",IDC_STATIC,4,67,231,8 +END + +IDD_PREVREPORTBOX DIALOGEX 100, 100, 232, 213 +STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU +CAPTION "%s Crash Logger" +CLASS "WIN_CRASH_LOGGER" +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN +    DEFPUSHBUTTON   "Send Report",IDOK,131,193,45,15,WS_GROUP +    EDITTEXT        IDC_EDIT1,3,100,223,89,ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL +    PUSHBUTTON      "Don't Send",IDCANCEL,181,193,45,15,WS_GROUP +    LTEXT           "%s appears to have crashed or frozen the last time it ran.",IDC_STATIC_HEADER,4,4,214,8 +    LTEXT           "This crash reporter collects information about your computer's",IDC_STATIC,4,17,201,8 +    LTEXT           "hardware configuration, operating system, and some %s",IDC_STATIC_MSG,4,25,212,8 +    LTEXT           "logs, all of which are used for debugging purposes only.",IDC_STATIC,4,33,210,8 +    LTEXT           "In the space below, please briefly describe what you were doing",IDC_STATIC,3,48,208,8 +    LTEXT           "or trying to do just prior to the crash.",IDC_STATIC,3,56,204,8 +    LTEXT           "If you don't wish to send Linden Lab a crash report, press Don't Send.",IDC_STATIC,3,90,223,8 +    LTEXT           "This report is NOT read by customer support.  If you have billing or",IDC_STATIC,3,68,208,8 +    LTEXT           "other questions, please go to: www.secondlife.com/support",IDC_STATIC,3,76,206,8 +    CONTROL         "Remember this choice",IDC_CHECK_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,193,89,13 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +2 TEXTINCLUDE  +BEGIN +    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" +    "#include ""windows.h""\r\n" +    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" +    "#include ""resource.h""\r\n" +    "\0" +END + +3 TEXTINCLUDE  +BEGIN +    "\r\n" +    "\0" +END + +1 TEXTINCLUDE  +BEGIN +    "resource.h\0" +END + +#endif    // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO  +BEGIN +    IDD_PROGRESS, DIALOG +    BEGIN +        LEFTMARGIN, 7 +        RIGHTMARGIN, 227 +        TOPMARGIN, 7 +        BOTTOMMARGIN, 26 +    END + +    IDD_REPORT, DIALOG +    BEGIN +        RIGHTMARGIN, 292 +        VERTGUIDE, 4 +        BOTTOMMARGIN, 119 +        HORZGUIDE, 4 +    END +END +#endif    // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE  +BEGIN +    IDS_APP_TITLE           "win_crash_logger" +    IDS_HELLO               "Hello World!" +    IDC_WIN_CRASH_LOGGER    "WIN_CRASH_LOGGER" +END + +#endif    // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif    // not APSTUDIO_INVOKED +  | 
