diff --git a/gen/obj_defines.h b/gen/obj_defines.h
index 54b75c46724d547725a05781c8be9ba879ec6d27..f9cf48b144017a0b6f26b971020ff317a05fce38 100644
--- a/gen/obj_defines.h
+++ b/gen/obj_defines.h
@@ -4,6 +4,8 @@ All rights reserved.  Please see niflib.h for licence. */
 #ifndef _OBJ_DEFINES_H_
 #define _OBJ_DEFINES_H_
 
+#define MAXARRAYDUMP 20
+
 #include "NIF_IO.h"
 #include "Ref.h"
 #include <iostream>
@@ -181,6 +183,10 @@ stringstream out; \
 out << bhkSerializable::asString(); \
 out << "Num Bodies:  " << numBodies << endl; \
 for (uint i0 = 0; i0 < bodies.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Bodies[" << i0 << "]:  " << bodies[i0] << endl; \
 }; \
 out << "Priority:  " << priority << endl; \
@@ -664,6 +670,10 @@ out << "Name:  " << name << endl; \
 out << "Extra Data:  " << extraData << endl; \
 out << "Num Extra Data List:  " << numExtraDataList << endl; \
 for (uint i0 = 0; i0 < extraDataList.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Extra Data List[" << i0 << "]:  " << extraDataList[i0] << endl; \
 }; \
 out << "Controller:  " << controller << endl; \
@@ -792,6 +802,10 @@ out << "Scale:  " << scale << endl; \
 out << "Velocity:  " << velocity << endl; \
 out << "Num Properties:  " << numProperties << endl; \
 for (uint i0 = 0; i0 < properties.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Properties[" << i0 << "]:  " << properties[i0] << endl; \
 }; \
 out << "Has Bounding Box:  " << hasBoundingBox << endl; \
@@ -898,6 +912,10 @@ if ( (hasAffectedNodeList_ != 0) ) { \
 out << "Switch State:  " << switchState << endl; \
 out << "Num Affected Nodes:  " << numAffectedNodes << endl; \
 for (uint i0 = 0; i0 < affectedNodes.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Affected Nodes[" << i0 << "]:  " << affectedNodes[i0] << endl; \
 }; \
 return out.str(); \
@@ -1252,6 +1270,10 @@ out << "Unknown Int 2:  " << unknownInt2 << endl; \
 for (uint i0 = 0; i0 < nodeGroups.size(); i0++) { \
 	out << "  Num Nodes:  " << nodeGroups[i0].numNodes << endl; \
 	for (uint i1 = 0; i1 < nodeGroups[i0].nodes.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Nodes[" << i1 << "]:  " << nodeGroups[i0].nodes[i1] << endl; \
 	}; \
 }; \
@@ -1607,6 +1629,10 @@ out << "Unknown Short 1:  " << unknownShort1 << endl; \
 out << "Has Vertices:  " << hasVertices << endl; \
 if ( (hasVertices != 0) ) { \
 	for (uint i1 = 0; i1 < vertices.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Vertices[" << i1 << "]:  " << vertices[i1] << endl; \
 	}; \
 }; \
@@ -1615,14 +1641,26 @@ out << "Unknown Byte:  " << unknownByte << endl; \
 out << "Has Normals:  " << hasNormals << endl; \
 if ( (hasNormals != 0) ) { \
 	for (uint i1 = 0; i1 < normals.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Normals[" << i1 << "]:  " << normals[i1] << endl; \
 	}; \
 }; \
 if ( (((hasNormals != 0)) && ((unknownByte & 16))) ) { \
 	for (uint i1 = 0; i1 < unknownVectors1.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Vectors 1[" << i1 << "]:  " << unknownVectors1[i1] << endl; \
 	}; \
 	for (uint i1 = 0; i1 < unknownVectors2.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Vectors 2[" << i1 << "]:  " << unknownVectors2[i1] << endl; \
 	}; \
 }; \
@@ -1631,6 +1669,10 @@ out << "Radius:  " << radius << endl; \
 out << "Has Vertex Colors:  " << hasVertexColors << endl; \
 if ( (hasVertexColors != 0) ) { \
 	for (uint i1 = 0; i1 < vertexColors.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Vertex Colors[" << i1 << "]:  " << vertexColors[i1] << endl; \
 	}; \
 }; \
@@ -1638,11 +1680,19 @@ out << "Num UV Sets:  " << numUvSets << endl; \
 out << "Has UV:  " << hasUv << endl; \
 for (uint i0 = 0; i0 < uvSets.size(); i0++) { \
 	for (uint i1 = 0; i1 < uvSets[i0].size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    UV Sets[" << i0 << "][" << i1 << "]:  " << uvSets[i0][i1] << endl; \
 	}; \
 }; \
 for (uint i0 = 0; i0 < uvSets2.size(); i0++) { \
 	for (uint i1 = 0; i1 < uvSets2[i0].size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    UV Sets 2[" << i0 << "][" << i1 << "]:  " << uvSets2[i0][i1] << endl; \
 	}; \
 }; \
@@ -1719,6 +1769,10 @@ out << NiTriBasedGeomData::asString(); \
 out << "Has Unknown Floats 1:  " << hasUnknownFloats1 << endl; \
 if ( (hasUnknownFloats1 != 0) ) { \
 	for (uint i1 = 0; i1 < unknownFloats1.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Floats 1[" << i1 << "]:  " << unknownFloats1[i1] << endl; \
 	}; \
 }; \
@@ -1726,6 +1780,10 @@ out << "Unknown Short 3:  " << unknownShort3 << endl; \
 out << "Has Unknown Floats 2:  " << hasUnknownFloats2 << endl; \
 if ( (hasUnknownFloats2 != 0) ) { \
 	for (uint i1 = 0; i1 < unknownFloats2.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Floats 2[" << i1 << "]:  " << unknownFloats2[i1] << endl; \
 	}; \
 }; \
@@ -1973,14 +2031,26 @@ for (uint i0 = 0; i0 < unknownVectors2.size(); i0++) { \
 stringstream out; \
 out << bhkSphereRepShape::asString(); \
 for (uint i0 = 0; i0 < 7; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats 1[" << i0 << "]:  " << unknownFloats1[i0] << endl; \
 }; \
 out << "Num 1:  " << num1 << endl; \
 for (uint i0 = 0; i0 < unknownVectors1.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Vectors 1[" << i0 << "]:  " << unknownVectors1[i0] << endl; \
 }; \
 out << "Num 2:  " << num2 << endl; \
 for (uint i0 = 0; i0 < unknownVectors2.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Vectors 2[" << i0 << "]:  " << unknownVectors2[i0] << endl; \
 }; \
 return out.str(); \
@@ -2018,6 +2088,10 @@ stringstream out; \
 out << AbhkConstraint::asString(); \
 for (uint i0 = 0; i0 < 5; i0++) { \
 	for (uint i1 = 0; i1 < 4; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Floats[" << i0 << "][" << i1 << "]:  " << unknownFloats[i0][i1] << endl; \
 	}; \
 }; \
@@ -2133,14 +2207,26 @@ stringstream out; \
 out << AbhkShapeCollection::asString(); \
 out << "Num Sub Shapes:  " << numSubShapes << endl; \
 for (uint i0 = 0; i0 < subShapes.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Sub Shapes[" << i0 << "]:  " << subShapes[i0] << endl; \
 }; \
 out << "Material:  " << material << endl; \
 for (uint i0 = 0; i0 < 6; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats[" << i0 << "]:  " << unknownFloats[i0] << endl; \
 }; \
 out << "Num Unknown Ints:  " << numUnknownInts << endl; \
 for (uint i0 = 0; i0 < unknownInts.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Ints[" << i0 << "]:  " << unknownInts[i0] << endl; \
 }; \
 return out.str(); \
@@ -2361,11 +2447,19 @@ out << bhkShape::asString(); \
 out << "Shape:  " << shape << endl; \
 out << "Material:  " << material << endl; \
 for (uint i0 = 0; i0 < 8; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Bytes 1[" << i0 << "]:  " << unknownBytes1[i0] << endl; \
 }; \
 out << "Unknown Float:  " << unknownFloat << endl; \
 out << "Num Unknown Bytes 2:  " << numUnknownBytes2 << endl; \
 for (uint i0 = 0; i0 < unknownBytes2.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Bytes 2[" << i0 << "]:  " << unknownBytes2[i0] << endl; \
 }; \
 out << "Unknown Vector:  " << unknownVector << endl; \
@@ -2424,6 +2518,10 @@ out << "Unknown Float 2:  " << unknownFloat2 << endl; \
 out << "Unknown Float 3:  " << unknownFloat3 << endl; \
 out << "Unknown Int 2:  " << unknownInt2 << endl; \
 for (uint i0 = 0; i0 < 8; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats[" << i0 << "]:  " << unknownFloats[i0] << endl; \
 }; \
 return out.str(); \
@@ -2498,21 +2596,41 @@ for (uint i0 = 0; i0 < unknownInts3.size(); i0++) { \
 stringstream out; \
 out << bhkSphereRepShape::asString(); \
 for (uint i0 = 0; i0 < 2; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats 1[" << i0 << "]:  " << unknownFloats1[i0] << endl; \
 }; \
 for (uint i0 = 0; i0 < 5; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Ints 1[" << i0 << "]:  " << unknownInts1[i0] << endl; \
 }; \
 for (uint i0 = 0; i0 < 3; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats 2[" << i0 << "]:  " << unknownFloats2[i0] << endl; \
 }; \
 out << "Unknown Int 2:  " << unknownInt2 << endl; \
 out << "Num Strips Data:  " << numStripsData << endl; \
 for (uint i0 = 0; i0 < stripsData.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Strips Data[" << i0 << "]:  " << stripsData[i0] << endl; \
 }; \
 out << "Num Unknown Ints 3:  " << numUnknownInts3 << endl; \
 for (uint i0 = 0; i0 < unknownInts3.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Ints 3[" << i0 << "]:  " << unknownInts3[i0] << endl; \
 }; \
 return out.str(); \
@@ -2587,14 +2705,26 @@ out << AbhkShapeCollection::asString(); \
 out << "Num Subparts:  " << numSubparts << endl; \
 for (uint i0 = 0; i0 < subparts.size(); i0++) { \
 	for (uint i1 = 0; i1 < 3; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Subparts[" << i0 << "][" << i1 << "]:  " << subparts[i0][i1] << endl; \
 	}; \
 }; \
 for (uint i0 = 0; i0 < 9; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats[" << i0 << "]:  " << unknownFloats[i0] << endl; \
 }; \
 out << "Scale:  " << scale << endl; \
 for (uint i0 = 0; i0 < 3; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats 2[" << i0 << "]:  " << unknownFloats2[i0] << endl; \
 }; \
 out << "Data:  " << data << endl; \
@@ -2642,9 +2772,17 @@ for (uint i0 = 0; i0 < 3; i0++) { \
 stringstream out; \
 out << AbhkConstraint::asString(); \
 for (uint i0 = 0; i0 < 8; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Vectors[" << i0 << "]:  " << unknownVectors[i0] << endl; \
 }; \
 for (uint i0 = 0; i0 < 3; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats 2[" << i0 << "]:  " << unknownFloats2[i0] << endl; \
 }; \
 return out.str(); \
@@ -2817,13 +2955,25 @@ NifStream( unknownInt6, out, version ); \
 stringstream out; \
 out << bhkEntity::asString(); \
 for (uint i0 = 0; i0 < 5; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats 1[" << i0 << "]:  " << unknownFloats1[i0] << endl; \
 }; \
 for (uint i0 = 0; i0 < 4; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Shorts 1[" << i0 << "]:  " << unknownShorts1[i0] << endl; \
 }; \
 out << "Layer Copy?:  " << layerCopy_ << endl; \
 for (uint i0 = 0; i0 < 6; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Shorts 2[" << i0 << "]:  " << unknownShorts2[i0] << endl; \
 }; \
 out << "Translation:  " << translation << endl; \
@@ -2837,6 +2987,10 @@ out << "Unknown Float 01:  " << unknownFloat01 << endl; \
 out << "Angular Velocity:  " << angularVelocity << endl; \
 out << "Unknown Float 02:  " << unknownFloat02 << endl; \
 for (uint i0 = 0; i0 < 12; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Transform?[" << i0 << "]:  " << transform_[i0] << endl; \
 }; \
 out << "Center:  " << center << endl; \
@@ -2858,6 +3012,10 @@ out << "Unknown Int 7:  " << unknownInt7 << endl; \
 out << "Unknown Int 8:  " << unknownInt8 << endl; \
 out << "Num Constraints:  " << numConstraints << endl; \
 for (uint i0 = 0; i0 < constraints.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Constraints[" << i0 << "]:  " << constraints[i0] << endl; \
 }; \
 return out.str(); \
@@ -2936,10 +3094,18 @@ NifStream( unknownFloat, out, version ); \
 stringstream out; \
 out << bhkEntity::asString(); \
 for (uint i0 = 0; i0 < 7; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unkown Floats[" << i0 << "]:  " << unkownFloats[i0] << endl; \
 }; \
 for (uint i0 = 0; i0 < 3; i0++) { \
 	for (uint i1 = 0; i1 < 5; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Floats 2[" << i0 << "][" << i1 << "]:  " << unknownFloats2[i0][i1] << endl; \
 	}; \
 }; \
@@ -3032,6 +3198,10 @@ stringstream out; \
 out << AbhkConstraint::asString(); \
 for (uint i0 = 0; i0 < 2; i0++) { \
 	for (uint i1 = 0; i1 < 4; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Floats[" << i0 << "][" << i1 << "]:  " << unknownFloats[i0][i1] << endl; \
 	}; \
 }; \
@@ -3127,6 +3297,10 @@ for (uint i0 = 0; i0 < 6; i0++) { \
 stringstream out; \
 out << NiExtraData::asString(); \
 for (uint i0 = 0; i0 < 6; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats[" << i0 << "]:  " << unknownFloats[i0] << endl; \
 }; \
 return out.str(); \
@@ -3309,6 +3483,10 @@ for (uint i0 = 0; i0 < triangles.size(); i0++) { \
 }; \
 out << "Num Vertices:  " << numVertices << endl; \
 for (uint i0 = 0; i0 < vertices.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Vertices[" << i0 << "]:  " << vertices[i0] << endl; \
 }; \
 return out.str(); \
@@ -3479,6 +3657,10 @@ out << "Unknown Short:  " << unknownShort << endl; \
 out << "Has Sizes:  " << hasSizes << endl; \
 if ( (hasSizes != 0) ) { \
 	for (uint i1 = 0; i1 < sizes.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Sizes[" << i1 << "]:  " << sizes[i1] << endl; \
 	}; \
 }; \
@@ -3523,6 +3705,10 @@ out << NiExtraData::asString(); \
 out << "Data Size:  " << binaryData.dataSize << endl; \
 out << "Unknown Int:  " << binaryData.unknownInt << endl; \
 for (uint i0 = 0; i0 < binaryData.data.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Data[" << i0 << "]:  " << binaryData.data[i0] << endl; \
 }; \
 return out.str(); \
@@ -3695,6 +3881,10 @@ for (uint i0 = 0; i0 < shapeGroups1.size(); i0++) { \
 }; \
 out << "Num Shape Groups 2:  " << numShapeGroups2 << endl; \
 for (uint i0 = 0; i0 < shapeGroups2.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Shape Groups 2[" << i0 << "]:  " << shapeGroups2[i0] << endl; \
 }; \
 return out.str(); \
@@ -3767,6 +3957,10 @@ if ( (data.numKeys != 0) ) { \
 	out << "  Interpolation:  " << data.interpolation << endl; \
 }; \
 for (uint i0 = 0; i0 < data.keys.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Keys[" << i0 << "]:  " << data.keys[i0] << endl; \
 }; \
 return out.str(); \
@@ -3955,6 +4149,10 @@ for (uint i0 = 0; i0 < 6; i0++) { \
 stringstream out; \
 out << NiBSplineInterpolator::asString(); \
 for (uint i0 = 0; i0 < 6; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats[" << i0 << "]:  " << unknownFloats[i0] << endl; \
 }; \
 return out.str(); \
@@ -3999,6 +4197,10 @@ out << NiBSplineInterpolator::asString(); \
 out << "Data:  " << data << endl; \
 out << "Unknown Link:  " << unknownLink << endl; \
 for (uint i0 = 0; i0 < 6; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats[" << i0 << "]:  " << unknownFloats[i0] << endl; \
 }; \
 return out.str(); \
@@ -4057,6 +4259,10 @@ out << NiBSplineInterpolator::asString(); \
 out << "Data:  " << data << endl; \
 out << "Basis Data:  " << basisData << endl; \
 for (uint i0 = 0; i0 < 17; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown4[" << i0 << "]:  " << unknown4[i0] << endl; \
 }; \
 return out.str(); \
@@ -4118,6 +4324,10 @@ out << "Unknown Int:  " << unknownInt << endl; \
 out << "Count:  " << count << endl; \
 for (uint i0 = 0; i0 < unknownData.size(); i0++) { \
 	for (uint i1 = 0; i1 < 2; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Data[" << i0 << "][" << i1 << "]:  " << unknownData[i0][i1] << endl; \
 	}; \
 }; \
@@ -4308,11 +4518,19 @@ if ( (collisionType == 0) ) { \
 }; \
 if ( (collisionType == 2) ) { \
 	for (uint i1 = 0; i1 < 8; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown6[" << i1 << "]:  " << unknown6[i1] << endl; \
 	}; \
 }; \
 if ( (collisionType == 1) ) { \
 	for (uint i1 = 0; i1 < 15; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown8[" << i1 << "]:  " << unknown8[i1] << endl; \
 	}; \
 }; \
@@ -4366,6 +4584,10 @@ if ( (data.numKeys != 0) ) { \
 	out << "  Interpolation:  " << data.interpolation << endl; \
 }; \
 for (uint i0 = 0; i0 < data.keys.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Keys[" << i0 << "]:  " << data.keys[i0] << endl; \
 }; \
 return out.str(); \
@@ -4440,6 +4662,10 @@ out << NiTimeController::asString(); \
 out << "Cumulative:  " << cumulative << endl; \
 out << "Num Controller Sequences:  " << numControllerSequences << endl; \
 for (uint i0 = 0; i0 < controllerSequences.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Controller Sequences[" << i0 << "]:  " << controllerSequences[i0] << endl; \
 }; \
 out << "Object Palette:  " << objectPalette << endl; \
@@ -5077,6 +5303,10 @@ out << "Unknown Int 2:  " << unknownInt2 << endl; \
 out << "Delta:  " << delta << endl; \
 out << "Num Sources:  " << numSources << endl; \
 for (uint i0 = 0; i0 < sources.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Sources[" << i0 << "]:  " << sources[i0] << endl; \
 }; \
 return out.str(); \
@@ -5131,6 +5361,10 @@ if ( (data.numKeys != 0) ) { \
 	out << "  Interpolation:  " << data.interpolation << endl; \
 }; \
 for (uint i0 = 0; i0 < data.keys.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Keys[" << i0 << "]:  " << data.keys[i0] << endl; \
 }; \
 return out.str(); \
@@ -5282,6 +5516,10 @@ stringstream out; \
 out << NiExtraData::asString(); \
 out << "Num Floats:  " << numFloats << endl; \
 for (uint i0 = 0; i0 < data.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Data[" << i0 << "]:  " << data[i0] << endl; \
 }; \
 return out.str(); \
@@ -5401,10 +5639,18 @@ out << "Data:  " << data << endl; \
 out << "Unknown Byte:  " << unknownByte << endl; \
 out << "Num Interpolators:  " << numInterpolators << endl; \
 for (uint i0 = 0; i0 < interpolators.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Interpolators[" << i0 << "]:  " << interpolators[i0] << endl; \
 }; \
 out << "Num Unknown Ints:  " << numUnknownInts << endl; \
 for (uint i0 = 0; i0 < unknownInts.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Ints[" << i0 << "]:  " << unknownInts[i0] << endl; \
 }; \
 return out.str(); \
@@ -5531,6 +5777,10 @@ stringstream out; \
 out << NiExtraData::asString(); \
 out << "Num Integers:  " << numIntegers << endl; \
 for (uint i0 = 0; i0 < data.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Data[" << i0 << "]:  " << data[i0] << endl; \
 }; \
 return out.str(); \
@@ -5723,6 +5973,10 @@ if ( (numRotationKeys != 0) ) { \
 }; \
 if ( (rotationType != 4) ) { \
 	for (uint i1 = 0; i1 < quaternionKeys.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Quaternion Keys[" << i1 << "]:  " << quaternionKeys[i1] << endl; \
 	}; \
 }; \
@@ -5734,6 +5988,10 @@ if ( (rotationType == 4) ) { \
 			out << "      Interpolation:  " << xyzRotations[i1].interpolation << endl; \
 		}; \
 		for (uint i2 = 0; i2 < xyzRotations[i1].keys.size(); i2++) { \
+			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) { \
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+				break; \
+			}; \
 			out << "      Keys[" << i2 << "]:  " << xyzRotations[i1].keys[i2] << endl; \
 		}; \
 	}; \
@@ -5743,6 +6001,10 @@ if ( (translations.numKeys != 0) ) { \
 	out << "  Interpolation:  " << translations.interpolation << endl; \
 }; \
 for (uint i0 = 0; i0 < translations.keys.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Keys[" << i0 << "]:  " << translations.keys[i0] << endl; \
 }; \
 out << "Num Keys:  " << scales.numKeys << endl; \
@@ -5750,6 +6012,10 @@ if ( (scales.numKeys != 0) ) { \
 	out << "  Interpolation:  " << scales.interpolation << endl; \
 }; \
 for (uint i0 = 0; i0 < scales.keys.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Keys[" << i0 << "]:  " << scales.keys[i0] << endl; \
 }; \
 return out.str(); \
@@ -6234,16 +6500,28 @@ out << APSysData::asString(); \
 out << "Unknown Byte 11:  " << unknownByte11 << endl; \
 for (uint i0 = 0; i0 < unknownFloats3.size(); i0++) { \
 	for (uint i1 = 0; i1 < 4; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Floats 3[" << i0 << "][" << i1 << "]:  " << unknownFloats3[i0][i1] << endl; \
 	}; \
 }; \
 for (uint i0 = 0; i0 < unknownFloats4.size(); i0++) { \
 	for (uint i1 = 0; i1 < 10; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Floats 4[" << i0 << "][" << i1 << "]:  " << unknownFloats4[i0][i1] << endl; \
 	}; \
 }; \
 for (uint i0 = 0; i0 < unknownFloats5.size(); i0++) { \
 	for (uint i1 = 0; i1 < 12; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Floats 5[" << i0 << "][" << i1 << "]:  " << unknownFloats5[i0][i1] << endl; \
 	}; \
 }; \
@@ -6252,6 +6530,10 @@ out << "Modifier:  " << modifier << endl; \
 out << "Unknown Byte 2:  " << unknownByte2 << endl; \
 out << "Num Unknown Links:  " << numUnknownLinks << endl; \
 for (uint i0 = 0; i0 < unknownLinks.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Links[" << i0 << "]:  " << unknownLinks[i0] << endl; \
 }; \
 out << "Unknown Short 4:  " << unknownShort4 << endl; \
@@ -6369,10 +6651,18 @@ for (uint i0 = 0; i0 < morphs.size(); i0++) { \
 	out << "  Num Morph Keys:  " << morphs[i0].numMorphKeys << endl; \
 	out << "  Morph Interpolation:  " << morphs[i0].morphInterpolation << endl; \
 	for (uint i1 = 0; i1 < morphs[i0].morphKeys.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Morph Keys[" << i1 << "]:  " << morphs[i0].morphKeys[i1] << endl; \
 	}; \
 	out << "  Unknown Int:  " << morphs[i0].unknownInt << endl; \
 	for (uint i1 = 0; i1 < morphs[i0].vectors.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Vectors[" << i1 << "]:  " << morphs[i0].vectors[i1] << endl; \
 	}; \
 }; \
@@ -6414,6 +6704,10 @@ stringstream out; \
 out << NiTimeController::asString(); \
 out << "Num Extra Targets:  " << numExtraTargets << endl; \
 for (uint i0 = 0; i0 < extraTargets.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Extra Targets[" << i0 << "]:  " << extraTargets[i0] << endl; \
 }; \
 return out.str(); \
@@ -6475,10 +6769,18 @@ stringstream out; \
 out << NiAVObject::asString(); \
 out << "Num Children:  " << numChildren << endl; \
 for (uint i0 = 0; i0 < children.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Children[" << i0 << "]:  " << children[i0] << endl; \
 }; \
 out << "Num Effects:  " << numEffects << endl; \
 for (uint i0 = 0; i0 < effects.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Effects[" << i0 << "]:  " << effects[i0] << endl; \
 }; \
 return out.str(); \
@@ -6556,6 +6858,10 @@ stringstream out; \
 out << NiNode::asString(); \
 out << "Unknown1:  " << unknown1 << endl; \
 for (uint i0 = 0; i0 < 292; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown 292 Bytes[" << i0 << "]:  " << unknown292Bytes[i0] << endl; \
 }; \
 return out.str(); \
@@ -6630,6 +6936,10 @@ out << "Unknown Int  2:  " << unknownInt2 << endl; \
 out << "Unknown Int 3:  " << unknownInt3 << endl; \
 out << "Num Unknown Links:  " << numUnknownLinks << endl; \
 for (uint i0 = 0; i0 < unknownLinks.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Links[" << i0 << "]:  " << unknownLinks[i0] << endl; \
 }; \
 return out.str(); \
@@ -6840,6 +7150,10 @@ out << "Unknown Byte:  " << unknownByte << endl; \
 out << "Num Entries?:  " << numEntries_ << endl; \
 for (uint i0 = 0; i0 < 256; i0++) { \
 	for (uint i1 = 0; i1 < 4; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Palette[" << i0 << "][" << i1 << "]:  " << palette[i0][i1] << endl; \
 	}; \
 }; \
@@ -7194,12 +7508,20 @@ out << "Num Active:  " << numActive << endl; \
 out << "Has Unknown Floats:  " << hasUnknownFloats << endl; \
 if ( (hasUnknownFloats != 0) ) { \
 	for (uint i1 = 0; i1 < unknownFloats.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Floats[" << i1 << "]:  " << unknownFloats[i1] << endl; \
 	}; \
 }; \
 out << "Has Rotations:  " << hasRotations << endl; \
 if ( (hasRotations != 0) ) { \
 	for (uint i1 = 0; i1 < rotations.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Rotations[" << i1 << "]:  " << rotations[i1] << endl; \
 	}; \
 }; \
@@ -7285,6 +7607,10 @@ out << NiParticles::asString(); \
 out << "Unknown Bool:  " << unknownBool << endl; \
 out << "Num Modifiers:  " << numModifiers << endl; \
 for (uint i0 = 0; i0 < modifiers.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Modifiers[" << i0 << "]:  " << modifiers[i0] << endl; \
 }; \
 return out.str(); \
@@ -7811,10 +8137,18 @@ out << "Blue Mask:  " << blueMask << endl; \
 out << "Alpha Mask:  " << alphaMask << endl; \
 out << "Bits Per Pixel:  " << bitsPerPixel << endl; \
 for (uint i0 = 0; i0 < 8; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown 8 Bytes[" << i0 << "]:  " << unknown8Bytes[i0] << endl; \
 }; \
 out << "Unknown Int:  " << unknownInt << endl; \
 for (uint i0 = 0; i0 < 54; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown 54 Bytes[" << i0 << "]:  " << unknown54Bytes[i0] << endl; \
 }; \
 out << "Palette:  " << palette << endl; \
@@ -7828,6 +8162,10 @@ for (uint i0 = 0; i0 < mipmaps.size(); i0++) { \
 out << "Data Size:  " << pixelData.dataSize << endl; \
 out << "Unknown Int:  " << pixelData.unknownInt << endl; \
 for (uint i0 = 0; i0 < pixelData.data.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Data[" << i0 << "]:  " << pixelData.data[i0] << endl; \
 }; \
 return out.str(); \
@@ -8058,6 +8396,10 @@ if ( (data.numKeys != 0) ) { \
 	out << "  Interpolation:  " << data.interpolation << endl; \
 }; \
 for (uint i0 = 0; i0 < data.keys.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Keys[" << i0 << "]:  " << data.keys[i0] << endl; \
 }; \
 return out.str(); \
@@ -8151,12 +8493,24 @@ stringstream out; \
 out << NiPSysModifier::asString(); \
 out << "Unknown Link:  " << unknownLink << endl; \
 for (uint i0 = 0; i0 < 2; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Ints 1[" << i0 << "]:  " << unknownInts1[i0] << endl; \
 }; \
 for (uint i0 = 0; i0 < 3; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats[" << i0 << "]:  " << unknownFloats[i0] << endl; \
 }; \
 for (uint i0 = 0; i0 < 2; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Ints 2[" << i0 << "]:  " << unknownInts2[i0] << endl; \
 }; \
 return out.str(); \
@@ -8436,6 +8790,10 @@ stringstream out; \
 out << APSysData::asString(); \
 for (uint i0 = 0; i0 < unknownFloats4.size(); i0++) { \
 	for (uint i1 = 0; i1 < 10; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown Floats 4[" << i0 << "][" << i1 << "]:  " << unknownFloats4[i0][i1] << endl; \
 	}; \
 }; \
@@ -8443,6 +8801,10 @@ out << "Unknown Bool 1:  " << unknownBool1 << endl; \
 if ( (unknownBool1 != 0) ) { \
 	for (uint i1 = 0; i1 < unknownBytes.size(); i1++) { \
 		for (uint i2 = 0; i2 < 32; i2++) { \
+			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) { \
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+				break; \
+			}; \
 			out << "      Unknown Bytes[" << i1 << "][" << i2 << "]:  " << unknownBytes[i1][i2] << endl; \
 		}; \
 	}; \
@@ -8450,6 +8812,10 @@ if ( (unknownBool1 != 0) ) { \
 if ( (unknownBool1 == 0) ) { \
 	for (uint i1 = 0; i1 < unknownBytesAlt.size(); i1++) { \
 		for (uint i2 = 0; i2 < 28; i2++) { \
+			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) { \
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+				break; \
+			}; \
 			out << "      Unknown Bytes Alt[" << i1 << "][" << i2 << "]:  " << unknownBytesAlt[i1][i2] << endl; \
 		}; \
 	}; \
@@ -8459,6 +8825,10 @@ out << "Unknown Bool 2:  " << unknownBool2 << endl; \
 if ( (unknownBool2 != 0) ) { \
 	for (uint i1 = 0; i1 < unknownBytes2.size(); i1++) { \
 		for (uint i2 = 0; i2 < 4; i2++) { \
+			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) { \
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+				break; \
+			}; \
 			out << "      Unknown Bytes 2[" << i1 << "][" << i2 << "]:  " << unknownBytes2[i1][i2] << endl; \
 		}; \
 	}; \
@@ -8607,10 +8977,18 @@ if ( (floatKeys_.numKeys != 0) ) { \
 	out << "  Interpolation:  " << floatKeys_.interpolation << endl; \
 }; \
 for (uint i0 = 0; i0 < floatKeys_.keys.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Keys[" << i0 << "]:  " << floatKeys_.keys[i0] << endl; \
 }; \
 out << "Num Visibility Keys?:  " << numVisibilityKeys_ << endl; \
 for (uint i0 = 0; i0 < visibilityKeys_.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Visibility Keys?[" << i0 << "]:  " << visibilityKeys_[i0] << endl; \
 }; \
 return out.str(); \
@@ -8891,6 +9269,10 @@ stringstream out; \
 out << NiPSysEmitter::asString(); \
 out << "Num Emitter Meshes:  " << numEmitterMeshes << endl; \
 for (uint i0 = 0; i0 < emitterMeshes.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Emitter Meshes[" << i0 << "]:  " << emitterMeshes[i0] << endl; \
 }; \
 out << "Initial Velocity Type:  " << initialVelocityType << endl; \
@@ -8943,6 +9325,10 @@ stringstream out; \
 out << NiPSysModifier::asString(); \
 out << "Num Meshes:  " << numMeshes << endl; \
 for (uint i0 = 0; i0 < meshes.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Meshes[" << i0 << "]:  " << meshes[i0] << endl; \
 }; \
 return out.str(); \
@@ -9410,10 +9796,18 @@ for (uint i0 = 0; i0 < unknownFloats2.size(); i0++) { \
 stringstream out; \
 out << NiObject::asString(); \
 for (uint i0 = 0; i0 < 8; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats[" << i0 << "]:  " << unknownFloats[i0] << endl; \
 }; \
 out << "Unknown Count:  " << unknownCount << endl; \
 for (uint i0 = 0; i0 < unknownFloats2.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Floats 2[" << i0 << "]:  " << unknownFloats2[i0] << endl; \
 }; \
 return out.str(); \
@@ -9556,6 +9950,10 @@ for (uint i0 = 0; i0 < boneList.size(); i0++) { \
 	out << "  Translation:  " << boneList[i0].translation << endl; \
 	out << "  Scale:  " << boneList[i0].scale << endl; \
 	for (uint i1 = 0; i1 < 4; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Unknown 4 Floats[" << i1 << "]:  " << boneList[i0].unknown4Floats[i1] << endl; \
 	}; \
 	out << "  Num Vertices:  " << boneList[i0].numVertices << endl; \
@@ -9629,6 +10027,10 @@ out << "Skin Partition:  " << skinPartition << endl; \
 out << "Skeleton Root:  " << skeletonRoot << endl; \
 out << "Num Bones:  " << bones.numBones << endl; \
 for (uint i0 = 0; i0 < bones.bones.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Bones[" << i0 << "]:  " << bones.bones[i0] << endl; \
 }; \
 return out.str(); \
@@ -9868,29 +10270,53 @@ for (uint i0 = 0; i0 < skinPartitionBlocks.size(); i0++) { \
 	out << "  Num Strips:  " << skinPartitionBlocks[i0].numStrips << endl; \
 	out << "  Num Weights Per Vertex:  " << skinPartitionBlocks[i0].numWeightsPerVertex << endl; \
 	for (uint i1 = 0; i1 < skinPartitionBlocks[i0].bones.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Bones[" << i1 << "]:  " << skinPartitionBlocks[i0].bones[i1] << endl; \
 	}; \
 	out << "  Has Vertex Map:  " << skinPartitionBlocks[i0].hasVertexMap << endl; \
 	for (uint i1 = 0; i1 < skinPartitionBlocks[i0].vertexMap.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Vertex Map[" << i1 << "]:  " << skinPartitionBlocks[i0].vertexMap[i1] << endl; \
 	}; \
 	out << "  Has Vertex Weights:  " << skinPartitionBlocks[i0].hasVertexWeights << endl; \
 	for (uint i1 = 0; i1 < skinPartitionBlocks[i0].vertexWeights.size(); i1++) { \
 		for (uint i2 = 0; i2 < skinPartitionBlocks[i0].vertexWeights[i1].size(); i2++) { \
+			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) { \
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+				break; \
+			}; \
 			out << "      Vertex Weights[" << i1 << "][" << i2 << "]:  " << skinPartitionBlocks[i0].vertexWeights[i1][i2] << endl; \
 		}; \
 	}; \
 	for (uint i1 = 0; i1 < skinPartitionBlocks[i0].stripLengths.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Strip Lengths[" << i1 << "]:  " << skinPartitionBlocks[i0].stripLengths[i1] << endl; \
 	}; \
 	out << "  Has Strips:  " << skinPartitionBlocks[i0].hasStrips << endl; \
 	for (uint i1 = 0; i1 < skinPartitionBlocks[i0].strips.size(); i1++) { \
 		for (uint i2 = 0; i2 < skinPartitionBlocks[i0].stripLengths[i1]; i2++) { \
+			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) { \
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+				break; \
+			}; \
 			out << "      Strips[" << i1 << "][" << i2 << "]:  " << skinPartitionBlocks[i0].strips[i1][i2] << endl; \
 		}; \
 	}; \
 	if ( (skinPartitionBlocks[i0].numStrips == 0) ) { \
 		for (uint i2 = 0; i2 < skinPartitionBlocks[i0].triangles.size(); i2++) { \
+			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) { \
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+				break; \
+			}; \
 			out << "      Triangles[" << i2 << "]:  " << skinPartitionBlocks[i0].triangles[i2] << endl; \
 		}; \
 	}; \
@@ -9898,6 +10324,10 @@ for (uint i0 = 0; i0 < skinPartitionBlocks.size(); i0++) { \
 	if ( (skinPartitionBlocks[i0].hasBoneIndices != 0) ) { \
 		for (uint i2 = 0; i2 < skinPartitionBlocks[i0].boneIndices.size(); i2++) { \
 			for (uint i3 = 0; i3 < skinPartitionBlocks[i0].boneIndices[i2].size(); i3++) { \
+				if ( !verbose && ( i3 > MAXARRAYDUMP ) ) { \
+					out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+					break; \
+				}; \
 				out << "        Bone Indices[" << i2 << "][" << i3 << "]:  " << skinPartitionBlocks[i0].boneIndices[i2][i3] << endl; \
 			}; \
 		}; \
@@ -10299,6 +10729,10 @@ stringstream out; \
 out << NiExtraData::asString(); \
 out << "Num Strings:  " << numStrings << endl; \
 for (uint i0 = 0; i0 < data.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Data[" << i0 << "]:  " << data[i0] << endl; \
 }; \
 return out.str(); \
@@ -10345,6 +10779,10 @@ out << NiExtraData::asString(); \
 out << "Unknown Int 1:  " << unknownInt1 << endl; \
 out << "Num Text Keys:  " << numTextKeys << endl; \
 for (uint i0 = 0; i0 < textKeys.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Text Keys[" << i0 << "]:  " << textKeys[i0] << endl; \
 }; \
 return out.str(); \
@@ -11376,6 +11814,10 @@ out << "Translation:  " << translation << endl; \
 out << "Rotation:  " << rotation << endl; \
 out << "Scale:  " << scale << endl; \
 for (uint i0 = 0; i0 < 3; i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Unknown Bytes[" << i0 << "]:  " << unknownBytes[i0] << endl; \
 }; \
 out << "Data:  " << data << endl; \
@@ -11493,12 +11935,20 @@ out << "Num Triangles:  " << numTriangles << endl; \
 out << "Num Triangle Points:  " << numTrianglePoints << endl; \
 out << "Has Triangles:  " << hasTriangles << endl; \
 for (uint i0 = 0; i0 < triangles.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Triangles[" << i0 << "]:  " << triangles[i0] << endl; \
 }; \
 out << "Num Match Groups:  " << numMatchGroups << endl; \
 for (uint i0 = 0; i0 < matchGroups.size(); i0++) { \
 	out << "  Num Vertices:  " << matchGroups[i0].numVertices << endl; \
 	for (uint i1 = 0; i1 < matchGroups[i0].vertexIndices.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Vertex Indices[" << i1 << "]:  " << matchGroups[i0].vertexIndices[i1] << endl; \
 	}; \
 }; \
@@ -11608,11 +12058,19 @@ out << NiTriBasedGeomData::asString(); \
 out << "Num Triangles:  " << numTriangles << endl; \
 out << "Num Strips:  " << numStrips << endl; \
 for (uint i0 = 0; i0 < stripLengths.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Strip Lengths[" << i0 << "]:  " << stripLengths[i0] << endl; \
 }; \
 out << "Has Points:  " << hasPoints << endl; \
 for (uint i0 = 0; i0 < points.size(); i0++) { \
 	for (uint i1 = 0; i1 < stripLengths[i0]; i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Points[" << i0 << "][" << i1 << "]:  " << points[i0][i1] << endl; \
 	}; \
 }; \
@@ -11704,6 +12162,10 @@ for (uint i0 = 0; i0 < 4; i0++) { \
 		out << "    Interpolation:  " << uvGroups[i0].interpolation << endl; \
 	}; \
 	for (uint i1 = 0; i1 < uvGroups[i0].keys.size(); i1++) { \
+		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { \
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+			break; \
+		}; \
 		out << "    Keys[" << i1 << "]:  " << uvGroups[i0].keys[i1] << endl; \
 	}; \
 }; \
@@ -11813,6 +12275,10 @@ out << NiExtraData::asString(); \
 out << "Num Bytes:  " << numBytes << endl; \
 out << "Num Vertices:  " << numVertices << endl; \
 for (uint i0 = 0; i0 < weight.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Weight[" << i0 << "]:  " << weight[i0] << endl; \
 }; \
 return out.str(); \
@@ -11893,6 +12359,10 @@ stringstream out; \
 out << AKeyedData::asString(); \
 out << "Num Vis Keys:  " << numVisKeys << endl; \
 for (uint i0 = 0; i0 < visKeys.size(); i0++) { \
+	if ( !verbose && ( i0 > MAXARRAYDUMP ) ) { \
+		out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; \
+		break; \
+	}; \
 	out << "  Vis Keys[" << i0 << "]:  " << visKeys[i0] << endl; \
 }; \
 return out.str(); \