diff --git a/.hgtags b/.hgtags
index 9ca419211ea7617e3b753ae43caf3f479115283b..c892fcb28e800f4ad46772dbc8cd2acc9b7a12b1 100755
--- a/.hgtags
+++ b/.hgtags
@@ -248,31 +248,33 @@ bb9932a7a5fd00edf52d95f354e3b37ae6a942db DRTVWR-156
 6414ecdabc5d89515b08d1f872cf923ed3a5523a DRTVWR-148
 2a3965b3ad202df7ea25d2be689291bb14a1280e DRTVWR-155
 24a7281bef42bd4430ceb25db8b195449c2c7de3 DRTVWR-153
+a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159
+9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157
 5910f8063a7e1ddddf504c2f35ca831cc5e8f469 DRTVWR-160
 f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 3.3.3-beta1
 f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 DRTVWR-144
-2d6c0634b11e6f3df11002b8510a72a0433da00a DRTVWR-164
+089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161
 600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162
+c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163
+2d6c0634b11e6f3df11002b8510a72a0433da00a DRTVWR-164
 80b5e5e9775966d3839331ffa7a16a60f9d7c930 DRTVWR-165
 fdcc08a4f20ae9bb060f4693c8980d216534efdf 3.3.3-beta2
 af5f3e43e6e4424b1da19d9e16f6b853a7b822ed DRTVWR-169
 4b3c68199a86cabaa5d9466d7b0f7e141e901d7a 3.3.3-beta3
 6428242e124b523813bfaf4c45b3d422f0298c81 3.3.3-release
-a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159
-9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157
-089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161
-c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163
 b9d0170b62eb1c7c3adaa37a0b13a833e5e659f9 DRTVWR-171
 050e48759337249130f684b4a21080b683f61732 DRTVWR-168
 09ef7fd1b0781f33b8a3a9af6236b7bcb4831910 DRTVWR-170
 f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 DRTVWR-158
 f91d003091a61937a044652c4c674447f7dcbb7a 3.3.4-beta1
+005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167
 bce218b2b45b730b22cc51e4807aa8b571cadef3 DRTVWR-173
 cbea6356ce9cb0c313b6777f10c5c14783264fcc DRTVWR-174
 82b5330bc8b17d0d4b598832e9c5a92e90075682 3.3.4-beta2
 57d221de3df94f90b55204313c2cef044a3c0ae2 DRTVWR-176
 eb539c65e6ee26eea2bf373af2d0f4b52dc91289 DRTVWR-177
 a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3
+888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
 4281aa899fb2cedb7a9ca7ce91c5c29d4aa69594 DRTVWR-180
 5c08e1d8edd871807153603b690e3ee9dbb548aa DRTVWR-183
 6c75f220b103db1420919c8b635fe53e2177f318 3.3.4-beta4
@@ -283,24 +285,32 @@ ab2ffc547c8a8950ff187c4f6c95e5334fab597b 3.3.4-beta5
 7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2
 8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207
 351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3
-005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167
-888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
 a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182
 1f27cdfdc54246484f8afbbe42ce48e954175cbd 3.4.0-beta1
-9ee9387789701d597130f879d9011a4958753862 DRTVWR-189
+81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186
 47f0d08ba7ade0a3905074009067c6d3df7e16ae DRTVWR-190
+cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181
+c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188
+9ee9387789701d597130f879d9011a4958753862 DRTVWR-189
 421126293dcbde918e0da027ca0ab9deb5b4fbf2 DRTVWR-192
+4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191
 33a2fc7a910ae29ff8b4850316ed7fbff9f64d33 DRTVWR-195
 e9732c739c8a72a590216951505ea9c76a526a84 DRTVWR-193
+78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194
 7602f61c804a512764e349c034c02ddabeefebc4 DRTVWR-196
 ae5c83dd61d2d37c45f1d5b8bf2b036d87599f1b DRTVWR-198
 507bdfbd6bf844a511c1ffeda4baa80016ed1346 DRTVWR-197
 b1dbb1a83f48f93f6f878cff9e52d2cb635e145c 3.4.0-beta2
 37402e2b19af970d51b0a814d79892cc5647532b DRTVWR-200
 182a9bf30e81070361bb020a78003b1cf398e79c 3.4.0-beta3
+248f4acd92a706c79e842bc83d80baa7369c0c2e DRTVWR-203
 7649a3dff5ec22d3727377e5f02efd0f421e4cb5 DRTVWR-201
 84fb70dfe3444e75a44fb4bee43e2fc8221cebdd 3.4.0-beta4
+de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202
 573e863be2f26d3687161def4b9fea9b7038dda8 3.4.0-beta5
+34dbbe2b00afe90352d3acf8290eb10ab90d1c8b oz-build-test-tag
+6ee71714935ffcd159db3d4f5800c1929aac54e1 DRTVWR-205
+7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206
 af7b28e75bd5a629cd9e0dc46fb3f1757626f493 DRTVWR-212
 015012c2b740ccdec8a8c3d6e5f898449ecfe0b8 DRTVWR-213
 62b07aa81b1957897c3846292bb9412977b0af6c 3.3.4-beta6
@@ -309,6 +319,7 @@ ceed0b65a69f1eac20d523e0203320a32f9a3f3c DRTVWR-215
 97977c67245f52db20eb15f1918cc0f24778cabc 3.4.0-release
 5adb2b8f96c3cac88ad7c7d996d707f1b29df336 3.4.1-beta1
 b3f74858a1c8720c82d0978f3877a3fc8ba459ec 3.4.1-beta1a
+b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219
 2b779f233ee6f38c89cb921650c773a96e63da92 DRTVWR-220
 0b9d95f4bfb6867cbf56eaec51633b0da2f1262d DRTVWR-221
 e6e553761829dc0270eaaa712b7cb0622535b076 3.4.1-beta3
@@ -333,36 +344,31 @@ baf97f06ae17223614c5e31aa42e71d87cff07fe DRTVWR-236
 b2f21e3442542283a80e7eaebae9f833e5a927b6 DRTVWR-237
 3f9be82de642d468c5fc272cb9d96b46b5498402 3.4.1-beta12
 e59ffd3fe0838ae6b09b242a6e9df71761b88f41 3.4.1-release
-81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186
-cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181
-c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188
-4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191
-78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194
-248f4acd92a706c79e842bc83d80baa7369c0c2e DRTVWR-203
-de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202
-34dbbe2b00afe90352d3acf8290eb10ab90d1c8b oz-build-test-tag
-6ee71714935ffcd159db3d4f5800c1929aac54e1 DRTVWR-205
-7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206
-b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219
 32896d5e920ca9a29256ff3b747c2e99752aa5ae DRTVWR-217
 704bbae7b182a1f2811a47a054e680522966f54a 3.4.2-beta1
+d799593b53ed733862e9a13871e318e886469377 DRTVWR-208
+e497dcde7a3653e384eb223a8a460030e89c294c DRTVWR-223
 288539fc0408ed4b69a99665de33bbbc2c3c08fe DRTVWR-216
 e664473c16df1d82ffaff382e7b3e023da202d52 3.4.2-beta2
+93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240
 0891d7a773a31397dcad48be3fa66531d567a821 DRTVWR-242
 710785535362b3cb801b6a3dc4703be3373bd0cd 3.4.2-beta3
-e9a5886052433d5db9e504ffaca10890f9932979 DRTVWR-243
-73b84b9864dc650fe7c8fc9f52361450f0849004 3.4.2-beta4
-16310aabccf315870f7cc9bf966926c0ad6954fa 3.4.2-release
-d799593b53ed733862e9a13871e318e886469377 DRTVWR-208
-e497dcde7a3653e384eb223a8a460030e89c294c DRTVWR-223
-93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240
 2aa72e3372a83dece4df9cf72fb1e7c34f90b5e3 DRTVWR-209
 f7bedce18ad52283e6072814db23318907261487 DRTVWR-238
 7b64c96fbcadf360bd2feaae19d330166b70877c DRTVWR-210
+e9a5886052433d5db9e504ffaca10890f9932979 DRTVWR-243
+73b84b9864dc650fe7c8fc9f52361450f0849004 3.4.2-beta4
+16310aabccf315870f7cc9bf966926c0ad6954fa 3.4.2-release
 5e4e4128b256525bafc07a62e35ae8527aaa9c9d DRTVWR-241
 f1d3b3fcab28ed9ea532bf50db0ba96f5c8cc8e9 DRTVWR-232
 4918b150e75df6b516fb6c2616d32043fa6b4cac DRTVWR-245
 94ab2b49458ab372a95d2d6949fdf574f413068d 3.4.3-beta1
+4c3460cb1fb7c6da9965e09c734d282a8e9c81f0 DRTVWR-229
+f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246
+39c5204b6e800983a41ccac8ad6dc993120197c6 DRTVWR-247
+7c7d57d393e8ae7b61623279de06eb4a62ccae6a DRTVWR-249
+f72b50ef168c159d6e79e97aa2bcafaf8577ab99 DRTVWR-230
+b418be80903520c492e1173f3afbc4021cad5d07 DRTVWR-255
 965b9a35e260c0f53be1a25f0db7abc8a67eaf47 DRTVWR-252
 bb10adc4f76cf0067fca7075146f00cdc0740e9d DRTVWR-251
 ab0aa2f6ba22b52fed30a2337197f589156edc75 DRTVWR-253
@@ -371,31 +377,25 @@ ab0aa2f6ba22b52fed30a2337197f589156edc75 DRTVWR-253
 44e764a6ac9e672a4f3bce821a4b6a218590c374 DRTVWR-258
 c23d734065ed593b2413385aecd8366d8e0ee96b DRTVWR-257
 452ce96d4046dc05a3ecaecc203e2cc8ddd72e76 DRTVWR-259
+9aa1aa9f1fe13c194695a0b8f0af298296241dc2 DRTVWR-260
 daca610d840625b5bebb966a57cb49581852c417 DRTVWR-265
 9afbdc4e24cc04feacfb2b7a10b78a64f780901a DRTVWR-266
 73280db02501f5ad041fc18b1eba68e73a81996c DRTVWR-267
 870e2d79e0063fda87187f17bbc2747766733194 3.4.3-beta3
 0a2ca6546b499239afeb66d17b2fadbcdbe36ab1 3.4.3-release
-4c3460cb1fb7c6da9965e09c734d282a8e9c81f0 DRTVWR-229
-f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246
-39c5204b6e800983a41ccac8ad6dc993120197c6 DRTVWR-247
-7c7d57d393e8ae7b61623279de06eb4a62ccae6a DRTVWR-249
-f72b50ef168c159d6e79e97aa2bcafaf8577ab99 DRTVWR-230
-b418be80903520c492e1173f3afbc4021cad5d07 DRTVWR-255
-9aa1aa9f1fe13c194695a0b8f0af298296241dc2 DRTVWR-260
 84fbaf2d4141bd161731430e760949dc787ca206 DRTVWR-244
 083d2d36b5bb1c54fc3dd7caac0e7ac381a9cef0 3.4.4-beta1
+391a8c74cec7275c5d26c85ad108d4782a3e3dd9 DRTVWR-268
 b634dec987c16e8c9c938e11e52591d9ead8fa9b DRTVWR-270
 cd39255bd23330fd30c04105f2811e941d8524fe 3.4.4-beta2
 2c4011bbc2b15b82198fd8b51f3a9fe765a08c4d DRTVWR-271
 2f8a3ef687bc55828abcb17ac1ad7cde70536d7e 3.4.4-beta3
 35cfd4cf5b895fa776592f2e630e330be7f0604e DRTVWR-273
+a36f1f354b02aa6e448ca13685de167d0a0a3d03 DRTVWR-272
+37dba00ad820de3a808d4039396b162a9c275b3e DRTVWR-269
 c374035d459af3c03dea2dd90880dfc25de64706 DRTVWR-275
 05d9f1dd7a954069af2a33abedb7713fa36a04cb 3.4.4-beta4
 e1bb1ae7d8b12faeb37933a737c199cc9b9f89cc 3.4.4-release
-391a8c74cec7275c5d26c85ad108d4782a3e3dd9 DRTVWR-268
-a36f1f354b02aa6e448ca13685de167d0a0a3d03 DRTVWR-272
-37dba00ad820de3a808d4039396b162a9c275b3e DRTVWR-269
 7c6dfdc1b7a2ce0d8e3a8f3ce3058547ea065c0f DRTVWR-250
 b9ff9730daa53a541925300cbd02bb14575a5705 DRTVWR-277
 af6b711a97073431953b55ee808aaa09900c27e5 DRTVWR-276
@@ -405,6 +405,8 @@ c296133849d1f103c0e2abc41e6599daed00b67b DRTVWR-280
 5df4802bec93c8d0a509946d826bb4c50c5442ec DRTVWR-281
 7c1c33ba4cfd2d15ca51cc1ac440eca551331a4a DRTVWR-283
 6b9c7dbebef793230d64e1b452577c8b142d4143 3.4.5-beta2
+37947e4f771f001b551581bf7cd0051c3153beed DRTVWR-282
+6482cceb91cda68b799f3e6cdc66d33bf123547a DRTVWR-284
 ccf991e02dc2f63fb646324230d54832683f4a9b DRTVWR-286
 2d849850558a5a0324b398d1c102d30bcbdfb88f DRTVWR-287
 e06898df8644fe567bee94f817d03abc1c380993 3.4.5-beta3
@@ -463,3 +465,4 @@ fb1630153bac5552046ea914af3f14deabc1def8 3.6.0-materials-beta1
 0a56f33ad6aa112032b14a41dad759ad377bdde9 3.6.0-release
 75cf8e855ae1af6895a35da475314c2b5acf1850 3.6.1-release
 f6741d5fe8d632651424484df0fe0cb4a01e9fbe 3.6.2-release
+fe4f7c5e9fd27e09d03deb1cc9ab3e5093f6309e 3.6.3-release
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 6337691657d851a65f120ecdf411364315f30014..26da3ad58c8122df04a292476b29161ae12e5795 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -176,6 +176,7 @@ Ansariel Hiller
 	STORM-1713
 	STORM-1899
 	STORM-1932
+	MAINT-2368
 Aralara Rajal
 Ardy Lay
 	STORM-859
@@ -483,6 +484,7 @@ Hiro Sommambulist
 Hitomi Tiponi
 	STORM-1741
 	STORM-1862
+	BUG-1067
 Holger Gilruth
 Horatio Freund
 Hoze Menges
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
old mode 100755
new mode 100644
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 1c25256e9521894a04c7e0b0230932d201f7c84b..c8a05e1faea6e0244ecc03f88c325bc7f5570879 100755
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -689,8 +689,17 @@ void LLImageRaw::fill( const LLColor4U& color )
 	}
 }
 
+LLPointer<LLImageRaw> LLImageRaw::duplicate()
+{
+	if(getNumRefs() < 2)
+	{
+		return this; //nobody else refences to this image, no need to duplicate.
+	}
 
-
+	//make a duplicate
+	LLPointer<LLImageRaw> dup = new LLImageRaw(getData(), getWidth(), getHeight(), getComponents());
+	return dup; 
+}
 
 // Src and dst can be any size.  Src and dst can each have 3 or 4 components.
 void LLImageRaw::copy(LLImageRaw* src)
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 4fc40ecff7703364b950cd7c8cdadd18266c5f3d..2277afc5852b6f21d4e1cc7e5b8bd72ad0ae6501 100755
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -30,6 +30,7 @@
 #include "lluuid.h"
 #include "llstring.h"
 #include "llthread.h"
+#include "llpointer.h"
 
 const S32 MIN_IMAGE_MIP =  2; // 4x4, only used for expand/contract power of 2
 const S32 MAX_IMAGE_MIP = 11; // 2048x2048
@@ -214,6 +215,9 @@ class LLImageRaw : public LLImageBase
 
 	// Copy operations
 	
+	//duplicate this raw image if refCount > 1.
+	LLPointer<LLImageRaw> duplicate();
+
 	// Src and dst can be any size.  Src and dst can each have 3 or 4 components.
 	void copy( LLImageRaw* src );
 
diff --git a/indra/llmath/llcamera.cpp b/indra/llmath/llcamera.cpp
index 22ba26f99b20d178f22fae7c5e4c5589470700e5..33cf185196ad59a496f2812e2cd9eb5bfd553e69 100755
--- a/indra/llmath/llcamera.cpp
+++ b/indra/llmath/llcamera.cpp
@@ -42,6 +42,11 @@ LLCamera::LLCamera() :
 	mPlaneCount(6),
 	mFrustumCornerDist(0.f)
 {
+	for (U32 i = 0; i < PLANE_MASK_NUM; i++)
+	{
+		mPlaneMask[i] = PLANE_MASK_NONE;
+	}
+
 	calculateFrustumPlanes();
 } 
 
@@ -52,6 +57,11 @@ LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_p
 	mPlaneCount(6),
 	mFrustumCornerDist(0.f)
 {
+	for (U32 i = 0; i < PLANE_MASK_NUM; i++)
+	{
+		mPlaneMask[i] = PLANE_MASK_NONE;
+	}
+
 	mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO);
 	mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE);
 	if(far_plane < 0) far_plane = DEFAULT_FAR_PLANE;
@@ -87,14 +97,14 @@ F32 LLCamera::getMaxView() const
 
 void LLCamera::setUserClipPlane(LLPlane& plane)
 {
-	mPlaneCount = 7;
-	mAgentPlanes[6] = plane;
-	mPlaneMask[6] = plane.calcPlaneMask();
+	mPlaneCount = AGENT_PLANE_USER_CLIP_NUM;
+	mAgentPlanes[AGENT_PLANE_USER_CLIP] = plane;
+	mPlaneMask[AGENT_PLANE_USER_CLIP] = plane.calcPlaneMask();
 }
 
 void LLCamera::disableUserClipPlane()
 {
-	mPlaneCount = 6;
+	mPlaneCount = AGENT_PLANE_NO_USER_CLIP_NUM;
 }
 
 void LLCamera::setView(F32 vertical_fov_rads) 
@@ -161,31 +171,33 @@ size_t LLCamera::readFrustumFromBuffer(const char *buffer)
 
 // ---------------- test methods  ---------------- 
 
-S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius) 
+static	const LLVector4a sFrustumScaler[] = 
 {
-	static const LLVector4a scaler[] = {
-		LLVector4a(-1,-1,-1),
-		LLVector4a( 1,-1,-1),
-		LLVector4a(-1, 1,-1),
-		LLVector4a( 1, 1,-1),
-		LLVector4a(-1,-1, 1),
-		LLVector4a( 1,-1, 1),
-		LLVector4a(-1, 1, 1),
-		LLVector4a( 1, 1, 1)
-	};
+	LLVector4a(-1,-1,-1),
+	LLVector4a( 1,-1,-1),
+	LLVector4a(-1, 1,-1),
+	LLVector4a( 1, 1,-1),
+	LLVector4a(-1,-1, 1),
+	LLVector4a( 1,-1, 1),
+	LLVector4a(-1, 1, 1),
+	LLVector4a( 1, 1, 1)		// 8 entries
+};
 
+S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius) 
+{
 	U8 mask = 0;
 	bool result = false;
 	LLVector4a rscale, maxp, minp;
 	LLSimdScalar d;
-	for (U32 i = 0; i < mPlaneCount; i++)
+	U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM);		// mAgentPlanes[] size is 7
+	for (U32 i = 0; i < max_planes; i++)
 	{
 		mask = mPlaneMask[i];
-		if (mask != 0xff)
+		if (mask < PLANE_MASK_NUM)
 		{
 			const LLPlane& p(mAgentPlanes[i]);
 			p.getAt<3>(d);
-			rscale.setMul(radius, scaler[mask]);
+			rscale.setMul(radius, sFrustumScaler[mask]);
 			minp.setSub(center, rscale);
 			d = -d;
 			if (p.dot3(minp).getF32() > d) 
@@ -207,29 +219,19 @@ S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius)
 
 S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius) 
 {
-	static const LLVector4a scaler[] = {
-		LLVector4a(-1,-1,-1),
-		LLVector4a( 1,-1,-1),
-		LLVector4a(-1, 1,-1),
-		LLVector4a( 1, 1,-1),
-		LLVector4a(-1,-1, 1),
-		LLVector4a( 1,-1, 1),
-		LLVector4a(-1, 1, 1),
-		LLVector4a( 1, 1, 1)
-	};
-
 	U8 mask = 0;
 	bool result = false;
 	LLVector4a rscale, maxp, minp;
 	LLSimdScalar d;
-	for (U32 i = 0; i < mPlaneCount; i++)
+	U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM);		// mAgentPlanes[] size is 7
+	for (U32 i = 0; i < max_planes; i++)
 	{
 		mask = mPlaneMask[i];
-		if ((i != 5) && (mask != 0xff))
+		if ((i != 5) && (mask < PLANE_MASK_NUM))
 		{
 			const LLPlane& p(mAgentPlanes[i]);
 			p.getAt<3>(d);
-			rscale.setMul(radius, scaler[mask]);
+			rscale.setMul(radius, sFrustumScaler[mask]);
 			minp.setSub(center, rscale);
 			d = -d;
 			if (p.dot3(minp).getF32() > d) 
@@ -369,7 +371,7 @@ int LLCamera::sphereInFrustum(const LLVector3 &sphere_center, const F32 radius)
 	bool res = false;
 	for (int i = 0; i < 6; i++)
 	{
-		if (mPlaneMask[i] != 0xff)
+		if (mPlaneMask[i] != PLANE_MASK_NONE)
 		{
 			float d = mAgentPlanes[i].dist(sphere_center);
 
@@ -541,14 +543,14 @@ void LLCamera::ignoreAgentFrustumPlane(S32 idx)
 		return;
 	}
 
-	mPlaneMask[idx] = 0xff;
+	mPlaneMask[idx] = PLANE_MASK_NONE;
 	mAgentPlanes[idx].clear();
 }
 
 void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
 {
 	
-	for (int i = 0; i < 8; i++)
+	for (int i = 0; i < AGENT_FRUSTRUM_NUM; i++)
 	{
 		mAgentFrustum[i] = frust[i];
 	}
@@ -560,22 +562,22 @@ void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
 	//order of planes is important, keep most likely to fail in the front of the list
 
 	//near - frust[0], frust[1], frust[2]
-	mAgentPlanes[2] = planeFromPoints(frust[0], frust[1], frust[2]);
+	mAgentPlanes[AGENT_PLANE_NEAR] = planeFromPoints(frust[0], frust[1], frust[2]);
 
 	//far  
-	mAgentPlanes[5] = planeFromPoints(frust[5], frust[4], frust[6]);
+	mAgentPlanes[AGENT_PLANE_FAR] = planeFromPoints(frust[5], frust[4], frust[6]);
 
 	//left  
-	mAgentPlanes[0] = planeFromPoints(frust[4], frust[0], frust[7]);
+	mAgentPlanes[AGENT_PLANE_LEFT] = planeFromPoints(frust[4], frust[0], frust[7]);
 
 	//right  
-	mAgentPlanes[1] = planeFromPoints(frust[1], frust[5], frust[6]);
+	mAgentPlanes[AGENT_PLANE_RIGHT] = planeFromPoints(frust[1], frust[5], frust[6]);
 
 	//top  
-	mAgentPlanes[4] = planeFromPoints(frust[3], frust[2], frust[6]);
+	mAgentPlanes[AGENT_PLANE_TOP] = planeFromPoints(frust[3], frust[2], frust[6]);
 
 	//bottom  
-	mAgentPlanes[3] = planeFromPoints(frust[1], frust[0], frust[4]);
+	mAgentPlanes[AGENT_PLANE_BOTTOM] = planeFromPoints(frust[1], frust[0], frust[4]);
 
 	//cache plane octant facing mask for use in AABBInFrustum
 	for (U32 i = 0; i < mPlaneCount; i++)
@@ -635,7 +637,7 @@ void LLCamera::calculateWorldFrustumPlanes()
 	LLVector3 center = mOrigin - mXAxis*mNearPlane;
 	mWorldPlanePos = center;
 	LLVector3 pnorm;	
-	for (int p=0; p<4; p++)
+	for (int p = 0; p < PLANE_NUM; p++)
 	{
 		mLocalPlanes[p].getVector3(pnorm);
 		LLVector3 norm = rotateToAbsolute(pnorm);
diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h
index 0b591be622e453915809b3e557caeb04310a937c..1283cfb16b63aef6eeebf1570274157046c55e71 100755
--- a/indra/llmath/llcamera.h
+++ b/indra/llmath/llcamera.h
@@ -76,26 +76,39 @@ class LLCamera
 		PLANE_RIGHT = 1,
 		PLANE_BOTTOM = 2,
 		PLANE_TOP = 3,
-		PLANE_NUM = 4
+		PLANE_NUM = 4,
+		PLANE_MASK_NONE = 0xff		// Disable this plane
 	};
 	enum {
 		PLANE_LEFT_MASK = (1<<PLANE_LEFT),
 		PLANE_RIGHT_MASK = (1<<PLANE_RIGHT),
 		PLANE_BOTTOM_MASK = (1<<PLANE_BOTTOM),
 		PLANE_TOP_MASK = (1<<PLANE_TOP),
-		PLANE_ALL_MASK = 0xf
+		PLANE_ALL_MASK = 0xf,
 	};
 
 	enum
-	{
+	{	// Indexes to mAgentPlanes[] and mPlaneMask[]
 		AGENT_PLANE_LEFT = 0,
-		AGENT_PLANE_RIGHT,
-		AGENT_PLANE_NEAR,
-		AGENT_PLANE_BOTTOM,
-		AGENT_PLANE_TOP,
-		AGENT_PLANE_FAR,
+		AGENT_PLANE_RIGHT = 1,
+		AGENT_PLANE_NEAR = 2,
+		AGENT_PLANE_BOTTOM = 3,
+		AGENT_PLANE_TOP = 4,
+		AGENT_PLANE_FAR = 5,
+		AGENT_PLANE_USER_CLIP = 6
+	};
+	enum
+	{	// Sizes for mAgentPlanes[].  7th entry is special case for user clip
+		AGENT_PLANE_NO_USER_CLIP_NUM = 6,
+		AGENT_PLANE_USER_CLIP_NUM = 7,
+		PLANE_MASK_NUM = 8			// 7 actually used, 8 is for alignment
 	};
 
+	enum
+	{
+		AGENT_FRUSTRUM_NUM = 8
+	};
+	
 	enum {
 		HORIZ_PLANE_LEFT = 0,
 		HORIZ_PLANE_RIGHT = 1,
@@ -108,15 +121,15 @@ class LLCamera
 	};
 
 private:
-	LL_ALIGN_16(LLPlane mAgentPlanes[7]);  //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
-	U8 mPlaneMask[8];         // 8 for alignment	
+	LL_ALIGN_16(LLPlane mAgentPlanes[AGENT_PLANE_USER_CLIP_NUM]);  //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
+	U8 mPlaneMask[PLANE_MASK_NUM];         // 8 for alignment	
 	
 	F32 mView;					// angle between top and bottom frustum planes in radians.
 	F32 mAspect;				// width/height
 	S32 mViewHeightInPixels;	// for ViewHeightInPixels() only
 	F32 mNearPlane;
 	F32 mFarPlane;
-	LL_ALIGN_16(LLPlane mLocalPlanes[4]);
+	LL_ALIGN_16(LLPlane mLocalPlanes[PLANE_NUM]);
 	F32 mFixedDistance;			// Always return this distance, unless < 0
 	LLVector3 mFrustCenter;		// center of frustum and radius squared for ultra-quick exclusion test
 	F32 mFrustRadiusSquared;
@@ -128,7 +141,7 @@ class LLCamera
 
 	LLVector3 mWorldPlanePos;		// Position of World Planes (may be offset from camera)
 public:
-	LLVector3 mAgentFrustum[8];  //8 corners of 6-plane frustum
+	LLVector3 mAgentFrustum[AGENT_FRUSTRUM_NUM];  //8 corners of 6-plane frustum
 	F32	mFrustumCornerDist;		//distance to corner of frustum against far clip plane
 	LLPlane& getAgentPlane(U32 idx) { return mAgentPlanes[idx]; }
 
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 47041a2880710e50e201cca400a3e35f44511b0d..f2a3e059ef64e9d7c214b9d6cbf2674c35f9e420 100755
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -72,7 +72,8 @@
 
 static const U32 EASY_HANDLE_POOL_SIZE		= 5;
 static const S32 MULTI_PERFORM_CALL_REPEAT	= 5;
-static const S32 CURL_REQUEST_TIMEOUT = 30; // seconds per operation
+static const S32 CURL_REQUEST_TIMEOUT = 120; // seconds per operation
+static const S32 CURL_CONNECT_TIMEOUT = 30; //seconds to wait for a connection
 static const S32 MAX_ACTIVE_REQUEST_COUNT = 100;
 
 // DEBUG //
@@ -517,6 +518,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,
 	//don't verify host name so urls with scrubbed host names will work (improves DNS performance)
 	setopt(CURLOPT_SSL_VERIFYHOST, 0);
 	setopt(CURLOPT_TIMEOUT, llmax(time_out, CURL_REQUEST_TIMEOUT));
+	setopt(CURLOPT_CONNECTTIMEOUT, CURL_CONNECT_TIMEOUT);
 
 	setoptString(CURLOPT_URL, url);
 
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 28ed051c5537a606873ecd8db38b48f0efd4f4ae..5ed05e220113a526a0a8ec9dbf56eb456489284c 100755
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -628,25 +628,41 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac
 			if (v)
 			{
 				U32 v_idx = idx[j*stride+v_offset]*3;
+				v_idx = llclamp(v_idx, (U32) 0, (U32) v->getCount());
 				vert.getPosition().set(v->get(v_idx),
 								v->get(v_idx+1),
 								v->get(v_idx+2));
 			}
 			
-			if (n)
+			//bounds check n and t lookups because some FBX to DAE converters
+			//use negative indices and empty arrays to indicate data does not exist
+			//for a particular channel
+			if (n && n->getCount() > 0)
 			{
 				U32 n_idx = idx[j*stride+n_offset]*3;
+				n_idx = llclamp(n_idx, (U32) 0, (U32) n->getCount());
 				vert.getNormal().set(n->get(n_idx),
 								n->get(n_idx+1),
 								n->get(n_idx+2));
 			}
+			else
+			{
+				vert.getNormal().clear();
+			}
+
 			
-			if (t)
+			if (t && t->getCount() > 0)
 			{
 				U32 t_idx = idx[j*stride+t_offset]*2;
+				t_idx = llclamp(t_idx, (U32) 0, (U32) t->getCount());
 				vert.mTexCoord.setVec(t->get(t_idx),
 								t->get(t_idx+1));								
 			}
+			else
+			{
+				vert.mTexCoord.clear();
+			}
+
 						
 			verts.push_back(vert);
 		}
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 088ba95b7502a282261c6320c1f64296135cbff0..c3005f1722b2f4677588dba987a09770d6d2bc68 100755
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -1154,7 +1154,8 @@ void LLGLManager::initExtensions()
 	// Misc
 	glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);
 	glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange);
-	
+	glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*) &mGLMaxTextureSize);
+
 #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS
 	LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL;
 	if (mHasVertexBufferObject)
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index 60597fd090943c42d6a8eeaaf38a216eb55aac5a..75e5fe86ec0ce1447b6df43b9fc62c3afe7fa0da 100755
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -155,6 +155,7 @@ class LLGLManager
 	S32 mVRAM; // VRAM in MB
 	S32 mGLMaxVertexRange;
 	S32 mGLMaxIndexRange;
+	S32 mGLMaxTextureSize;
 	
 	void getPixelFormat(); // Get the best pixel format
 
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
old mode 100644
new mode 100755
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index 6e22712b94f8158b3d099c627ba71337156f42b9..d53c37a8475835f5c90add214e8d5ecb036ef3d1 100755
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -117,8 +117,8 @@ void LLRenderTarget::resize(U32 resx, U32 resy, U32 color_fmt)
 
 bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)
 {
-	resx = llmin(resx, (U32) 4096);
-	resy = llmin(resy, (U32) 4096);
+	resx = llmin(resx, (U32) gGLManager.mGLMaxTextureSize);
+	resy = llmin(resy, (U32) gGLManager.mGLMaxTextureSize);
 
 	stop_glerror();
 	release();
diff --git a/indra/llui/llscrolllistcolumn.cpp b/indra/llui/llscrolllistcolumn.cpp
index af124d9826a5cc335ef4f6519b4e7cfeab5f2105..cc9ff7a487d60c4dc8ee28d4778ea10b9ccb5f30 100755
--- a/indra/llui/llscrolllistcolumn.cpp
+++ b/indra/llui/llscrolllistcolumn.cpp
@@ -236,7 +236,8 @@ void LLScrollColumnHeader::handleReshape(const LLRect& new_rect, bool by_user)
 		// tell scroll list to layout columns again
 		// do immediate update to get proper feedback to resize handle
 		// which needs to know how far the resize actually went
-		mColumn->mParentCtrl->updateColumns();
+		const bool force_update = true;
+		mColumn->mParentCtrl->updateColumns(force_update);
 	}
 }
 
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 7f04c92b27c07ad7da55d8dc2915671d68fefb64..4adfd42edd3f7e83dfbed91888ff7c5946fe2d8a 100755
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -615,7 +615,6 @@ S32 LLScrollListCtrl::calcMaxContentWidth()
 
 		if (mColumnWidthsDirty)
 		{
-			mColumnWidthsDirty = false;
 			// update max content width for this column, by looking at all items
 			column->mMaxContentWidth = column->mHeader ? LLFontGL::getFontSansSerifSmall()->getWidth(column->mLabel) + mColumnPadding + HEADING_TEXT_PADDING : 0;
 			item_list::iterator iter;
@@ -629,6 +628,7 @@ S32 LLScrollListCtrl::calcMaxContentWidth()
 		}
 		max_item_width += column->mMaxContentWidth;
 	}
+	mColumnWidthsDirty = false;
 
 	return max_item_width;
 }
@@ -643,7 +643,7 @@ bool LLScrollListCtrl::updateColumnWidths()
 		if (!column) continue;
 
 		// update column width
-		S32 new_width = column->getWidth();
+		S32 new_width = 0;
 		if (column->mRelWidth >= 0)
 		{
 			new_width = (S32)llround(column->mRelWidth*mItemListRect.getWidth());
@@ -652,6 +652,10 @@ bool LLScrollListCtrl::updateColumnWidths()
 		{
 			new_width = (mItemListRect.getWidth() - mTotalStaticColumnWidth - mTotalColumnPadding) / mNumDynamicWidthColumns;
 		}
+		else
+		{
+			new_width = column->getWidth();
+		}
 
 		if (column->getWidth() != new_width)
 		{
@@ -693,9 +697,9 @@ void LLScrollListCtrl::updateLineHeightInsert(LLScrollListItem* itemp)
 }
 
 
-void LLScrollListCtrl::updateColumns()
+void LLScrollListCtrl::updateColumns(bool force_update)
 {
-	if (!mColumnsDirty)
+	if (!mColumnsDirty && !force_update)
 		return;
 
 	mColumnsDirty = false;
@@ -749,7 +753,7 @@ void LLScrollListCtrl::updateColumns()
 	}
 
 	// propagate column widths to individual cells
-	if (columns_changed_width)
+	if (columns_changed_width || force_update)
 	{
 		item_list::iterator iter;
 		for (iter = mItemList.begin(); iter != mItemList.end(); iter++)
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 8fa06cc49945016319424c4ddb494fb40a59413f..7bc558f742e4d8295043ad51fc7d9151d9e41803 100755
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -342,7 +342,7 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
 
 	static void onClickColumn(void *userdata);
 
-	virtual void updateColumns();
+	virtual void updateColumns(bool force_update = false);
 	S32 calcMaxContentWidth();
 	bool updateColumnWidths();
 
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 1bb38bbf655f5c3313db95b81055e6cb52b2a2eb..1c9f50202d8fbf07088219cf42af4a9aefe16d5b 100755
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -336,6 +336,8 @@ int yyerror(const char *fmt, ...);
 "ATTACH_HUD_BOTTOM_LEFT" { count(); yylval.ival = 36; return(INTEGER_CONSTANT); }
 "ATTACH_HUD_BOTTOM"		{ count(); yylval.ival = 37; return(INTEGER_CONSTANT); }
 "ATTACH_HUD_BOTTOM_RIGHT"	{ count(); yylval.ival = 38; return(INTEGER_CONSTANT); }
+"ATTACH_NECK"   { count(); yylval.ival = 39; return(INTEGER_CONSTANT); }
+"ATTACH_AVATAR_CENTER"   { count(); yylval.ival = 40; return(INTEGER_CONSTANT); }
 
 "LAND_LEVEL"		{ count(); yylval.ival = E_LANDBRUSH_LEVEL; return(INTEGER_CONSTANT); }
 "LAND_RAISE"		{ count(); yylval.ival = E_LANDBRUSH_RAISE; return(INTEGER_CONSTANT); }
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 4a788a01dad42913228f213ad78fbb1fb8cb0928..0f44168a4d54427731b95473ed03e4730fe645b6 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-3.6.3
+3.6.4
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index f0d8b77afd8ea7748cfa6abb687f25a1d0a72261..a87310955fa929d2952741f27a903971398779e9 100755
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -274,7 +274,8 @@ ATTACH_LLLEG		Passed to llAttachToAvatar to attach task to left lower leg
 ATTACH_BELLY		Passed to llAttachToAvatar to attach task to belly
 ATTACH_LEFT_PEC		Passed to llAttachToAvatar to attach task to left pectoral
 ATTACH_RIGHT_PEC	Passed to llAttachToAvatar to attach task to right pectoral
-
+ATTACH_NECK			Passed to llAttachToAvatar to attach task to neck
+ATTACH_AVATAR_CENTER	Passed to llAttachToAvatar to attach task to avatar center
 LAND_LEVEL			Passed to llModifyLand to level terrain
 LAND_RAISE			Passed to llModifyLand to raise terrain
 LAND_LOWER			Passed to llModifyLand to lower terrain
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 54624e3f1d6bd48d0bcb898f1418e4c65a90dfd9..284bc85798468393ebb0aa2235027a48b0720be0 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -8456,6 +8456,18 @@
     <integer>0</integer>
   </map>
 
+  <key>RenderDepthOfFieldInEditMode</key>
+  <map>
+    <key>Comment</key>
+    <string>Whether to use depth of field effect when in edit mode</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>0</integer>
+  </map>
+
   <key>CameraDoFResScale</key>
   <map>
     <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
index 43ed41a2050c11affab3e55a044787fa7be14bf3..efd0d03965725dcdd8b3fcb42efc68c0c9718690 100755
--- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -45,3 +45,4 @@ mat4 getObjectSkinnedTransform()
 		
 	return mat;
 }
+
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index c64e11929df8b09d55a9d2787487405d50eb2c3e..122577b13236c49e45a0a127c2cac60b6245b307 100755
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -38,7 +38,7 @@ ATI 3D-Analyze							.*ATI.*3D-Analyze.*									0	0	0	0
 ATI All-in-Wonder 7500					.*ATI.*All-in-Wonder 75.*							0	1	0	0
 ATI All-in-Wonder 8500					.*ATI.*All-in-Wonder 85.*							0	1	0	0
 ATI All-in-Wonder 9200					.*ATI.*All-in-Wonder 92.*							0	1	0	0
-ATI All-in-Wonder 9xxx					.*ATI.*All-in-Wonder 9.*				1	1	0	0
+ATI All-in-Wonder 9xxx					.*ATI.*All-in-Wonder 9.*							1	1	0	2.1
 ATI All-in-Wonder HD					.*ATI.*All-in-Wonder HD.*							1	1	1	3.3
 ATI All-in-Wonder X600					.*ATI.*All-in-Wonder X6.*							1	1	0	0
 ATI All-in-Wonder X800					.*ATI.*All-in-Wonder X8.*							1	1	1	2.1
@@ -46,162 +46,132 @@ ATI All-in-Wonder X1800					.*ATI.*All-in-Wonder X18.*							3	1	0	0
 ATI All-in-Wonder X1900					.*ATI.*All-in-Wonder X19.*							3	1	0	0
 ATI All-in-Wonder PCI-E					.*ATI.*All-in-Wonder.*PCI-E.*						1	1	0	0
 ATI All-in-Wonder Radeon				.*ATI.*All-in-Wonder Radeon.*						0	1	0	0
-ATI ASUS ARES							.*ATI.*ASUS.*ARES.*						3	1	0	0
-ATI ASUS A9xxx							.*ATI.*ASUS.*A9.*						1	1	0	0
-ATI ASUS AH24xx							.*ATI.*ASUS.*AH24.*						1	1	1	3.3
-ATI ASUS AH26xx							.*ATI.*ASUS.*AH26.*						1	1	1	3.3
-ATI ASUS AH34xx							.*ATI.*ASUS.*AH34.*						1	1	1	3.3
-ATI ASUS AH36xx							.*ATI.*ASUS.*AH36.*						1	1	1	3.3
-ATI ASUS AH46xx							.*ATI.*ASUS.*AH46.*						2	1	1	3.3
-ATI ASUS AX3xx							.*ATI.*ASUS.*AX3.*						1	1	0	0
-ATI ASUS AX5xx							.*ATI.*ASUS.*AX5.*						1	1	0	0
-ATI ASUS AX8xx							.*ATI.*ASUS.*AX8.*						2	1	0	0
-ATI ASUS EAH24xx						.*ATI.*ASUS.*EAH24.*					2	1	0	0
-ATI ASUS EAH26xx						.*ATI.*ASUS.*EAH26.*					3	1	0	0
-ATI ASUS EAH29xx						.*ATI.*ASUS.*EAH29.*					3	1	0	0
-ATI ASUS EAH34xx						.*ATI.*ASUS.*EAH34.*					1	1	0	0
-ATI ASUS EAH36xx						.*ATI.*ASUS.*EAH36.*					2	1	0	0
-ATI ASUS EAH38xx						.*ATI.*ASUS.*EAH38.*					2	1	1	3.3
-ATI ASUS EAH43xx						.*ATI.*ASUS.*EAH43.*					2	1	1	3.3
-ATI ASUS EAH45xx						.*ATI.*ASUS.*EAH45.*					2	1	0	0
-ATI ASUS EAH48xx						.*ATI.*ASUS.*EAH48.*					3	1	1	3.3
-ATI ASUS EAH57xx						.*ATI.*ASUS.*EAH57.*					3	1	1	4.1
-ATI ASUS EAH58xx						.*ATI.*ASUS.*EAH58.*					5	1	1	4.1
-ATI ASUS EAH62xx						.*ATI.*ASUS.*EAH62.*					2	1	0	0
-ATI ASUS EAH63xx						.*ATI.*ASUS.*EAH63.*					2	1	0	0
-ATI ASUS EAH64xx						.*ATI.*ASUS.*EAH64.*					2	1	0	0
-ATI ASUS EAH65xx						.*ATI.*ASUS.*EAH65.*					2	1	0	4.1
-ATI ASUS EAH66xx						.*ATI.*ASUS.*EAH66.*					3	1	0	4.1
-ATI ASUS EAH67xx						.*ATI.*ASUS.*EAH67.*					3	1	0	0
-ATI ASUS EAH68xx						.*ATI.*ASUS.*EAH68.*					5	1	0	4
-ATI ASUS EAH69xx						.*ATI.*ASUS.*EAH69.*					5	1	0	4.1
-ATI ASUS Radeon X1xxx					.*ATI.*ASUS.*X1.*						2	1	1	2.1
-ATI Radeon X7xx							.*ATI.*ASUS.*X7.*						1	1	0	0
-ATI Radeon X19xx						.*ATI.*(Radeon|Diamond) X19.* ?.*		2	1	1	2.1
-ATI Radeon X18xx						.*ATI.*(Radeon|Diamond) X18.* ?.*		3	1	1	2.1
+ATI Radeon X1300						.*ATI.*(ASUS|Radeon).*X13.*							2	1	1	2.1
+ATI Radeon X1500						.*ATI.*(ASUS|Radeon).*X15.*							2	1	1	2.1
+ATI Radeon X1600						.*ATI.*(ASUS|Radeon).*X16.*							2	1	1	2.1
+ATI Radeon X1700						.*ATI.*(ASUS|Radeon).*X17.*							2	1	1	2.1
+ATI Radeon X1800						.*ATI.*(Radeon|Diamond) X18.* ?.*					3	1	1	2.1
+ATI Radeon X1900						.*ATI.*(Radeon|Diamond|ASUS) X19.* ?.*				2	1	1	2.1
 ATI Radeon X17xx						.*ATI.*(Radeon|Diamond) X17.* ?.*					1	1	1	2.1
-ATI Radeon X16xx						.*ATI.*(Radeon|Diamond) X16.* ?.*		1	1	1	2.1
-ATI Radeon X15xx						.*ATI.*(Radeon|Diamond) X15.* ?.*		1	1	1	2.1
-ATI Radeon X13xx						.*ATI.*(Radeon|Diamond) X13.* ?.*		1	1	1	2.1
-ATI Radeon X1xxx						.*ATI.*(Radeon|Diamond) X1.. ?.*		0	1	1	2.1
-ATI Radeon X2xxx						.*ATI.*(Radeon|Diamond) X2.. ?.*		1	1	1	2.1
+ATI Radeon X16xx						.*ATI.*(Radeon|Diamond) X17.* ?.*					1	1	1	2.1
+ATI Radeon X28xx						.*ATI.*(Radeon|Diamond) X28.. ?.*					1	1	1	2.1
 ATI Display Adapter						.*ATI.*display adapter.*							1	1	1	4.1
 ATI FireGL 5200							.*ATI.*FireGL V52.*									1	1	1	2.1
 ATI FireGL 5xxx							.*ATI.*FireGL V5.*									2	1	1	3.3
 ATI FireGL								.*ATI.*Fire.*GL.*									4	1	1	4.2
-ATI FirePro M3900						.*ATI.*FirePro.*M39.*					2	1	0	0
+ATI FirePro M3900						.*ATI.*FirePro.*M39.*								2	1	0	4.1
 ATI FirePro M5800						.*ATI.*FirePro.*M58.*								3	1	0	0
 ATI FirePro M7740						.*ATI.*FirePro.*M77.*								3	1	0	0
 ATI FirePro M7820						.*ATI.*FirePro.*M78.*								5	1	1	4.2
-ATI FireMV								.*ATI.*FireMV.*							0	1	1	1.3
+ATI FireMV								.*ATI.*FireMV.*										0	1	1	3.2
 ATI Generic								.*ATI.*Generic.*									0	0	0	0
 ATI Hercules 9800						.*ATI.*Hercules.* 9800.*							1	1	0	0
-ATI IGP 340M							.*ATI.*IGP.*340M.*						0	0	0	0
+ATI IGP 340M							.*ATI.*IGP.* 34[0-9]M.*								0	0	0	1.3
 ATI M52									.*ATI.*M52.*										1	1	0	0
 ATI M54									.*ATI.*M54.*										1	1	0	0
 ATI M56									.*ATI.*M56.*										1	1	0	0
 ATI M71									.*ATI.*M71.*										1	1	0	0
 ATI M72									.*ATI.*M72.*										1	1	0	0
 ATI M76									.*ATI.*M76.*										3	1	0	0
-ATI Radeon HD 64xx						.*ATI.*AMD Radeon.* HD [67]4..[MG]		2	1	1	4.2
-ATI Radeon HD 65xx						.*ATI.*AMD Radeon.* HD [67]5..[MG]		2	1	1	4.2
-ATI Radeon HD 66xx						.*ATI.*AMD Radeon.* HD [67]6..[MG]		3	1	1	4.2
-ATI Radeon HD 7100						.*ATI.*AMD Radeon.* HD 71.*				2	1	0	0
-ATI Radeon HD 7200						.*ATI.*AMD Radeon.* HD 72.*				2	1	0	0
-ATI Radeon HD 7300						.*ATI.*AMD Radeon.* HD 73.*				2	1	0	4.2
-ATI Radeon HD 7400						.*ATI.*AMD Radeon.* HD 74.*				2	1	0	4.2
-ATI Radeon HD 7500						.*ATI.*AMD Radeon.* HD 75.*				3	1	1	4.2
-ATI Radeon HD 7600						.*ATI.*AMD Radeon.* HD 76.*				3	1	0	4.2
-ATI Radeon HD 7700						.*ATI.*AMD Radeon.* HD 77.*				4	1	1	4.2
-ATI Radeon HD 7800						.*ATI.*AMD Radeon.* HD 78.*				5	1	1	4.2
-ATI Radeon HD 7900						.*ATI.*AMD Radeon.* HD 79.*				5	1	1	4.2
-ATI ASUS HD7100							.*ATI.*ASUS.* HD71.*					2	1	0	0
-ATI ASUS HD7200							.*ATI.*ASUS.* HD72.*					2	1	0	0
-ATI ASUS HD7300							.*ATI.*ASUS.* HD73.*					2	1	0	0
-ATI ASUS HD7400							.*ATI.*ASUS.* HD74.*					2	1	0	0
-ATI ASUS HD7500							.*ATI.*ASUS.* HD75.*					3	1	1	4.2
-ATI ASUS HD7600							.*ATI.*ASUS.* HD76.*					3	1	0	0
-ATI ASUS HD7700							.*ATI.*ASUS.* HD77.*					4	1	1	4.2
-ATI ASUS HD7800							.*ATI.*ASUS.* HD78.*					5	1	1	4.2
-ATI ASUS HD7900							.*ATI.*ASUS.* HD79.*					5	1	1	4.2
+ATI Radeon HD 6300M						.*ATI.*AMD Radeon.* (HD|HD )63..M					2	1	1	4.2
+ATI Radeon HD 6400M						.*ATI.*AMD Radeon.* (HD|HD )64..M					2	1	1	4.2
+ATI Radeon HD 6500M						.*ATI.*AMD Radeon.* (HD|HD )65..M					2	1	1	4.2
+ATI Radeon HD 6600M						.*ATI.*AMD Radeon.* (HD 6|6)6..M					3	1	1	4.2
+ATI Radeon HD 6700M						.*ATI.*AMD Radeon.* (HD|HD )67..M					3	1	1	4.2
+ATI Radeon HD 6800M						.*ATI.*AMD Radeon.* (HD|HD )68..M					3	1	1	4.2
+ATI Radeon HD 6300G						.*ATI.*AMD Radeon.* (HD|HD )63..G					2	1	1	4.2
+ATI Radeon HD 6400G						.*ATI.*AMD Radeon.* (HD|HD )64..G					2	1	1	4.2
+ATI Radeon HD 6500G						.*ATI.*AMD Radeon.* (HD|HD )65..G					2	1	1	4.2
+ATI Radeon HD 6600G						.*ATI.*AMD Radeon.* (HD|HD )66..G					3	1	1	4.2
+ATI Radeon HD 7100						.*ATI.*(Radeon|ASUS).* (HD|HD )71.*					2	1	0	0
+ATI Radeon HD 7200						.*ATI.*(Radeon|ASUS).* (HD|HD )72.*					2	1	0	4.2
+ATI Radeon HD 7300						.*ATI.*(Radeon|ASUS).* (HD|HD )73.*					2	1	0	4.2
+ATI Radeon HD 7400						.*ATI.*(Radeon|ASUS).* (HD|HD )74.*					2	1	0	4.2
+ATI Radeon HD 7500						.*ATI.*(Radeon|ASUS).* (HD|HD )75.*					3	1	1	4.2
+ATI Radeon HD 7600						.*ATI.*(Radeon|ASUS).* (HD|HD )76.*					3	1	0	4.2
+ATI Radeon HD 7700						.*ATI.*(Radeon|ASUS).* (HD|HD )77.*					4	1	1	4.2
+ATI Radeon HD 7800						.*ATI.*(Radeon|ASUS).* (HD|HD )78.*					5	1	1	4.2
+ATI Radeon HD 7900						.*ATI.*(Radeon|ASUS).* (HD|HD )79.*					5	1	1	4.2
+ATI Radeon HD 7000 Series				.*ATI.*(Radeon|ASUS).* (HD|HD )7000 Series.*		3	1	1	4.2
 ATI Mobility Radeon 4100				.*ATI.*Mobility.* 41..								1	1	1	3.3
+ATI Mobility Radeon 5000				.*ATI.*Mobility.* 50..								1	1	1	4.2
 ATI Mobility Radeon 7xxx				.*ATI.*Mobility.*Radeon 7.*							0	1	1	1.3
 ATI Mobility Radeon 8xxx				.*ATI.*Mobility.*Radeon 8.*							0	1	0	0
 ATI Mobility Radeon 9800				.*ATI.*Mobility.* 98.*								1	1	0	0
 ATI Mobility Radeon 9700				.*ATI.*Mobility.* 97.*								0	1	1	2.1
 ATI Mobility Radeon 9600				.*ATI.*Mobility.* 96.*								1	1	1	2.1
-ATI Mobility Radeon HD 530v				.*ATI.*Mobility.*HD *530v.*				1	1	1	3.3
-ATI Mobility Radeon HD 540v				.*ATI.*Mobility.*HD *540v.*				1	1	1	3.3
-ATI Mobility Radeon HD 545v				.*ATI.*Mobility.*HD *545v.*				2	1	1	4
-ATI Mobility Radeon HD 550v				.*ATI.*Mobility.*HD *550v.*				3	1	1	4
-ATI Mobility Radeon HD 560v				.*ATI.*Mobility.*HD *560v.*				3	1	1	3.2
-ATI Mobility Radeon HD 565v				.*ATI.*Mobility.*HD *565v.*				3	1	1	3.3
-ATI Mobility Radeon HD 2300				.*ATI.*Mobility.*HD *23.*				0	1	1	2.1
-ATI Mobility Radeon HD 2400				.*ATI.*Mobility.*HD *24.*				1	1	1	3.3
-ATI Mobility Radeon HD 2600				.*ATI.*Mobility.*HD *26.*				1	1	1	3.3
-ATI Mobility Radeon HD 2700				.*ATI.*Mobility.*HD *27.*				3	1	0	0
-ATI Mobility Radeon HD 3100				.*ATI.*Mobility.*HD *31.*				0	1	0	0
-ATI Mobility Radeon HD 3200				.*ATI.*Mobility.*HD *32.*				0	1	0	0
-ATI Mobility Radeon HD 3400				.*ATI.*Mobility.*HD *34.*				1	1	1	3.3
-ATI Mobility Radeon HD 3600				.*ATI.*Mobility.*HD *36.*				1	1	1	4
-ATI Mobility Radeon HD 3800				.*ATI.*Mobility.*HD *38.*				3	1	1	3.3
-ATI Mobility Radeon HD 4200				.*ATI.*Mobility.*HD *42.*				1	1	1	4
-ATI Mobility Radeon HD 4300				.*ATI.*Mobility.*HD *43.*				1	1	1	4
-ATI Mobility Radeon HD 4500				.*ATI.*Mobility.*HD *45.*				1	1	1	4
-ATI Mobility Radeon HD 4600				.*ATI.*Mobility.*HD *46.*				2	1	1	3.3
-ATI Mobility Radeon HD 4800				.*ATI.*Mobility.*HD *48.*				3	1	1	3.3
-ATI Mobility Radeon HD 5100				.*ATI.*Mobility.*HD *51.*				3	1	1	3.2
-ATI Mobility Radeon HD 5300				.*ATI.*Mobility.*HD *53.*				3	1	0	0
-ATI Mobility Radeon HD 5400				.*ATI.*Mobility.*HD *54.*				2	1	1	4.2
-ATI Mobility Radeon HD 5500				.*ATI.*Mobility.*HD *55.*				3	1	0	0
-ATI Mobility Radeon HD 5600				.*ATI.*Mobility.*HD *56.*				3	1	1	4.2
-ATI Mobility Radeon HD 5700				.*ATI.*Mobility.*HD *57.*				3	1	1	4.1
-ATI Mobility Radeon HD 6200				.*ATI.*Mobility.*HD *62.*				3	1	0	0
-ATI Mobility Radeon HD 6300				.*ATI.*Mobility.*HD *63.*				3	1	1	4.2
-ATI Mobility Radeon HD 6400M			.*ATI.*Mobility.*HD *64.*				3	1	0	0
-ATI Mobility Radeon HD 6500M			.*ATI.*Mobility.*HD *65.*				5	1	1	4.2
-ATI Mobility Radeon HD 6600M			.*ATI.*Mobility.*HD *66.*				5	1	0	0
-ATI Mobility Radeon HD 6700M			.*ATI.*Mobility.*HD *67.*				5	1	0	0
-ATI Mobility Radeon HD 6800M			.*ATI.*Mobility.*HD *68.*				5	1	0	0
-ATI Mobility Radeon HD 6900M			.*ATI.*Mobility.*HD *69.*				5	1	0	0
-ATI Radeon HD 2300						.*ATI.*Radeon HD *23..					0	1	1	3.3
-ATI Radeon HD 2400						.*ATI.*Radeon HD *24..					1	1	1	4
-ATI Radeon HD 2600						.*ATI.*Radeon HD *26..					2	1	1	3.3
-ATI Radeon HD 2900						.*ATI.*Radeon HD *29..					3	1	1	3.3
-ATI Radeon HD 3000						.*ATI.*Radeon HD *30..					0	1	0	0
-ATI Radeon HD 3100						.*ATI.*Radeon HD *31..					1	1	0	0
-ATI Radeon HD 3200						.*ATI.*Radeon HD *32..					1	1	1	4
-ATI Radeon HD 3300						.*ATI.*Radeon HD *33..					1	1	1	3.3
-ATI Radeon HD 3400						.*ATI.*Radeon HD *34..					1	1	1	4
-ATI Radeon HD 3500						.*ATI.*Radeon HD *35..					2	1	0	0
-ATI Radeon HD 3600						.*ATI.*Radeon HD *36..					3	1	1	3.3
-ATI Radeon HD 3700						.*ATI.*Radeon HD *37..					3	1	0	0
+ATI Mobility Radeon HD 530v				.*ATI.*Mobility.*HD 530v.*							1	1	1	3.3
+ATI Mobility Radeon HD 540v				.*ATI.*Mobility.*HD 540v.*							1	1	1	3.3
+ATI Mobility Radeon HD 545v				.*ATI.*Mobility.*HD 545v.*							2	1	1	4
+ATI Mobility Radeon HD 550v				.*ATI.*Mobility.*HD 550v.*							3	1	1	4
+ATI Mobility Radeon HD 560v				.*ATI.*Mobility.*HD 560v.*							3	1	1	3.2
+ATI Mobility Radeon HD 565v				.*ATI.*Mobility.*HD 565v.*							3	1	1	3.3
+ATI Mobility Radeon HD 2300				.*ATI.*Mobility.*HD 23.*							0	1	1	2.1
+ATI Mobility Radeon HD 2400				.*ATI.*Mobility.*HD 24.*							1	1	1	3.3
+ATI Mobility Radeon HD 2600				.*ATI.*Mobility.*HD 26.*							1	1	1	3.3
+ATI Mobility Radeon HD 2700				.*ATI.*Mobility.*HD 27.*							3	1	0	0
+ATI Mobility Radeon HD 3100				.*ATI.*Mobility.*HD 31.*							0	1	0	0
+ATI Mobility Radeon HD 3200				.*ATI.*Mobility.*HD 32.*							0	1	0	0
+ATI Mobility Radeon HD 3400				.*ATI.*Mobility.*HD 34.*							1	1	1	4
+ATI Mobility Radeon HD 3600				.*ATI.*Mobility.*HD 36.*							1	1	1	4
+ATI Mobility Radeon HD 3800				.*ATI.*Mobility.*HD 38.*							3	1	1	3.3
+ATI Mobility Radeon HD 4200				.*ATI.*Mobility.*HD 42.*							1	1	1	4
+ATI Mobility Radeon HD 4300				.*ATI.*Mobility.*(HD |HD)43.*						1	1	1	4
+ATI Mobility Radeon HD 4500				.*ATI.*Mobility.*HD 45.*							1	1	1	4
+ATI Mobility Radeon HD 4600				.*ATI.*Mobility.*HD 46.*							2	1	1	3.3
+ATI Mobility Radeon HD 4800				.*ATI.*Mobility.*HD 48.*							3	1	1	3.3
+ATI Mobility Radeon HD 5000 Series		.*ATI.*Mobility.*HD 50.*							3	1	1	3.2
+ATI Mobility Radeon HD 5100				.*ATI.*Mobility.*HD 51.*							3	1	1	3.2
+ATI Mobility Radeon HD 5300				.*ATI.*Mobility.*HD 53.*							3	1	0	0
+ATI Mobility Radeon HD 5400				.*ATI.*Mobility.*HD 54.*							2	1	1	4.2
+ATI Mobility Radeon HD 5500				.*ATI.*Mobility.*HD 55.*							3	1	0	4.2
+ATI Mobility Radeon HD 5600				.*ATI.*Mobility.*HD 56.*							3	1	1	4.2
+ATI Mobility Radeon HD 5700				.*ATI.*Mobility.*HD 57.*							3	1	1	4.1
+ATI Mobility Radeon HD 6200				.*ATI.*Mobility.*HD 62.*							3	1	0	0
+ATI Mobility Radeon HD 6300				.*ATI.*Mobility.*HD 63.*							3	1	1	4.2
+ATI Mobility Radeon HD 6400M			.*ATI.*Mobility.*HD 64.*							3	1	0	0
+ATI Mobility Radeon HD 6500M			.*ATI.*Mobility.*HD 65.*							5	1	1	4.2
+ATI Mobility Radeon HD 6600M			.*ATI.*Mobility.*HD 66.*							5	1	0	0
+ATI Mobility Radeon HD 6700M			.*ATI.*Mobility.*HD 67.*							5	1	0	0
+ATI Mobility Radeon HD 6800M			.*ATI.*Mobility.*HD 68.*							5	1	0	0
+ATI Mobility Radeon HD 6900M			.*ATI.*Mobility.*HD 69.*							5	1	0	0
+ATI Mobility Radeon Graphics			.*ATI Mobility Radeon Graphics.*					1	1	0	4
+ATI Radeon HD 2300						.*ATI.*Radeon.* (HD|HD )23..						0	1	1	3.3
+ATI Radeon HD 2400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)24..				1	1	1	4
+ATI Radeon HD 2600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)26..				2	1	1	4
+ATI Radeon HD 2900						.*ATI.*Radeon.* (HD|HD )29..						3	1	1	3.3
+ATI Radeon HD 3000						.*ATI.*Radeon.* (HD|HD )30..						0	1	0	0
+ATI Radeon HD 3100						.*ATI.*Radeon.* (HD|HD )31..						1	1	0	0
+ATI Radeon HD 3200						.*ATI.*Radeon.* (HD|HD )32..						1	1	1	4
+ATI Radeon HD 3300						.*ATI.*Radeon.* (HD|HD )33..						1	1	1	3.3
+ATI Radeon HD 3400						.*ATI.*(Radeon|ASUS).* (HD|HD |AH|EAH)34..			1	1	1	4
+ATI Radeon HD 3500						.*ATI.*Radeon.* (HD|HD )35..						2	1	0	0
+ATI Radeon HD 3600						.*ATI.*(Radeon|ASUS).* (HD|HD |AH|EAH)36..			3	1	1	4
+ATI Radeon HD 3700						.*ATI.*Radeon.* (HD|HD )37..						3	1	0	3.3
 ATI HD3700								.*ATI.* HD37..										3	1	0	3.3
-ATI Radeon HD 3800						.*ATI.*Radeon HD *38..					3	1	1	4
-ATI Radeon HD 4100						.*ATI.*Radeon HD *41..					1	1	0	0
-ATI Radeon HD 4200						.*ATI.*Radeon HD *42..					1	1	1	4
-ATI Radeon HD 4300						.*ATI.*Radeon HD *43..					2	1	1	4
-ATI Radeon HD 4400						.*ATI.*Radeon HD *44..					2	1	0	0
-ATI Radeon HD 4500						.*ATI.*Radeon HD *45..					2	1	1	3.3
-ATI Radeon HD 4600						.*ATI.*Radeon HD *46..					3	1	1	4
-ATI Radeon HD 4700						.*ATI.*Radeon HD *47..					3	1	1	3.3
-ATI Radeon HD 4800						.*ATI.*Radeon HD *48..					3	1	1	4
-ATI ASUS EAH5400						.*ATI.*ASUS EAH54..						3	1	1	4.2
-ATI Radeon HD 5400						.*ATI.*Radeon HD *54..					3	1	1	4.2
-ATI Radeon HD 5500						.*ATI.*Radeon HD *55..					3	1	1	4.2
-ATI ASUS EAH5500						.*ATI.*ASUS EAH55..						3	1	1	4.2
-ATI Radeon HD 5600						.*ATI.*Radeon HD *56..					3	1	1	4.2
-ATI Radeon HD 5700						.*ATI.*Radeon HD *57..					3	1	1	4.2
-ATI Radeon HD 5800						.*ATI.*Radeon HD *58..					4	1	1	4.2
-ATI Radeon HD 5900						.*ATI.*Radeon HD *59..					4	1	1	4.2
-ATI Radeon HD 6200						.*ATI.*Radeon HD *62..					0	1	1	4.2
-ATI Radeon HD 6300						.*ATI.*Radeon HD *63..					1	1	1	4.2
-ATI Radeon HD 6400						.*ATI.*Radeon HD *64..					3	1	1	4.2
-ATI Radeon HD 6500						.*ATI.*Radeon HD *65..					3	1	1	4.2
-ATI Radeon HD 6600						.*ATI.*Radeon HD *66..					3	1	1	4.2
-ATI Radeon HD 6700						.*ATI.*Radeon HD *67..					3	1	1	4.2
-ATI Radeon HD 6800						.*ATI.*Radeon HD *68..					4	1	1	4.2
-ATI Radeon HD 6900						.*ATI.*Radeon HD *69..					5	1	1	4.2
+ATI Radeon HD 3800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)38..				3	1	1	4
+ATI Radeon HD 4100						.*ATI.*Radeon.* (HD|HD )41..						1	1	0	0
+ATI Radeon HD 4200						.*ATI.*Radeon.* (HD|HD )42..						1	1	1	4
+ATI Radeon HD 4300						.*ATI.*(Radeon|ASUS).* (HD4|HD 4|EAH4|4)3..			2	1	1	4
+ATI Radeon HD 4400						.*ATI.*Radeon.* (HD|HD )44..						2	1	0	0
+ATI Radeon HD 4500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)45..				2	1	1	3.3
+ATI Radeon HD 4600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)46..				3	1	1	4
+ATI Radeon HD 4700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)47..				3	1	1	3.3
+ATI Radeon HD 4800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)48..				3	1	1	4
+ATI Radeon HD 5400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)54..				3	1	1	4.2
+ATI Radeon HD 5500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)55..				3	1	1	4.2
+ATI Radeon HD 5600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)56..				3	1	1	4.2
+ATI Radeon HD 5700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)57..				3	1	1	4.2
+ATI Radeon HD 5800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)58..				4	1	1	4.2
+ATI Radeon HD 5900						.*ATI.*Radeon.* (HD|HD )59..						4	1	1	4.2
+ATI Radeon HD 6200						.*ATI.*Radeon.* (HD|HD )62..						0	1	1	4.2
+ATI Radeon HD 6300						.*ATI.*Radeon.* (HD|HD )63..						1	1	1	4.2
+ATI Radeon HD 6400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)64..				3	1	1	4.2
+ATI Radeon HD 6500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)65..				3	1	1	4.2
+ATI Radeon HD 6600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)66..				3	1	1	4.2
+ATI Radeon HD 6700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)67..				3	1	1	4.2
+ATI Radeon HD 6800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)68..				4	1	1	4.2
+ATI Radeon HD 6900						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)69..				5	1	1	4.2
 ATI Radeon OpenGL						.*ATI.*Radeon OpenGL.*								0	0	0	0
 ATI Radeon 2100							.*ATI.*Radeon 21..									0	1	1	2.1
 ATI Radeon 3000							.*ATI.*Radeon 30..									1	1	1	4
@@ -219,17 +189,21 @@ ATI Radeon 9800							.*ATI.*Radeon 98..									1	1	1	2.1
 ATI Radeon RV250						.*ATI.*RV250.*										0	1	0	0
 ATI Radeon RV600						.*ATI.*RV6.*										1	1	0	0
 ATI Radeon RX700						.*ATI.*RX70.*										1	1	0	0
-ATI Radeon RX800						.*ATI.*Radeon *RX80.*					2	1	0	0
+ATI Radeon RX800						.*ATI.*Radeon RX80.*								2	1	0	0
 ATI RS880M								.*ATI.*RS880M										1	1	0	0
 ATI Radeon RX9550						.*ATI.*RX9550.*										1	1	0	0
 ATI Radeon VE							.*ATI.*Radeon.*VE.*									0	0	0	0
-ATI Radeon X300							.*ATI.*Radeon *X3.*						1	1	1	2.1
+ATI Radeon X300							.*ATI.*Radeon X3.*									1	1	1	2.1
 ATI Radeon X400							.*ATI.*Radeon ?X4.*									0	1	0	0
 ATI Radeon X500							.*ATI.*Radeon ?X5.*									1	1	1	2.1
-ATI Radeon X600							.*ATI.*Radeon ?X6.*						1	1	1	2.1
+ATI Radeon X600							.*ATI.*(Radeon |ASUS Extreme A)X6.*					1	1	1	2.1
 ATI Radeon X700							.*ATI.*Radeon ?X7.*									2	1	1	2.1
 ATI Radeon X800							.*ATI.*Radeon ?X8.*									1	1	1	2.1
 ATI Radeon X900							.*ATI.*Radeon ?X9.*									2	1	0	0
+ATI Radeon X1000						.*ATI.*Radeon ?X10.*								2	1	0	2.1
+ATI Radeon X1200						.*ATI.*Radeon ?X12.*								2	1	0	2.1
+ATI Radeon X1400						.*ATI.*Radeon ?X14.*								2	1	0	2.1
+ATI Radeon X2300						.*ATI.*Radeon ?X23.*								2	1	0	2.1
 ATI Radeon Xpress						.*ATI.*Radeon Xpress.*								0	1	1	2.1
 ATI Rage 128							.*ATI.*Rage 128.*									0	1	0	0
 ATI R300 (9700)							.*R300.*											0	1	1	2.1
@@ -248,41 +222,43 @@ ATI RV530								.*RV530.*											1	1	0	0
 ATI RX480 (Xpress 200P)					.*RX480.*											0	1	0	0
 ATI RX700								.*RX700.*											1	1	0	0
 AMD ANTILLES (HD 6990)					.*(AMD|ATI).*Antilles.*								3	1	0	0
+ATI ROBSON								.*(AMD|ATI).*ROBSON.*								3	1	0	4
 AMD BARTS (HD 6800)						.*(AMD|ATI).*Barts.*								3	1	1	2.1
+AMD WRESTLER							.*(AMD|ATI).*WRESTLER.*								3	1	1	4
+AMD SUMO								.*(AMD|ATI).*SUMO.*									3	1	1	4.1
 AMD CAICOS (HD 6400)					.*(AMD|ATI).*Caicos.*								3	1	0	0
 AMD CAYMAN (HD 6900)					.*(AMD|ATI).*(Cayman|CAYMAM).*						3	1	0	0
-AMD CEDAR (HD 5450)						.*(AMD|ATI).*Cedar.*					2	1	0	0
+AMD CEDAR (HD 5450)						.*(AMD|ATI).*Cedar.*								2	1	0	2.1
 AMD CYPRESS (HD 5800)					.*(AMD|ATI).*Cypress.*								3	1	0	0
 AMD HEMLOCK (HD 5970)					.*(AMD|ATI).*Hemlock.*								3	1	0	0
 AMD JUNIPER (HD 5700)					.*(AMD|ATI).*Juniper.*								3	1	0	0
 AMD PARK								.*(AMD|ATI).*Park.*									3	1	0	0
-AMD REDWOOD (HD 5500/5600)				.*(AMD|ATI).*Redwood.*					3	1	0	0
-AMD TURKS (HD 6500/6600)				.*(AMD|ATI).*Turks.*					3	1	0	0
+AMD REDWOOD (HD 5500/5600)				.*(AMD|ATI).*Redwood.*								3	1	0	1.4
+AMD TURKS (HD 6500/6600)				.*(AMD|ATI).*Turks.*								3	1	0	2.1
 AMD RS780 (HD 3200)						.*RS780.*											0	1	1	2.1
 AMD RS880 (HD 4200)						.*RS880.*											0	1	1	3.2
 AMD RV610 (HD 2400)						.*RV610.*											1	1	0	0
 AMD RV620 (HD 3400)						.*RV620.*											1	1	0	0
 AMD RV630 (HD 2600)						.*RV630.*											2	1	0	0
-AMD RV635 (HD 3600)						.*RV635.*								3	1	0	0
+AMD RV635 (HD 3600)						.*RV635.*											3	1	0	1.4
 AMD RV670 (HD 3800)						.*RV670.*											3	1	0	0
 AMD R680 (HD 3870 X2)					.*R680.*											3	1	0	0
 AMD R700 (HD 4800 X2)					.*R700.*											3	1	0	0
 AMD RV710 (HD 4300)						.*RV710.*											0	1	1	1.4
-AMD RV730 (HD 4600)						.*RV730.*								3	1	0	0
+AMD RV730 (HD 4600)						.*RV730.*											3	1	0	1.4
 AMD RV740 (HD 4700)						.*RV740.*											3	1	0	0
 AMD RV770 (HD 4800)						.*RV770.*											3	1	0	0
 AMD RV790 (HD 4800)						.*RV790.*											3	1	0	0
 ATI 760G/Radeon 3000					.*ATI.*AMD 760G.*									1	1	1	3.3
 ATI 780L/Radeon 3000					.*ATI.*AMD 780L.*									1	1	0	0
 ATI Radeon DDR							.*ATI.*Radeon ?DDR.*								0	1	0	0
-ATI FirePro 2000						.*ATI.*FirePro 2.*						2	1	1	4.1
+ATI FirePro 2000						.*ATI.*FirePro 2.*									2	1	1	4.2
 ATI FirePro 3000						.*ATI.*FirePro V3.*									2	1	0	0
-ATI FirePro 4000						.*ATI.*FirePro V4.*						2	1	0	0
+ATI FirePro 4000						.*ATI.*FirePro V4.*									2	1	0	4.1
 ATI FirePro 5000						.*ATI.*FirePro V5.*									3	1	0	0
 ATI FirePro 7000						.*ATI.*FirePro V7.*									3	1	0	0
 ATI FirePro M							.*ATI.*FirePro M.*									3	1	1	4.2
 ATI R300 (9700)							.*R300.*											0	1	1	2.1
-ATI Radeon								.*ATI.*(Diamond|Radeon).*				0	1	0	4.2
 Intel X3100								.*Intel.*X3100.*									1	1	1	2.1
 Intel GMA 3600							.*Intel.* 3600.*									0	1	1	3
 Intel 830M								.*Intel.*830M										0	0	0	0
@@ -308,8 +284,6 @@ Intel Graphics Media HD					.*Intel.*Graphics Media.*HD.*						1	1	1	2.1
 Intel HD Graphics 2000					.*Intel.*HD Graphics 2.*							2	1	0	4
 Intel HD Graphics 3000					.*Intel.*HD Graphics 3.*							3	1	1	3.1
 Intel HD Graphics 4000					.*Intel.*HD Graphics 4.*							3	1	1	4
-Intel HD2000							.*Intel.*HD2000.*						2	1	0	0
-Intel HD3000							.*Intel.*HD3000.*						3	1	0	0
 Intel HD Graphics						.*Intel.*HD Graphics.*								2	1	1	4
 Intel Mobile 4 Series					.*Intel.*Mobile.* 4 Series.*						0	1	1	2.1
 Intel 4 Series Internal					.*Intel.* 4 Series Internal.*						1	1	1	2.1
@@ -322,113 +296,109 @@ Intel Q45/Q43							.*Intel.*Q4.*										1	1	1	2.1
 Intel B45/B43							.*Intel.*B4.*										1	1	1	2.1
 Intel 3D-Analyze						.*Intel.*3D-Analyze.*								2	1	0	0
 Matrox									.*Matrox.*											0	0	0	0
-Mesa									.*Mesa.*								1	0	1	2.1
+Mesa									.*Mesa.*											1	0	1	3
 Gallium									.*Gallium.*											1	1	1	2.1
-NVIDIA G100M							.*NVIDIA .*100M.*						4	1	1	3.3
-NVIDIA G102M							.*NVIDIA .*102M.*						1	1	1	3.3
-NVIDIA G103M							.*NVIDIA .*103M.*						2	1	1	3.3
-NVIDIA G105M							.*NVIDIA .*105M.*						2	1	1	3.3
-NVIDIA G 110M							.*NVIDIA .*110M.*						1	1	1	3.3
-NVIDIA G 120M							.*NVIDIA .*120M.*						1	1	1	3.3
-NVIDIA G 205M							.*NVIDIA .*205M.*						1	1	0	0
-NVIDIA G 410M							.*NVIDIA .*410M.*						3	1	1	4.2
-NVIDIA GT 120M							.*NVIDIA .*GT *12*M.*					3	1	1	3.3
-NVIDIA GT 130M							.*NVIDIA .*GT *13*M.*					3	1	1	3.3
-NVIDIA GT 140M							.*NVIDIA .*GT *14*M.*					3	1	1	3.3
-NVIDIA GT 150M							.*NVIDIA .*GTS *15*M.*					2	1	0	0
-NVIDIA GTS 160M							.*NVIDIA .*GTS *16*M.*					2	1	0	0
-NVIDIA G210M							.*NVIDIA .*G21*M.*						3	1	0	0
-NVIDIA GT 220M							.*NVIDIA .*GT *22*M.*					3	1	1	3.3
-NVIDIA GT 230M							.*NVIDIA .*GT *23*M.*					3	1	1	3.3
-NVIDIA GT 240M							.*NVIDIA .*GT *24*M.*					3	1	1	3.3
-NVIDIA GTS 250M							.*NVIDIA .*GTS *25*M.*					3	1	0	0
-NVIDIA GTS 260M							.*NVIDIA .*GTS *26*M.*					3	1	0	0
-NVIDIA GTX 260M							.*NVIDIA .*GTX *26*M.*					3	1	0	0
-NVIDIA GTX 270M							.*NVIDIA .*GTX *27*M.*					3	1	0	0
-NVIDIA GTX 280M							.*NVIDIA .*GTX *28*M.*					3	1	0	0
-NVIDIA 300M								.*NVIDIA .*30*M.*						3	1	1	4.2
-NVIDIA G 310M							.*NVIDIA .*31*M.*						2	1	0	0
-NVIDIA GT 320M							.*NVIDIA .*GT *32*M.*					3	1	0	0
-NVIDIA GT 325M							.*NVIDIA .*GT *32*M.*					3	1	1	3.3
-NVIDIA GT 330M							.*NVIDIA .*GT *33*M.*					3	1	1	3.3
-NVIDIA GT 340M							.*NVIDIA .*GT *34*M.*					4	1	1	3.3
-NVIDIA GTS 350M							.*NVIDIA .*GTS *35*M.*					4	1	1	3.3
-NVIDIA GTS 360M							.*NVIDIA .*GTS *360M.*					5	1	1	3.3
-NVIDIA 405M								.*NVIDIA .* 40*M.*						2	1	0	4.2
-NVIDIA 410M								.*NVIDIA .* 41*M.*						3	1	0	0
-NVIDIA GT 415M							.*NVIDIA .*GT *41*M.*					3	1	1	4.2
-NVIDIA GT 420M							.*NVIDIA .*GT *42*M.*					3	1	1	4.2
-NVIDIA GT 430M							.*NVIDIA .*GT *43*M.*					3	1	1	4.2
-NVIDIA GT 440M							.*NVIDIA .*GT *44*M.*					3	1	1	4.2
-NVIDIA GT 450M							.*NVIDIA .*GT *45*M.*					3	1	0	0
-NVIDIA GTX 460M							.*NVIDIA .*GTX *46*M.*					4	1	1	4.2
-NVIDIA GTX 470M							.*NVIDIA .*GTX *47*M.*					3	1	0	0
-NVIDIA GTX 480M							.*NVIDIA .*GTX *48*M.*					3	1	1	4.2
-NVIDIA GT 520M							.*NVIDIA .*GT *52*M.*					3	1	1	4.2
-NVIDIA GT 530M							.*NVIDIA .*GT *53*M.*					3	1	1	4.2
-NVIDIA GT 540M							.*NVIDIA .*GT *54*M.*					3	1	1	4.2
-NVIDIA GT 550M							.*NVIDIA .*GT *55*M.*					3	1	1	4.2
-NVIDIA GTX 560M							.*NVIDIA .*GTX *56*M.*					3	1	0	0
-NVIDIA GTX 570M							.*NVIDIA .*GTX *57*M.*					5	1	0	0
-NVIDIA GTX 580M							.*NVIDIA .*GTX *58*M.*					5	1	1	4.2
-NVIDIA 610M								.*NVIDIA.* 61*M.*						3	1	1	4.2
-NVIDIA GT 620M							.*NVIDIA .*GT *62*M.*					3	1	0	0
-NVIDIA GT 630M							.*NVIDIA .*GT *63*M.*					3	1	0	0
-NVIDIA GT 640M							.*NVIDIA .*GT *64*M.*					3	1	0	0
-NVIDIA GT 650M							.*NVIDIA .*GT *65*M.*					3	1	0	0
-NVIDIA GTX 660M							.*NVIDIA .*GTX *66*M.*					5	1	0	0
-NVIDIA GTX 670M							.*NVIDIA .*GTX *67*M.*					5	1	1	4.2
-NVIDIA GTX 680M							.*NVIDIA .*GTX *68*M.*					5	1	0	0
-NVIDIA GTX 690M							.*NVIDIA .*GTX *69*M.*					5	1	0	0
+NVIDIA G100M							.*NVIDIA .* 10[0-9]M.*								4	1	1	3.3
+NVIDIA G 110M							.*NVIDIA .* 11[0-9]M.*								1	1	1	3.3
+NVIDIA G 120M							.*NVIDIA .* 12[0-9]M.*								1	1	1	3.3
+NVIDIA G 200M							.*NVIDIA .* 20[0-9]M.*								1	1	0	0
+NVIDIA G 410M							.*NVIDIA .* 41[0-9]M.*								3	1	1	4.2
+NVIDIA GT 130M							.*NVIDIA .*GT 13[0-9]M.*							3	1	1	3.3
+NVIDIA GT 140M							.*NVIDIA .*GT 14[0-9]M.*							3	1	1	3.3
+NVIDIA GT 150M							.*NVIDIA .*GTS 15[0-9]M.*							2	1	0	0
+NVIDIA GTS 160M							.*NVIDIA .*GTS 16[0-9]M.*							2	1	0	0
+NVIDIA G210M							.*NVIDIA .*G21[0-9]M.*								3	1	0	3.3
+NVIDIA GT 220M							.*NVIDIA .*GT 22[0-9]M.*							3	1	1	3.3
+NVIDIA GT 230M							.*NVIDIA .*GT 23[0-9]M.*							3	1	1	3.3
+NVIDIA GT 240M							.*NVIDIA .*GT 24[0-9]M.*							3	1	1	3.3
+NVIDIA GTS 250M							.*NVIDIA .*GTS 25[0-9]M.*							3	1	0	3.3
+NVIDIA GTS 260M							.*NVIDIA .*GTS 26[0-9]M.*							3	1	0	0
+NVIDIA GTX 260M							.*NVIDIA .*GTX 26[0-9]M.*							3	1	0	3.3
+NVIDIA GTX 270M							.*NVIDIA .*GTX 27[0-9]M.*							3	1	0	0
+NVIDIA GTX 280M							.*NVIDIA .*GTX 28[0-9]M.*							3	1	0	3.3
+NVIDIA 300M								.*NVIDIA .*GT 30[0-9]M.*							3	1	1	4.2
+NVIDIA G 310M							.*NVIDIA .* 31[0-9]M.*								2	1	0	3.3
+NVIDIA GT 320M							.*NVIDIA .* 32[0-9]M.*								3	1	0	3.3
+NVIDIA GT 330M							.*NVIDIA .*GT 33[0-9]M.*							3	1	1	3.3
+NVIDIA GT 340M							.*NVIDIA .*GT 34[0-9]M.*							4	1	1	3.3
+NVIDIA GTS 350M							.*NVIDIA .*GTS 35[0-9]M.*							4	1	1	3.3
+NVIDIA GTS 360M							.*NVIDIA .*GTS 36[0-9]M.*							5	1	1	3.3
+NVIDIA 400M								.*NVIDIA .* 40[0-9]M.*								2	1	0	0
+NVIDIA 410M								.*NVIDIA .* 41[0-9]M.*								3	1	0	0
+NVIDIA GT 420M							.*NVIDIA .*GT 42[0-9]M.*							3	1	1	4.2
+NVIDIA GT 430M							.*NVIDIA .*GT 43[0-9]M.*							3	1	1	4.2
+NVIDIA GT 440M							.*NVIDIA .*GT 44[0-9]M.*							3	1	1	4.2
+NVIDIA GT 450M							.*NVIDIA .*GT 45[0-9]M.*							3	1	0	0
+NVIDIA GTX 460M							.*NVIDIA .*GTX 46[0-9]M.*							4	1	1	4.3
+NVIDIA GTX 470M							.*NVIDIA .*GTX 47[0-9]M.*							3	1	0	4.2
+NVIDIA GTX 480M							.*NVIDIA .*GTX 48[0-9]M.*							3	1	1	4.2
+NVIDIA GT 520M							.*NVIDIA .*GT 52[0-9]M.*							3	1	1	4.2
+NVIDIA GT 530M							.*NVIDIA .*GT 53[0-9]M.*							3	1	1	4.2
+NVIDIA GT 540M							.*NVIDIA .*GT 54[0-9]M.*							3	1	1	4.2
+NVIDIA GT 550M							.*GeForce GT 55[0-9]M.*								3	1	1	4.2
+NVIDIA GTX 560M							.*NVIDIA .*GTX 56[0-9]M.*							3	1	0	4.2
+NVIDIA GTX 570M							.*NVIDIA .*GTX 57[0-9]M.*							5	1	0	4.2
+NVIDIA GTX 580M							.*NVIDIA .*GTX 58[0-9]M.*							5	1	1	4.2
+NVIDIA 610M								.*NVIDIA.* 61[0-9]M.*								3	1	1	4.2
+NVIDIA GT 620M							.*NVIDIA .*GT 62[0-9]M.*							3	1	0	4.2
+NVIDIA GT 630M							.*NVIDIA .*GT 63[0-9]M.*							3	1	0	4.2
+NVIDIA GT 640M							.*NVIDIA .*GT 64[0-9]M.*							3	1	0	4.2
+NVIDIA GT 650M							.*NVIDIA .*GT 65[0-9]M.*							3	1	0	4.2
+NVIDIA GTX 660M							.*NVIDIA .*GTX 66[0-9]M.*							5	1	0	4.3
+NVIDIA GTX 670M							.*NVIDIA .*GTX 67[0-9]M.*							5	1	1	4.2
+NVIDIA GTX 680M							.*NVIDIA .*GTX 68[0-9]M.*							5	1	0	4.2
+NVIDIA GTX 690M							.*NVIDIA .*GTX 69[0-9]M.*							5	1	0	0
 NVIDIA G100								.*NVIDIA .*G10.*									3	1	1	4.2
-NVIDIA GT 120							.*NVIDIA .*GT *12.*						2	1	0	3
-NVIDIA GT 130							.*NVIDIA .*GT *13.*						2	1	0	3.3
-NVIDIA GTS 150							.*NVIDIA .*GTS *15.*					2	1	0	0
+NVIDIA GT 120							.*NVIDIA .*GT 12.*									2	1	0	3.3
+NVIDIA GT 130							.*NVIDIA .*GT 13.*									2	1	0	3.3
+NVIDIA GT 140							.*NVIDIA .*GT 14.*									2	1	0	3.3
+NVIDIA GTS 150							.*NVIDIA .*GTS 15.*									2	1	0	0
 NVIDIA 200								.*NVIDIA .*GeForce 20.*								2	1	1	3.3
 NVIDIA G200								.*NVIDIA .*GeForce G20.*							2	1	1	3.3
 NVIDIA G210								.*NVIDIA .*GeForce G210.*							3	1	1	3.3
 NVIDIA 210								.*NVIDIA .*GeForce 210.*							3	1	1	3.3
-NVIDIA GT 220							.*NVIDIA .*GT *22.*						2	1	1	3.3
-NVIDIA GT 230							.*NVIDIA .*GT *23.*						2	1	1	3.3
-NVIDIA GT 240							.*NVIDIA .*GT *24.*						4	1	1	3.3
-NVIDIA GTS 240							.*NVIDIA .*GTS *24.*					4	1	1	3.3
-NVIDIA GTS 250							.*NVIDIA .*GTS *25.*					4	1	1	3.3
-NVIDIA GTX 260							.*NVIDIA .*GTX *26.*					4	1	1	3.3
-NVIDIA GTX 270							.*NVIDIA .*GTX *27.*					4	1	0	3.3
-NVIDIA GTX 280							.*NVIDIA .*GTX *28.*					4	1	1	3.3
-NVIDIA GTX 290							.*NVIDIA .*GTX *29.*					5	1	0	3.3
+NVIDIA GT 220							.*NVIDIA .*GT 22.*									2	1	1	3.3
+NVIDIA GT 230							.*NVIDIA .*GT 23.*									2	1	1	3.3
+NVIDIA GT 240							.*NVIDIA .*GT 24.*									4	1	1	3.3
+NVIDIA GTS 240							.*NVIDIA .*GTS 24.*									4	1	1	3.3
+NVIDIA GTS 250							.*NVIDIA .*GTS 25.*									4	1	1	3.3
+NVIDIA GTX 260							.*NVIDIA .*GTX 26.*									4	1	1	3.3
+NVIDIA GTX 270							.*NVIDIA .*GTX 27.*									4	1	0	3.3
+NVIDIA GTX 280							.*NVIDIA .*GTX 28.*									4	1	1	3.3
+NVIDIA GTX 290							.*NVIDIA .*GTX 29.*									5	1	0	3.3
 NVIDIA 310								.*NVIDIA .*GeForce 310.*							3	1	1	3.3
 NVIDIA 315								.*NVIDIA .*GeForce 315.*							3	1	1	3.3
-NVIDIA GT 320							.*NVIDIA .*GT *32.*						3	1	0	3.3
-NVIDIA GT 330							.*NVIDIA .*GT *33.*						3	1	0	3.3
-NVIDIA GT 340							.*NVIDIA .*GT *34.*						3	1	0	0
+NVIDIA GT 320							.*NVIDIA .*GT 32.*									3	1	0	3.3
+NVIDIA GT 330							.*NVIDIA .*GT 33.*									3	1	0	3.3
+NVIDIA GT 340							.*NVIDIA .*GT 34.*									3	1	0	3.3
 NVIDIA 405								.*NVIDIA .* 405.*									3	1	0	3.3
-NVIDIA GT 420							.*NVIDIA .*GT *42.*						3	1	1	4.2
-NVIDIA GT 430							.*NVIDIA .*GT *43.*						3	1	1	4.2
-NVIDIA GT 440							.*NVIDIA .*GT *44.*						4	1	0	4.2
-NVIDIA GTS 450							.*NVIDIA .*GTS *45.*					4	1	1	4.2
-NVIDIA GTX 460							.*NVIDIA .*GTX *46.*					5	1	1	4.3
-NVIDIA GTX 470							.*NVIDIA .*GTX *47.*					5	1	1	4.2
-NVIDIA GTX 480							.*NVIDIA .*GTX *48.*					5	1	1	4.2
-NVIDIA 510								.*NVIDIA .* 510.*						3	1	0	0
-NVIDIA GT 520							.*NVIDIA .*GT *52.*						3	1	1	4.2
-NVIDIA GT 530							.*NVIDIA .*GT *53.*						3	1	1	4.2
-NVIDIA GT 540							.*NVIDIA .*GT *54.*						3	1	1	4.2
-NVIDIA GTX 550							.*NVIDIA .*GTX *55.*					5	1	1	4.3
-NVIDIA GTX 560							.*NVIDIA .*GTX *56.*					5	1	1	4.2
-NVIDIA GTX 570							.*NVIDIA .*GTX *57.*					5	1	1	4.2
-NVIDIA GTX 580							.*NVIDIA .*GTX *58.*					5	1	1	4.3
-NVIDIA GTX 590							.*NVIDIA .*GTX *59.*					5	1	1	4.2
-NVIDIA GT 610							.*NVIDIA .*GT *61.*						3	1	1	4.2
-NVIDIA GT 620							.*NVIDIA .*GT *62.*						3	1	0	4.2
-NVIDIA GT 630							.*NVIDIA .*GT *63.*						3	1	0	4.2
-NVIDIA GT 640							.*NVIDIA .*GT *64.*						3	1	0	4.3
-NVIDIA GT 650							.*NVIDIA .*GT *65.*						3	1	1	4.2
-NVIDIA GTX 650							.*NVIDIA .*GTX *65.*					3	1	1	4.2
-NVIDIA GTX 660							.*NVIDIA .*GTX *66.*					5	1	0	4.3
-NVIDIA GTX 670							.*NVIDIA .*GTX *67.*					5	1	1	4.2
-NVIDIA GTX 680							.*NVIDIA .*GTX *68.*					5	1	1	4.2
-NVIDIA GTX 690							.*NVIDIA .*GTX *69.*					5	1	1	4.2
+NVIDIA GT 420							.*NVIDIA .*GT 42.*									3	1	1	4.2
+NVIDIA GT 430							.*NVIDIA .*GT 43.*									3	1	1	4.3
+NVIDIA GT 440							.*NVIDIA .*GT 44.*									4	1	0	4.3
+NVIDIA GTS 450							.*NVIDIA .*GTS 45.*									4	1	1	4.2
+NVIDIA GTX 460							.*NVIDIA .*GTX 46.*									5	1	1	4.3
+NVIDIA GTX 470							.*NVIDIA .*GTX 47.*									5	1	1	4.2
+NVIDIA GTX 480							.*NVIDIA .*GTX 48.*									5	1	1	4.2
+NVIDIA 510								.*NVIDIA .* 510.*									3	1	0	4.2
+NVIDIA GT 520							.*NVIDIA .*GT 52.*									3	1	1	4.2
+NVIDIA GT 530							.*NVIDIA .*GT 53.*									3	1	1	4.2
+NVIDIA GT 540							.*NVIDIA .*GT 54.*									3	1	1	4.2
+NVIDIA GTX 550							.*NVIDIA .*GTX 55.*									5	1	1	4.3
+NVIDIA GTX 560							.*NVIDIA .*GTX 56.*									5	1	1	4.3
+NVIDIA GTX 570							.*NVIDIA .*GTX 57.*									5	1	1	4.2
+NVIDIA GTX 580							.*NVIDIA .*GTX 58.*									5	1	1	4.3
+NVIDIA GTX 590							.*NVIDIA .*GTX 59.*									5	1	1	4.2
+NVIDIA 605								.*NVIDIA .* 605.*									3	1	1	4.2
+NVIDIA GT 610							.*NVIDIA .*GT 61.*									3	1	1	4.2
+NVIDIA GT 620							.*NVIDIA .*GT 62.*									3	1	0	4.2
+NVIDIA GT 630							.*NVIDIA .*GT 63.*									3	1	0	4.2
+NVIDIA GT 640							.*NVIDIA .*GT 64.*									3	1	0	4.2
+NVIDIA GT 650							.*NVIDIA .*GT 65.*									3	1	1	4.2
+NVIDIA GTX 650							.*NVIDIA .*GTX 65.*									3	1	1	4.2
+NVIDIA GTX 660							.*NVIDIA .*GTX 66.*									5	1	0	4.3
+NVIDIA GTX 670							.*NVIDIA .*GTX 67.*									5	1	1	4.2
+NVIDIA GTX 680							.*NVIDIA .*GTX 68.*									5	1	1	4.2
+NVIDIA GTX 690							.*NVIDIA .*GTX 69.*									5	1	1	4.2
 NVIDIA C51								.*NVIDIA .*C51.*									0	1	1	2
 NVIDIA G72								.*NVIDIA .*G72.*									1	1	0	0
 NVIDIA G73								.*NVIDIA .*G73.*									1	1	0	0
@@ -437,13 +407,7 @@ NVIDIA G86								.*NVIDIA .*G86.*									3	1	0	0
 NVIDIA G92								.*NVIDIA .*G92.*									3	1	0	0
 NVIDIA GeForce							.*GeForce 256.*										0	0	0	0
 NVIDIA GeForce 2						.*GeForce ?2 ?.*									0	1	1	1.5
-NVIDIA GeForce 3						.*GeForce ?3 ?.*						2	1	1	2.1
-NVIDIA GeForce 3 Ti						.*GeForce ?3 Ti.*						0	1	0	0
 NVIDIA GeForce 4						.*NVIDIA .*GeForce ?4.*								0	1	1	1.5
-NVIDIA GeForce 4 Go						.*NVIDIA .*GeForce ?4.*Go.*				0	1	0	0
-NVIDIA GeForce 4 MX						.*NVIDIA .*GeForce ?4 MX.*				0	1	0	0
-NVIDIA GeForce 4 PCX					.*NVIDIA .*GeForce ?4 PCX.*				0	1	0	0
-NVIDIA GeForce 4 Ti						.*NVIDIA .*GeForce ?4 Ti.*				0	1	0	0
 NVIDIA GeForce 6100						.*NVIDIA .*GeForce 61.*								3	1	1	4.2
 NVIDIA GeForce 6200						.*NVIDIA .*GeForce 62.*								0	1	1	2.1
 NVIDIA GeForce 6500						.*NVIDIA .*GeForce 65.*								1	1	1	2.1
@@ -458,33 +422,33 @@ NVIDIA GeForce 7500						.*NVIDIA .*GeForce 75.*								2	1	1	2.1
 NVIDIA GeForce 7600						.*NVIDIA .*GeForce 76.*								2	1	1	2.1
 NVIDIA GeForce 7800						.*NVIDIA .*GeForce 78.*								2	1	1	2.1
 NVIDIA GeForce 7900						.*NVIDIA .*GeForce 79.*								3	1	1	2.1
-NVIDIA GeForce 8100						.*NVIDIA .*GeForce 81.*					1	1	0	0
-NVIDIA GeForce 8200M					.*NVIDIA .*GeForce 8200M.*				1	1	0	3.3
-NVIDIA GeForce 8200						.*NVIDIA .*GeForce 82.*					1	1	0	2.1
+NVIDIA GeForce 8100						.*NVIDIA .*GeForce 81.*								1	1	0	3.3
+NVIDIA GeForce 8200M					.*NVIDIA .*GeForce 820[0-9]M.*						1	1	0	3.3
+NVIDIA GeForce 8200						.*NVIDIA .*GeForce 82.*								1	1	0	3.3
 NVIDIA GeForce 8300						.*NVIDIA .*GeForce 83.*								3	1	1	3.3
-NVIDIA GeForce 8400M					.*NVIDIA .*GeForce 8400M.*				1	1	1	3.3
+NVIDIA GeForce 8400M					.*NVIDIA .*GeForce 840[0-9]M.*						1	1	1	3.3
 NVIDIA GeForce 8400						.*NVIDIA .*GeForce 84.*								2	1	1	3.3
 NVIDIA GeForce 8500						.*NVIDIA .*GeForce 85.*								2	1	1	3.3
-NVIDIA GeForce 8600M					.*NVIDIA .*GeForce 8600M.*				2	1	1	3.3
+NVIDIA GeForce 8600M					.*NVIDIA .*GeForce 860[0-9]M.*						2	1	1	3.3
 NVIDIA GeForce 8600						.*NVIDIA .*GeForce 86.*								3	1	1	3.3
-NVIDIA GeForce 8700M					.*NVIDIA .*GeForce 8700M.*				2	1	1	3.3
+NVIDIA GeForce 8700M					.*NVIDIA .*GeForce 870[0-9]M.*						2	1	1	3.3
 NVIDIA GeForce 8700						.*NVIDIA .*GeForce 87.*								3	1	0	0
-NVIDIA GeForce 8800M					.*NVIDIA .*GeForce 8800M.*				2	1	1	3.3
+NVIDIA GeForce 8800M					.*NVIDIA .*GeForce 880[0-9]M.*						2	1	1	3.3
 NVIDIA GeForce 8800						.*NVIDIA .*GeForce 88.*								3	1	1	3.3
-NVIDIA GeForce 9100M					.*NVIDIA .*GeForce 9100M.*				0	1	0	0
+NVIDIA GeForce 9100M					.*NVIDIA .*GeForce 910[0-9]M.*						0	1	0	3.3
 NVIDIA GeForce 9100						.*NVIDIA .*GeForce 91.*								0	1	0	3.3
-NVIDIA GeForce 9200M					.*NVIDIA .*GeForce 9200M.*				1	1	0	3.1
+NVIDIA GeForce 9200M					.*NVIDIA .*GeForce 920[0-9]M.*						1	1	0	3.3
 NVIDIA GeForce 9200						.*NVIDIA .*GeForce 92.*								1	1	0	3.3
-NVIDIA GeForce 9300M					.*NVIDIA .*GeForce 9300M.*				1	1	1	3.3
+NVIDIA GeForce 9300M					.*NVIDIA .*GeForce 930[0-9]M.*						1	1	1	3.3
 NVIDIA GeForce 9300						.*NVIDIA .*GeForce 93.*								1	1	1	3.3
-NVIDIA GeForce 9400M					.*NVIDIA .*GeForce 9400M.*				2	1	1	3.3
+NVIDIA GeForce 9400M					.*NVIDIA .*GeForce 940[0-9]M.*						2	1	1	3.3
 NVIDIA GeForce 9400						.*NVIDIA .*GeForce 94.*								3	1	1	3.3
-NVIDIA GeForce 9500M					.*NVIDIA .*GeForce 9500M.*				1	1	1	3.3
+NVIDIA GeForce 9500M					.*NVIDIA .*GeForce 950[0-9]M.*						1	1	1	3.3
 NVIDIA GeForce 9500						.*NVIDIA .*GeForce 95.*								3	1	1	3.3
-NVIDIA GeForce 9600M					.*NVIDIA .*GeForce 9600M.*				2	1	1	3.3
+NVIDIA GeForce 9600M					.*NVIDIA .*GeForce 960[0-9]M.*						2	1	1	3.3
 NVIDIA GeForce 9600						.*NVIDIA .*GeForce 96.*								3	1	1	3.3
-NVIDIA GeForce 9700M					.*NVIDIA .*GeForce 9700M.*				0	1	1	3.3
-NVIDIA GeForce 9800M					.*NVIDIA .*GeForce 9800M.*				2	1	1	3.3
+NVIDIA GeForce 9700M					.*NVIDIA .*GeForce 970[0-9]M.*						0	1	1	3.3
+NVIDIA GeForce 9800M					.*NVIDIA .*GeForce 980[0-9]M.*						2	1	1	3.3
 NVIDIA GeForce 9800						.*NVIDIA .*GeForce 98.*								3	1	1	3.3
 NVIDIA GeForce FX 5100					.*NVIDIA .*GeForce FX 51.*							0	1	0	0
 NVIDIA GeForce FX 5200					.*NVIDIA .*GeForce FX 52.*							0	1	0	2.1
@@ -495,7 +459,7 @@ NVIDIA GeForce FX 5700					.*NVIDIA .*GeForce FX 57.*							0	1	1	2.1
 NVIDIA GeForce FX 5800					.*NVIDIA .*GeForce FX 58.*							1	1	0	0
 NVIDIA GeForce FX 5900					.*NVIDIA .*GeForce FX 59.*							1	1	1	2.1
 NVIDIA GeForce FX Go5100				.*NVIDIA .*GeForce FX Go51.*						0	1	0	0
-NVIDIA GeForce FX Go5200				.*NVIDIA .*GeForce FX Go52.*			0	1	0	0
+NVIDIA GeForce FX Go5200				.*NVIDIA .*GeForce FX Go52.*						0	1	0	1.5
 NVIDIA GeForce FX Go5300				.*NVIDIA .*GeForce FX Go53.*						0	1	0	0
 NVIDIA GeForce FX Go5500				.*NVIDIA .*GeForce FX Go55.*						0	1	0	0
 NVIDIA GeForce FX Go5600				.*NVIDIA .*GeForce FX Go56.*						0	1	1	2.1
@@ -504,13 +468,13 @@ NVIDIA GeForce FX Go5800				.*NVIDIA .*GeForce FX Go58.*						1	1	0	0
 NVIDIA GeForce FX Go5900				.*NVIDIA .*GeForce FX Go59.*						1	1	0	0
 NVIDIA GeForce FX Go5xxx				.*NVIDIA .*GeForce FX Go.*							0	1	0	0
 NVIDIA GeForce Go 6100					.*NVIDIA .*GeForce Go 61.*							0	1	1	2.1
-NVIDIA GeForce Go 6200					.*NVIDIA .*GeForce Go 62.*				0	1	0	0
-NVIDIA GeForce Go 6400					.*NVIDIA .*GeForce Go 64.*				1	1	1	2
+NVIDIA GeForce Go 6200					.*NVIDIA .*GeForce Go 62.*							0	1	0	1.5
+NVIDIA GeForce Go 6400					.*NVIDIA .*GeForce Go 64.*							1	1	1	2.1
 NVIDIA GeForce Go 6500					.*NVIDIA .*GeForce Go 65.*							1	1	0	0
 NVIDIA GeForce Go 6600					.*NVIDIA .*GeForce Go 66.*							0	1	1	2.1
 NVIDIA GeForce Go 6700					.*NVIDIA .*GeForce Go 67.*							1	1	0	0
 NVIDIA GeForce Go 6800					.*NVIDIA .*GeForce Go 68.*							0	1	1	2.1
-NVIDIA GeForce Go 7200					.*NVIDIA .*GeForce Go 72.*				1	1	0	0
+NVIDIA GeForce Go 7200					.*NVIDIA .*GeForce Go 72.*							1	1	0	2.1
 NVIDIA GeForce Go 7300 LE				.*NVIDIA .*GeForce Go 73.*LE.*						1	1	0	0
 NVIDIA GeForce Go 7300					.*NVIDIA .*GeForce Go 73.*							1	1	1	2.1
 NVIDIA GeForce Go 7400					.*NVIDIA .*GeForce Go 74.*							1	1	1	2.1
@@ -528,9 +492,9 @@ NVIDIA NB8P								.*NVIDIA .*NB8P.*									2	1	0	0
 NVIDIA NB9E								.*NVIDIA .*NB9E.*									3	1	0	0
 NVIDIA NB9M								.*NVIDIA .*NB9M.*									1	1	0	0
 NVIDIA NB9P								.*NVIDIA .*NB9P.*									2	1	0	0
-NVIDIA N10								.*NVIDIA .*N10.*						1	1	0	0
-NVIDIA GeForce PCX						.*GeForce PCX.*							0	1	0	0
-NVIDIA Generic							.*NVIDIA .*Unknown.*					0	0	0	3
+NVIDIA N10								.*NVIDIA .*N10.*									1	1	0	2.1
+NVIDIA GeForce PCX						.*GeForce PCX.*										0	1	0	1.5
+NVIDIA Generic							.*NVIDIA .*Unknown.*								0	0	0	2.1
 NVIDIA NV17								.*NVIDIA .*NV17.*									0	1	0	0
 NVIDIA NV34								.*NVIDIA .*NV34.*									0	1	0	0
 NVIDIA NV35								.*NVIDIA .*NV35.*									0	1	0	0
@@ -540,7 +504,7 @@ NVIDIA NV43								.*NVIDIA .*NV43.*									1	1	0	0
 NVIDIA NV44								.*NVIDIA .*NV44.*									1	1	0	0
 NVIDIA nForce							.*NVIDIA .*nForce.*									0	0	0	3.3
 NVIDIA MCP51							.*NVIDIA .*MCP51.*									1	1	0	0
-NVIDIA MCP61							.*NVIDIA .*MCP61.*						1	1	0	0
+NVIDIA MCP61							.*NVIDIA .*MCP61.*									1	1	0	2.1
 NVIDIA MCP67							.*NVIDIA .*MCP67.*									1	1	0	0
 NVIDIA MCP68							.*NVIDIA .*MCP68.*									1	1	0	0
 NVIDIA MCP73							.*NVIDIA .*MCP73.*									1	1	0	0
@@ -548,44 +512,44 @@ NVIDIA MCP77							.*NVIDIA .*MCP77.*									1	1	0	0
 NVIDIA MCP78							.*NVIDIA .*MCP78.*									1	1	0	0
 NVIDIA MCP79							.*NVIDIA .*MCP79.*									1	1	0	0
 NVIDIA MCP7A							.*NVIDIA .*MCP7A.*									1	1	0	0
-NVIDIA Quadro2							.*Quadro2.*								0	1	0	0
-NVIDIA Quadro 1000M						.*Quadro.*1000M.*						2	1	0	4.2
-NVIDIA Quadro 2000 M/D					.*Quadro.*2000.*						3	1	0	4.2
-NVIDIA Quadro 3000M						.*Quadro.*3000M.*						3	1	0	0
-NVIDIA Quadro 4000M						.*Quadro.*4000M.*						3	1	0	0
-NVIDIA Quadro 4000						.*Quadro *4000.*						3	1	0	4.2
-NVIDIA Quadro 50x0 M					.*Quadro.*50.0.*						3	1	0	0
+NVIDIA Quadro2							.*Quadro2.*											0	1	0	1.5
+NVIDIA Quadro 1000M						.*Quadro.* (K1|1)00[0-9]M.*							2	1	0	4.2
+NVIDIA Quadro 2000 M/D					.*Quadro.* (K2|2)000.*								3	1	0	4.2
+NVIDIA Quadro 3000M						.*Quadro.* (K3|3)00[0-9]M.*							3	1	0	4.2
+NVIDIA Quadro 4000M						.*Quadro.* (K4|4)00[0-9]M.*							3	1	0	4.2
+NVIDIA Quadro 4000						.*Quadro 4000.*										3	1	0	4.2
+NVIDIA Quadro 50x0 M					.*Quadro.* 50.0.*									3	1	0	4.2
 NVIDIA Quadro 6000						.*Quadro.* 6000.*									3	1	0	0
 NVIDIA Quadro 400						.*Quadro.* 400.*									2	1	0	3.3
-NVIDIA Quadro 600						.*Quadro.*600.*							2	1	0	3.3
-NVIDIA Quadro4							.*Quadro4.*								0	1	0	0
+NVIDIA Quadro 600						.*Quadro.* 600.*									2	1	0	4.2
+NVIDIA Quadro4							.*Quadro4.*											0	1	0	1.5
 NVIDIA Quadro DCC						.*Quadro DCC.*										0	1	0	0
 NVIDIA Quadro CX						.*Quadro.*CX.*										3	1	0	0
-NVIDIA Quadro FX 770M					.*Quadro.*FX *770M.*					2	1	0	0
-NVIDIA Quadro FX 1500M					.*Quadro.*FX *1500M.*					1	1	0	2.1
-NVIDIA Quadro FX 1600M					.*Quadro.*FX *1600M.*					2	1	0	0
-NVIDIA Quadro FX 2500M					.*Quadro.*FX *2500M.*					2	1	0	0
-NVIDIA Quadro FX 2700M					.*Quadro.*FX *2700M.*					3	1	0	0
-NVIDIA Quadro FX 2800M					.*Quadro.*FX *2800M.*					3	1	0	3.3
-NVIDIA Quadro FX 3500					.*Quadro.*FX *3500.*					2	1	0	2.1
-NVIDIA Quadro FX 3600					.*Quadro.*FX *3600.*					3	1	0	0
-NVIDIA Quadro FX 3700					.*Quadro.*FX *3700.*					3	1	0	3.3
-NVIDIA Quadro FX 3800					.*Quadro.*FX *3800.*					3	1	0	3.2
-NVIDIA Quadro FX 4500					.*Quadro.*FX *45.*						3	1	0	0
-NVIDIA Quadro FX 880M					.*Quadro.*FX *880M.*					3	1	0	3.3
-NVIDIA Quadro FX 4800					.*NVIDIA .*Quadro *FX *4800.*			3	1	0	0
+NVIDIA Quadro FX 770M					.*Quadro.*FX 77[0-9]M.*								2	1	0	3.3
+NVIDIA Quadro FX 1500M					.*Quadro.*FX 150[0-9]M.*							1	1	0	2.1
+NVIDIA Quadro FX 1600M					.*Quadro.*FX 160[0-9]M.*							2	1	0	3.3
+NVIDIA Quadro FX 2500M					.*Quadro.*FX 250[0-9]M.*							2	1	0	2.1
+NVIDIA Quadro FX 2700M					.*Quadro.*FX 270[0-9]M.*							3	1	0	3.3
+NVIDIA Quadro FX 2800M					.*Quadro.*FX 280[0-9]M.*							3	1	0	3.3
+NVIDIA Quadro FX 3500					.*Quadro.*FX 3500.*									2	1	0	2.1
+NVIDIA Quadro FX 3600					.*Quadro.*FX 3600.*									3	1	0	3.3
+NVIDIA Quadro FX 3700					.*Quadro.*FX 3700.*									3	1	0	3.3
+NVIDIA Quadro FX 3800					.*Quadro.*FX 3800.*									3	1	0	3.3
+NVIDIA Quadro FX 4500					.*Quadro.*FX 45.*									3	1	0	2.1
+NVIDIA Quadro FX 880M					.*Quadro.*FX 88[0-9]M.*								3	1	0	3.3
+NVIDIA Quadro FX 4800					.*NVIDIA .*Quadro FX 4800.*							3	1	0	3.1
 NVIDIA Quadro FX						.*Quadro FX.*										1	1	0	3.3
-NVIDIA Quadro NVS 1xxM					.*Quadro NVS *1.[05]M.*					0	1	1	3.3
-NVIDIA Quadro NVS 300M					.*NVIDIA .*NVS *300M.*					2	1	0	0
-NVIDIA Quadro NVS 320M					.*NVIDIA .*NVS *320M.*					2	1	0	0
-NVIDIA Quadro NVS 2100M					.*NVIDIA .*NVS *2100M.*					2	1	0	0
-NVIDIA Quadro NVS 3100M					.*NVIDIA .*NVS *3100M.*					2	1	0	0
-NVIDIA Quadro NVS 4200M					.*NVIDIA .*NVS *4200M.*					2	1	0	4.1
-NVIDIA Quadro NVS 5100M					.*NVIDIA .*NVS *5100M.*					2	1	0	0
-NVIDIA Quadro NVS						.*NVIDIA .*NVS							0	1	0	3.2
+NVIDIA Quadro NVS 1xxM					.*Quadro NVS 1.[05]M.*								0	1	1	3.3
+NVIDIA Quadro NVS 300M					.*NVIDIA .*NVS 30[0-9]M.*							2	1	0	0
+NVIDIA Quadro NVS 320M					.*NVIDIA .*NVS 32[0-9]M.*							2	1	0	0
+NVIDIA Quadro NVS 2100M					.*NVIDIA .*NVS 210[0-9]M.*							2	1	0	3.3
+NVIDIA Quadro NVS 3100M					.*NVIDIA .*NVS 310[0-9]M.*							2	1	0	3.3
+NVIDIA Quadro NVS 4200M					.*NVIDIA .*NVS 420[0-9]M.*							2	1	0	4.2
+NVIDIA Quadro NVS 5100M					.*NVIDIA .*NVS 510[0-9]M.*							2	1	0	0
+NVIDIA Quadro NVS						.*NVIDIA .*NVS										0	1	0	4.2
 NVIDIA Corporation N12P					.*NVIDIA .*N12P.*									1	1	1	4.1
-NVIDIA Corporation N11M					.*NVIDIA .*N11M.*						2	1	0	0
-NVIDIA RIVA TNT							.*RIVA TNT.*							0	0	0	0
+NVIDIA Corporation N11M					.*NVIDIA .*N11M.*									2	1	0	3.1
+NVIDIA RIVA TNT							.*RIVA TNT.*										0	0	0	1.5
 S3										.*S3 Graphics.*										0	0	1	1.4
 SiS										SiS.*												0	0	1	1.5
 Trident									Trident.*											0	0	0	0
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 8c6f99326ca62b46d5c43f75bdd9826ac9c4a746..d22376c3b2629a8e8341be26100b99b15919028b 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -4606,11 +4606,6 @@ void LLAppViewer::idle()
 				llinfos << "Dead object updates: " << gObjectList.mNumDeadObjectUpdates << llendl;
 				gObjectList.mNumDeadObjectUpdates = 0;
 			}
-			if (gObjectList.mNumUnknownKills)
-			{
-				llinfos << "Kills on unknown objects: " << gObjectList.mNumUnknownKills << llendl;
-				gObjectList.mNumUnknownKills = 0;
-			}
 			if (gObjectList.mNumUnknownUpdates)
 			{
 				llinfos << "Unknown object updates: " << gObjectList.mNumUnknownUpdates << llendl;
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 075299386e70a039a0389425130ab93c1e2e79f6..a0024a231c95831909063235be5d16e92118c80c 100755
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -135,6 +135,16 @@ void LLDrawPoolAvatar::prerender()
 	{
 		sBufferUsage = GL_STREAM_DRAW_ARB;
 	}
+
+	if (!mDrawFace.empty())
+	{
+		const LLFace *facep = mDrawFace[0];
+		if (facep && facep->getDrawable())
+		{
+			LLVOAvatar* avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
+			updateRiggedVertexBuffers(avatarp);
+		}
+	}
 }
 
 LLMatrix4& LLDrawPoolAvatar::getModelView()
@@ -1434,6 +1444,65 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
 	}
 }
 
+void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
+{
+	face->setGeomIndex(0);
+	face->setIndicesIndex(0);
+		
+	//rigged faces do not batch textures
+	face->setTextureIndex(255);
+
+	if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
+	{ //make a new buffer
+		if (sShaderLevel > 0)
+		{
+			buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
+		}
+		else
+		{
+			buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB);
+		}
+		buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true);
+	}
+	else
+	{ //resize existing buffer
+		buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);
+	}
+
+	face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);
+	face->setVertexBuffer(buffer);
+
+	U16 offset = 0;
+		
+	LLMatrix4 mat_vert = skin->mBindShapeMatrix;
+	glh::matrix4f m((F32*) mat_vert.mMatrix);
+	m = m.inverse().transpose();
+		
+	F32 mat3[] = 
+	{ m.m[0], m.m[1], m.m[2],
+		m.m[4], m.m[5], m.m[6],
+		m.m[8], m.m[9], m.m[10] };
+
+	LLMatrix3 mat_normal(mat3);				
+
+	//let getGeometryVolume know if alpha should override shiny
+	U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture());
+
+	if (type == LLDrawPool::POOL_ALPHA)
+	{
+		face->setPoolType(LLDrawPool::POOL_ALPHA);
+	}
+	else
+	{
+		face->setPoolType(LLDrawPool::POOL_AVATAR);
+	}
+
+	//llinfos << "Rebuilt face " << face->getTEOffset() << " of " << face->getDrawable() << " at " << gFrameTimeSeconds << llendl;
+	face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
+
+	buffer->flush();
+}
+
 void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* face, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
 {
 	LLVector4a* weight = vol_face.mWeights;
@@ -1453,60 +1522,27 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
 		buffer->getNumIndices() != vol_face.mNumIndices ||
 		(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))
 	{
-		face->setGeomIndex(0);
-		face->setIndicesIndex(0);
-		
-		//rigged faces do not batch textures
-		face->setTextureIndex(255);
-
-		if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
-		{ //make a new buffer
-			if (sShaderLevel > 0)
+		if (drawable && drawable->isState(LLDrawable::REBUILD_ALL))
+		{ //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues
+			for (S32 i = 0; i < drawable->getNumFaces(); ++i)
 			{
-				buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
-			}
-			else
-			{
-				buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB);
+				LLFace* facep = drawable->getFace(i);
+				U32 face_data_mask = facep->getRiggedVertexBufferDataMask();
+				if (face_data_mask)
+				{
+					LLPointer<LLVertexBuffer> cur_buffer = facep->getVertexBuffer();
+					const LLVolumeFace& cur_vol_face = volume->getVolumeFace(i);
+					getRiggedGeometry(facep, cur_buffer, face_data_mask, skin, volume, cur_vol_face);
+				}
 			}
-			buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true);
-		}
-		else
-		{ //resize existing buffer
-			buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);
-		}
-
-		face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);
-		face->setVertexBuffer(buffer);
-
-		U16 offset = 0;
-		
-		LLMatrix4 mat_vert = skin->mBindShapeMatrix;
-		glh::matrix4f m((F32*) mat_vert.mMatrix);
-		m = m.inverse().transpose();
-		
-		F32 mat3[] = 
-		{ m.m[0], m.m[1], m.m[2],
-		  m.m[4], m.m[5], m.m[6],
-		  m.m[8], m.m[9], m.m[10] };
-
-		LLMatrix3 mat_normal(mat3);				
-
-		//let getGeometryVolume know if alpha should override shiny
-		U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture());
+			drawable->clearState(LLDrawable::REBUILD_ALL);
 
-		if (type == LLDrawPool::POOL_ALPHA)
-		{
-			face->setPoolType(LLDrawPool::POOL_ALPHA);
+			buffer = face->getVertexBuffer();
 		}
 		else
-		{
-			face->setPoolType(LLDrawPool::POOL_AVATAR);
+		{ //just rebuild this face
+			getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face);
 		}
-
-		face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
-
-		buffer->flush();
 	}
 
 	if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime())
@@ -1591,11 +1627,6 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
 			}
 		}
 	}
-
-	if (drawable && (face->getTEOffset() == drawable->getNumFaces()-1))
-	{
-		drawable->clearState(LLDrawable::REBUILD_ALL);
-	}
 }
 
 void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
@@ -1771,7 +1802,6 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
 
 void LLDrawPoolAvatar::renderDeferredRiggedSimple(LLVOAvatar* avatar)
 {
-	updateRiggedVertexBuffers(avatar);
 	renderRigged(avatar, RIGGED_DEFERRED_SIMPLE);
 }
 
@@ -1840,7 +1870,6 @@ void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)
 
 void LLDrawPoolAvatar::renderRiggedSimple(LLVOAvatar* avatar)
 {
-	updateRiggedVertexBuffers(avatar);
 	renderRigged(avatar, RIGGED_SIMPLE);
 }
 
diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h
index 7d0368a9459d7b7363228e12e7968730e490f14b..4fbda1f862b90aa67a98d3d17b8a82b7beb5223e 100755
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -133,6 +133,7 @@ class LLDrawPoolAvatar : public LLFacePool
 	void endDeferredRiggedSimple();
 	void endDeferredRiggedBump();
 		
+	void getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face);
 	void updateRiggedFaceVertexBuffer(LLVOAvatar* avatar,
 									  LLFace* facep, 
 									  const LLMeshSkinInfo* skin, 
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index f021f4ed0f4e9f11912d317806c0e6431e957a96..9b2b778677aaa7a16f2bbe7f5bfc4fe711697a5c 100755
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -768,7 +768,7 @@ bool less_than_max_mag(const LLVector4a& vec)
 }
 
 BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
-								const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume)
+								const LLMatrix4& mat_vert_in, BOOL global_volume)
 {
 	//get bounding box
 	if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED))
@@ -777,10 +777,6 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
 		LLMatrix4a mat_vert;
 		mat_vert.loadu(mat_vert_in);
 
-		LLMatrix4a mat_normal;
-		mat_normal.loadu(mat_normal_in);
-
-		//VECTORIZE THIS
 		LLVector4a min,max;
 	
 		if (f >= volume.getNumVolumeFaces())
@@ -797,100 +793,68 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
 		llassert(less_than_max_mag(max));
 
 		//min, max are in volume space, convert to drawable render space
-		LLVector4a center;
-		LLVector4a t;
-		t.setAdd(min, max);
-		t.mul(0.5f);
-		mat_vert.affineTransform(t, center);
-		LLVector4a size;
-		size.setSub(max, min);
-		size.mul(0.5f);
 
-		llassert(less_than_max_mag(min));
-		llassert(less_than_max_mag(max));
+		//get 8 corners of bounding box
+		LLVector4Logical mask[6];
 
-		if (!global_volume)
+		for (U32 i = 0; i < 6; ++i)
 		{
-			//VECTORIZE THIS
-			LLVector4a scale;
-			scale.load3(mDrawablep->getVObj()->getScale().mV);
-			size.mul(scale);
+			mask[i].clear();
 		}
 
-		// Catch potential badness from normalization before it happens
-		//
-		llassert(mat_normal.mMatrix[0].isFinite3() && (mat_normal.mMatrix[0].dot3(mat_normal.mMatrix[0]).getF32() > F_APPROXIMATELY_ZERO));
-		llassert(mat_normal.mMatrix[1].isFinite3() && (mat_normal.mMatrix[1].dot3(mat_normal.mMatrix[1]).getF32() > F_APPROXIMATELY_ZERO));
-		llassert(mat_normal.mMatrix[2].isFinite3() && (mat_normal.mMatrix[2].dot3(mat_normal.mMatrix[2]).getF32() > F_APPROXIMATELY_ZERO));
-
-		mat_normal.mMatrix[0].normalize3fast();
-		mat_normal.mMatrix[1].normalize3fast();
-		mat_normal.mMatrix[2].normalize3fast();
+		mask[0].setElement<2>(); //001
+		mask[1].setElement<1>(); //010
+		mask[2].setElement<1>(); //011
+		mask[2].setElement<2>();
+		mask[3].setElement<0>(); //100
+		mask[4].setElement<0>(); //101
+		mask[4].setElement<2>();
+		mask[5].setElement<0>(); //110
+		mask[5].setElement<1>();
 		
-		LLVector4a v[4];
+		LLVector4a v[8];
 
-		//get 4 corners of bounding box
-		mat_normal.rotate(size,v[0]);
+		v[6] = min;
+		v[7] = max;
 
-		//VECTORIZE THIS
-		LLVector4a scale;
-		
-		scale.set(-1.f, -1.f, 1.f);
-		scale.mul(size);
-		mat_normal.rotate(scale, v[1]);
-		
-		scale.set(1.f, -1.f, -1.f);
-		scale.mul(size);
-		mat_normal.rotate(scale, v[2]);
-		
-		scale.set(-1.f, 1.f, -1.f);
-		scale.mul(size);
-		mat_normal.rotate(scale, v[3]);
+		for (U32 i = 0; i < 6; ++i)
+		{
+			v[i].setSelectWithMask(mask[i], min, max);
+		}
+
+		LLVector4a tv[8];
 
+		//transform bounding box into drawable space
+		for (U32 i = 0; i < 8; ++i)
+		{
+			mat_vert.affineTransform(v[i], tv[i]);
+		}
+	
+		//find bounding box
 		LLVector4a& newMin = mExtents[0];
 		LLVector4a& newMax = mExtents[1];
-		
-		newMin = newMax = center;
-		
-		llassert(less_than_max_mag(center));
-		
-		for (U32 i = 0; i < 4; i++)
-		{
-			LLVector4a delta;
-			delta.setAbs(v[i]);
-			LLVector4a min;
-			min.setSub(center, delta);
-			LLVector4a max;
-			max.setAdd(center, delta);
 
-			newMin.setMin(newMin,min);
-			newMax.setMax(newMax,max);
+		newMin = newMax = tv[0];
 
-			llassert(less_than_max_mag(newMin));
-			llassert(less_than_max_mag(newMax));
+		for (U32 i = 1; i < 8; ++i)
+		{
+			newMin.setMin(newMin, tv[i]);
+			newMax.setMax(newMax, tv[i]);
 		}
 
 		if (!mDrawablep->isActive())
-		{
+		{	// Shift position for region
 			LLVector4a offset;
 			offset.load3(mDrawablep->getRegion()->getOriginAgent().mV);
 			newMin.add(offset);
 			newMax.add(offset);
-			
-			llassert(less_than_max_mag(newMin));
-			llassert(less_than_max_mag(newMax));
 		}
 
-		t.setAdd(newMin, newMax);
+		LLVector4a t;
+		t.setAdd(newMin,newMax);
 		t.mul(0.5f);
 
-		llassert(less_than_max_mag(t));
-		
-		//VECTORIZE THIS
 		mCenterLocal.set(t.getF32ptr());
-		
-		llassert(less_than_max_mag(newMin));
-		llassert(less_than_max_mag(newMax));
 
 		t.setSub(newMax,newMin);
 		mBoundingSphereRadius = t.getLength3().getF32()*0.5f;
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index 0687544d53880f00ba956e9d6a40fa0046643cfd..763634a3ab53708a66f81458cda06e1fde7d1455 100755
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -195,7 +195,7 @@ class LLFace
 	void		setSize(S32 numVertices, S32 num_indices = 0, bool align = false);
 	
 	BOOL		genVolumeBBoxes(const LLVolume &volume, S32 f,
-								   const LLMatrix4& mat, const LLMatrix3& inv_trans_mat, BOOL global_volume = FALSE);
+								   const LLMatrix4& mat, BOOL global_volume = FALSE);
 	
 	void		init(LLDrawable* drawablep, LLViewerObject* objp);
 	void		destroy();
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 8290494c229c7d596e03e1d26e02ee5c839c01c2..d4355007c1fe493203266dc9545dc8d4dbba4a72 100755
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2118,7 +2118,7 @@ void LLPanelLandOptions::refreshSearch()
 
 	bool can_change =
 			LLViewerParcelMgr::isParcelModifiableByAgent(
-				parcel, GP_LAND_CHANGE_IDENTITY)
+				parcel, GP_LAND_FIND_PLACES)
 			&& region
 			&& !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH));
 
diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
index 2b92b0b3d1c1e1ce216da214932f6dc02c015574..a567d1217a1b049db2695c742ec54c9e4bc906e3 100755
--- a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
+++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
@@ -92,7 +92,7 @@ void LLMenuOptionPathfindingRebakeNavmesh::initialize()
 
 void LLMenuOptionPathfindingRebakeNavmesh::quit()
 {
-	if (mIsInitialized)
+	if (mIsInitialized)		// Quitting from the login screen leaves this uninitialized
 	{
 		if (mNavMeshSlot.connected())
 		{
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 8602271f84470e016ec1cd6f78502351e5b44876..8eaf691d6fbe2e9a7c6254a0693bb37caec397ad 100755
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -413,7 +413,7 @@ class LLMeshUploadThread : public LLThread
 
 	void startRequest() { ++mPendingUploads; }
 	void stopRequest() { --mPendingUploads; }
-		
+
 	bool finished() { return mFinished; }
 	virtual void run();
 	void preStart();
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 7f396b7b7ed42d4067feb20800efdaf14ad69483..7ddd04fed0a616a8616af8e2cefc449b1c8d0a81 100755
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -416,9 +416,9 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
 }
 
 
-void LLNameListCtrl::updateColumns()
+void LLNameListCtrl::updateColumns(bool force_update)
 {
-	LLScrollListCtrl::updateColumns();
+	LLScrollListCtrl::updateColumns(force_update);
 
 	if (!mNameColumn.empty())
 	{
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index 271802d48a52ad5c99e483494a9063b45f539135..5aa1e1c458b0569d5e58bb367b07e4a216b543c2 100755
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -149,7 +149,7 @@ class LLNameListCtrl
 
 	void sortByName(BOOL ascending);
 
-	/*virtual*/ void updateColumns();
+	/*virtual*/ void updateColumns(bool force_update);
 
 	/*virtual*/ void	mouseOverHighlightNthItem( S32 index );
 private:
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 133b269c112433824dea63880210092b1880d552..a9a3c686a65d50f0997a199da27f7d57324b1641 100755
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -85,6 +85,7 @@ class LLPanelGroupInvite::impl
 	std::string		mAlreadyInGroup;
 	std::string		mTooManySelected;
 	bool		mConfirmedOwnerInvite;
+	std::set<LLUUID>	mInviteeIDs;
 
 	void (*mCloseCallback)(void* data);
 
@@ -117,31 +118,30 @@ LLPanelGroupInvite::impl::~impl()
 	}
 }
 
+const S32 MAX_GROUP_INVITES = 100; // Max invites per request. 100 to match server cap.
+
 void LLPanelGroupInvite::impl::addUsers(const std::vector<std::string>& names,
 										const uuid_vec_t& agent_ids)
 {
 	std::string name;
 	LLUUID id;
 
+	if (names.size() + mInviteeIDs.size() > MAX_GROUP_INVITES)
+	{
+		// Fail! Show a warning and don't add any names.
+		LLSD msg;
+		msg["MESSAGE"] = mTooManySelected;
+		LLNotificationsUtil::add("GenericAlert", msg);
+		return;
+	}
+
 	for (S32 i = 0; i < (S32)names.size(); i++)
 	{
 		name = names[i];
 		id = agent_ids[i];
 
 		// Make sure this agent isn't already in the list.
-		bool already_in_list = false;
-		std::vector<LLScrollListItem*> items = mInvitees->getAllData();
-		for (std::vector<LLScrollListItem*>::iterator iter = items.begin();
-			 iter != items.end(); ++iter)
-		{
-			LLScrollListItem* item = *iter;
-			if (item->getUUID() == id)
-			{
-				already_in_list = true;
-				break;
-			}
-		}
-		if (already_in_list)
+		if (mInviteeIDs.find(id) != mInviteeIDs.end())
 		{
 			continue;
 		}
@@ -152,6 +152,7 @@ void LLPanelGroupInvite::impl::addUsers(const std::vector<std::string>& names,
 		row["columns"][0]["value"] = name;
 
 		mInvitees->addElement(row);
+		mInviteeIDs.insert(id);
 	}
 }
 
@@ -193,7 +194,6 @@ void LLPanelGroupInvite::impl::submitInvitations()
 		role_member_pairs[item->getUUID()] = role_id;
 	}
 	
-	const S32 MAX_GROUP_INVITES = 100; // Max invites per request. 100 to match server cap.
 	if (role_member_pairs.size() > MAX_GROUP_INVITES)
 	{
 		// Fail!
@@ -334,6 +334,12 @@ void LLPanelGroupInvite::impl::handleRemove()
 			mInvitees->getAllSelected();
 	if (selection.empty()) return;
 
+	std::vector<LLScrollListItem*>::iterator iter;
+	for(iter = selection.begin(); iter != selection.end(); ++iter)
+	{
+		mInviteeIDs.erase( (*iter)->getUUID() );
+	}
+
 	// Remove all selected invitees.
 	mInvitees->deleteSelectedItems();
 	mRemoveButton->setEnabled(FALSE);
@@ -459,6 +465,7 @@ void LLPanelGroupInvite::clear()
 	mImplementation->mRoleNames->clear();
 	mImplementation->mRoleNames->removeall();
 	mImplementation->mOKButton->setEnabled(FALSE);
+	mImplementation->mInviteeIDs.clear();
 }
 
 void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids)
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 941c5787835c61a42d80a9ca2488a357e321423e..9e97790df89baad5ade893d87c2bddf749fa3b8e 100755
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -3457,7 +3457,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
 	}
 	else if	(type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::SPHERE)
 	{
-		/*LLVolumeParams volume_params;
+		LLVolumeParams volume_params;
 		volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE );
 		volume_params.setBeginAndEndS( 0.f, 1.f );
 		volume_params.setBeginAndEndT( 0.f, 1.f );
@@ -3467,7 +3467,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
 		
 		gGL.diffuseColor4fv(color.mV);
 		pushVerts(sphere);
-		LLPrimitive::sVolumeManager->unrefVolume(sphere);*/
+		LLPrimitive::sVolumeManager->unrefVolume(sphere);
 	}
 	else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::CYLINDER)
 	{
@@ -3545,51 +3545,67 @@ void renderPhysicsShapes(LLSpatialGroup* group)
 	for (LLSpatialGroup::OctreeNode::const_element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
 	{
 		LLDrawable* drawable = *i;
-		LLVOVolume* volume = drawable->getVOVolume();
-		if (volume && !volume->isAttachment() && volume->getPhysicsShapeType() != LLViewerObject::PHYSICS_SHAPE_NONE )
+
+		if (drawable->isSpatialBridge())
 		{
-			if (!group->mSpatialPartition->isBridge())
+			LLSpatialBridge* bridge = drawable->asPartition()->asBridge();
+
+			if (bridge)
 			{
 				gGL.pushMatrix();
-				LLVector3 trans = drawable->getRegion()->getOriginAgent();
-				gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
-				renderPhysicsShape(drawable, volume);
+				gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
+				bridge->renderPhysicsShapes();
 				gGL.popMatrix();
 			}
-			else
-			{
-				renderPhysicsShape(drawable, volume);
-			}
 		}
 		else
 		{
-			LLViewerObject* object = drawable->getVObj();
-			if (object && object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH)
+			LLVOVolume* volume = drawable->getVOVolume();
+			if (volume && !volume->isAttachment() && volume->getPhysicsShapeType() != LLViewerObject::PHYSICS_SHAPE_NONE )
 			{
-				gGL.pushMatrix();
-				gGL.multMatrix((F32*) object->getRegion()->mRenderMatrix.mMatrix);
-				//push face vertices for terrain
-				for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+				if (!group->mSpatialPartition->isBridge())
 				{
-					LLFace* face = drawable->getFace(i);
-					if (face)
+					gGL.pushMatrix();
+					LLVector3 trans = drawable->getRegion()->getOriginAgent();
+					gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+					renderPhysicsShape(drawable, volume);
+					gGL.popMatrix();
+				}
+				else
+				{
+					renderPhysicsShape(drawable, volume);
+				}
+			}
+			else
+			{
+				LLViewerObject* object = drawable->getVObj();
+				if (object && object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH)
+				{
+					gGL.pushMatrix();
+					gGL.multMatrix((F32*) object->getRegion()->mRenderMatrix.mMatrix);
+					//push face vertices for terrain
+					for (S32 i = 0; i < drawable->getNumFaces(); ++i)
 					{
-						LLVertexBuffer* buff = face->getVertexBuffer();
-						if (buff)
+						LLFace* face = drawable->getFace(i);
+						if (face)
 						{
-							glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+							LLVertexBuffer* buff = face->getVertexBuffer();
+							if (buff)
+							{
+								glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 
-							buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
-							gGL.diffuseColor3f(0.2f, 0.5f, 0.3f);
-							buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
+								buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
+								gGL.diffuseColor3f(0.2f, 0.5f, 0.3f);
+								buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
 									
-							gGL.diffuseColor3f(0.2f, 1.f, 0.3f);
-							glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-							buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
+								gGL.diffuseColor3f(0.2f, 1.f, 0.3f);
+								glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+								buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
+							}
 						}
 					}
+					gGL.popMatrix();
 				}
-				gGL.popMatrix();
 			}
 		}
 	}
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 36a7aeb59024078a8fd7e74f5fb25e374a82c05b..5bc2e971ebee8be581ba3049511b3334db38a330 100755
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1922,10 +1922,10 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
 		h >>= i;
 		if(w * h *c > 0) //valid
 		{
-			LLPointer<LLImageRaw> newraw = new LLImageRaw(raw->getData(), raw->getWidth(), raw->getHeight(), raw->getComponents());
-			newraw->scale(w, h) ;
-			raw = newraw;
-
+			//make a duplicate to keep the original raw image untouched.
+			raw = raw->duplicate();
+			raw->scale(w, h) ;
+			
 			discardlevel += i ;
 		}
 	}
@@ -1935,9 +1935,12 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
 	memcpy(mFastCachePadBuffer + sizeof(S32), &h, sizeof(S32));
 	memcpy(mFastCachePadBuffer + sizeof(S32) * 2, &c, sizeof(S32));
 	memcpy(mFastCachePadBuffer + sizeof(S32) * 3, &discardlevel, sizeof(S32));
-	if(w * h * c > 0) //valid
+
+	S32 copy_size = w * h * c;
+	if(copy_size > 0) //valid
 	{
-		memcpy(mFastCachePadBuffer + TEXTURE_FAST_CACHE_ENTRY_OVERHEAD, raw->getData(), w * h * c);
+		copy_size = llmin(copy_size, TEXTURE_FAST_CACHE_ENTRY_SIZE - TEXTURE_FAST_CACHE_ENTRY_OVERHEAD);
+		memcpy(mFastCachePadBuffer + TEXTURE_FAST_CACHE_ENTRY_OVERHEAD, raw->getData(), copy_size);
 	}
 	S32 offset = id * TEXTURE_FAST_CACHE_ENTRY_SIZE;
 
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
old mode 100755
new mode 100644
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index fc9a316759e45046c09d18f93c43390112746978..1c362c18e0d7ede5f872388f6b41c46b8cd573c1 100755
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -121,7 +121,7 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
 BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
 {
 	// don't pick transparent so users can't "pay" transparent objects
-	mPick = gViewerWindow->pickImmediate(x, y, FALSE);
+	mPick = gViewerWindow->pickImmediate(x, y, FALSE, TRUE);
 	mPick.mKeyMask = mask;
 
 	// claim not handled so UI focus stays same
@@ -1687,6 +1687,13 @@ BOOL LLToolPie::handleRightClickPick()
 			showVisualContextMenuEffect();
 		}
 	}
+	else if (mPick.mParticleOwnerID.notNull())
+	{
+		if (gMenuMuteParticle && mPick.mParticleOwnerID != gAgent.getID())
+		{
+			gMenuMuteParticle->show(x,y);
+		}
+	}
 
 	LLTool::handleRightMouseDown(x, y, mask);
 	// We handled the event.
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 7bde5d388ed0552f7cbbea0b67986931a7fca257..323eac19a4cc6ed5e7a3e0b6430f5ab2e80787dd 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -170,6 +170,7 @@ LLContextMenu	*gMenuObject = NULL;
 LLContextMenu	*gMenuAttachmentSelf = NULL;
 LLContextMenu	*gMenuAttachmentOther = NULL;
 LLContextMenu	*gMenuLand	= NULL;
+LLContextMenu	*gMenuMuteParticle = NULL;
 
 const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents");
 
@@ -426,6 +427,9 @@ void init_menus()
 	gMenuLand = LLUICtrlFactory::createFromFile<LLContextMenu>(
 		"menu_land.xml", gMenuHolder, registry);
 
+	gMenuMuteParticle = LLUICtrlFactory::createFromFile<LLContextMenu>(
+		"menu_mute_particle.xml", gMenuHolder, registry);
+
 	///
 	/// set up the colors
 	///
@@ -2488,6 +2492,9 @@ void cleanup_menus()
 	delete gMenuLand;
 	gMenuLand = NULL;
 
+	delete gMenuMuteParticle;
+	gMenuMuteParticle = NULL;
+
 	delete gMenuBarView;
 	gMenuBarView = NULL;
 
@@ -2841,6 +2848,13 @@ bool enable_object_edit()
 	return enable;
 }
 
+bool enable_mute_particle()
+{
+	const LLPickInfo& pick = LLToolPie::getInstance()->getPick();
+
+	return pick.mParticleOwnerID != LLUUID::null && pick.mParticleOwnerID != gAgent.getID();
+}
+
 // mutually exclusive - show either edit option or build in menu
 bool enable_object_build()
 {
@@ -6258,6 +6272,33 @@ class LLLandEdit : public view_listener_t
 	}
 };
 
+class LLMuteParticle : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		LLUUID id = LLToolPie::getInstance()->getPick().mParticleOwnerID;
+		
+		if (id.notNull())
+		{
+			std::string name;
+			gCacheName->getFullName(id, name);
+
+			LLMute mute(id, name, LLMute::AGENT);
+			if (LLMuteList::getInstance()->isMuted(mute.mID))
+			{
+				LLMuteList::getInstance()->remove(mute);
+			}
+			else
+			{
+				LLMuteList::getInstance()->add(mute);
+				LLPanelBlockedList::showPanelAndSelect(mute.mID);
+			}
+		}
+
+		return true;
+	}
+};
+
 class LLWorldEnableBuyLand : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -8754,6 +8795,9 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLLandBuyPass(), "Land.BuyPass");
 	view_listener_t::addMenu(new LLLandEdit(), "Land.Edit");
 
+	// Particle muting
+	view_listener_t::addMenu(new LLMuteParticle(), "Particle.Mute");
+
 	view_listener_t::addMenu(new LLLandEnableBuyPass(), "Land.EnableBuyPass");
 	commit.add("Land.Buy", boost::bind(&handle_buy_land));
 
@@ -8776,6 +8820,7 @@ void initialize_menus()
 	enable.add("EnablePayObject", boost::bind(&enable_pay_object));
 	enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));
 	enable.add("EnableEdit", boost::bind(&enable_object_edit));
+	enable.add("EnableMuteParticle", boost::bind(&enable_mute_particle));
 	enable.add("VisibleBuild", boost::bind(&enable_object_build));
 	commit.add("Pathfinding.Linksets.Select", boost::bind(&LLFloaterPathfindingLinksets::openLinksetsWithSelectedObjects));
 	enable.add("EnableSelectInPathfindingLinksets", boost::bind(&enable_object_select_in_pathfinding_linksets));
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 143420e2274971e814ee97484d0293651ef1be8e..7f09fc2d8faf74acc4c56cd89083ca960a1736c0 100755
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -177,6 +177,7 @@ extern LLContextMenu		*gMenuObject;
 extern LLContextMenu		*gMenuAttachmentSelf;
 extern LLContextMenu		*gMenuAttachmentOther;
 extern LLContextMenu		*gMenuLand;
+extern LLContextMenu		*gMenuMuteParticle;
 
 // Needed to build menus when attachment site list available
 extern LLMenuGL* gAttachSubMenu;
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index acb384834e42f82bfbcd71a6b6d67c05c6db06c9..f744f5ace27be2ce27c498bff16118a719151f3c 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -4582,7 +4582,6 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
 		if (id == LLUUID::null)
 		{
 			LL_DEBUGS("Messaging") << "Unknown kill for local " << local_id << LL_ENDL;
-			gObjectList.mNumUnknownKills++;
 			continue;
 		}
 		else
@@ -4606,18 +4605,12 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
 				// Do the kill
 				gObjectList.killObject(objectp);
 			}
-			else
-			{
-				LL_WARNS("Messaging") << "Object in UUID lookup, but not on object list in kill!" << LL_ENDL;
-				gObjectList.mNumUnknownKills++;
-			}
 		}
 
 		// We should remove the object from selection after it is marked dead by gObjectList to make LLToolGrab,
         // which is using the object, release the mouse capture correctly when the object dies.
         // See LLToolGrab::handleHoverActive() and LLToolGrab::handleHoverNonPhysical().
 		LLSelectMgr::getInstance()->removeObjectFromSelections(id);
-
 	}
 }
 
@@ -7397,8 +7390,12 @@ void process_script_teleport_request(LLMessageSystem* msg, void**)
 	LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance();
 	if(instance)
 	{
-		instance->trackURL(
-						   sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]);
+		llinfos << "Object named " << object_name 
+			<< " is offering TP to region "
+			<< sim_name << " position " << pos
+			<< llendl;
+
+		instance->trackURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]);
 		LLFloaterReg::showInstance("world_map", "center");
 	}
 	
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index caacf26cb38ac23977b2bbee1b5f80c66230be42..66615657d82a723d433c96b4e1fbeb1c688a5686 100755
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -106,7 +106,6 @@ LLViewerObjectList::LLViewerObjectList()
 	mNumNewObjects = 0;
 	mWasPaused = FALSE;
 	mNumDeadObjectUpdates = 0;
-	mNumUnknownKills = 0;
 	mNumUnknownUpdates = 0;
 }
 
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 449a4633ff28794f467da1fc91edbb0807a8269e..6518c25d09f773b171dce567da5f8d222883b715 100755
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -188,7 +188,6 @@ class LLViewerObjectList
 
 	S32 mNumUnknownUpdates;
 	S32 mNumDeadObjectUpdates;
-	S32 mNumUnknownKills;
 	S32 mNumDeadObjects;
 protected:
 	std::vector<U64>	mOrphanParents;	// LocalID/ip,port of orphaned objects
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index 6bd9f66b9c482e564ac34dbcb4434aefdfe84971..61cdfd781874871e8e683fe58c2d5af5ef1d1357 100755
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -488,9 +488,13 @@ void LLViewerPartSim::destroyClass()
 //static
 BOOL LLViewerPartSim::shouldAddPart()
 {
-	if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
+	if (sParticleCount >= MAX_PART_COUNT)
 	{
+		return FALSE;
+	}
 
+	if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
+	{
 		F32 frac = (F32)sParticleCount/(F32)sMaxParticleCount;
 		frac -= PART_THROTTLE_THRESHOLD;
 		frac *= PART_THROTTLE_RESCALE;
@@ -500,7 +504,10 @@ BOOL LLViewerPartSim::shouldAddPart()
 			return FALSE;
 		}
 	}
-	if (sParticleCount >= MAX_PART_COUNT)
+
+	// Check frame rate, and don't add more if the viewer is really slow
+	const F32 MIN_FRAME_RATE_FOR_NEW_PARTICLES = 4.f;
+	if (gFPSClamped < MIN_FRAME_RATE_FOR_NEW_PARTICLES)
 	{
 		return FALSE;
 	}
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 6cc9f4ace178506abade0d17529b7892ab57b493..84f66c359fbda3ebcdb3eb8cc54331f97731718e 100755
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1199,10 +1199,10 @@ void LLViewerFetchedTexture::dump()
 // ONLY called from LLViewerFetchedTextureList
 void LLViewerFetchedTexture::destroyTexture() 
 {
-	//if(LLImageGL::sGlobalTextureMemoryInBytes < sMaxDesiredTextureMemInBytes)//not ready to release unused memory.
-	//{
-	//	return ;
-	//}
+	if(LLImageGL::sGlobalTextureMemoryInBytes < sMaxDesiredTextureMemInBytes * 0.95f)//not ready to release unused memory.
+	{
+		return ;
+	}
 	if (mNeedsCreateTexture)//return if in the process of generating a new texture.
 	{
 		return ;
@@ -1290,7 +1290,12 @@ void LLViewerFetchedTexture::addToCreateTexture()
 							destroyRawImage();
 							return ;
 						}
-						mRawImage->scale(w >> i, h >> i) ;					
+
+						{
+							//make a duplicate in case somebody else is using this raw image
+							mRawImage = mRawImage->duplicate(); 
+							mRawImage->scale(w >> i, h >> i) ;					
+						}
 					}
 				}
 			}
@@ -1521,7 +1526,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 	else if (pixel_priority < 0.001f && !have_all_data)
 	{
 		// Not on screen but we might want some data
-		if (mBoostLevel > BOOST_HIGH)
+		if (mBoostLevel > BOOST_SELECTED)
 		{
 			// Always want high boosted images
 			priority = 1.f;
@@ -2669,7 +2674,11 @@ void LLViewerFetchedTexture::setCachedRawImage()
 				--i ;
 			}
 			
-			mRawImage->scale(w >> i, h >> i) ;
+			{
+				//make a duplicate in case somebody else is using this raw image
+				mRawImage = mRawImage->duplicate(); 
+				mRawImage->scale(w >> i, h >> i) ;
+			}
 		}
 		mCachedRawImage = mRawImage ;
 		mRawDiscardLevel += i ;
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index c96f89017fd75d96734faecbf20383326bcd7851..10101a4b9b7ce70cd61ca834f869892ecdf9e22b 100755
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -101,6 +101,7 @@ class LLViewerTexture : public LLGLTexture
 		INVALID_TEXTURE_TYPE
 	};
 
+
 	typedef std::vector<LLFace*> ll_face_list_t;
 	typedef std::vector<LLVOVolume*> ll_volume_list_t;
 
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 3f2ff7eb82a54a9ca68cc9d139c971851533deed..e98a2cb32c42df1ed111b1dfdd59ede5f2edada1 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -231,7 +231,9 @@ LLFrameTimer	gAwayTriggerTimer;
 BOOL			gShowOverlayTitle = FALSE;
 
 LLViewerObject*  gDebugRaycastObject = NULL;
+LLVOPartGroup* gDebugRaycastParticle = NULL;
 LLVector4a       gDebugRaycastIntersection;
+LLVector4a		gDebugRaycastParticleIntersection;
 LLVector2        gDebugRaycastTexCoord;
 LLVector4a       gDebugRaycastNormal;
 LLVector4a       gDebugRaycastTangent;
@@ -2864,6 +2866,8 @@ void LLViewerWindow::updateUI()
 											  &gDebugRaycastTangent,
 											  &gDebugRaycastStart,
 											  &gDebugRaycastEnd);
+
+		gDebugRaycastParticle = gPipeline.lineSegmentIntersectParticle(gDebugRaycastStart, gDebugRaycastEnd, &gDebugRaycastParticleIntersection, NULL);
 	}
 
 	updateMouseDelta();
@@ -3684,7 +3688,7 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback
 		pick_transparent = TRUE;
 	}
 
-	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, TRUE, callback);
+	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, FALSE, TRUE, callback);
 	schedulePick(pick_info);
 }
 
@@ -3740,7 +3744,7 @@ void LLViewerWindow::returnEmptyPicks()
 }
 
 // Performs the GL object/land pick.
-LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_transparent)
+LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_transparent, BOOL pick_particle)
 {
 	BOOL in_build_mode = LLFloaterReg::instanceVisible("build");
 	if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha)
@@ -3749,10 +3753,10 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_trans
 		// "Show Debug Alpha" means no object actually transparent
 		pick_transparent = TRUE;
 	}
-
+	
 	// shortcut queueing in mPicks and just update mLastPick in place
 	MASK	key_mask = gKeyboard->currentMask(TRUE);
-	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, TRUE, NULL);
+	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_particle, TRUE, NULL);
 	mLastPick.fetchResults();
 
 	return mLastPick;
@@ -4311,7 +4315,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 	F32 scale_factor = 1.0f ;
 	if (!keep_window_aspect || (image_width > window_width) || (image_height > window_height))
 	{	
-		if ((image_width > window_width || image_height > window_height) && LLPipeline::sRenderDeferred && !show_ui)
+		if ((image_width <= gGLManager.mGLMaxTextureSize && image_height <= gGLManager.mGLMaxTextureSize) && 
+			(image_width > window_width || image_height > window_height) && LLPipeline::sRenderDeferred && !show_ui)
 		{
 			if (scratch_space.allocate(image_width, image_height, GL_RGBA, true, true))
 			{
@@ -4326,6 +4331,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 					snapshot_height = image_height;
 					reset_deferred = true;
 					mWorldViewRectRaw.set(0, image_height, image_width, 0);
+					LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
+					LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
 					scratch_space.bindTarget();
 				}
 				else
@@ -4535,6 +4542,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 	if (reset_deferred)
 	{
 		mWorldViewRectRaw = window_rect;
+		LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
+		LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
 		scratch_space.flush();
 		scratch_space.release();
 		gPipeline.allocateScreenBuffer(original_width, original_height);
@@ -5148,13 +5157,15 @@ LLPickInfo::LLPickInfo()
 	  mTangent(),
 	  mBinormal(),
 	  mHUDIcon(NULL),
-	  mPickTransparent(FALSE)
+	  mPickTransparent(FALSE),
+	  mPickParticle(FALSE)
 {
 }
 
 LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos, 
 		       MASK keyboard_mask, 
 		       BOOL pick_transparent,
+			   BOOL pick_particle,
 		       BOOL pick_uv_coords,
 		       void (*pick_callback)(const LLPickInfo& pick_info))
 	: mMousePt(mouse_pos),
@@ -5170,7 +5181,8 @@ LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos,
 	  mTangent(),
 	  mBinormal(),
 	  mHUDIcon(NULL),
-	  mPickTransparent(pick_transparent)
+	  mPickTransparent(pick_transparent),
+	  mPickParticle(pick_particle)
 {
 }
 
@@ -5188,6 +5200,10 @@ void LLPickInfo::fetchResults()
 	LLVector4a origin;
 	origin.load3(LLViewerCamera::getInstance()->getOrigin().mV);
 	F32 icon_dist = 0.f;
+	LLVector4a start;
+	LLVector4a end;
+	LLVector4a particle_end;
+
 	if (hit_icon)
 	{
 		LLVector4a delta;
@@ -5197,14 +5213,24 @@ void LLPickInfo::fetchResults()
 
 	LLViewerObject* hit_object = gViewerWindow->cursorIntersect(mMousePt.mX, mMousePt.mY, 512.f,
 									NULL, -1, mPickTransparent, &face_hit,
-									&intersection, &uv, &normal, &tangent);
+									&intersection, &uv, &normal, &tangent, &start, &end);
 	
 	mPickPt = mMousePt;
 
 	U32 te_offset = face_hit > -1 ? face_hit : 0;
 
-	//unproject relative clicked coordinate from window coordinate using GL
-	
+	if (mPickParticle)
+	{ //get the end point of line segement to use for particle raycast
+		if (hit_object)
+		{
+			particle_end = intersection;
+		}
+		else
+		{
+			particle_end = end;
+		}
+	}
+
 	LLViewerObject* objectp = hit_object;
 
 
@@ -5219,6 +5245,7 @@ void LLPickInfo::fetchResults()
 		mHUDIcon = hit_icon;
 		mPickType = PICK_ICON;
 		mPosGlobal = mHUDIcon->getPositionGlobal();
+
 	}
 	else if (objectp)
 	{
@@ -5268,6 +5295,18 @@ void LLPickInfo::fetchResults()
 		}
 	}
 	
+	if (mPickParticle)
+	{ //search for closest particle to click origin out to intersection point
+		S32 part_face = -1;
+
+		LLVOPartGroup* group = gPipeline.lineSegmentIntersectParticle(start, particle_end, NULL, &part_face);
+		if (group)
+		{
+			mParticleOwnerID = group->getPartOwner(part_face);
+			mParticleSourceID = group->getPartSource(part_face);
+		}
+	}
+
 	if (mPickCallback)
 	{
 		mPickCallback(*this);
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 89f6e3bc26e7194b7de436342ad8204146b9b3f2..c16b80b2149f5cbe7551f2352650ef2fbcd8f1c6 100755
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -65,6 +65,7 @@ class LLWindow;
 class LLRootView;
 class LLWindowListener;
 class LLViewerWindowListener;
+class LLVOPartGroup;
 class LLPopupView;
 
 #define PICK_HALF_WIDTH 5
@@ -87,7 +88,8 @@ class LLPickInfo
 	LLPickInfo();
 	LLPickInfo(const LLCoordGL& mouse_pos, 
 		MASK keyboard_mask, 
-		BOOL pick_transparent, 
+		BOOL pick_transparent,
+		BOOL pick_particle,
 		BOOL pick_surface_info,
 		void (*pick_callback)(const LLPickInfo& pick_info));
 
@@ -108,6 +110,8 @@ class LLPickInfo
 	LLVector3d		mPosGlobal;
 	LLVector3		mObjectOffset;
 	LLUUID			mObjectID;
+	LLUUID			mParticleOwnerID;
+	LLUUID			mParticleSourceID;
 	S32				mObjectFace;
 	LLHUDIcon*		mHUDIcon;
 	LLVector3       mIntersection;
@@ -118,6 +122,7 @@ class LLPickInfo
 	LLVector4		mTangent;
 	LLVector3		mBinormal;
 	BOOL			mPickTransparent;
+	BOOL			mPickParticle;
 	void		    getSurfaceInfo();
 
 private:
@@ -356,7 +361,7 @@ class LLViewerWindow : public LLWindowCallbacks
 	void			returnEmptyPicks();
 
 	void			pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info), BOOL pick_transparent = FALSE);
-	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent);
+	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_particle = FALSE);
 	LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,
 										   LLVector4a* intersection);
 
@@ -501,6 +506,8 @@ extern LLFrameTimer		gAwayTriggerTimer;		// how long the avatar has been away
 
 extern LLViewerObject*  gDebugRaycastObject;
 extern LLVector4a       gDebugRaycastIntersection;
+extern LLVOPartGroup*	gDebugRaycastParticle;
+extern LLVector4a		gDebugRaycastParticleIntersection;
 extern LLVector2        gDebugRaycastTexCoord;
 extern LLVector4a       gDebugRaycastNormal;
 extern LLVector4a       gDebugRaycastTangent;
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 43a5ddba425c70bbdee7eb2182576888e3c15a71..8ed86b4fd512a6fc95632194207a6c88c88421bd 100755
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -193,8 +193,14 @@ void LLVOPartGroup::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
 	const LLVector3& pos_agent = getPositionAgent();
 	newMin.load3( (pos_agent - mScale).mV);
 	newMax.load3( (pos_agent + mScale).mV);
+
+	llassert(newMin.isFinite3());
+	llassert(newMax.isFinite3());
+
 	LLVector4a pos;
 	pos.load3(pos_agent.mV);
+
+	llassert(pos.isFinite3());
 	mDrawable->setPositionGroup(pos);
 }
 
@@ -234,6 +240,37 @@ LLDrawable* LLVOPartGroup::createDrawable(LLPipeline *pipeline)
 
  const F32 MAX_PARTICLE_AREA_SCALE = 0.02f; // some tuned constant, limits on how much particle area to draw
 
+ LLUUID LLVOPartGroup::getPartOwner(S32 idx)
+ {
+	 LLUUID ret = LLUUID::null;
+
+	 if (idx < (S32) mViewerPartGroupp->mParticles.size())
+	 {
+		 ret = mViewerPartGroupp->mParticles[idx]->mPartSourcep->getOwnerUUID();
+	 }
+
+	 return ret;
+ }
+
+ LLUUID LLVOPartGroup::getPartSource(S32 idx)
+ {
+	 LLUUID ret = LLUUID::null;
+
+	 if (idx < (S32) mViewerPartGroupp->mParticles.size())
+	 {
+		 LLViewerPart* part = mViewerPartGroupp->mParticles[idx];
+		 if (part && part->mPartSourcep.notNull() &&
+			 part->mPartSourcep->mSourceObjectp.notNull())
+		 {
+			 LLViewerObject* source = part->mPartSourcep->mSourceObjectp;
+			 ret = source->getID();
+		 }
+	 }
+
+	 return ret;
+ }
+
+
 F32 LLVOPartGroup::getPartSize(S32 idx)
 {
 	if (idx < (S32) mViewerPartGroupp->mParticles.size())
@@ -316,6 +353,10 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
 			inv_camera_dist_squared = 1.f / camera_dist_squared;
 		else
 			inv_camera_dist_squared = 1.f;
+
+		llassert(llfinite(inv_camera_dist_squared));
+		llassert(!llisnan(inv_camera_dist_squared));
+
 		F32 area = part->mScale.mV[0] * part->mScale.mV[1] * inv_camera_dist_squared;
 		tot_area = llmax(tot_area, area);
  		
@@ -387,20 +428,63 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
 	return TRUE;
 }
 
-void LLVOPartGroup::getGeometry(S32 idx,
-								LLStrider<LLVector4a>& verticesp,
-								LLStrider<LLVector3>& normalsp, 
-								LLStrider<LLVector2>& texcoordsp,
-								LLStrider<LLColor4U>& colorsp, 
-								LLStrider<U16>& indicesp)
+
+BOOL LLVOPartGroup::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
+										  S32 face,
+										  BOOL pick_transparent,
+										  S32* face_hit,
+										  LLVector4a* intersection,
+										  LLVector2* tex_coord,
+										  LLVector4a* normal,
+										  LLVector4a* bi_normal)
 {
-	if (idx >= (S32) mViewerPartGroupp->mParticles.size())
+	LLVector4a dir;
+	dir.setSub(end, start);
+
+	F32 closest_t = 2.f;
+	BOOL ret = FALSE;
+	
+	for (U32 idx = 0; idx < mViewerPartGroupp->mParticles.size(); ++idx)
 	{
-		return;
+		const LLViewerPart &part = *((LLViewerPart*) (mViewerPartGroupp->mParticles[idx]));
+
+		LLVector4a v[4];
+		LLStrider<LLVector4a> verticesp;
+		verticesp = v;
+		
+		getGeometry(part, verticesp);
+
+		F32 a,b,t;
+		if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, a,b,t) ||
+			LLTriangleRayIntersect(v[1], v[3], v[2], start, dir, a,b,t))
+		{
+			if (t >= 0.f &&
+				t <= 1.f &&
+				t < closest_t)
+			{
+				ret = TRUE;
+				closest_t = t;
+				if (face_hit)
+				{
+					*face_hit = idx;
+				}
+
+				if (intersection)
+				{
+					LLVector4a intersect = dir;
+					intersect.mul(closest_t);
+					intersection->setAdd(intersect, start);
+				}
+			}
+		}
 	}
 
-	const LLViewerPart &part = *((LLViewerPart*) (mViewerPartGroupp->mParticles[idx]));
+	return ret;
+}
 
+void LLVOPartGroup::getGeometry(const LLViewerPart& part,
+								LLStrider<LLVector4a>& verticesp)
+{
 	LLVector4a part_pos_agent;
 	part_pos_agent.load3(part.mPosAgent.mV);
 	LLVector4a camera_agent;
@@ -452,8 +536,6 @@ void LLVOPartGroup::getGeometry(S32 idx,
 	up.mul(0.5f*part.mScale.mV[1]);
 
 
-	LLVector3 normal = -LLViewerCamera::getInstance()->getXAxis();
-
 	//HACK -- the verticesp->mV[3] = 0.f here are to set the texture index to 0 (particles don't use texture batching, maybe they should)
 	// this works because there is actually a 4th float stored after the vertex position which is used as a texture index
 	// also, somebody please VECTORIZE THIS
@@ -472,6 +554,25 @@ void LLVOPartGroup::getGeometry(S32 idx,
 	(*verticesp++).getF32ptr()[3] = 0.f;
 	verticesp->setAdd(ppamu, right);
 	(*verticesp++).getF32ptr()[3] = 0.f;
+}
+
+
+								
+void LLVOPartGroup::getGeometry(S32 idx,
+								LLStrider<LLVector4a>& verticesp,
+								LLStrider<LLVector3>& normalsp, 
+								LLStrider<LLVector2>& texcoordsp,
+								LLStrider<LLColor4U>& colorsp, 
+								LLStrider<U16>& indicesp)
+{
+	if (idx >= (S32) mViewerPartGroupp->mParticles.size())
+	{
+		return;
+	}
+	
+	const LLViewerPart &part = *((LLViewerPart*) (mViewerPartGroupp->mParticles[idx]));
+
+	getGeometry(part, verticesp);
 
 	*colorsp++ = part.mColor;
 	*colorsp++ = part.mColor;
@@ -480,6 +581,7 @@ void LLVOPartGroup::getGeometry(S32 idx,
 
 	if (!(part.mFlags & LLPartData::LL_PART_EMISSIVE_MASK))
 	{ //not fullbright, needs normal
+		LLVector3 normal = -LLViewerCamera::getInstance()->getXAxis();
 		*normalsp++   = normal;
 		*normalsp++   = normal;
 		*normalsp++   = normal;
diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h
index 42c1252d01f69c9fccfbf08c272c35205b03f10b..2befb018239f85f43a04490c516c95187609eafd 100755
--- a/indra/newview/llvopartgroup.h
+++ b/indra/newview/llvopartgroup.h
@@ -69,11 +69,23 @@ class LLVOPartGroup : public LLAlphaObject
 	virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
 	virtual U32 getPartitionType() const;
 	
+	/*virtual*/ BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
+										  S32 face,
+										  BOOL pick_transparent,
+										  S32* face_hit,
+										  LLVector4a* intersection,
+										  LLVector2* tex_coord,
+										  LLVector4a* normal,
+										  LLVector4a* tangent);
+
 	/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent);
 	/*virtual*/ void updateTextures();
 
 	/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
 	/*virtual*/ BOOL        updateGeometry(LLDrawable *drawable);
+	void		getGeometry(const LLViewerPart& part,							
+								LLStrider<LLVector4a>& verticesp);
+				
 				void		getGeometry(S32 idx,
 								LLStrider<LLVector4a>& verticesp,
 								LLStrider<LLVector3>& normalsp, 
@@ -83,6 +95,9 @@ class LLVOPartGroup : public LLAlphaObject
 
 	void updateFaceSize(S32 idx) { }
 	F32 getPartSize(S32 idx);
+	LLUUID getPartOwner(S32 idx);
+	LLUUID getPartSource(S32 idx);
+
 	void setViewerPartGroup(LLViewerPartGroup *part_groupp)		{ mViewerPartGroupp = part_groupp; }
 	LLViewerPartGroup* getViewerPartGroup()	{ return mViewerPartGroupp; }
 
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 3be1f523529c78adbe6f42692a8a044fe53e4c93..e6385dceeac8eccb0bad86ce4589c0c014a19b70 100755
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1113,7 +1113,13 @@ void LLVOVolume::sculpt()
 		
 		S32 max_discard = mSculptTexture->getMaxDiscardLevel();
 		if (discard_level > max_discard)
-			discard_level = max_discard;    // clamp to the best we can do
+		{
+			discard_level = max_discard;    // clamp to the best we can do			
+		}
+		if(discard_level > MAX_DISCARD_LEVEL)
+		{
+			return; //we think data is not ready yet.
+		}
 
 		S32 current_discard = getVolume()->getSculptLevel() ;
 		if(current_discard < -2)
@@ -1452,7 +1458,7 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
 			continue;
 		}
 		res &= face->genVolumeBBoxes(*volume, i,
-										mRelativeXform, mRelativeXformInvTrans,
+										mRelativeXform, 
 										(mVolumeImpl && mVolumeImpl->isVolumeGlobal()) || force_global);
 		
 		if (rebuild)
@@ -4833,7 +4839,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 
 			if (is_rigged)
 			{
-				drawablep->setState(LLDrawable::RIGGED);
+				if (!drawablep->isState(LLDrawable::RIGGED))
+				{
+					drawablep->setState(LLDrawable::RIGGED);
+
+					//first time this is drawable is being marked as rigged,
+					// do another LoD update to use avatar bounding box
+					vobj->updateLOD();
+				}
 			}
 			else
 			{
diff --git a/indra/newview/noise.h b/indra/newview/noise.h
index 0923bffcf2c8090997743783cde0365d9f6dc717..b3efad73c5622063e5334c3ba75e2129f90e6461 100755
--- a/indra/newview/noise.h
+++ b/indra/newview/noise.h
@@ -310,6 +310,8 @@ static void normalize3(F32 v[3])
 
 static void init(void)
 {
+	// we want repeatable noise (e.g. for stable terrain texturing), so seed with known value
+	srand(42);
 	int i, j, k;
 
 	for (i = 0 ; i < B ; i++) {
@@ -340,6 +342,9 @@ static void init(void)
 		for (j = 0 ; j < 3 ; j++)
 			g3[B + i][j] = g3[i][j];
 	}
+
+	// reintroduce entropy
+	srand(time(NULL));		// Flawfinder: ignore
 }
 
 #undef B
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index c25d22bbdf77f0b77072eecd5c88df9de6bb2981..f49395da349e57ef71a5d39b1b8e452ce1fffb7f 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -163,6 +163,7 @@ S32 LLPipeline::RenderGlowIterations;
 F32 LLPipeline::RenderGlowWidth;
 F32 LLPipeline::RenderGlowStrength;
 BOOL LLPipeline::RenderDepthOfField;
+BOOL LLPipeline::RenderDepthOfFieldInEditMode;
 F32 LLPipeline::CameraFocusTransitionTime;
 F32 LLPipeline::CameraFNumber;
 F32 LLPipeline::CameraFocalLength;
@@ -615,6 +616,7 @@ void LLPipeline::init()
 	connectRefreshCachedSettingsSafe("RenderGlowWidth");
 	connectRefreshCachedSettingsSafe("RenderGlowStrength");
 	connectRefreshCachedSettingsSafe("RenderDepthOfField");
+	connectRefreshCachedSettingsSafe("RenderDepthOfFieldInEditMode");
 	connectRefreshCachedSettingsSafe("CameraFocusTransitionTime");
 	connectRefreshCachedSettingsSafe("CameraFNumber");
 	connectRefreshCachedSettingsSafe("CameraFocalLength");
@@ -1125,6 +1127,7 @@ void LLPipeline::refreshCachedSettings()
 	RenderGlowWidth = gSavedSettings.getF32("RenderGlowWidth");
 	RenderGlowStrength = gSavedSettings.getF32("RenderGlowStrength");
 	RenderDepthOfField = gSavedSettings.getBOOL("RenderDepthOfField");
+	RenderDepthOfFieldInEditMode = gSavedSettings.getBOOL("RenderDepthOfFieldInEditMode");
 	CameraFocusTransitionTime = gSavedSettings.getF32("CameraFocusTransitionTime");
 	CameraFNumber = gSavedSettings.getF32("CameraFNumber");
 	CameraFocalLength = gSavedSettings.getF32("CameraFocalLength");
@@ -4864,18 +4867,6 @@ void LLPipeline::renderPhysicsDisplay()
 		}
 	}
 
-	for (LLCullResult::bridge_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
-	{
-		LLSpatialBridge* bridge = *i;
-		if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
-		{
-			gGL.pushMatrix();
-			gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
-			bridge->renderPhysicsShapes();
-			gGL.popMatrix();
-		}
-	}
-
 	gGL.flush();
 
 	if (LLGLSLShader::sNoFixedFunction)
@@ -5323,6 +5314,42 @@ void LLPipeline::renderDebug()
 		gUIProgram.bind();
 	}
 
+	if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST) && !hud_only)
+	{ //draw crosshairs on particle intersection
+		if (gDebugRaycastParticle)
+		{
+			if (LLGLSLShader::sNoFixedFunction)
+			{ //this debug display requires shaders
+				gDebugProgram.bind();
+
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+				LLVector3 center(gDebugRaycastParticleIntersection.getF32ptr());
+				LLVector3 size(0.1f, 0.1f, 0.1f);
+
+				LLVector3 p[6];
+
+				p[0] = center + size.scaledVec(LLVector3(1,0,0));
+				p[1] = center + size.scaledVec(LLVector3(-1,0,0));
+				p[2] = center + size.scaledVec(LLVector3(0,1,0));
+				p[3] = center + size.scaledVec(LLVector3(0,-1,0));
+				p[4] = center + size.scaledVec(LLVector3(0,0,1));
+				p[5] = center + size.scaledVec(LLVector3(0,0,-1));
+				
+				gGL.begin(LLRender::LINES);
+				gGL.diffuseColor3f(1.f, 1.f, 0.f);
+				for (U32 i = 0; i < 6; i++)
+				{
+					gGL.vertex3fv(p[i].mV);
+				}
+				gGL.end();
+				gGL.flush();
+
+				gDebugProgram.unbind();
+			}
+		}
+	}
+
 	if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
 	{
 		LLVertexBuffer::unbind();
@@ -5356,7 +5383,7 @@ void LLPipeline::renderDebug()
 			if (i > 3)
 			{ //render shadow frusta as volumes
 				if (mShadowFrustPoints[i-4].empty())
-			{
+				{
 					continue;
 				}
 
@@ -7003,6 +7030,48 @@ void LLPipeline::setRenderHighlightTextureChannel(LLRender::eTexIndex channel)
 	sRenderHighlightTextureChannel = channel;
 }
 
+LLVOPartGroup* LLPipeline::lineSegmentIntersectParticle(const LLVector4a& start, const LLVector4a& end, LLVector4a* intersection,
+														S32* face_hit)
+{
+	LLVector4a local_end = end;
+
+	LLVector4a position;
+
+	LLDrawable* drawable = NULL;
+
+	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); 
+			iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
+	{
+		LLViewerRegion* region = *iter;
+
+		LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_PARTICLE);
+		if (part && hasRenderType(part->mDrawableType))
+		{
+			LLDrawable* hit = part->lineSegmentIntersect(start, local_end, TRUE, face_hit, &position, NULL, NULL, NULL);
+			if (hit)
+			{
+				drawable = hit;
+				local_end = position;						
+			}
+		}
+	}
+
+	LLVOPartGroup* ret = NULL;
+	if (drawable)
+	{
+		//make sure we're returning an LLVOPartGroup
+		llassert(drawable->getVObj()->getPCode() == LLViewerObject::LL_VO_PART_GROUP);
+		ret = (LLVOPartGroup*) drawable->getVObj().get();
+	}
+		
+	if (intersection)
+	{
+		*intersection = position;
+	}
+
+	return ret;
+}
+
 LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start, const LLVector4a& end,
 														BOOL pick_transparent,												
 														S32* face_hit,
@@ -7562,7 +7631,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
 	{
 
 		bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater() &&
-							!LLToolMgr::getInstance()->inBuildMode() &&
+			(RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&
 							RenderDepthOfField;
 
 
@@ -9582,7 +9651,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
 	pp.push_back(LLVector3(max.mV[0], max.mV[1], max.mV[2]));
 
 	//add corners of camera frustum
-	for (U32 i = 0; i < 8; i++)
+	for (U32 i = 0; i < LLCamera::AGENT_FRUSTRUM_NUM; i++)
 	{
 		pp.push_back(camera.mAgentFrustum[i]);
 	}
@@ -9609,7 +9678,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
 
 	for (U32 i = 0; i < 12; i++)
 	{ //for each line segment in bounding box
-		for (U32 j = 0; j < 6; j++) 
+		for (U32 j = 0; j < LLCamera::AGENT_PLANE_NO_USER_CLIP_NUM; j++) 
 		{ //for each plane in camera frustum
 			const LLPlane& cp = camera.getAgentPlane(j);
 			const LLVector3& v1 = pp[bs[i*2+0]];
@@ -9695,19 +9764,19 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
 			}
 		}
 				
-		for (U32 j = 0; j < 6; ++j)
+		for (U32 j = 0; j < LLCamera::AGENT_PLANE_NO_USER_CLIP_NUM; ++j)
 		{
 			const LLPlane& cp = camera.getAgentPlane(j);
 			F32 dist = cp.dist(pp[i]);
 			if (dist > 0.05f) //point is above some plane, not contained
-					{
+			{
 				found = false;
 				break;
-						}
-					}
+			}
+		}
 
-					if (found)
-					{
+		if (found)
+		{
 			fp.push_back(pp[i]);
 		}
 	}
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 70dcf8040708568ae3c576bb686a814a137c635c..f0bebbe20d869d1421ad8411375d3ec2ffe45da1 100755
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -58,6 +58,7 @@ class LLRenderFunc;
 class LLCubeMap;
 class LLCullResult;
 class LLVOAvatar;
+class LLVOPartGroup;
 class LLGLSLShader;
 class LLCurlRequest;
 class LLDrawPoolAlpha;
@@ -202,6 +203,12 @@ class LLPipeline
 												LLVector4a* normal = NULL,               // return the surface normal at the intersection point
 												LLVector4a* tangent = NULL             // return the surface tangent at the intersection point  
 		);
+
+	//get the closest particle to start between start and end, returns the LLVOPartGroup and particle index
+	LLVOPartGroup* lineSegmentIntersectParticle(const LLVector4a& start, const LLVector4a& end, LLVector4a* intersection,
+														S32* face_hit);
+
+
 	LLViewerObject* lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end,
 											  BOOL pick_transparent,
 											  S32* face_hit,                          // return the face hit
@@ -910,6 +917,7 @@ class LLPipeline
 	static F32 RenderGlowWidth;
 	static F32 RenderGlowStrength;
 	static BOOL RenderDepthOfField;
+	static BOOL RenderDepthOfFieldInEditMode;
 	static F32 CameraFocusTransitionTime;
 	static F32 CameraFNumber;
 	static F32 CameraFocalLength;
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
index 46ba4bd29d2786bf2c0ac1f7835dffb4765eac06..0a8beec7de025d569fb13bc68e5c6dbbfce16d3f 100755
--- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
@@ -112,4 +112,15 @@
          <menu_item_call.on_enable
           function="Object.EnableInspect" />
    </menu_item_call>
+  <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index 28e032ce5f0e4f90c4eaf1c016efbb3d9003bfce..bcbc8d5b86c7df1ba7d93c0e69ee85e92b55769e 100755
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -143,4 +143,15 @@ name="Edit Outfit">
     <menu_item_call.on_enable
      function="Attachment.EnableDrop" />
   </menu_item_call>
+  <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
index e7c2b80da27f45f8b69c8297352885aab5d5a87c..8be2683680fa6115b4a9740e6112320899a74e52 100755
--- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
@@ -103,4 +103,15 @@
         <menu_item_call.on_enable
          function="EnablePayAvatar" />
     </menu_item_call>
+  <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
index c1ff026a74e51fb856db513c20fe177cc6882d12..ca0c9bd5e4947d8235235fc6b7c65364df09edae 100755
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -269,4 +269,16 @@
             <menu_item_call.on_visible
              function="Advanced.EnableAppearanceToXML"/>
     </menu_item_call>
+  <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_land.xml b/indra/newview/skins/default/xui/en/menu_land.xml
index cc6d8ad9c1d8dcd37fd57b56d324dd8feca35a91..2ad5cbbe951cd561d4b72ab58fa5afb16380842b 100755
--- a/indra/newview/skins/default/xui/en/menu_land.xml
+++ b/indra/newview/skins/default/xui/en/menu_land.xml
@@ -61,4 +61,15 @@
         <menu_item_call.on_enable
          function="EnableEdit" />
     </menu_item_call>
+   <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_mute_particle.xml b/indra/newview/skins/default/xui/en/menu_mute_particle.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a4261bf39e6ea5f411d477fa195132e765ccdcfd
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_mute_particle.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu
+ layout="topleft"
+ name="Mute Particle Pie">
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
index f6004621a652988262a4c0d0225236fa449bf661..52ab7da51550113eb57baca78fa4ac8f1a3f35b9 100755
--- a/indra/newview/skins/default/xui/en/menu_object.xml
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -196,4 +196,15 @@
     <menu_item_call.on_enable
         function="Object.EnableDelete" />
   </menu_item_call>
+  <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 32635e4540b8dabbc89b7bff5a765d6056100725..9b65f45c3ea83a6073902179393ab53a6fded2eb 100755
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -6843,7 +6843,6 @@ This will add a bookmark in your inventory so you can quickly IM this Resident.
    name="RegionRestartMinutes"
    priority="high"
    sound="UISndAlert"
-   persist="true"
    type="notify">
 This region will restart in [MINUTES] minutes.
 If you stay in this region you will be logged out.
@@ -6854,7 +6853,6 @@ If you stay in this region you will be logged out.
    name="RegionRestartSeconds"
    priority="high"
    sound="UISndAlert"
-   persist="true"
    type="notify">
 This region will restart in [SECONDS] seconds.
 If you stay in this region you will be logged out.
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index d7db7caf66efc65ee754638f17d96d29569d9320..3c4d28803729b82942bcca6674ea73e2f59192e1 100755
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -47,7 +47,7 @@
         Better
     </text>
     <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
@@ -56,16 +56,15 @@
      top_delta="-2"
      width="2" />
   <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
      left_pad="41"
-     name="LowMidraphicsDivet"
-     top_delta="-2"
+     name="LowMidGraphicsDivet"
      width="2" />
     <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
@@ -74,7 +73,7 @@
      top_delta="0"
      width="2" />
   <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
@@ -83,7 +82,7 @@
      top_delta="0"
      width="2" />
     <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
@@ -92,7 +91,7 @@
      top_delta="0"
      width="2" />
   <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
@@ -101,7 +100,7 @@
      top_delta="0"
      width="2" />
     <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml
index 89aef57ccaea0ab8274168fa6bda56f017a4520c..0eeccbeac516983fcf523daae0cf7685a0f481a1 100755
--- a/indra/newview/skins/default/xui/en/role_actions.xml
+++ b/indra/newview/skins/default/xui/en/role_actions.xml
@@ -70,8 +70,8 @@
 		     longdescription="Toggle &apos;Show Place in Search&apos; and setting a parcel&apos;s category in About Land &gt; Options tab."
 		     name="land find places" value="17" />
 		<action
-		     description="Change parcel name, description, and &apos;Show Place in Search&apos; settings"
-		     longdescription="Change parcel name, description, and &apos;Show Place in Search&apos; settings. This is done in About Land &gt; Options tab."
+		     description="Change parcel name, description, and &apos;Moderate Content&apos; settings"
+		     longdescription="Change parcel name, description, and &apos;Moderate Content&apos; settings. This is done in About Land &gt; Options tab."
 		     name="land change identity" value="18" />
 		<action description="Set landing point and set teleport routing"
 		     longdescription="On a group-owned parcel, Members in a Role with this Ability can set a landing point to specify where incoming teleports arrive, and also set teleport routing for further control. This is done in About Land &gt; Options tab."
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index fa4529e085c57f6462a5f2567ef15920e4a7c2c0..a56213cdfe5f9fac3a5e562bd4a53c25265eb9d1 100755
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2519,6 +2519,8 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale
 	<string name="ATTACH_HUD_BOTTOM_LEFT">HUD Bottom Left</string>
 	<string name="ATTACH_HUD_BOTTOM">HUD Bottom</string>
 	<string name="ATTACH_HUD_BOTTOM_RIGHT">HUD Bottom Right</string>
+	<string name="ATTACH_NECK">Neck</string>
+	<string name="ATTACH_AVATAR_CENTER">Avatar Center</string>
 
 	<!-- script editor -->
 	<string name="CursorPos">Line [LINE], Column [COLUMN]</string>