1/**
2 * Handles paste from Lucidchart
3 *
4 * TODO: Move to dynamic loading minimized plugin.
5 */
6//This covers version 52 of Lucidchart ("BCUVersion": 52 or "BackwardsCompatibilityStateVersion": 52)
7LucidImporter = {};
8(function()
9{
10	// Global import transformation
11	var defaultFontSize = '13';
12	var defaultLucidFont = 'Liberation Sans';
13	var scale = 0.75;
14	var dx = 0;
15	var dy = 0;
16
17	var arcSize = 6;
18	var edgeStyle = 'html=1;jettySize=18;';
19	var vertexStyle = 'html=1;overflow=block;blockSpacing=1;whiteSpace=wrap;';
20	var labelStyle = 'text;html=1;resizable=0;labelBackgroundColor=#ffffff;align=center;verticalAlign=middle;';
21
22	var c = 'verticalLabelPosition=bottom;verticalAlign=top;fillColor=#036897;strokeColor=#ffffff';
23	var s = 'shape=mxgraph.';
24	var ss = 'strokeColor=none;shape=mxgraph.';
25	var ssAzure = 'verticalLabelPosition=bottom;verticalAlign=top;' + ss;
26	var cs = 'mxCompositeShape';
27	var azur19 = 'aspect=fixed;html=1;points=[];align=center;verticalAlign=top;image;image=img/lib/mscae/';
28	var gcpIcon = 'html=1;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none;shape=mxgraph.gcp2.';
29	var kupIcon = 'html=1;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none;shape=mxgraph.kubernetes.icon;prIcon=';
30
31	//Instead of doing a massive code refactoring, thees ugly global variables are used
32	var isLastLblHTML = false;
33	var gFontFamilyStyle = '';
34
35	//stencils to rotate counter clockwise 90 degrees
36	var rccw = [
37		'AEUSBBlock',
38		'AGSCutandpasteBlock',
39		'iOSDeviceiPadLandscape',
40		'iOSDeviceiPadProLandscape'
41	];
42
43	//stencils to rotate clockwise 180 degrees
44	var rcw2 = [
45		'fpDoor'
46	];
47
48	var edgeStyleMap = {
49			'None': 'none;',
50			'Arrow': 'block;xyzFill=1;',
51			'Hollow Arrow': 'block;xyzFill=0;',
52			'Open Arrow': 'open;',
53			'CFN ERD Zero Or More Arrow': 'ERzeroToMany;xyzSize=10;',
54			'CFN ERD One Or More Arrow': 'ERoneToMany;xyzSize=10;',
55			'CFN ERD Many Arrow': 'ERmany;xyzSize=10;',
56			'CFN ERD Exactly One Arrow': 'ERmandOne;xyzSize=10;',
57			'CFN ERD Zero Or One Arrow': 'ERzeroToOne;xyzSize=10;',
58			'CFN ERD One Arrow': 'ERone;xyzSize=16;',
59			'Generalization': 'block;xyzFill=0;xyzSize=12;',
60			'Big Open Arrow': 'open;xyzSize=10;',
61			'Asynch1': 'openAsync;flipV=1;xyzSize=10;',
62			'Asynch2': 'openAsync;xyzSize=10;',
63			'Aggregation': 'diamond;xyzFill=0;xyzSize=16;',
64			'Composition': 'diamond;xyzFill=1;xyzSize=16;',
65			'BlockEnd': 'box;xyzFill=0;xyzSize=16;',
66			'Measure': 'ERone;xyzSize=10;',
67			'CircleOpen': 'oval;xyzFill=0;xyzSize=16;',
68			'CircleClosed': 'oval;xyzFill=1;xyzSize=16;',
69			'BlockEndFill': 'box;xyzFill=1;xyzSize=16;',
70			'Nesting': 'circlePlus;xyzSize=7;xyzFill=0;',
71			'BPMN Conditional': 'diamond;xyzFill=0;',
72			'BPMN Default': 'dash;'
73	};
74
75	var styleMap = {
76//Standard
77			'DefaultTextBlockNew': 'strokeColor=none;fillColor=none',
78			'DefaultTextBlock': 'strokeColor=none;fillColor=none',
79			'DefaultSquareBlock': '',
80			'RectangleBlock': '',
81			'DefaultNoteBlock': 'shape=note;size=15',
82			'DefaultNoteBlockV2': 'shape=note;size=15',
83			'HotspotBlock': 'strokeColor=none;fillColor=none',
84			'ImageSearchBlock2': 'shape=image',
85			'UserImage2Block': 'shape=image',
86			'ExtShapeBoxBlock': '',
87			'DefaultStickyNoteBlock': 'shadow=1',
88//Flowchart
89			'ProcessBlock': '',
90			'DecisionBlock': 'rhombus',
91			'TerminatorBlock': 'rounded=1;arcSize=50',
92			'PredefinedProcessBlock': 'shape=process',
93			'DocumentBlock': 'shape=document;boundedLbl=1',
94			'MultiDocumentBlock': s + 'flowchart.multi-document',
95			'ManualInputBlock': 'shape=manualInput;size=15',
96			'PreparationBlock': 'shape=hexagon;perimeter=hexagonPerimeter2',
97			'DataBlock': 'shape=parallelogram;perimeter=parallelogramPerimeter;anchorPointDirection=0',
98			'DataBlockNew': 'shape=parallelogram;perimeter=parallelogramPerimeter;anchorPointDirection=0',
99			'DatabaseBlock': 'shape=cylinder3;size=4;anchorPointDirection=0;boundedLbl=1;',
100			'DirectAccessStorageBlock': 'shape=cylinder3;direction=south;size=10;anchorPointDirection=0;boundedLbl=1;',
101			'InternalStorageBlock': cs,
102			'PaperTapeBlock': 'shape=tape;size=0.2',
103			'ManualOperationBlockNew': 'shape=trapezoid;perimeter=trapezoidPerimeter;anchorPointDirection=0;flipV=1',
104			'DelayBlock': 'shape=delay',
105			'StoredDataBlock': 'shape=cylinder3;boundedLbl=1;size=15;lid=0;direction=south;',
106			'MergeBlock': 'triangle;direction=south;anchorPointDirection=0',
107			'ConnectorBlock': 'ellipse',
108			'OrBlock': s + 'flowchart.summing_function',
109			'SummingJunctionBlock': s + 'flowchart.or',
110			'DisplayBlock': 'shape=display',
111			'OffPageLinkBlock': 'shape=offPageConnector',
112			'BraceNoteBlock': cs,
113			'NoteBlock': cs,
114//Containers
115			'AdvancedSwimLaneBlock': cs,
116			'AdvancedSwimLaneBlockRotated': cs,
117			'RectangleContainerBlock': 'container=1;collapsible=0',
118			'DiamondContainerBlock':  'shape=rhombus;container=1;collapsible=0',
119			'RoundedRectangleContainerBlock': 'container=1;rounded=1;absoluteArcSize=1;arcSize=24;collapsible=0',
120			'CircleContainerBlock': 'ellipse;container=1;collapsible=0',
121			'PillContainerBlock': 'shape=mxgraph.flowchart.terminator;container=1;collapsible=0',
122			'BraceBlock': cs,
123			'BracketBlock': cs,
124			'BraceBlockRotated': cs,
125			'BracketBlockRotated': cs,
126//Geometric shapes
127			'IsoscelesTriangleBlock': 'shape=mxgraph.basic.acute_triangle;dx=0.5;anchorPointDirection=0',
128			'RightTriangleBlock': s + 'basic.orthogonal_triangle',
129			'PentagonBlock': s + 'basic.pentagon',
130			'HexagonBlock': 'shape=hexagon;perimeter=hexagonPerimeter2',
131			'OctagonBlock': s + 'basic.octagon2;dx=15;',
132			'CrossBlock': 'shape=cross;size=0.6',
133			'CloudBlock': 'ellipse;shape=cloud',
134			'HeartBlock': s + 'basic.heart',
135			'RightArrowBlock': cs,
136			'DoubleArrowBlock': cs,
137			'CalloutBlock': s + 'basic.rectangular_callout',
138			'CalloutSquareBlock': cs,
139			'ShapeCircleBlock': 'ellipse',
140			'ShapePolyStarBlock': s + 'basic.star',
141			'ShapeDiamondBlock': 'rhombus',
142//Misc
143			'UI2HotspotBlock' : 'opacity=50;strokeColor=none',
144//Android Devices
145			'AndroidDevice' : cs,
146//Android Dialogs
147			'AndroidAlertDialog' : cs,
148			'AndroidDateDialog' : cs,
149			'AndroidTimeDialog' : cs,
150//Android Blocks
151			'AndroidListItems' : cs,
152			'AndroidTabs' : cs,
153			'AndroidProgressBar' : cs,
154			'AndroidImageBlock' : cs,
155			'AndroidTextBlock' : cs,
156			'AndroidActionBar' : cs,
157//			'AndroidBrowserBar' NA
158//Android Inputs
159			'AndroidButton' : cs,
160			'AndroidTextBox' : cs,
161			'AndroidRadioButton' : cs,
162			'AndroidCheckBox' : cs,
163			'AndroidToggle' : cs,
164			'AndroidSlider' : cs,
165//Android Icons (not working properly, needs specific code)
166			'AndroidIconCheck': s + 'ios7.misc.check',
167//			'AndroidIconBack' NA
168			'AndroidIconCancel' : s + 'atlassian.x',
169			'AndroidIconCollapse': s + 'ios7.misc.up',
170			'AndroidIconExpand': s + 'ios7.misc.down',
171//			'AndroidIconForward' NA
172			'AndroidIconNext': s + 'ios7.misc.right',
173			'AndroidIconPrevious': s + 'ios7.misc.left',
174			'AndroidIconRefresh' : + 'ios7.icons.repeat',
175			'AndroidIconInformation': s + 'ios7.icons.info',
176//			'AndroidIconHelp' NA
177			'AndroidIconSearch': s + 'ios7.icons.looking_glass',
178			'AndroidIconSettings': s + 'ios7.icons.volume;direction=south',
179//			'AndroidIconDislike' NA
180//			'AndroidIconLike' NA
181//			'AndroidIconDelete' NA
182//			'AndroidIconCopy' NA
183//			'AndroidIconCut' NA
184//			'AndroidIconPaste' NA
185			'AndroidIconTrash': s + 'ios7.icons.trashcan',
186			'AndroidIconEmail': s + 'mockup.misc.mail2',
187			'AndroidIconNew': s + 'ios7.misc.flagged',
188//			'AndroidIconImage' NA
189//			'AndroidIconUndo' NA
190//			'AndroidIconSharing' NA
191//			'AndroidIconDownload' NA
192//			'AndroidIconError' NA
193//			'AndroidIconWarning' NA
194//iOS mockups
195			'iOSDeviceiPhoneSE': s + 'ios7.misc.iphone',
196			'iOSDeviceiPhone6s': s + 'ios7.misc.iphone',
197			'iOSDeviceiPhone6sPlus': s + 'ios7.misc.iphone',
198			'iOSDeviceiPadPortrait': s + 'ios7.misc.ipad7inch',
199			'iOSDeviceiPadLandscape': s + 'ios7.misc.ipad7inch',
200			'iOSDeviceiPadProPortrait': s + 'ios7.misc.ipad7inch',
201			'iOSDeviceiPadProLandscape': s + 'ios7.misc.ipad10inch',
202//iOS UI components
203			'iOSButton': 'fillColor=none;strokeColor=none;',
204			'iOSSegmentedControl' : cs, //TODO
205			'iOSStepper': s + 'ios7.misc.adjust',
206			'iOSToggle': s + 'ios7ui.onOffButton;buttonState=on;strokeColor2=#aaaaaa;fillColor2=#ffffff',
207			'iOSSlider': cs,
208			'iOSProgressBar': cs,
209			'iOSPageControls': cs,
210			'iOSStatusBar' : cs,
211			'iOSSearchBar' : cs,
212			'iOSNavBar' : cs,
213			'iOSTabs' : cs,
214			'iOSUniversalKeyboard': s + 'ios.iKeybLett',
215			'iOSDatePicker' : cs,
216			'iOSTimePicker' : cs,
217			'iOSCountdownPicker' : cs,
218			'iOSBasicCell' : cs,
219			'iOSSubtitleCell' : cs,
220			'iOSRightDetailCell' : cs,
221			'iOSLeftDetailCell' : cs,
222			'iOSTableGroupedSectionBreak' : cs,
223			'iOSTablePlainHeaderFooter' : cs,
224//Mind Map
225			'MindMapBlock' : '',
226			'MindMapStadiumBlock' : 'arcSize=50',
227			'MindMapCloud' : 'shape=cloud',
228			'MindMapCircle' : 'ellipse',
229			'MindMapIsoscelesTriangleBlock' : 'shape=triangle;direction=north',
230			'MindMapDiamondBlock' : 'shape=rhombus',
231			'MindMapPentagonBlock' : s + 'basic.pentagon',
232			'MindMapHexagonBlock' : 'shape=hexagon;perimeter=hexagonPerimeter2',
233			'MindMapOctagonBlock' : s + 'basic.octagon2;dx=10;',
234			'MindMapCrossBlock' : s + 'basic.cross2;dx=20',
235//Entity Relationship
236			'ERDEntityBlock' : cs,
237			'ERDEntityBlock2' : cs,
238			'ERDEntityBlock3' : cs,
239			'ERDEntityBlock4' : cs,
240//UML Class Diagram
241			'UMLClassBlock': cs,
242			'UMLActiveClassBlock': 'shape=process',
243			'UMLMultiplicityBlock' : cs,
244//			'UMLPackageBlock': 'shape=folder;tabPosition=left',
245			'UMLPackageBlock': '',
246			'UMLConstraintBlock' : cs,
247			'UMLNoteBlock': 'shape=note;size=15',
248			'UMLNoteBlockV2': 'shape=note;size=15',
249			'UMLTextBlock': cs,
250//UML Use Case
251			'UMLActorBlock': 'shape=umlActor;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;whiteSpace=nowrap',
252			'UMLUseCaseBlock': 'ellipse',
253			'UMLCircleContainerBlock': 'ellipse;container=1',
254			'UMLRectangleContainerBlock': 'container=1',
255//UML State/Activity
256			'UMLOptionLoopBlock' : s + 'sysml.package2;xSize=90;overflow=fill',
257			'UMLAlternativeBlock2' : s + 'sysml.package2;xSize=90;overflow=fill',
258			'UMLStartBlock' : 'ellipse;fillColor=#000000',
259			'UMLStateBlock' : cs,
260			'UMLDecisionBlock' : 'shape=rhombus;',
261			'UMLHForkJoinBlock' : 'fillColor=#000000',
262			'UMLVForkJoinBlock' : 'fillColor=#000000',
263			'UMLFlowFinalBlock' : s + 'flowchart.or',
264			'UMLHistoryStateBlock' : 'ellipse',
265			'UMLEndBlock' : s + 'bpmn.shape;outline=end;symbol=terminate;strokeColor=#000000;fillColor=#ffffff',
266			'UMLObjectBlock' : '',
267			'UMLSendSignalBlock' : s + 'sysml.sendSigAct',
268			'UMLReceiveSignalBlock' : s + 'sysml.accEvent;flipH=1',
269			'UMLAcceptTimeEventActionBlock' : s + 'sysml.timeEvent',
270//			'UMLInterruptingEdgeBlock' NA
271			'UMLOffPageLinkBlock' : s + 'sysml.sendSigAct;direction=south',
272//			'UMLExpansionNodeBlock' NA
273			'UMLMultiLanePoolBlock' : cs,
274			'UMLMultiLanePoolRotatedBlock' : cs,
275			'UMLMultidimensionalSwimlane' : cs,
276//UML Sequence
277			'UMLActivationBlock' : '',
278			'UMLDeletionBlock' : s + 'sysml.x;strokeWidth=4',
279//			'UMLAlternativeBlock' NA
280			'UMLSeqEntityBlock' : s + 'electrical.radio.microphone_1;direction=north',
281//			'UMLBoundaryBlock' NA
282//			'UMLControlBlock'NA
283//UML Component
284			'UMLComponentBlock' : 'shape=component;align=left;spacingLeft=36',
285			'UMLComponentBlockV2' : 'shape=component;align=left;spacingLeft=36',
286			'UMLNodeBlock' : 'shape=cube;size=20;flipH=1;verticalAlign=top;spacingTop=22;spacingLeft=5',
287			'UMLNodeBlockV2' : 'shape=cube;size=20;flipH=1;verticalAlign=top;spacingTop=22;spacingLeft=5',
288			'UMLComponentInterfaceBlock' : 'ellipse',
289			'UMLComponentInterfaceBlockV2' : 'ellipse',
290			'UMLComponentBoxBlock' : cs,
291			'UMLComponentBoxBlockV2' : cs,
292			'UMLAssemblyConnectorBlock': cs,
293			'UMLAssemblyConnectorBlockV2': cs,
294			'UMLProvidedInterfaceBlock' : cs,
295			'UMLProvidedInterfaceBlockV2' :cs,
296			'UMLRequiredInterfaceBlock' : 'shape=requires;direction=north',
297			'UMLRequiredInterfaceBlockV2' : 'shape=requires;direction=north',
298			'UMLSwimLaneBlockV2': cs,
299			'UMLSwimLaneBlock': 'swimlane;startSize=25;container=1;collapsible=0;dropTarget=0;fontStyle=0',
300//UML Deployment
301//UML Entity Relationship
302			'UMLEntityBlock' : '',
303			'UMLWeakEntityBlock' : 'shape=ext;double=1',
304			'UMLAttributeBlock' : 'ellipse',
305			'UMLMultivaluedAttributeBlock' : 'shape=doubleEllipse',
306			'UMLRelationshipBlock' : 'shape=rhombus',
307			'UMLWeakRelationshipBlock' : 'shape=rhombus;double=1',
308//BPMN 2.0
309			'BPMNActivity' : cs,
310			'BPMNEvent' : cs,
311			'BPMNChoreography' : cs,
312			'BPMNConversation' : cs,
313			'BPMNGateway' : cs,
314			'BPMNData' : cs,
315			'BPMNDataStore' : 'shape=datastore',
316			'BPMNAdvancedPoolBlock' : cs,
317			'BPMNAdvancedPoolBlockRotated' : cs,
318			'BPMNBlackPool' : cs,
319			'BPMNTextAnnotation' : cs,
320//Data Flow
321			'DFDExternalEntityBlock' : cs,
322			'DFDExternalEntityBlock2' : '',
323			'YDMDFDProcessBlock' : 'ellipse',
324			'YDMDFDDataStoreBlock' : 'shape=partialRectangle;right=0;left=0',
325			'GSDFDProcessBlock' : cs,
326			'GSDFDProcessBlock2' : 'rounded=1;arcSize=10;',
327			'GSDFDDataStoreBlock' : cs,
328			'GSDFDDataStoreBlock2' : 'shape=partialRectangle;right=0',
329//Org Chart
330			'OrgBlock' : cs,
331//Tables
332			'DefaultTableBlock' : cs,
333//Value Stream Mapping
334//Processes
335			'VSMCustomerSupplierBlock' : s + 'lean_mapping.outside_sources',
336			'VSMDedicatedProcessBlock' : cs,
337			'VSMSharedProcessBlock' : cs,
338			'VSMWorkcellBlock' : cs,
339			'VSMDatacellBlock' : cs,
340//Materials
341			'VSMInventoryBlock' : cs,
342			'VSMSupermarketBlock' : cs,
343			'VSMPhysicalPullBlock' : s + 'lean_mapping.physical_pull;direction=south',
344			'VSMFIFOLaneBlock' : cs,
345			'VSMSafetyBufferStockBlock' : cs,
346//Shipments
347			'VSMExternalShipmentAirplaneBlock' : s + 'lean_mapping.airplane_7',
348			'VSMExternalShipmentForkliftBlock' : s + 'lean_mapping.move_by_forklift',
349			'VSMExternalShipmentTruckBlock' : s + 'lean_mapping.truck_shipment;align=left;',
350			'VSMExternalShipmentBoatBlock' : s + 'lean_mapping.boat_shipment;verticalAlign=bottom;',
351//Information
352			'VSMProductionControlBlock' : cs,
353			'VSMOtherInformationBlock' : '',
354//			'VSMHeijyunkaBoxBlock' NA
355			'VSMSequencedPullBallBlock' : s + 'lean_mapping.sequenced_pull_ball',
356			'VSMMRPERPBlock' : s + 'lean_mapping.mrp_erp;whiteSpace=wrap',
357			'VSMLoadLevelingBlock' : s + 'lean_mapping.load_leveling',
358			'VSMGoSeeBlock' : s + 'lean_mapping.go_see_production_scheduling;flipH=1',
359			'VSMGoSeeProductionBlock' : cs,
360			'VSMVerbalInfoBlock' : s + 'lean_mapping.verbal',
361//Value Stream Mapping
362			'VSMKaizenBurstBlock' : s + 'lean_mapping.kaizen_lightening_burst',
363			'VSMOperatorBlock' : s + 'lean_mapping.operator;flipV=1',
364			'VSMTimelineBlock' : cs, //TODO Timeline shape
365			'VSMQualityProblemBlock' : s + 'lean_mapping.quality_problem',
366//Kanban
367			'VSMProductionKanbanSingleBlock' : 'shape=card;size=18;flipH=1;',
368			'VSMProductionKanbanBatchBlock' : cs,
369			'VSMWithdrawalKanbanBlock' : s + 'lean_mapping.withdrawal_kanban',
370//			'VSMWithdrawalKanbanBatchBlock' NA
371			'VSMSignalKanbanBlock' : 'shape=triangle;direction=south;anchorPointDirection=0',
372			'VSMKanbanPostBlock' : s + 'lean_mapping.kanban_post',
373//Arrows
374			'VSMShipmentArrow': 'shape=singleArrow;arrowWidth=0.5;arrowSize=0.13',
375			'VSMPushArrow' : s + 'lean_mapping.push_arrow',
376			'VSMElectronicInformationArrow' : cs,
377//EC2
378			'AWSElasticComputeCloudBlock2' : cs,
379//			'AWSElasticComputeCloudBlock2' : ss + 'aws3.ec2;verticalLabelPosition=bottom;align=center;verticalAlign=top',
380			'AWSInstanceBlock2' : ss + 'aws3.instance',
381			'AWSInstancesBlock2' : ss + 'aws3.instances;verticalLabelPosition=bottom;align=center;verticalAlign=top',
382			'AWSAMIBlock2' : ss + 'aws3.ami;verticalLabelPosition=bottom;align=center;verticalAlign=top',
383			'AWSDBonInstanceBlock2' : ss + 'aws3.db_on_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top',
384			'AWSInstanceCloudWatchBlock2' : ss + 'aws3.instance_with_cloudwatch;verticalLabelPosition=bottom;align=center;verticalAlign=top',
385			//'AmazonCloudWatch2017' : ss + 'aws3.instance_with_cloudwatch;verticalLabelPosition=bottom;align=center;verticalAlign=top',
386			'AWSElasticIPBlock2' : ss + 'aws3.elastic_ip;verticalLabelPosition=bottom;align=center;verticalAlign=top',
387			'AWSHDFSClusterBlock2' : ss + 'aws3.hdfs_cluster;verticalLabelPosition=bottom;align=center;verticalAlign=top',
388			'AWSAutoScalingBlock2' : ss + 'aws3.auto_scaling;verticalLabelPosition=bottom;align=center;verticalAlign=top',
389			'AWSEC2OptimizedInstance2' : ss + 'aws3.optimized_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top',
390			'AWSAmazonEC2(Spotinstance)' : ss + 'aws3.spot_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top',
391			'AWSAmazonECR' : ss + 'aws3.ecr;verticalLabelPosition=bottom;align=center;verticalAlign=top',
392			'AWSAmazonECS' : ss + 'aws3.ecs;verticalLabelPosition=bottom;align=center;verticalAlign=top',
393			'AWSLambda2' : ss + 'aws3.lambda;verticalLabelPosition=bottom;align=center;verticalAlign=top',
394			'AWSElasticLoadBalancing' : ss + 'aws3.elastic_load_balancing;verticalLabelPosition=bottom;align=center;verticalAlign=top',
395//Networking
396			'AWSElasticLoadBlock2' : ss + 'aws3.classic_load_balancer;verticalLabelPosition=bottom;align=center;verticalAlign=top',
397			'AWSDirectConnectBlock3' : ss + 'aws3.direct_connect;verticalLabelPosition=bottom;align=center;verticalAlign=top',
398			'AWSElasticNetworkBlock2' : ss + 'aws3.elastic_network_interface;verticalLabelPosition=bottom;align=center;verticalAlign=top',
399			'AWSRoute53Block2' : cs,
400			'AWSHostedZoneBlock2' : ss + 'aws3.hosted_zone;fontColor=#FFFFFF;fontStyle=1',
401			'AWSRouteTableBlock2' : ss + 'aws3.route_table;verticalLabelPosition=bottom;align=center;verticalAlign=top',
402			'AWSVPCBlock2' : ss + 'aws3.vpc;verticalLabelPosition=bottom;align=center;verticalAlign=top',
403			'AWSVPNConnectionBlock2' : ss + 'aws3.vpn_connection;verticalLabelPosition=bottom;align=center;verticalAlign=top',
404			'AWSVPNGatewayBlock2' : ss + 'aws3.vpn_gateway;verticalLabelPosition=bottom;align=center;verticalAlign=top',
405			'AWSCustomerGatewayBlock2' : ss + 'aws3.customer_gateway;verticalLabelPosition=bottom;align=center;verticalAlign=top',
406			'AWSCustomerGatewayBlock3' : ss + 'aws3.customer_gateway;verticalLabelPosition=bottom;align=center;verticalAlign=top',
407			'AWSInternetGatewayBlock2' : ss + 'aws3.internet_gateway;verticalLabelPosition=bottom;align=center;verticalAlign=top',
408			'AWSRouterBlock2' : ss + 'aws3.router;verticalLabelPosition=bottom;align=center;verticalAlign=top',
409			'AWSRouterBlock3' : ss + 'aws3.router;verticalLabelPosition=bottom;align=center;verticalAlign=top',
410			'AWSAmazonVPC(endpoints)' : ss + 'aws3.endpoints;verticalLabelPosition=bottom;align=center;verticalAlign=top',
411			'AWSAmazonVPC(flowlogs)' : ss + 'aws3.flow_logs;verticalLabelPosition=bottom;align=center;verticalAlign=top',
412			'AWSAmazonVPC(VPCNATgateway)' : ss + 'aws3.vpc_nat_gateway;verticalLabelPosition=bottom;align=center;verticalAlign=top',
413			'AWSVPCPeering3' : ss + 'aws3.vpc_peering;verticalLabelPosition=bottom;align=center;verticalAlign=top',
414
415//S3
416			'AWSSimpleStorageBlock2' : ss + 'aws3.s3;verticalLabelPosition=bottom;align=center;verticalAlign=top',
417			'AWSBucketBlock2' : ss + 'aws3.bucket;fontStyle=1;fontColor=#ffffff',
418			'AWSBuckethWithObjectsBlock2' : ss + 'aws3.bucket_with_objects;verticalLabelPosition=bottom;align=center;verticalAlign=top',
419			'AWSObjectBlock2' : ss + 'aws3.object;fontStyle=1;fontColor=#ffffff',
420			'AWSImportExportBlock2' : ss + 'aws3.import_export;verticalLabelPosition=bottom;align=center;verticalAlign=top',
421			'AWSStorageGatewayBlock2' : ss + 'aws3.storage_gateway;verticalLabelPosition=bottom;align=center;verticalAlign=top',
422			'AWSElasticBlockStorageBlock2' : ss + 'aws3.volume;fontStyle=1;fontColor=#ffffff',
423			'AWSVolumeBlock3' : ss + 'aws3.volume;fontStyle=1;fontColor=#ffffff',
424			'AWSSnapshotBlock2' : ss + 'aws3.snapshot;fontStyle=1;fontColor=#ffffff',
425			'AWSGlacierArchiveBlock3' : ss + 'aws3.archive;verticalLabelPosition=bottom;align=center;verticalAlign=top',
426			'AWSGlacierVaultBlock3' : ss + 'aws3.vault;verticalLabelPosition=bottom;align=center;verticalAlign=top',
427			'AWSAmazonEFS' : ss + 'aws3.efs;verticalLabelPosition=bottom;align=center;verticalAlign=top',
428			'AWSGlacierBlock2' : ss + 'aws3.glacier;verticalLabelPosition=bottom;align=center;verticalAlign=top',
429			'AWSAWSImportExportSnowball' : ss + 'aws3.snowball;verticalLabelPosition=bottom;align=center;verticalAlign=top',
430			'AWSStorageGatewayCachedVolumn2' : ss + 'aws3.cached_volume;verticalLabelPosition=bottom;align=center;verticalAlign=top',
431			'AWSStorageGatewayNon-CachedVolumn2' : ss + 'aws3.non_cached_volume;verticalLabelPosition=bottom;align=center;verticalAlign=top',
432			'AWSStorageGatewayVirtualTapeLibrary2' : ss + 'aws3.virtual_tape_library;verticalLabelPosition=bottom;align=center;verticalAlign=top',
433//Content Delivery
434			'AWSCloudFrontBlock2' : ss + 'aws3.cloudfront;verticalLabelPosition=bottom;align=center;verticalAlign=top',
435			'AWSDownloadDistBlock2' : ss + 'aws3.download_distribution;verticalLabelPosition=bottom;align=center;verticalAlign=top',
436			'AWSStreamingBlock2' : ss + 'aws3.streaming_distribution;verticalLabelPosition=bottom;align=center;verticalAlign=top',
437			'AWSEdgeLocationBlock2' : ss + 'aws3.edge_location;verticalLabelPosition=bottom;align=center;verticalAlign=top',
438//Database
439			'AWSItemBlock2' : ss + 'aws3.item;verticalLabelPosition=bottom;align=center;verticalAlign=top',
440			'AWSItemsBlock2' : ss + 'aws3.items;verticalLabelPosition=bottom;align=center;verticalAlign=top',
441			'AWSAttributeBlock2' : ss + 'aws3.attribute;verticalLabelPosition=bottom;align=center;verticalAlign=top',
442			'AWSAttributesBlock2' : ss + 'aws3.attributes;verticalLabelPosition=bottom;align=center;verticalAlign=top',
443			'AWSRDBSBlock2' : cs,
444			'AWSRDSInstanceBlock2' : ss + 'aws3.rds_db_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top',
445			'AWSRDSStandbyBlock2' : ss + 'aws3.rds_db_instance_standby_multi_az;verticalLabelPosition=bottom;align=center;verticalAlign=top',
446			'AWSRDSInstanceReadBlock2' : ss + 'aws3.rds_db_instance_read_replica;verticalLabelPosition=bottom;align=center;verticalAlign=top',
447			'AWSOracleDBBlock2' : ss + 'aws3.oracle_db_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top',
448			'AWSMySQLDBBlock2' : ss + 'aws3.mysql_db_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top',
449			'AWSDynamoDBBlock2' : ss + 'aws3.dynamo_db;verticalLabelPosition=bottom;align=center;verticalAlign=top',
450			'AWSSimpleDatabaseBlock3' : ss + 'aws2.database.simpledb;verticalLabelPosition=bottom;align=center;verticalAlign=top',
451			'AWSSimpleDatabaseDomainBlock3' : ss + 'aws2.database.simpledb_domain;verticalLabelPosition=bottom;align=center;verticalAlign=top',
452			'AWSTableBlock2' : ss + 'aws3.table;verticalLabelPosition=bottom;align=center;verticalAlign=top',
453			'AWSAmazonRedShiftBlock3' : ss + 'aws3.redshift;verticalLabelPosition=bottom;align=center;verticalAlign=top',
454			'AWSElastiCacheNodeBlock2' : ss + 'aws3.cache_node;verticalLabelPosition=bottom;align=center;verticalAlign=top',
455			'AWSElastiCacheBlock2' : ss + 'aws3.elasticache;verticalLabelPosition=bottom;align=center;verticalAlign=top',
456			'AWSDynamoDBGlobalSecondaryIndexes2' : ss + 'aws3.global_secondary_index;verticalLabelPosition=bottom;align=center;verticalAlign=top',
457			'AWSAmazonElastiCacheMemcache2' : ss + 'aws3.memcached;verticalLabelPosition=bottom;align=center;verticalAlign=top',
458			'AWSAmazonElastiCacheRedis2' : ss + 'aws3.redis;verticalLabelPosition=bottom;align=center;verticalAlign=top',
459			'AWSAmazonRDSMSSQLInstance2' : ss + 'aws3.ms_sql_instance_2;verticalLabelPosition=bottom;align=center;verticalAlign=top',
460			'AWSMSSQLDBBlock3' : ss + 'aws3.ms_sql_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top',
461			'AWSAmazonRDSMySQLDBInstance2' : ss + 'aws3.mysql_db_instance_2;verticalLabelPosition=bottom;align=center;verticalAlign=top',
462			'AWSAmazonRDSOracleDBInstance2' : ss + 'aws3.oracle_db_instance_2;verticalLabelPosition=bottom;align=center;verticalAlign=top',
463			'AWSRDSReplicasetswithPIOP2' : ss + 'aws3.piop;verticalLabelPosition=bottom;align=center;verticalAlign=top',
464			'AWSAmazonRDSPostgreSQL2' : ss + 'aws3.postgre_sql_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top',
465			'AWSRDSMasterSQL2' : ss + 'aws3.sql_master;verticalLabelPosition=bottom;align=center;verticalAlign=top',
466			'AWSRDSSlaveSQL2' : ss + 'aws3.sql_slave;verticalLabelPosition=bottom;align=center;verticalAlign=top',
467			'AWSAmazonRedshift(densecomputenode)' : ss + 'aws3.dense_compute_node;verticalLabelPosition=bottom;align=center;verticalAlign=top',
468			'AWSAmazonRedshift(densestoragenode)' : ss + 'aws3.dense_storage_node;verticalLabelPosition=bottom;align=center;verticalAlign=top',
469			'AWSAWSDatabaseMigrationService' : ss + 'aws3.database_migration_service;verticalLabelPosition=bottom;align=center;verticalAlign=top',
470//Security Identity
471			'AWSACM' : ss + 'aws3.certificate_manager;verticalLabelPosition=bottom;align=center;verticalAlign=top',
472			'AWSAmazonInspector' : ss + 'aws3.inspector;verticalLabelPosition=bottom;align=center;verticalAlign=top',
473			'AWSAWSCloudHSM' : ss + 'aws3.cloudhsm;verticalLabelPosition=bottom;align=center;verticalAlign=top',
474			'AWSDirectoryService2' : ss + 'aws3.directory_service;verticalLabelPosition=bottom;align=center;verticalAlign=top',
475			'AWSAWSKMS' : ss + 'aws3.kms;verticalLabelPosition=bottom;align=center;verticalAlign=top',
476			'AWSAWSWAF' : ss + 'aws3.waf;verticalLabelPosition=bottom;align=center;verticalAlign=top',
477			'AWSACM(certificate-manager)' : ss + 'aws3.certificate_manager_2;verticalLabelPosition=bottom;align=center;verticalAlign=top',
478//App Services
479			'AWSSESBlock2' : ss + 'aws3.ses;verticalLabelPosition=bottom;align=center;verticalAlign=top',
480			'AWSEmailBlock2' : ss + 'aws3.email;verticalLabelPosition=bottom;align=center;verticalAlign=top',
481			'AWSSNSBlock2' : ss + 'aws3.sns;verticalLabelPosition=bottom;align=center;verticalAlign=top',
482			'AWSSQSBlock3' : ss + 'aws3.sqs;verticalLabelPosition=bottom;align=center;verticalAlign=top',
483			'AWSQueueBlock2' : ss + 'aws3.queue;verticalLabelPosition=bottom;align=center;verticalAlign=top',
484			'AWSMessageBlock2' : ss + 'aws3.message;verticalLabelPosition=bottom;align=center;verticalAlign=top',
485			'AWSDeciderBlock2' : ss + 'aws3.decider;verticalLabelPosition=bottom;align=center;verticalAlign=top',
486			'AWSSWFBlock2' : ss + 'aws3.swf;verticalLabelPosition=bottom;align=center;verticalAlign=top',
487			'AWSWorkerBlock2' : ss + 'aws3.worker;verticalLabelPosition=bottom;align=center;verticalAlign=top',
488			'AWSCloudSearchBlock2' : ss + 'aws3.cloudsearch;verticalLabelPosition=bottom;align=center;verticalAlign=top',
489			'AWSCloudSearchMetadataBlock3' : ss + 'aws3.search_documents;verticalLabelPosition=bottom;align=center;verticalAlign=top',
490			'AWSElasticTranscoder3' : ss + 'aws3.elastic_transcoder;verticalLabelPosition=bottom;align=center;verticalAlign=top',
491			'AWSAmazonAPIGateway' : ss + 'aws3.api_gateway;verticalLabelPosition=bottom;align=center;verticalAlign=top',
492			'AWSAppStream2' : ss + 'aws3.appstream;verticalLabelPosition=bottom;align=center;verticalAlign=top',
493//Deployment
494			'AWSCloudFormationBlock2' : ss + 'aws3.cloudformation;verticalLabelPosition=bottom;align=center;verticalAlign=top',
495			'AWSDataPipelineBlock3' : ss + 'aws3.data_pipeline;verticalLabelPosition=bottom;align=center;verticalAlign=top',
496			'AWSDataPipelineBlock2' : ss + 'aws3.data_pipeline;verticalLabelPosition=bottom;align=center;verticalAlign=top',
497			'AWSTemplageBlock2' : ss + 'aws3.template;verticalLabelPosition=bottom;align=center;verticalAlign=top',
498			'AWSStackBlock2' : ss + 'aws3.stack_aws_cloudformation;verticalLabelPosition=bottom;align=center;verticalAlign=top',
499			'AWSBeanStockBlock2' : ss + 'aws3.elastic_beanstalk;verticalLabelPosition=bottom;align=center;verticalAlign=top',
500			'AWSApplicationBlock2' : ss + 'aws3.application;verticalLabelPosition=bottom;align=center;verticalAlign=top',
501			'AWSBeanstalkDeploymentBlock3' : ss + 'aws3.deployment;verticalLabelPosition=bottom;align=center;verticalAlign=top',
502			'AWSIAMBlock3' : ss + 'aws3.iam;verticalLabelPosition=bottom;align=center;verticalAlign=top',
503			'AWSIAMSTSBlock3' : ss + 'aws3.sts;verticalLabelPosition=bottom;align=center;verticalAlign=top',
504			'AWSIAMAddonBlock2' : ss + 'aws3.add_on;verticalLabelPosition=bottom;align=center;verticalAlign=top',
505			'AWSCloudWatchBlock3' : ss + 'aws3.cloudwatch;verticalLabelPosition=bottom;align=center;verticalAlign=top',
506			'AWSCloudWatchAlarmBlock2' : ss + 'aws3.alarm;verticalLabelPosition=bottom;align=center;verticalAlign=top',
507			'AWSIAMSecurityTokenService2' : ss + 'aws3.sts_2;verticalLabelPosition=bottom;align=center;verticalAlign=top',
508			'AWSIAMDataEncryptionKey2' : ss + 'aws3.data_encryption_key;verticalLabelPosition=bottom;align=center;verticalAlign=top',
509			'AWSIAMEncryptedData2' : ss + 'aws3.encrypted_data;verticalLabelPosition=bottom;align=center;verticalAlign=top',
510			'AWSAWSIAM(long-termsecuritycredential)' : ss + 'aws3.long_term_security_credential;verticalLabelPosition=bottom;align=center;verticalAlign=top',
511			'AWSIAMMFAToken2' : ss + 'aws3.mfa_token;verticalLabelPosition=bottom;align=center;verticalAlign=top',
512			'AWSIAMPermissions2' : ss + 'aws3.permissions_2;verticalLabelPosition=bottom;align=center;verticalAlign=top',
513			'AWSIAMRoles2' : ss + 'aws3.role;verticalLabelPosition=bottom;align=center;verticalAlign=top',
514			'AWSAWSIAM(temporarysecuritycredential)' : ss + 'aws3.long_term_security_credential;verticalLabelPosition=bottom;align=center;verticalAlign=top',
515			'AWSCloudTrail2' : ss + 'aws3.cloudtrail;verticalLabelPosition=bottom;align=center;verticalAlign=top',
516			'AWSConfig2' : ss + 'aws3.config;verticalLabelPosition=bottom;align=center;verticalAlign=top',
517			'AWSOpsWorksBlock3' : ss + 'aws3.opsworks;verticalLabelPosition=bottom;align=center;verticalAlign=top',
518			'AWSAWSServiceCatalog' : ss + 'aws3.service_catalog;verticalLabelPosition=bottom;align=center;verticalAlign=top',
519			'AWSTrustedAdvisor2' : ss + 'aws3.trusted_advisor;verticalLabelPosition=bottom;align=center;verticalAlign=top',
520			'AWSOpsWorksApps2' : ss + 'aws3.apps;verticalLabelPosition=bottom;align=center;verticalAlign=top',
521			'AWSOpsWorksDeployments2' : ss + 'aws3.deployments;verticalLabelPosition=bottom;align=center;verticalAlign=top',
522			'AWSOpsWorksInstances2' : ss + 'aws3.instances_2;verticalLabelPosition=bottom;align=center;verticalAlign=top',
523			'AWSOpsWorksLayers2' : ss + 'aws3.layers;verticalLabelPosition=bottom;align=center;verticalAlign=top',
524			'AWSOpsWorksMonitoring2' : ss + 'aws3.monitoring;verticalLabelPosition=bottom;align=center;verticalAlign=top',
525			'AWSOpsWorksPermissions2' : ss + 'aws3.permissions;verticalLabelPosition=bottom;align=center;verticalAlign=top',
526			'AWSOpsWorksResources2' : ss + 'aws3.resources;verticalLabelPosition=bottom;align=center;verticalAlign=top',
527			'AWSOpsWorksStack2' : ss + 'aws3.stack_aws_opsworks;verticalLabelPosition=bottom;align=center;verticalAlign=top',
528//On-Demand
529			'AWSMechanicalTurkBlock3' : ss + 'aws3.mechanical_turk;verticalLabelPosition=bottom;align=center;verticalAlign=top',
530			'AWSHumanITBlock2' : ss + 'aws3.human_intelligence_tasks_hit;verticalLabelPosition=bottom;align=center;verticalAlign=top',
531			'AWSAssignmentTaskBlock2' : ss + 'aws3.requester;verticalLabelPosition=bottom;align=center;verticalAlign=top',
532			'AWSWorkersBlock2' : ss + 'aws3.users;verticalLabelPosition=bottom;align=center;verticalAlign=top',
533			'AWSRequesterBlock2' : ss + 'aws3.assignment_task;verticalLabelPosition=bottom;align=center;verticalAlign=top',
534//SDKs
535			'AWSAndroidBlock3': ss + 'aws3.android;fillColor=#96BF3D;verticalLabelPosition=bottom;align=center;verticalAlign=top',
536			'AWSiOSBlock3' : ss + 'aws3.android;fillColor=#CFCFCF;verticalLabelPosition=bottom;align=center;verticalAlign=top',
537			'AWSJavaBlock3' : ss + 'aws3.android;fillColor=#EE472A;verticalLabelPosition=bottom;align=center;verticalAlign=top',
538			'AWSJavaScript' : ss + 'aws3.android;fillColor=#205E00;verticalLabelPosition=bottom;align=center;verticalAlign=top',
539			'AWSNetBlock3' : ss + 'aws3.android;fillColor=#115193;verticalLabelPosition=bottom;align=center;verticalAlign=top',
540			'AWSNodeJSBlock3' : ss + 'aws3.android;fillColor=#8CC64F;verticalLabelPosition=bottom;align=center;verticalAlign=top',
541			'AWSPHPBlock3' : ss + 'aws3.android;fillColor=#5A69A4;verticalLabelPosition=bottom;align=center;verticalAlign=top',
542			'AWSPythonBlock3' : ss + 'aws3.android;fillColor=#FFD44F;verticalLabelPosition=bottom;align=center;verticalAlign=top',
543			'AWSRubyBlock3' : ss + 'aws3.android;fillColor=#AE1F23;verticalLabelPosition=bottom;align=center;verticalAlign=top',
544			'AWSXamarin' : ss + 'aws3.android;fillColor=#4090D7;verticalLabelPosition=bottom;align=center;verticalAlign=top',
545			'AWSCLIBlock3' : ss + 'aws3.cli;fillColor=#444444;verticalLabelPosition=bottom;align=center;verticalAlign=top',
546			'AWSEclipseToolkitBlock3' : ss + 'aws3.toolkit_for_eclipse;fillColor=#342074;verticalLabelPosition=bottom;align=center;verticalAlign=top',
547			'AWSVisualStudioToolkitBlock3' : ss + 'aws3.toolkit_for_visual_studio;fillColor=#53B1CB;verticalLabelPosition=bottom;align=center;verticalAlign=top',
548			'AWSWindowsPowershellToolkitBlock3' : ss + 'aws3.toolkit_for_windows_powershell;fillColor=#737373;verticalLabelPosition=bottom;align=center;verticalAlign=top',
549//Analytics
550			'AWSAmazonElasticsearchService' : ss + 'aws3.elasticsearch_service;verticalLabelPosition=bottom;align=center;verticalAlign=top',
551			'AWSElasticMapReduceBlock2' : ss + 'aws3.emr;verticalLabelPosition=bottom;align=center;verticalAlign=top',
552			'AWSClusterBlock2' : ss + 'aws3.emr_cluster;verticalLabelPosition=bottom;align=center;verticalAlign=top',
553			'AWSEMREngine2' : ss + 'aws3.emr_engine;verticalLabelPosition=bottom;align=center;verticalAlign=top',
554			'AWSEMRMapRM3Engine2' : ss + 'aws3.emr_engine_mapr_m3;verticalLabelPosition=bottom;align=center;verticalAlign=top',
555			'AWSEMRMapRM5Engine2' : ss + 'aws3.emr_engine_mapr_m5;verticalLabelPosition=bottom;align=center;verticalAlign=top',
556			'AWSEMRMapRM7Engine2' : ss + 'aws3.emr_engine_mapr_m7;verticalLabelPosition=bottom;align=center;verticalAlign=top',
557			'AWSKinesis2' : ss + 'aws3.kinesis;verticalLabelPosition=bottom;align=center;verticalAlign=top',
558			'AWSAmazonKinesis(AmazonKinesisAnalytics)' : ss + 'aws3.kinesis;verticalLabelPosition=bottom;align=center;verticalAlign=top',
559			'AWSKinesisEnabledApp2' : ss + 'aws3.kinesis_enabled_app;verticalLabelPosition=bottom;align=center;verticalAlign=top',
560			'AWSAmazonKinesis(AmazonKinesisFirehose)' : ss + 'aws3.kinesis_firehose;verticalLabelPosition=bottom;align=center;verticalAlign=top',
561			'AWSAmazonKinesis(AmazonKinesisStreams)' : ss + 'aws3.kinesis_streams;verticalLabelPosition=bottom;align=center;verticalAlign=top',
562			'AWSAmazonMachineLearning' : ss + 'aws3.machine_learning;verticalLabelPosition=bottom;align=center;verticalAlign=top',
563			'AWSAmazonQuickSight' : ss + 'aws3.quicksight;verticalLabelPosition=bottom;align=center;verticalAlign=top',
564//Mobile Services
565			'AWSCognito2' : ss + 'aws3.cognito;verticalLabelPosition=bottom;align=center;verticalAlign=top',
566			'AWSMobileAnalytics2' : ss + 'aws3.mobile_analytics;verticalLabelPosition=bottom;align=center;verticalAlign=top',
567			'AWSAWSDeviceFarm' : ss + 'aws3.device_farm;verticalLabelPosition=bottom;align=center;verticalAlign=top',
568			'AWSAWSMobileHub' : ss + 'aws3.mobile_hub;gradientColor=#AD688A;gradientDirection=east;verticalLabelPosition=bottom;align=center;verticalAlign=top',
569			'AWSTopicBlock2' : ss + 'aws3.topic_2;fontStyle=1;fontColor=#ffffff;verticalAlign=top;spacingTop=-5',
570			'AWSEmailNotificationBlock2' : ss + 'aws3.email_notification;verticalLabelPosition=bottom;align=center;verticalAlign=top',
571			'AWSHTTPNotificationBlock2' : ss + 'aws3.http_notification;verticalLabelPosition=bottom;align=center;verticalAlign=top',
572//Developer Tools
573			'AWSAWSCodeCommit' : ss + 'aws3.codecommit;verticalLabelPosition=bottom;align=center;verticalAlign=top',
574			'AWSCodeDeploy2' : ss + 'aws3.codedeploy;verticalLabelPosition=bottom;align=center;verticalAlign=top',
575			'AWSAWSCodePipeline' : ss + 'aws3.codepipeline;verticalLabelPosition=bottom;align=center;verticalAlign=top',
576//Enterprise Application
577			'AWSWorkDocs2' : ss + 'aws3.workdocs;verticalLabelPosition=bottom;align=center;verticalAlign=top',
578			'AWSAmazonWorkMail' : ss + 'aws3.workmail;verticalLabelPosition=bottom;align=center;verticalAlign=top',
579			'AWSAmazonWorkSpaces2' : ss + 'aws3.workspaces;verticalLabelPosition=bottom;align=center;verticalAlign=top',
580//Internet of Things
581			'AWSAWSIoT' : ss + 'aws3.aws_iot;verticalLabelPosition=bottom;align=center;verticalAlign=top',
582			'AWSAWSIoT(action)' : ss + 'aws3.action;verticalLabelPosition=bottom;align=center;verticalAlign=top',
583			'AWSAWSIoT(actuator)' : ss + 'aws3.actuator;verticalLabelPosition=bottom;align=center;verticalAlign=top',
584			'AWSAWSIoT(certificate)' : ss + 'aws3.certificate;verticalLabelPosition=bottom;align=center;verticalAlign=top',
585			'AWSAWSIoT(desiredstate)' : ss + 'aws3.desired_state;verticalLabelPosition=bottom;align=center;verticalAlign=top',
586			'AWSAWSIoT(hardwareboard)' : ss + 'aws3.hardware_board;verticalLabelPosition=bottom;align=center;verticalAlign=top',
587			'AWSAWSIoT(HTTP2protocol)' : ss + 'aws3.http_2_protocol;verticalLabelPosition=bottom;align=center;verticalAlign=top',
588			'AWSAWSIoT(HTTPprotocol)' : ss + 'aws3.http_protocol;verticalLabelPosition=bottom;align=center;verticalAlign=top',
589			'AWSAWSIoT(MQTTprotocol)' : ss + 'aws3.mqtt_protocol;verticalLabelPosition=bottom;align=center;verticalAlign=top',
590			'AWSAWSIoT(policy)' : ss + 'aws3.policy;verticalLabelPosition=bottom;align=center;verticalAlign=top',
591			'AWSAWSIoT(reportedstate)' : ss + 'aws3.reported_state;verticalLabelPosition=bottom;align=center;verticalAlign=top',
592			'AWSAWSIoT(rule)' : ss + 'aws3.rule;verticalLabelPosition=bottom;align=center;verticalAlign=top',
593			'AWSAWSIoT(sensor)' : ss + 'aws3.sensor;verticalLabelPosition=bottom;align=center;verticalAlign=top',
594			'AWSAWSIoT(servo)' : ss + 'aws3.servo;verticalLabelPosition=bottom;align=center;verticalAlign=top',
595			'AWSAWSIoT(shadow)' : ss + 'aws3.shadow;verticalLabelPosition=bottom;align=center;verticalAlign=top',
596			'AWSAWSIoT(simulator)' : ss + 'aws3.simulator;verticalLabelPosition=bottom;align=center;verticalAlign=top',
597			'AWSAWSIoT(thingbank)' : ss + 'aws3.bank;verticalLabelPosition=bottom;align=center;verticalAlign=top',
598			'AWSAWSIoT(thingbicycle)' : ss + 'aws3.bicycle;verticalLabelPosition=bottom;align=center;verticalAlign=top',
599			'AWSAWSIoT(thingcamera)' : ss + 'aws3.camera;verticalLabelPosition=bottom;align=center;verticalAlign=top',
600			'AWSAWSIoT(thingcar)' : ss + 'aws3.car;verticalLabelPosition=bottom;align=center;verticalAlign=top',
601			'AWSAWSIoT(thingcart)' : ss + 'aws3.cart;verticalLabelPosition=bottom;align=center;verticalAlign=top',
602			'AWSAWSIoT(thingcoffeepot)' : ss + 'aws3.coffee_pot;verticalLabelPosition=bottom;align=center;verticalAlign=top',
603			'AWSAWSIoT(thingdoorlock)' : ss + 'aws3.door_lock;verticalLabelPosition=bottom;align=center;verticalAlign=top',
604			'AWSAWSIoT(thingfactory)' : ss + 'aws3.factory;verticalLabelPosition=bottom;align=center;verticalAlign=top',
605			'AWSAWSIoT(thinggeneric)' : ss + 'aws3.generic;verticalLabelPosition=bottom;align=center;verticalAlign=top',
606			'AWSAWSIoT(thinghouse)' : ss + 'aws3.house;verticalLabelPosition=bottom;align=center;verticalAlign=top',
607			'AWSAWSIoT(thinglightbulb)' : ss + 'aws3.lightbulb;verticalLabelPosition=bottom;align=center;verticalAlign=top',
608			'AWSAWSIoT(thingmedicalemergency)' : ss + 'aws3.medical_emergency;verticalLabelPosition=bottom;align=center;verticalAlign=top',
609			'AWSAWSIoT(thingpoliceemergency)' : ss + 'aws3.police_emergency;verticalLabelPosition=bottom;align=center;verticalAlign=top',
610			'AWSAWSIoT(thingthermostat)' : ss + 'aws3.thermostat;verticalLabelPosition=bottom;align=center;verticalAlign=top',
611			'AWSAWSIoT(thingtravel)' : ss + 'aws3.travel;verticalLabelPosition=bottom;align=center;verticalAlign=top',
612			'AWSAWSIoT(thingutility)' : ss + 'aws3.utility;verticalLabelPosition=bottom;align=center;verticalAlign=top',
613			'AWSAWSIoT(thingwindfarm)' : ss + 'aws3.windfarm;verticalLabelPosition=bottom;align=center;verticalAlign=top',
614			'AWSAWSIoT(topic)' : ss + 'aws3.topic;verticalLabelPosition=bottom;align=center;verticalAlign=top',
615
616//AWS General
617			'AWSCloudBlock2' : ss + 'aws3.cloud;verticalLabelPosition=bottom;align=center;verticalAlign=top',
618			'AWSVPCloudBlock3' : ss + 'aws3.virtual_private_cloud;verticalLabelPosition=bottom;align=center;verticalAlign=top',
619			'AWSUserBlock2' : ss + 'aws3.user;verticalLabelPosition=bottom;align=center;verticalAlign=top',
620			'AWSUsersBlock2' : ss + 'aws3.users;verticalLabelPosition=bottom;align=center;verticalAlign=top',
621			'AWSClientBlock2' : ss + 'aws3.management_console;verticalLabelPosition=bottom;align=center;verticalAlign=top',
622			'AWSMobileClientBlock2' : ss + 'aws3.mobile_client;verticalLabelPosition=bottom;align=center;verticalAlign=top',
623			'AWSGenericDatabaseBlock3' : ss + 'aws3.generic_database;verticalLabelPosition=bottom;align=center;verticalAlign=top',
624			'AWSDiskBlock3' : ss + 'aws3.disk;verticalLabelPosition=bottom;align=center;verticalAlign=top',
625			'AWSTapeStorageBlock3' : ss + 'aws3.tape_storage;verticalLabelPosition=bottom;align=center;verticalAlign=top',
626			'AWSMediaBlock2' : ss + 'aws3.multimedia;verticalLabelPosition=bottom;align=center;verticalAlign=top',
627			'AWSDataCenterBlock2' : ss + 'aws3.corporate_data_center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
628			'AWSServerBlock2' : ss + 'aws3.traditional_server;verticalLabelPosition=bottom;align=center;verticalAlign=top',
629			'AWSInternetBlock2' : ss + 'aws2.non-service_specific.internet;verticalLabelPosition=bottom;align=center;verticalAlign=top',
630			'AWSForumsBlock3' : ss + 'aws3.forums;verticalLabelPosition=bottom;align=center;verticalAlign=top',
631			'AWSManagementBlock2' : ss + 'aws3.management_console;verticalLabelPosition=bottom;align=center;verticalAlign=top',
632			'AWSAmazonElasticCacheNode2' : ss + 'aws3.cache_node;verticalLabelPosition=bottom;align=center;verticalAlign=top',
633			'AWSAmazonRedshiftDW1Cluster2' : ss + 'aws3.dense_compute_node;verticalLabelPosition=bottom;align=center;verticalAlign=top',
634			'AWSAmazonRedshiftDW2Cluster2' : ss + 'aws3.dense_storage_node;verticalLabelPosition=bottom;align=center;verticalAlign=top',
635			'AWSAmazonRedshiftSSDFamilyCluster2' : ss + 'aws3.dense_storage_node;verticalLabelPosition=bottom;align=center;verticalAlign=top',
636			'AWSAmazonRoute53RouteTable2' : ss + 'aws3.route_table;verticalLabelPosition=bottom;align=center;verticalAlign=top',
637//			'AWSExampleIAMBlock2' NA
638			'AWSSubnetBlock2' : ss + 'aws3.permissions;verticalLabelPosition=bottom;align=center;verticalAlign=top',
639//AWS Containers
640			'AWSRoundedRectangleContainerBlock2' : cs,
641//Azure Cloud
642			'ACAccessControlBlock' : ssAzure + 'azure.access_control',
643			'ACAPIAppsBlock' : ssAzure + 'mscae.cloud.api_app',
644			'ACAPIManagementBlock' : ssAzure + 'mscae.cloud.api_management',
645			'ACAppInsightsBlock' : ssAzure + 'mscae.cloud.application_insights',
646			'ACAppServicesBlock' : ssAzure + 'mscae.cloud.app_service',
647			'ACAutoscalingBlock' : ssAzure + 'azure.autoscale',
648			'ACAzureActiveDirectoryBlock' : ssAzure + 'azure.azure_active_directory',
649			'ACAzurealertBlock' : ssAzure + 'azure.azure_alert',
650			'ACAzureAutomationBlock' : ssAzure + 'azure.automation',
651			'ACAzureBatchBlock' : ssAzure + 'mscae.cloud.azure_batch',
652			'ACAzureRedisBlock' : ssAzure + 'azure.azure_cache',
653			'ACAzureFilesBlock' : ssAzure + 'mscae.cloud.azure_files_service',
654			'ACAzureloadbalancerBlock' : ssAzure + 'mscae.cloud.azure_automatic_load_balancer',
655			'ACAzureMarketplaceBlock' : ssAzure + 'azure.azure_marketplace',
656			'ACAzureRightManagementRMSBlock' : ssAzure + 'mscae.cloud.azure_rights_management_rms',
657			'ACAzureSDKBlock' : ssAzure + 'azure.azure_sdk',
658			'ACAzureSearchBlock' : ssAzure + 'mscae.cloud.azure_search',
659			'ACAzureSQLdatabaseBlock' : ssAzure + 'azure.sql_database_sql_azure',
660			'ACAzuresubscriptionBlock' : ssAzure + 'azure.azure_subscription',
661			'ACAzureWebsitesBlock' : ssAzure + 'azure.azure_website',
662			'ACBackupServiceBlock' : ssAzure + 'azure.backup_service',
663			'ACBitbucketcodesourceBlock' : ssAzure + 'azure.bitbucket_code_source',
664			'ACBizTalkServicesBlock' : ssAzure + 'azure.biztalk_services',
665			'ACCloudServiceBlock' : ssAzure + 'azure.cloud_service',
666			'ACCodePlexBlock' : ssAzure + 'azure.codeplex_code_source',
667//			'ACComputeBlock' NA
668			'ACContentDeliveryNetworkBlock' : ssAzure + 'azure.content_delivery_network',
669			'ACDataFactoryBlock' : ssAzure + 'mscae.cloud.data_factory',
670//			'ACDataservicesBlock' NA
671			'ACDocumentDBBlock' : ssAzure + 'mscae.cloud.documentdb',
672			'ACDropboxcodesourceBlock' : ssAzure + 'azure.dropbox_code_source',
673			'ACEventsHubBlock' : ssAzure + 'mscae.cloud.event_hubs',
674			'ACExpressRouteBlock' : ssAzure + 'azure.express_route',
675			'ACGitHubBlock' : ssAzure + 'azure.github_code',
676			'ACGitrepositoryBlock' : ssAzure + 'azure.git_repository',
677			'ACHDInsightBlock' : ssAzure + 'mscae.cloud.hdinsight',
678			'ACHealthmonitoringBlock' : ssAzure + 'azure.health_monitoring',
679			'ACHealthyBlock' : ssAzure + 'azure.healthy',
680			'ACHybridConnectionBlock' : ssAzure + 'mscae.cloud.hybrid_connections',
681			'ACBizTalkhybridconnectionBlock' : ssAzure + 'mscae.cloud.hybrid_connection_manager',
682			'ACKeyVaultBlock' : ssAzure + 'mscae.cloud.key_vault',
683			'ACLogicAppBlock' : ssAzure + 'mscae.cloud.logic_app',
684			'ACMachineLearningBlock' : ssAzure + 'mscae.cloud.machine_learning',
685			'ACMediaServicesBlock' : ssAzure + 'azure.media_service',
686			'ACMicrosoftaccountBlock' : ssAzure + 'mscae.cloud.microsoft_account',
687			'ACMicrosoftAzureBlock' : ssAzure + 'mscae.cloud.microsoft_azure',
688			'ACMobileEngagementBlock' : ssAzure + 'mscae.cloud.mobile_engagement',
689			'ACMobileServicesBlock' : ssAzure + 'mscae.cloud.mobile_app',
690			'ACMultiFactorAuthBlock' : ssAzure + 'azure.multi_factor_authentication',
691			'ACMySQLdatabaseBlock' : ssAzure + 'azure.mysql_database',
692			'ACNotificationHubsBlock' : ssAzure + 'azure.notification_hub',
693			'ACNotificationtopicBlock' : ssAzure + 'azure.notification_topic',
694			'ACOperationalInsightsBlock' : ssAzure + 'mscae.cloud.operational_insights',
695			'ACOSimageBlock' : ssAzure + 'azure.operating_system_image',
696			'ACRemoteAppBlock' : ssAzure + 'mscae.cloud.remoteapp',
697			'ACrpdRemotingfileBlock' : ssAzure + 'azure.rdp_remoting_file',
698			'ACSchedulerBlock' : ssAzure + 'azure.scheduler',
699			'ACServiceBusBlock' : ssAzure + 'azure.service_bus',
700			'ACServiceBusQueueBlock' : ssAzure + 'azure.service_bus_queues',
701			'ACServiceBusRelayBlock' : ssAzure + 'azure.service_bus_relay',
702			'ACServiceBusTopicBlock' : ssAzure + 'azure.service_bus_topics_and_subscriptions',
703			'ACServiceEndpointBlock' : ssAzure + 'mscae.cloud.service_endpoint',
704			'ACServicepackageBlock' : ssAzure + 'mscae.cloud.service_package',
705			'ACSiteRecoveryBlock' : ssAzure + 'azure.hyper_v_recovery_manager',
706			'ACSQLdatabasegenericBlock' : ssAzure + 'azure.sql_database',
707//			'ACSQLDatabasePremiumBlock' NA
708			'ACSQLdatasyncBlock' : ssAzure + 'azure.sql_datasync',
709			'ACSQLreportingdeprecatedBlock' : ssAzure + 'azure.sql_reporting',
710			'ACStartuptaskBlock' : ssAzure + 'azure.startup_task',
711			'ACStorageAzureBlock' : ssAzure + 'mscae.cloud.azure_storage',
712			'ACStorageblobBlock' : ssAzure + 'azure.storage_blob',
713			'ACStoragequeueBlock' : ssAzure + 'azure.storage_queue',
714			'ACStoragetableBlock' : ssAzure + 'azure.storage_table',
715			'ACStorSimpleBlock' : ssAzure + 'azure.storsimple',
716			'ACStreamAnalyticsBlock' : ssAzure + 'mscae.cloud.stream_analytics',
717			'ACTrafficManagerBlock' : ssAzure + 'azure.traffic_manager',
718			'ACAlienBlock' : ssAzure + 'azure.unidentified_code_object',
719			'ACVHDBlock' : ssAzure + 'azure.vhd',
720			'ACVHDdatadiskBlock' : ssAzure + 'azure.vhd_data_disk',
721			'ACVirtualmachineBlock' : ssAzure + 'azure.virtual_machine',
722			'ACVirtualmachinecontainerBlock' : ssAzure + 'mscae.cloud.virtual_machine_container',
723			'ACVirtualnetworkBlock' : ssAzure + 'azure.virtual_network',
724			'ACVisualStudioOnlineBlock' : ssAzure + 'azure.visual_studio_online',
725			'ACVMsymbolonlyBlock' : ssAzure + 'azure.virtual_machine_feature',
726			'ACWebJobsBlock' : ssAzure + 'mscae.cloud.webjobs',
727			'ACWebroleBlock' : ssAzure + 'azure.web_role',
728			'ACWebrolesBlock' : ssAzure + 'azure.web_roles',
729			'ACWorkaccountBlock' : ssAzure + 'mscae.cloud.work_account',
730			'ACWorkerroleBlock' : ssAzure + 'azure.worker_role',
731			'ACWorkerrolesBlock' : ssAzure + 'azure.worker_roles',
732			'ADNSBlock' : ssAzure + 'mscae.cloud.azure_dns',
733//			'AGatewayBlock' NA
734			'ACLoadBalancerBlock' : ssAzure + 'mscae.cloud.azure_load_balancer_feature',
735			'ACResourceGroupBlock' : ssAzure + 'mscae.cloud.resource_group',
736			'ACVPNGatewayBlock' : ssAzure + 'mscae.cloud.vpn_gateway',
737//Azure Enterprise
738			'AEActiveDirectoryFSPBlock' : ssAzure + 'mscae.enterprise.d',
739			'AEADFSBlock' : ssAzure + 'mscae.enterprise.ad_fs',
740			'AEAndroidPhoneBlock' : ssAzure + 'mscae.enterprise.android_phone',
741			'AEappblankfortextBlock' : ssAzure + 'mscae.enterprise.application_blank',
742			'AEAppGenericBlock' : ssAzure + 'mscae.enterprise.app_generic',
743			'AEAppserverBlock' : ssAzure + 'mscae.enterprise.application_server',
744			'AEBackuplocalBlock' : ssAzure + 'mscae.enterprise.backup_local',
745			'AEBackuponlineBlock' : ssAzure + 'mscae.enterprise.backup_online',
746			'AECalendarBlock' : ssAzure + 'mscae.general.calendar',
747			'AECertificateBlock' : ssAzure + 'azure.certificate',
748			'AEClientAppBlock' : ssAzure + 'mscae.enterprise.client_application',
749			'AECloudBlock' : ssAzure + 'mscae.enterprise.internet',
750			'AEClusterserverBlock' : ssAzure + 'mscae.enterprise.cluster_server',
751			'AECodefileBlock' : ssAzure + 'azure.code_file',
752			'AEConnectorsBlock' : ssAzure + 'mscae.enterprise.connectors',
753			'AEDatabasegenericBlock' : ssAzure + 'mscae.enterprise.database_generic',
754			'AEDatabaseserverBlock' : ssAzure + 'mscae.enterprise.database_server',
755			'AEDatabasesyncBlock' : ssAzure + 'mscae.enterprise.database_synchronization',
756			'AEDeviceBlock' : ssAzure + 'mscae.enterprise.device',
757			'AEDirectaccessBlock' : ssAzure + 'mscae.enterprise.direct_access_feature',
758			'AEDocumentBlock' : ssAzure + 'mscae.enterprise.document',
759			'AEDomaincontrollerBlock' : ssAzure + 'mscae.enterprise.domain_controller',
760			'AEEnterpriseBuildingBlock' : ssAzure + 'azure.enterprise',
761			'AEFilegeneralBlock' : ssAzure + 'azure.file',
762			'AEFilterBlock' : ssAzure + 'mscae.enterprise.filter',
763			'AEFirewallBlock' : ssAzure + 'mscae.enterprise.firewall',
764			'AEFolderBlock' : ssAzure + 'mscae.enterprise.folder',
765			'AEGatewayBlock' : ssAzure + 'mscae.enterprise.gateway',
766			'AEGenericcodeBlock' : ssAzure + 'azure.code_file',
767			'AEGraphBlock' : ssAzure + 'mscae.general.graph',
768			'AEHealthmonitoringBlock' : ssAzure + 'azure.health_monitoring',
769			'AEHealthyBlock' : ssAzure + 'azure.healthy',
770			'AEImportgenericBlock' : ssAzure + 'mscae.enterprise.import_generic',
771			'AEInternetBlock' : ssAzure + 'mscae.enterprise.internet',
772			'AEKeyboardBlock' : ssAzure + 'mscae.enterprise.keyboard',
773			'AEKeypermissionsBlock' : ssAzure + 'mscae.enterprise.key_permissions',
774			'AELaptopcomputerBlock' : ssAzure + 'azure.laptop',
775			'AELoadbalancerBlock' : ssAzure + 'azure.load_balancer_generic',
776			'AELoadTestingBlock' : ssAzure + 'mscae.enterprise.load_testing',
777			'AELockprotectedBlock' : ssAzure + 'mscae.enterprise.lock',
778			'AELockunprotectedBlock' : ssAzure + 'mscae.enterprise.lock_unlocked',
779			'AEMaintenanceBlock' : ssAzure + 'mscae.enterprise.maintenance',
780			'AEManagementconsoleBlock' : ssAzure + 'mscae.enterprise.management_console',
781			'AEMessageBlock' : ssAzure + 'azure.message',
782			'AEMonitorBlock' : ssAzure + 'azure.computer',
783			'AEMonitorrunningappsBlock' : ssAzure + 'mscae.enterprise.monitor_running_apps',
784			'AEMouseBlock' : ssAzure + 'mscae.enterprise.mouse',
785			'AENetworkcardBlock' : ssAzure + 'mscae.enterprise.network_card',
786			'AENotallowedBlock' : ssAzure + 'mscae.general.not_allowed',
787			'AEPerformanceBlock' : ssAzure + 'mscae.enterprise.performance',
788			'AEPerformancemonitorBlock' : ssAzure + 'mscae.enterprise.performance_monitor',
789			'AEPhoneBlock' : ssAzure + 'azure.mobile',
790			'AEPlugandplayBlock' : ssAzure + 'mscae.enterprise.plug_and_play',
791			'AEPowershellscriptfileBlock' : ssAzure + 'azure.powershell_file',
792			'AEProtocolstackBlock' : ssAzure + 'mscae.enterprise.protocol_stack',
793			'AEQueuegeneralBlock' : ssAzure + 'azure.queue_generic',
794			'AERMSconnectorBlock' : ssAzure + 'mscae.enterprise.rms_connector',
795			'AERouterBlock' : ssAzure + 'mscae.enterprise.router',
796			'AEScriptfileBlock' : ssAzure + 'azure.script_file',
797			'AESecurevirtualmachineBlock' : ssAzure + 'mscae.enterprise.secure_virtual_machine',
798			'AEServerbladeBlock' : ssAzure + 'azure.server',
799			'AEServerdirectoryBlock' : ssAzure + 'mscae.enterprise.server_directory',
800			'AEServerfarmBlock' : ssAzure + 'mscae.enterprise.server_farm',
801			'AEServergenericBlock' : ssAzure + 'mscae.enterprise.server_generic',
802			'AEServerrackBlock' : ssAzure + 'azure.server_rack',
803			'AESettingsBlock' : ssAzure + 'mscae.enterprise.settings',
804			'AESharedfolderBlock' : ssAzure + 'mscae.enterprise.shared_folder',
805			'AESmartcardBlock' : ssAzure + 'mscae.enterprise.smartcard',
806			'AEStorageBlock' : ssAzure + 'mscae.enterprise.storage',
807			'AETableBlock' : ssAzure + 'mscae.enterprise.table',
808			'AETabletBlock' : ssAzure + 'azure.tablet',
809			'AEToolBlock' : ssAzure + 'mscae.enterprise.tool',
810			'AETunnelBlock' : ssAzure + 'mscae.general.tunnel',
811			'AEUnhealthyBlock' : ssAzure + 'mscae.enterprise.unhealthy',
812			'AEUSBBlock' : ssAzure + 'mscae.enterprise.usb',
813			'AEUserBlock' : ssAzure + 'azure.user',
814			'AEVideoBlock' : ssAzure + 'mscae.general.video',
815			'AEVirtualmachineBlock' : ssAzure + 'azure.virtual_machine_feature',
816			'AEWebBlock' : ssAzure + 'mscae.enterprise.web',
817			'AEWebserverBlock' : ssAzure + 'mscae.enterprise.web_server',
818			'AEWindowsserverBlock' : ssAzure + 'mscae.enterprise.windows_server',
819			'AEWirelessconnectionBlock' : ssAzure + 'mscae.enterprise.wireless_connection',
820			'AEWorkstationclientBlock' : ssAzure + 'mscae.enterprise.workstation_client',
821			'AEXMLwebserviceBlock' : ssAzure + 'mscae.enterprise.xml_web_service',
822			'AGSAudioBlock' : ssAzure + 'mscae.general.audio',
823			'AGSBugBlock' : ssAzure + 'mscae.general.bug',
824			'AGSCablesettopTVboxBlock' : ssAzure + 'mscae.general.cable_settop_tv_box',
825			'AGSCalendarBlock' : ssAzure + 'mscae.general.calendar',
826			'AGSChartBlock' : ssAzure + 'mscae.general.chart',
827			'AGSCheckmarkSuccessBlock' : ssAzure + 'mscae.general.checkmark',
828			'AGSContinousCycleCircleBlock' : ssAzure + 'mscae.general.continuous_cycle',
829			'AGSCrossoutFailureBlock' : ssAzure + 'mscae.general.crossout',
830			'AGSCutandpasteBlock' : ssAzure + 'mscae.general.cut_and_paste',
831			'AGSFolderBlock' : ssAzure + 'mscae.enterprise.folder',
832			'AGSGamecontrollerBlock' : ssAzure + 'mscae.general.game_controller',
833			'AGSGearsBlock' : ssAzure + 'mscae.general.gears',
834			'AGSGraphBlock' : ssAzure + 'mscae.general.graph',
835			'AGSLikeBlock' : ssAzure + 'mscae.general.like',
836			'AGSNotallowedBlock' : ssAzure + 'mscae.general.not_allowed',
837			'AGSSliderbarhorizontalBlock' : ssAzure + 'mscae.general.slider_bar_horizontal',
838			'AGSSliderbarvertBlock' : ssAzure + 'mscae.general.slider_bar_vertical',
839			'AGSTasklistorBacklogBlock' : ssAzure + 'mscae.general.task_list',
840			'AGSTasksBlock' : ssAzure + 'mscae.general.tasks',
841			'AGSTunnelBlock' : ssAzure + 'mscae.general.tunnel',
842			'AGSUserBlock' : ssAzure + 'azure.user',
843			'AGSVideoBlock' : ssAzure + 'mscae.general.video',
844// Azure VMS
845			'AVMActiveDirectoryVMBlock' : 'shape=mxgraph.mscae.vm.active_directory;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
846			'AVMActiveDirectoryVMmultiBlock' : 'shape=mxgraph.mscae.vm.active_directory_multi;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
847			'AVMAppServerVMBlock' : 'shape=mxgraph.mscae.vm.application_server;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
848			'AVMAppServerVMmultiBlock' : 'shape=mxgraph.mscae.vm.application_server_multi;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
849			'AVMDatabaseServerVMBlock' : 'shape=mxgraph.mscae.vm.database_server;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
850			'AVMDatabaseServerVMmultiBlock' : 'shape=mxgraph.mscae.vm.database_server_multi;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
851			'AVMDirectoryServerVMBlock' : 'shape=mxgraph.mscae.vm.directory_server;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
852			'AVMDirectoryServerVMmultiBlock' : 'shape=mxgraph.mscae.vm.directory_server_multi;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
853			'AVMDomainServerVMBlock' : 'shape=mxgraph.mscae.vm.domain_server;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
854			'AVMDomainServerVMmultiBlock' : 'shape=mxgraph.mscae.vm.domain_server_multi;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
855			'AVMFileServerVMBlock' : 'shape=mxgraph.mscae.vm.file_server;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
856			'AVMFileServerVMmultiBlock' : 'shape=mxgraph.mscae.vm.file_server_multi;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
857			'AVMWebServerVMBlock' : 'shape=mxgraph.mscae.vm.web_server;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
858			'AVMWebServerVMmultiBlock' : 'shape=mxgraph.mscae.vm.web_server_multi;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
859			'AVMWindowsServerVMBlock' : 'shape=mxgraph.mscae.vm.windows_server;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
860			'AVMWindowsServerVMmultiBlock' : 'shape=mxgraph.mscae.vm.windows_server_multi;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=none',
861// Azure 2019
862			'AccessReviewAzure2019': azur19 + 'Access_Review.svg',
863			'ActiveDirectoryConnectHealthAzure2019': azur19 + 'Active_Directory_Health_Monitoring.svg',
864			'ActiveDirectoryAzure2019': azur19 + 'Active_Directory.svg',
865			'ActiveDirectoryAzure2019_': azur19 + 'ActiveDirectory.svg',
866			'ActiveDirectoryDomainAzure2019': azur19 + 'ActiveDirectoryDomain.svg',
867			'AddressSpaceAzure2019': azur19 + 'Address_Space.svg',
868			'AddTeamMemberAzure2019': azur19 + 'AddTeamMember.svg',
869			'ADFSAzure2019': azur19 + 'ADFS.svg',
870			'AdvisorAzure2019': azur19 + 'Advisor.svg',
871			'AlienAzure2019': azur19 + 'Alien.svg',
872			'AlienSadAzure2019': azur19 + 'AlienSad.svg',
873			'AnalysisServicesAzure2019': azur19 + 'Analysis_Services.svg',
874			'APIManagementServicesAzure2019': azur19 + 'API_Management.svg',
875			'APIAzure2019': azur19 + 'API.svg',
876			'APIDefinitionAzure2019': azur19 + 'APIDefinition.svg',
877			'AppConfigurationAzure2019': azur19 + 'App_Configuration.svg',
878			'AppRegistrationsAzure2019': azur19 + 'App_Registrations.svg',
879			'AppServiceAPIAppsAzure2019': azur19 + 'App_Service_API_Apps.svg',
880			'AppServiceFrontendAzure2019': azur19 + 'App_Service_Frontend.svg',
881			'PublicIPAddressesAzure2019': azur19 + 'App_Service_IPAddress.svg',
882			'AzureAppServiceMobileAzure2019': azur19 + 'App_Service_Mobile_App.svg',
883			'AppServiceWorkerPoolsAzure2019': azur19 + 'App_Service_Worker_Pools.svg',
884			'AppServiceAzure2019': azur19 + 'App_Service.svg',
885			'AppServicesAzure2019': azur19 + 'App_Services.svg',
886			'AppServiceEnvironmentsAzure2019': azur19 + 'App_Services.svg',
887			'ApplicationGatewayAzure2019': azur19 + 'Application_Gateway.svg',
888			'ApplicationInsightsAzure2019': azur19 + 'Application_Insights.svg',
889			'ApplicationSecurityGroupsAzure2019': azur19 + 'Application_Security_Groups.svg',
890			'AppServiceConnectivityAzure2019': azur19 + 'AppServiceConnectivity.svg',
891			'AppServiceEnvironmentAzure2019': azur19 + 'AppServiceEnvironment.svg',
892			'ArchiveStorageAzure2019': azur19 + 'Archive_Storage.svg',
893			'ARMExplorerAzure2019': azur19 + 'ARMExplorer.svg',
894			'AuditingAzure2019': azur19 + 'Auditing.svg',
895			'AuditingServerAzure2019': azur19 + 'AuditingServer.svg',
896			'AutoBackupAzure2019': azur19 + 'AutoBackup.svg',
897			'AutomationAccountsAzure2019': azur19 + 'Automation.svg',
898			'AvatarAzure2019': azur19 + 'Avatar.svg',
899			'AvatarDefaultAzure2019': azur19 + 'AvatarDefault.svg',
900			'AvatarUnknownAzure2019': azur19 + 'AvatarUnknown.svg',
901			'Azure API for FHIRAzure2019': azur19 + 'Azure API for FHIR.svg',
902			'AzureADB2CAzure2019': azur19 + 'Azure_AD_B2C.svg',
903			'AzureADDomainServicesAzure2019': azur19 + 'Azure_AD_Domain_Services.svg',
904			'AzureADIdentityProtectionAzure2019': azur19 + 'Azure_AD_Identity_Protection.svg',
905			'AzureADPrivilegedIdentityManagementAzure2019': azur19 + 'Azure_AD_Privileged_Identity_Management.svg',
906			'AzureAPIforFHIRAzure2019': azur19 + 'Azure_API_for_FHIR.svg',
907			'AzureArtifactsAzure2019': azur19 + 'Azure_Artifacts.svg',
908			'AzureBoardsAzure2019': azur19 + 'Azure_Boards.svg',
909			'AzureCacheforRedisAzure2019': azur19 + 'Azure_Cache_for_Redis.svg',
910			'AzureDataExplorerClustersAzure2019': azur19 + 'Azure_Data_Explorer_Clusters.svg',
911			'AzureDatabaseforMariaDBServersAzure2019': azur19 + 'Azure_Database_for_MariaDB_servers.svg',
912			'AzureDatabaseforMySQLServersAzure2019': azur19 + 'Azure_Database_for_MySQL_servers.svg',
913			'AzureDatabaseforPostgreSQLServersAzure2019': azur19 + 'Azure_Database_for_PostgreSQL_servers.svg',
914			'AzureDatabaseMigrationServicesAzure2019': azur19 + 'Azure_Database_Migration_Services.svg',
915			'AzureDevOpsAzure2019': azur19 + 'Azure_DevOps.svg',
916			'AzureDigitalTwinsAzure2019': azur19 + 'Azure_Digital_Twins.svg',
917			'AzureFirewallAzure2019': azur19 + 'Azure_Firewall.svg',
918			'AzureHomeAzure2019': azur19 + 'Azure_Home.svg',
919			'AzureIoTHubSecurityAzure2019': azur19 + 'Azure_IoT_Hub_Security.svg',
920			'AzureIoTHubAzure2019': azur19 + 'Azure_IoT_Hub.svg',
921			'AzureMapsAzure2019': azur19 + 'Azure_Maps.svg',
922			'AzureMediaPlayerAzure2019': azur19 + 'Azure_Media_Player.svg',
923			'AzureNetAppfilesAzure2019': azur19 + 'Azure_NetApp_files.svg',
924			'AzurePipelinesAzure2019': azur19 + 'Azure_Pipelines.svg',
925			'AzureReposAzure2019': azur19 + 'Azure_Repos.svg',
926			'AzureSentinelAzure2019': azur19 + 'Azure_Sentinel.svg',
927			'AzureSphereAzure2019': azur19 + 'Azure_Sphere.svg',
928			'AzureTestPlansAzure2019': azur19 + 'Azure_Test_Plans.svg',
929			'AzureFXTEdgeFilerAzure2019': azur19 + 'AzureFXTEdgeFiler.svg',
930			'BacklogAzure2019': azur19 + 'Backlog.svg',
931			'RecoveryServicesVaultsAzure2019': azur19 + 'Backup.svg',
932			'BatchAccountsAzure2019': azur19 + 'Batch_Accounts.svg',
933			'BatchAIAzure2019': azur19 + 'Batch_AI.svg',
934			'BatchTaskAzure2019': azur19 + 'Batch_Task.svg',
935			'BatchTaskVMAzure2019': azur19 + 'Batch_TaskVM.svg',
936			'BatchAzure2019': azur19 + 'Batch.svg',
937			'BillingHubAzure2019': azur19 + 'BillingHub.svg',
938			'BizTalkServicesHybridConnectionsAzure2019': azur19 + 'BizTalk_Services_Hybrid_Connections.svg',
939			'BizTalkServicesAzure2019': azur19 + 'BizTalk_Services.svg',
940			'BlobStorageAzure2019': azur19 + 'BlobBlock.svg',
941			'BlobPageAzure2019': azur19 + 'BlobPage.svg',
942			'BlockchainAzure2019': azur19 + 'Blockchain.svg',
943			'BlogStorageAzure2019': azur19 + 'Blog_Storage.svg',
944			'BlueprintsAzure2019': azur19 + 'Blueprints.svg',
945			'BookAzure2019': azur19 + 'Book.svg',
946			'BotServicesAzure2019': azur19 + 'Bot_Services.svg',
947			'BranchAzure2019': azur19 + 'Branch.svg',
948			'BrowserAzure2019': azur19 + 'Browser.svg',
949			'BugAzure2019': azur19 + 'Bug.svg',
950			'BuildingBlocksAzure2019': azur19 + 'Building_Blocks.svg',
951			'BuildsAzure2019': azur19 + 'Builds.svg',
952			'AzureCacheplusRedisAzure2019': azur19 + 'Cache_including_Redis.svg',
953			'AzureCacheRedisAzure2019': azur19 + 'Cache_Redis_Product.svg',
954			'CalendarAzure2019': azur19 + 'Calendar.svg',
955			'CDNrocketAzure2019': azur19 + 'CDNrocket.svg',
956			'CertificateAzure2019': azur19 + 'Certificate.svg',
957			'AppServiceCertificatesAzure2019': azur19 + 'Certificate.svg',
958			'MetricsAzure2019': azur19 + 'Chart.svg',
959			'CheckAzure2019': azur19 + 'Check.svg',
960			'CitrixVirtualDesktopsEssentialsAzure2019': azur19 + 'Citrix_Virtual_Desktops_Essentials.svg',
961			'ReservedIPAddressesClassicAzure2019': azur19 + 'ClassicIPAddress.svg',
962			'ClassicStorageAzure2019': azur19 + 'ClassicStorage.svg',
963			'ClientAppsAzure2019': azur19 + 'Client_Apps.svg',
964			'RecentAzure2019': azur19 + 'Clock.svg',
965			'CycleCloudAzure2019': azur19 + 'Cloud_Cycle.svg',
966			'CloudServicesAzure2019': azur19 + 'Cloud_Service.svg',
967			'CloudServicesClassicAzure2019': azur19 + 'Cloud_Services_Classic.svg',
968			'CloudSimpleNodesAzure2019': azur19 + 'CloudSimple_Nodes.svg',
969			'CloudSimpleServicesAzure2019': azur19 + 'CloudSimple_Services.svg',
970			'CloudSimpleVirtualMachinesAzure2019': azur19 + 'CloudSimple_Virtual_Machines.svg',
971			'CodeAzure2019': azur19 + 'Code.svg',
972			'CognitiveServicesComputerVisionAzure2019': azur19 + 'Cognitive_Services_Computer_Vision.svg',
973			'CognitiveServicesemotionAzure2019': azur19 + 'Cognitive_Services_emotion.svg',
974			'CognitiveServicesfaceAzure2019': azur19 + 'Cognitive_Services_face.svg',
975			'CognitiveServicesluisAzure2019': azur19 + 'Cognitive_Services_luis.svg',
976			'CognitiveServicesrecommendationsAzure2019': azur19 + 'Cognitive_Services_recommendations.svg',
977			'CognitiveServicesSpeechAzure2019': azur19 + 'Cognitive_Services_Speech.svg',
978			'CognitiveServicestextanalyticsAzure2019': azur19 + 'Cognitive_Services_textanalytics.svg',
979			'CognitiveServicesweblanguagemodelAzure2019': azur19 + 'Cognitive_Services_web_language_model.svg',
980			'CognitiveServicesAzure2019': azur19 + 'Cognitive_Services.svg',
981			'CommitsAzure2019': azur19 + 'Commits.svg',
982			'ConnectionAzure2019': azur19 + 'Connection.svg',
983			'ConnectionsAzure2019': azur19 + 'Connections.svg',
984			'ContactInfoAzure2019': azur19 + 'ContactInfo.svg',
985			'ContainerInstancesAzure2019': azur19 + 'Container_Instances.svg',
986			'ContainerRegistriesAzure2019': azur19 + 'Container_Registries.svg',
987			'ContainerServiceAzure2019': azur19 + 'Container_Service.svg',
988			'CDNProfilesAzure2019': azur19 + 'Content_Delivery_Network.svg',
989			'ContentProtectionAzure2019': azur19 + 'Content_Protection.svg',
990			'ContentManagementSystemAzure2019': azur19 + 'ContentManagementSystem.svg',
991			'ContinuousExportAzure2019': azur19 + 'ContinuousExport.svg',
992			'ControllersAzure2019': azur19 + 'Controllers.svg',
993			'ControlsAzure2019': azur19 + 'Controls.svg',
994			'ControlsHorizontalAzure2019': azur19 + 'ControlsHorizontal.svg',
995			'AzureCosmosDBAzure2019': azur19 + 'CosmosDB.svg',
996			'CounterAzure2019': azur19 + 'Counter.svg',
997			'CubesAzure2019': azur19 + 'Cubes.svg',
998			'CustomDomainAzure2019': azur19 + 'CustomDomain.svg',
999			'AppServiceDomainsAzure2019': azur19 + 'CustomDomain.svg',
1000			'CustomerLockboxAzure2019': azur19 + 'Customer_Lockbox.svg',
1001			'CustomerInsightsAzure2019': azur19 + 'CustomerInsights.svg',
1002			'DataBoxEdgeDataBoxGatewayAzure2019': azur19 + 'Data_Box_Edge_Data_Box_Gateway.svg',
1003			'DataBoxAzure2019': azur19 + 'Data_Box.svg',
1004			'ImportExportJobsAzure2019': azur19 + 'Data_Box.svg',
1005			'AzureDataCatalogAzure2019': azur19 + 'Data_Catalog.svg',
1006			'DataFactoriesAzure2019': azur19 + 'Data_Factory.svg',
1007			'DataLakeAnalyticsAzure2019': azur19 + 'Data_Lake_Analytics.svg',
1008			'DataLakeStorageAzure2019': azur19 + 'Data_Lake_Storage.svg',
1009			'DataLakeStoreGen1Azure2019': azur19 + 'Data_Lake_Store.svg',
1010			'DataLakeAzure2019': azur19 + 'Data_Lake.svg',
1011			'DataWarehouseAzure2019': azur19 + 'Data_Warehouse.svg',
1012			'AzureDatabaseGenericAzure2019': azur19 + 'Database_General.svg',
1013			'DatabaseRestoreAzure2019': azur19 + 'DatabaseRestore.svg',
1014			'AzureDatabricksAzure2019': azur19 + 'Databricks.svg',
1015			'dataExportAzure2019': azur19 + 'dataExport.svg',
1016			'dataRetentionAzure2019': azur19 + 'dataRetention.svg',
1017			'DataServicescategoryrollupAzure2019': azur19 + 'DataServices_category_rollup.svg',
1018			'DCOSAzure2019': azur19 + 'DC_OS.svg',
1019			'DDOSProtectionPlansAzure2019': azur19 + 'DDOS_Protection_Plans.svg',
1020			'DedicatedEventHubAzure2019': azur19 + 'Dedicated_Event_Hub.svg',
1021			'DevConsoleAzure2019': azur19 + 'DevConsole.svg',
1022			'DeveloperToolsAzure2019': azur19 + 'Developer_Tools.svg',
1023			'DeviceComplianceAzure2019': azur19 + 'Device_Compliance.svg',
1024			'DeviceConfigAzure2019': azur19 + 'Device_Config.svg',
1025			'DeviceProvisioningServicesAzure2019': azur19 + 'Device_Provisioning_Services.svg',
1026			'DevicesGroupsAzure2019': azur19 + 'Devices_Groups.svg',
1027			'AzureDevTestLabsAzure2019': azur19 + 'DevTest_Labs.svg',
1028			'DirectorySyncAzure2019': azur19 + 'DirectorySync.svg',
1029			'DiscardAzure2019': azur19 + 'Discard.svg',
1030			'DisksAzure2019': azur19 + 'Discs.svg',
1031			'DNSPrivateZonesAzure2019': azur19 + 'DNS_Private_Zones.svg',
1032			'DNSZonesAzure2019': azur19 + 'DNS.svg',
1033			'DockerAzure2019': azur19 + 'Docker.svg',
1034			'DocumentDBAzure2019': azur19 + 'DocumentDB.svg',
1035			'DownloadAzure2019': azur19 + 'Download.svg',
1036			'EBooksAzure2019': azur19 + 'eBooks.svg',
1037			'EducationAzure2019': azur19 + 'Education.svg',
1038			'ElasticDatabasePoolsAzure2019': azur19 + 'Elastic_Database_Pools.svg',
1039			'ElasticJobAgentsAzure2019': azur19 + 'Elastic_Job_Agents.svg',
1040			'EnrollmentAzure2019': azur19 + 'Enrollment.svg',
1041			'EnterpriseApplicationsAzure2019': azur19 + 'Enterprise_Applications.svg',
1042			'EventGridTopicsAzure2019': azur19 + 'Event_Grid_Topics.svg',
1043			'EventGridDomainsAzure2019': azur19 + 'Event_Grid.svg',
1044			'EventGridSubscriptionsAzure2019': azur19 + 'Event_Grid.svg',
1045			'EventHubClustersAzure2019': azur19 + 'Event_Hub_Clusters.svg',
1046			'EventHubsAzure2019': azur19 + 'Event_Hubs.svg',
1047			'EventLogAzure2019': azur19 + 'EventLog.svg',
1048			'ExchangeOnPremisesAccessAzure2019': azur19 + 'Exchange_On_premises_Access.svg',
1049			'ExpressRouteCircuitsAzure2019': azur19 + 'Express_Route.svg',
1050			'ExtensionsAzure2019': azur19 + 'Extensions.svg',
1051			'FavoriteAzure2019': azur19 + 'Favorite.svg',
1052			'FileAzure2019': azur19 + 'File.svg',
1053			'FilesAzure2019': azur19 + 'Files.svg',
1054			'FolderAzure2019': azur19 + 'Folder.svg',
1055			'FolderBlankAzure2019': azur19 + 'FolderBlank.svg',
1056			'FolderCubeAzure2019': azur19 + 'FolderCube.svg',
1057			'FolderWebsiteAzure2019': azur19 + 'FolderWebsite.svg',
1058			'ForPlacementOnlyAzure2019': azur19 + 'ForPlacementOnly.svg',
1059			'FreeServicesAzure2019': azur19 + 'Free_Services.svg',
1060			'FrontDoorsAzure2019': azur19 + 'Front_Doors.svg',
1061			'FtpAzure2019': azur19 + 'Ftp.svg',
1062			'FunctionAppsAzure2019': azur19 + 'Functions.svg',
1063			'GalleryManagementAzure2019': azur19 + 'GalleryManagement.svg',
1064			'GatewayAzure2019': azur19 + 'Gateway.svg',
1065			'Gear2Azure2019': azur19 + 'Gear_2.svg',
1066			'GearAzure2019': azur19 + 'Gear.svg',
1067			'GearAlternate2Azure2019': azur19 + 'GearAlternate_2.svg',
1068			'GearAlternateAzure2019': azur19 + 'GearAlternate.svg',
1069			'GeneralStorageAzure2019': azur19 + 'General_Storage.svg',
1070			'GenomicsAccountsAzure2019': azur19 + 'Genomics_Accounts.svg',
1071			'GeoReplicationPremiumAzure2019': azur19 + 'GeoReplicationPremium.svg',
1072			'GeoReplicationStandardAzure2019': azur19 + 'GeoReplicationStandard.svg',
1073			'GetMoreLicenseAzure2019': azur19 + 'GetMoreLicense.svg',
1074			'GetStartedAzure2019': azur19 + 'GetStarted.svg',
1075			'GiftAzure2019': azur19 + 'Gift.svg',
1076			'GlobeAzure2019': azur19 + 'Globe.svg',
1077			'GlobeErrorAzure2019': azur19 + 'GlobeError.svg',
1078			'GlobeSuccessAzure2019': azur19 + 'GlobeSuccess.svg',
1079			'GlobeWarningAzure2019': azur19 + 'GlobeWarning.svg',
1080			'GoAzure2019': azur19 + 'Go.svg',
1081			'GreatScottAzure2019': azur19 + 'GreatScott.svg',
1082			'GridAzure2019': azur19 + 'Grid.svg',
1083			'AllResourcesAzure2019': azur19 + 'Grid3x3.svg',
1084			'GuestAssignmentsAzure2019': azur19 + 'Guest_Assignments.svg',
1085			'Guide2Azure2019': azur19 + 'Guide_2.svg',
1086			'GuideAzure2019': azur19 + 'Guide.svg',
1087			'HammerAzure2019': azur19 + 'Hammer.svg',
1088			'HDInsightAzure2019': azur19 + 'HDInsight.svg',
1089			'HDInsightClustersAzure2019': azur19 + 'HDInsightClusters.svg',
1090			'HealthErrorBadgeAzure2019': azur19 + 'HealthErrorBadge.svg',
1091			'HealthWarningBadgeAzure2019': azur19 + 'HealthWarningBadge.svg',
1092			'HeartAzure2019': azur19 + 'Heart.svg',
1093			'HeartPulseAzure2019': azur19 + 'HeartPulse.svg',
1094			'HomeAzure2019': azur19 + 'Home.svg',
1095			'HybridConnectionEndpointAzure2019': azur19 + 'HybridConnectionEndpoint.svg',
1096			'IdentityGovernanceAzure2019': azur19 + 'Identity_Governance.svg',
1097			'ImageDefinitionsAzure2019': azur19 + 'Image_Definitions.svg',
1098			'ImageVersionsAzure2019': azur19 + 'Image_Versions.svg',
1099			'ImageAzure2019': azur19 + 'Image.svg',
1100			'InboundNATAzure2019': azur19 + 'InboundNAT.svg',
1101			'InboundRuleAzure2019': azur19 + 'InboundRule.svg',
1102			'InformationAzure2019': azur19 + 'Info_2.svg',
1103			'WhatsNewAzure2019': azur19 + 'Info.svg',
1104			'AzureTimeSeriesInsightsEventsSourcesAzure2019': azur19 + 'Input.svg',
1105			'InputOutputAzure2019': azur19 + 'InputOutput.svg',
1106			'InstallVisualStudioAzure2019': azur19 + 'InstallVisualStudio.svg',
1107			'IntegrationAccountsAzure2019': azur19 + 'Integration_Accounts.svg',
1108			'IntegrationServiceEnvironmentsAzure2019': azur19 + 'Integration_Service_Environments.svg',
1109			'IntuneAppProtectionAzure2019': azur19 + 'Intune_App_Protection.svg',
1110			'IntuneAzure2019': azur19 + 'Intune_App_Protection.svg',
1111			'IOTedgeAzure2019': azur19 + 'IOT_edge.svg',
1112			'JobAzure2019': azur19 + 'Job.svg',
1113			'JourneyHubAzure2019': azur19 + 'JourneyHub.svg',
1114			'KeyVaultsAzure2019': azur19 + 'Key_Vaults.svg',
1115			'SubscriptionsAzure2019': azur19 + 'Key.svg',
1116			'KeyboardShortcutsAzure2019': azur19 + 'KeyboardShortcuts.svg',
1117			'KeyVaultAzure2019': azur19 + 'KeyVault.svg',
1118			'KubernetesServicesAzure2019': azur19 + 'Kubernetes_Services.svg',
1119			'KubernetesAzure2019': azur19 + 'Kubernetes.svg',
1120			'KuduKnifeAzure2019': azur19 + 'KuduKnife.svg',
1121			'LaunchPortalAzure2019': azur19 + 'LaunchPortal.svg',
1122			'LoadBalancersAzure2019': azur19 + 'Load_Balancer_feature.svg',
1123			'LoadTestAzure2019': azur19 + 'LoadTest.svg',
1124			'LocalNetworkGatewaysAzure2019': azur19 + 'Local_Network_Gateways.svg',
1125			'LocalNetworkAzure2019': azur19 + 'LocalNetwork.svg',
1126			'LocationAzure2019': azur19 + 'Location.svg',
1127			'LogAnalyticsWorkspacesAzure2019': azur19 + 'Log_Analytics_Workspaces.svg',
1128			'ActivityLogAzure2019': azur19 + 'Log.svg',
1129			'DiagnosticSettingsAzure2019': azur19 + 'LogDiagnostics.svg',
1130			'LogicAppsCustomConnectorAzure2019': azur19 + 'Logic_Apps_Custom_Connector.svg',
1131			'LogicAppsAzure2019': azur19 + 'Logic_Apps.svg',
1132			'LogStreamingAzure2019': azur19 + 'LogStreaming.svg',
1133			'MachineLearningServiceWorkspacesAzure2019': azur19 + 'Machine_Learning_Service_Workspaces.svg',
1134			'MachineLearningStudioWebServicePlansAzure2019': azur19 + 'Machine_Learning_Studio_Web_Service_Plans.svg',
1135			'MachineLearningStudioWebServicesAzure2019': azur19 + 'Machine_Learning_Studio_Web_Services.svg',
1136			'MachineLearningStudioWorkspacesAzure2019': azur19 + 'Machine_Learning_Studio_Workspaces.svg',
1137			'MachineLearningAzure2019': azur19 + 'Machine_Learning.svg',
1138			'MachineLearningServicePlansAzure2019': azur19 + 'MachineLearningServicePlans.svg',
1139			'MachineLearningWebServicesAzure2019': azur19 + 'MachineLearningWebServices.svg',
1140			'MachineLearningWorkspacesAzure2019': azur19 + 'MachineLearningWorkspaces.svg',
1141			'ManagedApplicationsAzure2019': azur19 + 'Managed_Applications.svg',
1142			'ManagedDatabasesAzure2019': azur19 + 'Managed_Databases.svg',
1143			'ManagedDesktopAzure2019': azur19 + 'Managed_Desktop.svg',
1144			'ManagedIdentitiesAzure2019': azur19 + 'Managed_Identities.svg',
1145			'ManagedApplicationsAzure2019_': azur19 + 'ManagedApplications.svg',
1146			'ManagementGroupsAzure2019': azur19 + 'Management_Groups.svg',
1147			'ManagementPortalAzure2019': azur19 + 'Management_Portal.svg',
1148			'ManagePortalAzure2019': azur19 + 'ManagePortal.svg',
1149			'DiskSnapshotsAzure2019': azur19 + 'MD_snapshot.svg',
1150			'MediaEncodingAzure2019': azur19 + 'Media_Encoding.svg',
1151			'MediaOnDemandAzure2019': azur19 + 'Media_On_Demand.svg',
1152			'MediaServicesAzure2019': azur19 + 'Media_Services.svg',
1153			'AzureMediaServicesAzure2019': azur19 + 'Media_Services.svg',
1154			'MediaFileAzure2019': azur19 + 'MediaFile.svg',
1155			'MigrationProjectsAzure2019': azur19 + 'Migration_Projects.svg',
1156			'AzureMobileEngagementAzure2019': azur19 + 'Mobile_Engagement.svg',
1157			'ModuleAzure2019': azur19 + 'Module.svg',
1158			'MonitorAzure2019': azur19 + 'Monitor.svg',
1159			'MonitoringAzure2019': azur19 + 'Monitoring.svg',
1160			'MultiFactorAuthenticationAzure2019': azur19 + 'Multi_Factor_Authentication.svg',
1161			'MySQLClearDBdatabaseAzure2019': azur19 + 'MySQL_ClearDB_database.svg',
1162			'NetworkSecurityGroupsClassicAzure2019': azur19 + 'Network_Security_Groups_Classic.svg',
1163			'NetworkWatcherAzure2019': azur19 + 'Network_watcher.svg',
1164			'NetworkInterfacesAzure2019': azur19 + 'NetworkInterfaceCard.svg',
1165			'NewAzure2019': azur19 + 'New.svg',
1166			'NextBillAzure2019': azur19 + 'NextBill.svg',
1167			'NonAzureMachineAzure2019': azur19 + 'Non_Azure_Machine.svg',
1168			'NotificationHubsAzure2019': azur19 + 'Notification_Hubs.svg',
1169			'NotificationHubNamespacesAzure2019': azur19 + 'Notification_Hubs.svg',
1170			'AlertsAzure2019': azur19 + 'Notification.svg',
1171			'NSGAzure2019': azur19 + 'NSG.svg',
1172			'OfferAzure2019': azur19 + 'Offer.svg',
1173			'OnPremisesDataGatewaysAzure2019': azur19 + 'On_Premises_Data_Gateways.svg',
1174			'OnPremiseSetupAzure2019': azur19 + 'OnPremiseSetup.svg',
1175			'AzureOpenShiftAzure2019': azur19 + 'OpenShift.svg',
1176			'OperationsManagementSuiteAzure2019': azur19 + 'Operations_Management_Suite.svg',
1177			'OSImagesClassicAzure2019': azur19 + 'OS_Images_Classic.svg',
1178			'OutboundNATAzure2019': azur19 + 'OutboundNAT.svg',
1179			'OutboundRuleAzure2019': azur19 + 'OutboundRule.svg',
1180			'OutputAzure2019': azur19 + 'Output.svg',
1181			'overageCostsAzure2019': azur19 + 'overageCosts.svg',
1182			'PausedAzure2019': azur19 + 'Paused.svg',
1183			'PeeringsAzure2019': azur19 + 'Peerings.svg',
1184			'PendingAzure2019': azur19 + 'Pending.svg',
1185			'UserIconAzure2019': azur19 + 'Person.svg',
1186			'PersonWithFriendAzure2019': azur19 + 'PersonWithFriend.svg',
1187			'PhoneAzure2019': azur19 + 'Phone.svg',
1188			'PluralsightAzure2019': azur19 + 'PluralSight_mono.svg',
1189			'PolicyAzure2019': azur19 + 'Policy.svg',
1190			'PortalCurrentAzure2019': azur19 + 'PortalCurrent.svg',
1191			'PostponeAzure2019': azur19 + 'Postpone.svg',
1192			'PowerAzure2019': azur19 + 'Power.svg',
1193			'PowershellAzure2019': azur19 + 'Powershell.svg',
1194			'PowerUp2Azure2019': azur19 + 'PowerUp_2.svg',
1195			'PowerUpAzure2019': azur19 + 'PowerUp.svg',
1196			'PreviewRightAzure2019': azur19 + 'PreviewRight.svg',
1197			'ProbeAzure2019': azur19 + 'Probe.svg',
1198			'ProcessExplorerAzure2019': azur19 + 'ProcessExplorer.svg',
1199			'ProductionReadyDBAzure2019': azur19 + 'ProductionReadyDB.svg',
1200			'PublishAzure2019': azur19 + 'Publish.svg',
1201			'PullRequestAzure2019': azur19 + 'PullRequest.svg',
1202			'QSDiagnosticsAzure2019': azur19 + 'QSDiagnostics.svg',
1203			'QSFileAzure2019': azur19 + 'QSFile.svg',
1204			'QSMailAzure2019': azur19 + 'QSMail.svg',
1205			'QSWarningAzure2019': azur19 + 'QSWarning.svg',
1206			'QueuedAzure2019': azur19 + 'Queued.svg',
1207			'QueuesStorageAzure2019': azur19 + 'Queues_Storage.svg',
1208			'QuickStartCenterAzure2019': azur19 + 'Quick_Start_Center.svg',
1209			'QuickstartAzure2019': azur19 + 'Quickstart.svg',
1210			'QuotaAzure2019': azur19 + 'Quota.svg',
1211			'RainAzure2019': azur19 + 'Rain.svg',
1212			'RDMAAzure2019': azur19 + 'RDMA.svg',
1213			'RecommendationAzure2019': azur19 + 'Recommendation.svg',
1214			'RemoteAppAzure2019': azur19 + 'RemoteApp.svg',
1215			'ReservationsAzure2019': azur19 + 'Reservations.svg',
1216			'ResourceExplorerAzure2019': azur19 + 'Resource_Explorer.svg',
1217			'ResourceGraphExplorerAzure2019': azur19 + 'Resource_Graph_Explorer.svg',
1218			'ResourceGroupsAzure2019': azur19 + 'Resource_Groups.svg',
1219			'ResourceDefaultAzure2019': azur19 + 'ResourceDefault.svg',
1220			'ResourceGroupAzure2019': azur19 + 'ResourceGroup.svg',
1221			'ResourceLinkedAzure2019': azur19 + 'ResourceLinked.svg',
1222			'ResourceProviderAzure2019': azur19 + 'ResourceProvider.svg',
1223			'ResourceRoleAzure2019': azur19 + 'ResourceRole.svg',
1224			'RouteFiltersAzure2019': azur19 + 'Route_Filter.svg',
1225			'RuleAzure2019': azur19 + 'Rule.svg',
1226			'RunbooksAzure2019': azur19 + 'Runbooks.svg',
1227			'RunbookSourceAzure2019': azur19 + 'RunbookSource.svg',
1228			'SAPHANAonAzureAzure2019': azur19 + 'SAP_HANA_on_Azure.svg',
1229			'ScaleAzure2019': azur19 + 'Scale.svg',
1230			'ScaleAltAzure2019': azur19 + 'ScaleAlt.svg',
1231			'SchedulerJobAzure2019': azur19 + 'SchedulerJob.svg',
1232			'SchedulerJobCollectionsAzure2019': azur19 + 'SchedulerJobCollection.svg',
1233			'SDKAzure2019': azur19 + 'SDK.svg',
1234			'SearchAzure2019': azur19 + 'Search.svg',
1235			'AzureSearchAzure2019': azur19 + 'Search.svg',
1236			'SearchGridAzure2019': azur19 + 'SearchGrid.svg',
1237			'SecurityBaselinesAzure2019': azur19 + 'Security_Baselines.svg',
1238			'ConditionalAccessAzure2019': azur19 + 'Security_Center.svg',
1239			'SecurityCenterAzure2019': azur19 + 'Security_Center.svg',
1240			'SendGridAccountsAzure2019': azur19 + 'SendGrid_Accounts.svg',
1241			'ServerAzure2019': azur19 + 'Server.svg',
1242			'ServerFarmAzure2019': azur19 + 'ServerFarm.svg',
1243			'ServerProxyAzure2019': azur19 + 'ServerProxy.svg',
1244			'serversAndMobileDevicesAzure2019': azur19 + 'serversAndMobileDevices.svg',
1245			'ServiceBusQueuesAzure2019': azur19 + 'Service_Bus_Queues.svg',
1246			'AzureServiceBusRelaysAzure2019': azur19 + 'Service_Bus_Relay.svg',
1247			'ServiceBusTopicsAzure2019': azur19 + 'Service_Bus_Topics.svg',
1248			'AzureServiceBusAzure2019': azur19 + 'Service_Bus.svg',
1249			'ServiceCatalogManagedApplicationDefinitionsAzure2019': azur19 + 'Service_Catalog_Managed_Application_Definitions.svg',
1250			'ServiceEndpointPoliciesAzure2019': azur19 + 'Service_Endpoint_Policies.svg',
1251			'ServiceFabricClustersAzure2019': azur19 + 'Service_Fabric.svg',
1252			'ServiceHealthAzure2019': azur19 + 'ServiceHealth.svg',
1253			'SharedDashboardAzure2019': azur19 + 'Shared_Dashboard.svg',
1254			'SharedImageGalleriesAzure2019': azur19 + 'Shared_Image_Galleries.svg',
1255			'ShieldFirewallAzure2019': azur19 + 'ShieldFirewall.svg',
1256			'SignalRAzure2019': azur19 + 'SignalR.svg',
1257			'SiteRecoveryAzure2019': azur19 + 'Site_Recovery.svg',
1258			'SoftwareasaServiceSaaSAzure2019': azur19 + 'Software_as_a_Service.svg',
1259			'SoftwareUpdateAzure2019': azur19 + 'Software_Update.svg',
1260			'SolutionsAzure2019': azur19 + 'Solutions.svg',
1261			'SpatialAnchorAzure2019': azur19 + 'Spatial_Anchor.svg',
1262			'SQLDatabasesAzure2019': azur19 + 'SQL_Database_generic.svg',
1263			'AzureSQLDataWarehouseAzure2019': azur19 + 'SQL_DataWarehouse.svg',
1264			'SQLManagedInstancesAzure2019': azur19 + 'SQL_Managed_Instances.svg',
1265			'SQLServersAzure2019': azur19 + 'SQL_Servers.svg',
1266			'SQLStretchDatabaseAzure2019': azur19 + 'SQL_Stretch_Database.svg',
1267			'SQLServerStretchDatabasesAzure2019': azur19 + 'dep/SQL_Server_Stretch_DB.svg',
1268			'SQLQueryPerformanceCheckAzure2019': azur19 + 'SQLQueryPerformanceCheck.svg',
1269			'SSDAzure2019': azur19 + 'SSD.svg',
1270			'StackOverflowAzure2019': azur19 + 'StackOverflow.svg',
1271			'StorageAccountsAzure2019': azur19 + 'Storage_Accounts.svg',
1272			'StorageExplorerAzure2019': azur19 + 'Storage_Explorer.svg',
1273			'StorageSyncServicesAzure2019': azur19 + 'Storage_sync_service.svg',
1274			'StorageAzure2019': azur19 + 'Storage.svg',
1275			'StorageAzureFilesAzure2019': azur19 + 'StorageAzureFiles.svg',
1276			'StorageContainerAzure2019': azur19 + 'StorageContainer.svg',
1277			'StorageQueueAzure2019': azur19 + 'StorageQueue.svg',
1278			'StorageReplicaAzure2019': azur19 + 'StorageReplica.svg',
1279			'MarketplaceAzure2019': azur19 + 'Store_Marketplace.svg',
1280			'StorSimpleDataManagersAzure2019': azur19 + 'StorSimple_Data_Managers.svg',
1281			'AzureStorSimpleDeviceManagersAzure2019': azur19 + 'StorSimple.svg',
1282			'StorSimpleDeviceManagersAzure2019': azur19 + 'StorSimple.svg',
1283			'StreamAnalyticsJobsAzure2019': azur19 + 'Stream_Analytics.svg',
1284			'SubnetAzure2019': azur19 + 'Subnet.svg',
1285			'HelpSupportAzure2019': azur19 + 'Support_2.svg',
1286			'SupportRequestsAzure2019': azur19 + 'Support_Requests.svg',
1287			'SupportAzure2019': azur19 + 'Support.svg',
1288			'TableStorageAzure2019': azur19 + 'Table_Storage.svg',
1289			'TagAzure2019': azur19 + 'Tag.svg',
1290			'TagsAzure2019': azur19 + 'Tags.svg',
1291			'TaskAzure2019': azur19 + 'Task.svg',
1292			'TasksAzure2019': azur19 + 'Tasks.svg',
1293			'TasksPolychromaticAzure2019': azur19 + 'TasksPolychromatic.svg',
1294			'TaskVMAzure2019': azur19 + 'TaskVM.svg',
1295			'TaxAzure2019': azur19 + 'Tax.svg',
1296			'TeamProjectAzure2019': azur19 + 'TeamProject.svg',
1297			'TemplatesAzure2019': azur19 + 'Templates.svg',
1298			'TenantStatusAzure2019': azur19 + 'Tenant_Status.svg',
1299			'TFSVCRepositoryAzure2019': azur19 + 'TFSVCRepository.svg',
1300			'AzureTimeSeriesInsightsEnvironmentsAzure2019': azur19 + 'Time_Series_Insights_environments.svg',
1301			'TimeSeriesInsightsAzure2019': azur19 + 'TimeSeriesInsights.svg',
1302			'ToolboxAzure2019': azur19 + 'Toolbox.svg',
1303			'ToolsAzure2019': azur19 + 'Tools.svg',
1304			'TrafficManagerProfilesAzure2019': azur19 + 'Traffic_Manager.svg',
1305			'TrafficManagerDisabledAzure2019': azur19 + 'TrafficManagerDisabled.svg',
1306			'TrafficManagerEnabledAzure2019': azur19 + 'TrafficManagerEnabled.svg',
1307			'TwoUserIconAzure2019': azur19 + 'Two_User_Icon.svg',
1308			'UnidentifiedFeatureObjectAzure2019': azur19 + 'Unidentified_Feature_Object.svg',
1309			'UserHealthIconAzure2019': azur19 + 'User_Health_Icon.svg',
1310			'UserPrivacyAzure2019': azur19 + 'User_Privacy.svg',
1311			'UserResourceAzure2019': azur19 + 'User_Resource.svg',
1312			'RouteTablesAzure2019': azur19 + 'UserDefinedRoute.svg',
1313			'VariablesAzure2019': azur19 + 'Variables.svg',
1314			'VersionsAzure2019': azur19 + 'Versions.svg',
1315			'VirtualClustersAzure2019': azur19 + 'Virtual_Clusters.svg',
1316			'VirtualDatacenterAzure2019': azur19 + 'Virtual_Datacenter.svg',
1317			'VMClassicAzure2019': azur19 + 'Virtual_Machine_2.svg',
1318			'VMAzure2019': azur19 + 'Virtual_Machine.svg',
1319			'AvailabilitySetsAzure2019': azur19 + 'Virtual_Machines_Availability_Set.svg',
1320			'VirtualMachinesLinuxAzure2019': azur19 + 'Virtual_Machines_Linux.svg',
1321			'VirtualNetworkClassicAzure2019': azur19 + 'Virtual_Network_Classic.svg',
1322			'VirtualNetworksAzure2019': azur19 + 'Virtual_Network.svg',
1323			'VirtualWANsAzure2019': azur19 + 'Virtual_WANs.svg',
1324			'VirtualMachineLinuxAzure2019': azur19 + 'VirtualMachineLinux.svg',
1325			'VMWindowsAzure2019': azur19 + 'VirtualMachineWindows.svg',
1326			'VisualStudioTeamServicesCodePlexsourceAzure2019': azur19 + 'Visual_Studio_Team_Services_CodePlex_source.svg',
1327			'VMImagesAzure2019': azur19 + 'VM_Images.svg',
1328			'VMLinuxNonAzureAzure2019': azur19 + 'VM_Linux_Non_Azure.svg',
1329			'VMLinuxAzure2019': azur19 + 'VM_Linux.svg',
1330			'VMScaleSetsAzure2019': azur19 + 'VM_Scale_Set.svg',
1331			'VMWindowsNonAzureAzure2019': azur19 + 'VM_Windows_Non_Azure.svg',
1332			'VMScaleAzure2019': azur19 + 'VMScale.svg',
1333			'VirtualNetworkGatewaysAzure2019': azur19 + 'VPN_Gateway.svg',
1334			'VPNPointToSiteAzure2019': azur19 + 'VPNPointToSite.svg',
1335			'VPNSiteToSiteAzure2019': azur19 + 'VPNSiteToSite.svg',
1336			'WebAppFirewallAzure2019': azur19 + 'Web_App_Firewall.svg',
1337			'WebAppWebJobsAzure2019': azur19 + 'WebApp_WebJobs.svg',
1338			'UmbracoAzure2019': azur19 + 'WebAppUmbraco.svg',
1339			'WordPressAzure2019': azur19 + 'WebAppWordPress.svg',
1340			'WebEnvironmentAzure2019': azur19 + 'WebEnvironment.svg',
1341			'WebhooksAzure2019': azur19 + 'Webhooks.svg',
1342			'WebHostingAzure2019': azur19 + 'WebHosting.svg',
1343			'AppServicePlansAzure2019': azur19 + 'WebHosting.svg',
1344			'WebNetworkAzure2019': azur19 + 'WebNetwork.svg',
1345			'WebsitePowerAzure2019': azur19 + 'WebsitePower.svg',
1346			'WebsiteReplicatorAzure2019': azur19 + 'WebsiteReplicator.svg',
1347			'WebsiteSettingsAzure2019': azur19 + 'WebsiteSettings.svg',
1348			'WebsiteStagingAzure2019': azur19 + 'WebsiteStaging.svg',
1349			'WebSlotsAzure2019': azur19 + 'WebSlots.svg',
1350			'WebTestAzure2019': azur19 + 'WebTest.svg',
1351			'Windows10IoTCoreServicesAzure2019': azur19 + 'Windows_10_IoT_Core_Services.svg',
1352			'WorkflowAzure2019': azur19 + 'Workflow.svg',
1353			'WrenchAzure2019': azur19 + 'Wrench.svg',
1354			'XboxControllerAzure2019': azur19 + 'XboxController.svg',
1355			'HockeyAppAzure2019' : 'shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.cloud.hockeyapp;fillColor=#0079D6;pointerEvents=1',
1356			'AppServiceLogicAppAzure2019': azur19 + 'dep/App_Service_Logic_App.svg',
1357			//'ApplicationGatewayAzure2019': azur19 + 'dep/Application_Gateway.svg',
1358			'ContentDeliveryNetworkAzure2019': azur19 + 'dep/Content_Delivery_Network.svg',
1359			//'DataLakeAnalyticsAzure2019': azur19 + 'dep/Data_Lake_Analytics.svg',
1360			'DataLakeStoreAzure2019': azur19 + 'dep/Data_Lake_Store.svg',
1361			//'DataLakeAzure2019': azur19 + 'dep/Data_Lake.svg',
1362			//'DataWarehouseAzure2019': azur19 + 'dep/DataWarehouse.svg',
1363			'AzureInformationProtectionAzure2019' : 'aspect=fixed;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.cloud.azure_rights_management_rms;fillColor=#58B4D9;',
1364			'IoTCentralApplicationsAzure2019' : 'aspect=fixed;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.cloud.central;fillColor=#0079D6;pointerEvents=1',
1365
1366//Cisco Basic
1367			'Cisco_cisco_androgenous_person' : s + 'cisco.people.androgenous_person;' + c,
1368			'Cisco_cisco_atm_switch' : s + 'cisco.switches.atm_switch;' + c,
1369			'Cisco_cisco_cloud' : s + 'cisco.storage.cloud;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=#036897;fillColor=#ffffff',
1370			'Cisco_cisco_fileserver' : s + 'cisco.servers.fileserver;' + c,
1371			'Cisco_cisco_firewall' : s + 'cisco.security.firewall;' + c,
1372			'Cisco_cisco_generic_building' : s + 'cisco.buildings.generic_building;' + c,
1373			'Cisco_cisco_laptop' : s + 'cisco.computers_and_peripherals.laptop;' + c,
1374			'Cisco_cisco_lock' : s + 'cisco.security.lock;' + c,
1375			'Cisco_cisco_microwebserver' : s + 'cisco.servers.microwebserver;' + c,
1376			'Cisco_cisco_pc' : s + 'cisco.computers_and_peripherals.pc;' + c,
1377			'Cisco_cisco_pda' : s + 'cisco.misc.pda;' + c,
1378			'Cisco_cisco_phone' : s + 'cisco.modems_and_phones.hootphone;' + c,
1379			'Cisco_cisco_printer' : s + 'cisco.computers_and_peripherals.printer;' + c,
1380			'Cisco_cisco_relational_database' : s + 'cisco.storage.relational_database;' + c,
1381			'Cisco_cisco_router' : s + 'cisco.routers.router;' + c,
1382			'Cisco_cisco_standing_man' : s + 'cisco.people.standing_man;' + c,
1383			'Cisco_cisco_standing_woman' : s + 'cisco.people.standing_woman;' + c,
1384			'Cisco_cisco_ups' : s + 'cisco.misc.ups;' + c,
1385			'Cisco_cisco_wireless_router' : s + 'cisco.routers.wireless_router;' + c,
1386//Cisco Extended
1387			'Cisco_cisco_100baset_hub' : s + 'cisco.hubs_and_gateways.100baset_hub;' + c,
1388			'Cisco_cisco_10700' : s + 'cisco.routers.10700;' + c,
1389			'Cisco_cisco_10GE_FCoE' : s + 'cisco.controllers_and_modules.10ge_fcoe;' + c,
1390			'Cisco_cisco_15200' : s + 'cisco.misc.15200;' + c,
1391			'Cisco_cisco_3174__desktop_' : s + 'cisco.controllers_and_modules.3174_(desktop)_cluster_controller;' + c,
1392			'Cisco_cisco_3200_mobile_access_router' : s + 'cisco.routers.mobile_access_router;' + c,
1393			'Cisco_cisco_3x74__floor_' : s + 'cisco.controllers_and_modules.3x74_(floor)_cluster_controller;' + c,
1394			'Cisco_cisco_6700_series' : s + 'cisco.misc.6700_series;' + c,
1395			'Cisco_cisco_7500ars__7513_' : s + 'cisco.misc.7500ars_(7513);' + c,
1396//			'Cisco_cisco_access_gateway' NA
1397			'Cisco_cisco_accesspoint' : s + 'cisco.misc.access_point;' + c,
1398			'Cisco_cisco_ace' : s + 'cisco.misc.ace;' + c,
1399			'Cisco_cisco_ACS' : s + 'cisco.misc.acs;' + c,
1400			'Cisco_cisco_adm' : s + 'cisco.misc.adm;' + c,
1401			'Cisco_cisco_antenna' : s + 'cisco.wireless.antenna;' + c,
1402			'Cisco_cisco_asic_processor' : s + 'cisco.misc.asic_processor;' + c,
1403			'Cisco_cisco_ASR_1000_Series' : s + 'cisco.misc.asr_1000_series;' + c,
1404			'Cisco_cisco_ata' : s + 'cisco.misc.ata;' + c,
1405			'Cisco_cisco_atm_3800' : s + 'cisco.misc.atm_3800;' + c,
1406			'Cisco_cisco_atm_fast_gigabit_etherswitch' : s + 'cisco.switches.atm_fast_gigabit_etherswitch;' + c,
1407			'Cisco_cisco_atm_router' : s + 'cisco.routers.atm_router;' + c,
1408			'Cisco_cisco_atm_tag_switch_router' : s + 'cisco.routers.atm_tag_switch_router;' + c,
1409			'Cisco_cisco_avs' : s + 'cisco.misc.avs;' + c,
1410			'Cisco_cisco_AXP' : s + 'cisco.misc.axp;' + c,
1411//			'Cisco_cisco_bbfw_media' NA
1412//			'Cisco_cisco_bbfw' NA
1413			'Cisco_cisco_bbsm' : s + 'cisco.misc.bbsm;' + c,
1414			'Cisco_cisco_branch_office' : s + 'cisco.buildings.branch_office;' + c,
1415			'Cisco_cisco_breakout_box' : s + 'cisco.misc.breakout_box;' + c,
1416			'Cisco_cisco_bridge' : s + 'cisco.misc.bridge;' + c,
1417			'Cisco_cisco_broadband_router' : s + 'cisco.routers.broadcast_router;' + c,
1418			'Cisco_cisco_bts_10200' : s + 'cisco.misc.bts_10200;' + c,
1419			'Cisco_cisco_cable_modem' : s + 'cisco.modems_and_phones.cable_modem;' + c,
1420			'Cisco_cisco_callmanager' : s + 'cisco.misc.call_manager;' + c,
1421			'Cisco_cisco_car' : s + 'cisco.misc.car;' + c,
1422			'Cisco_cisco_carrier_routing_system' : s + 'cisco.misc.carrier_routing_system;' + c,
1423			'Cisco_cisco_cddi_fddi' : s + 'cisco.misc.cddi_fddi;' + c,
1424			'Cisco_cisco_cdm' : s + 'cisco.misc.cdm;' + c,
1425			'Cisco_cisco_cellular_phone' : s + 'cisco.modems_and_phones.cell_phone;' + c,
1426			'Cisco_cisco_centri_firewall' : s + 'cisco.security.centri_firewall;' + c,
1427			'Cisco_cisco_cisco_1000' : s + 'cisco.misc.cisco_1000;' + c,
1428			'Cisco_cisco_cisco_asa_5500' : s + 'cisco.misc.asa_5500;' + c,
1429			'Cisco_cisco_cisco_ca' : s + 'cisco.misc.cisco_ca;' + c,
1430			'Cisco_cisco_cisco_file_engine' : s + 'cisco.storage.cisco_file_engine;' + c,
1431			'Cisco_cisco_cisco_hub' : s + 'cisco.hubs_and_gateways.cisco_hub;' + c,
1432			'Cisco_cisco_ciscosecurity' : s + 'cisco.security.cisco_security;' + c,
1433//			'Cisco_cisco_Cisco_telepresence_manager' NA
1434			'Cisco_cisco_cisco_unified_presence_server' : s + 'cisco.servers.cisco_unified_presence_server;' + c,
1435			'Cisco_cisco_cisco_unityexpress' : s + 'cisco.misc.cisco_unity_express;' + c,
1436			'Cisco_cisco_ciscoworks' : s + 'cisco.misc.cisco_works;' + c,
1437			'Cisco_cisco_class_4_5_switch' : s + 'cisco.switches.class_4_5_switch;' + c,
1438			'Cisco_cisco_communications_server' : s + 'cisco.servers.communications_server;' + c,
1439			'Cisco_cisco_contact_center' : s + 'cisco.misc.contact_center;' + c,
1440			'Cisco_cisco_content_engine__cache_director_' : s + 'cisco.directors.content_engine_(cache_director);' + c,
1441			'Cisco_cisco_content_service_router' : s + 'cisco.routers.content_service_router;' + c,
1442			'Cisco_cisco_content_service_switch_1100' : s + 'cisco.switches.content_service_switch_1100;' + c,
1443			'Cisco_cisco_content_switch_module' : s + 'cisco.controllers_and_modules.content_switch_module;' + c,
1444			'Cisco_cisco_content_switch' : s + 'cisco.switches.content_switch;' + c,
1445			'Cisco_cisco_content_transformation_engine__cte_' : s + 'cisco.misc.content_transformation_engine_(cte);' + c,
1446			'Cisco_cisco_cs_mars' : s + 'cisco.misc.cs-mars;' + c,
1447			'Cisco_cisco_csm_s' : s + 'cisco.misc.csm-s;' + c,
1448			'Cisco_cisco_csu_dsu' : s + 'cisco.misc.csu_dsu;' + c,
1449			'Cisco_cisco_CUBE' : s + 'cisco.misc.cube;' + c,
1450			'Cisco_cisco_detector' : s + 'cisco.misc.detector;' + c,
1451			'Cisco_cisco_director_class_fibre_channel_director' : s + 'cisco.directors.director-class_fibre_channel_director;' + c,
1452			'Cisco_cisco_directory_server' : s + 'cisco.servers.directory_server;' + c,
1453			'Cisco_cisco_diskette' : s + 'cisco.storage.diskette;' + c,
1454			'Cisco_cisco_distributed_director' : s + 'cisco.directors.distributed_director;' + c,
1455			'Cisco_cisco_dot_dot' : s + 'cisco.misc.dot-dot;' + c,
1456			'Cisco_cisco_dpt' : s + 'cisco.misc.dpt;' + c,
1457			'Cisco_cisco_dslam' : s + 'cisco.misc.dslam;' + c,
1458			'Cisco_cisco_dual_mode_ap' : s + 'cisco.misc.dual_mode;' + c,
1459			'Cisco_cisco_dwdm_filter' : s + 'cisco.misc.dwdm_filter;' + c,
1460			'Cisco_cisco_end_office' : s + 'cisco.buildings.end_office;' + c,
1461			'Cisco_cisco_fax' : s + 'cisco.modems_and_phones.fax;' + c,
1462			'Cisco_cisco_fc_storage' : s + 'cisco.storage.fc_storage;' + c,
1463			'Cisco_cisco_fddi_ring' : s + 'cisco.misc.fddi_ring;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=#036897;',
1464			'Cisco_cisco_fibre_channel_disk_subsystem' : s + 'cisco.storage.fibre_channel_disk_subsystem;' + c,
1465			'Cisco_cisco_fibre_channel_fabric_switch' : s + 'cisco.switches.fibre_channel_fabric_switch;' + c,
1466			'Cisco_cisco_file_cabinet' : s + 'cisco.storage.file_cabinet;' + c,
1467			'Cisco_cisco_file_server' : s + 'cisco.servers.file_server;' + c,
1468			'Cisco_cisco_firewall_service_module__fwsm_' : s + 'cisco.controllers_and_modules.firewall_service_module_(fwsm);' + c,
1469			'Cisco_cisco_front_end_processor' : s + 'cisco.misc.front_end_processor;' + c,
1470			'Cisco_cisco_gatekeeper' : s + 'cisco.security.gatekeeper;strokeColor=#036897;',
1471			'Cisco_cisco_general_applicance' : s + 'cisco.misc.general_appliance;' + c,
1472			'Cisco_cisco_generic_gateway' : s + 'cisco.hubs_and_gateways.generic_gateway;' + c,
1473			'Cisco_cisco_generic_processor' : s + 'cisco.misc.generic_processor;' + c,
1474			'Cisco_cisco_generic_softswitch' : s + 'cisco.switches.generic_softswitch;' + c,
1475			'Cisco_cisco_gigabit_switch_atm_tag_router' : s + 'cisco.routers.gigabit_switch_atm_tag_router;' + c,
1476			'Cisco_cisco_government_building' : s + 'cisco.buildings.government_building;' + c,
1477			'Cisco_cisco_Ground_terminal' : s + 'cisco.wireless.ground_terminal;' + c,
1478			'Cisco_cisco_guard' : s + 'cisco.security.guard;' + c,
1479			'Cisco_cisco_handheld' : s + 'cisco.misc.handheld;' + c,
1480			'Cisco_cisco_hootphone' : s + 'cisco.modems_and_phones.hootphone;' + c,
1481			'Cisco_cisco_host' : s + 'cisco.servers.host;' + c,
1482			'Cisco_cisco_hp_mini' : s + 'cisco.misc.hp_mini;' + c,
1483			'Cisco_cisco_h' : s + 'cisco.misc.h_323;' + c,
1484			'Cisco_cisco_hub' : s + 'cisco.hubs_and_gateways.hub;' + c,
1485			'Cisco_cisco_iad_router' : s + 'cisco.routers.iad_router;' + c,
1486			'Cisco_cisco_ibm_mainframe' : s + 'cisco.computers_and_peripherals.ibm_mainframe;' + c,
1487			'Cisco_cisco_ibm_mini_as400' : s + 'cisco.computers_and_peripherals.ibm_mini_as400;' + c,
1488			'Cisco_cisco_ibm_tower' : s + 'cisco.computers_and_peripherals.ibm_tower;' + c,
1489			'Cisco_cisco_icm' : s + 'cisco.misc.icm;' + c,
1490			'Cisco_cisco_ics' : s + 'cisco.misc.ics;' + c,
1491			'Cisco_cisco_intelliswitch_stack' : s + 'cisco.switches.intelliswitch_stack;' + c,
1492			'Cisco_cisco_ios_firewall' : s + 'cisco.security.ios_firewall;' + c,
1493			'Cisco_cisco_ios_slb' : s + 'cisco.misc.ios_slb;' + c,
1494			'Cisco_cisco_ip_communicator' : s + 'cisco.misc.ip_communicator;' + c,
1495			'Cisco_cisco_ip_dsl' : s + 'cisco.misc.ip_dsl;' + c,
1496			'Cisco_cisco_ip_phone' : s + 'cisco.modems_and_phones.ip_phone;' + c,
1497			'Cisco_cisco_ip' : s + 'cisco.misc.ip;' + c,
1498			'Cisco_cisco_iptc' : s + 'cisco.misc.iptc;' + c,
1499			'Cisco_cisco_ip_telephony_router' : s + 'cisco.routers.ip_telephony_router;' + c,
1500			'Cisco_cisco_iptv_content_manager' : s + 'cisco.misc.iptv_content_manager;' + c,
1501			'Cisco_cisco_iptv_server' : s + 'cisco.servers.iptv_server;' + c,
1502			'Cisco_cisco_iscsi_router' : s + 'cisco.routers.isci_router;' + c,
1503			'Cisco_cisco_isdn_switch' : s + 'cisco.switches.isdn_switch;' + c,
1504			'Cisco_cisco_itp' : s + 'cisco.misc.itp;' + c,
1505			'Cisco_cisco_jbod' : s + 'cisco.misc.jbod;' + c,
1506			'Cisco_cisco_key' : s + 'cisco.misc.key;' + c,
1507			'Cisco_cisco_keys' : s + 'cisco.misc.keys;' + c,
1508			'Cisco_cisco_lan_to_lan' : s + 'cisco.misc.lan_to_lan;' + c,
1509			'Cisco_cisco_layer_2_remote_switch' : s + 'cisco.switches.layer_2_remote_switch;' + c,
1510			'Cisco_cisco_layer_3_switch' : s + 'cisco.switches.layer_3_switch;' + c,
1511			'Cisco_cisco_lightweight_ap' : s + 'cisco.misc.lightweight_ap;' + c,
1512			'Cisco_cisco_localdirector' : s + 'cisco.directors.localdirector;' + c,
1513			'Cisco_cisco_longreach_cpe' : s + 'cisco.misc.longreach_cpe;' + c,
1514			'Cisco_cisco_macintosh' : s + 'cisco.computers_and_peripherals.macintosh;' + c,
1515			'Cisco_cisco_mac_woman' : s + 'cisco.people.mac_woman;' + c,
1516			'Cisco_cisco_man_woman' : s + 'cisco.people.man_woman;' + c,
1517			'Cisco_cisco_mas_gateway' : s + 'cisco.hubs_and_gateways.mas_gateway;' + c,
1518			'Cisco_cisco_mau' : s + 'cisco.misc.mau;' + c,
1519			'Cisco_cisco_mcu' : s + 'cisco.misc.mcu;' + c,
1520			'Cisco_cisco_mdu' : s + 'cisco.buildings.mdu;' + c,
1521			'Cisco_cisco_me_1100' : s + 'cisco.misc.me1100;' + c,
1522			'Cisco_cisco_Mediator' : s + 'cisco.misc.mediator;' + c,
1523			'Cisco_cisco_meetingplace' : s + 'cisco.misc.meetingplace;' + c,
1524			'Cisco_cisco_mesh_ap' : s + 'cisco.misc.mesh_ap;' + c,
1525			'Cisco_cisco_metro_1500' : s + 'cisco.misc.metro_1500;' + c,
1526			'Cisco_cisco_mgx_8000_multiservice_switch' : s + 'cisco.switches.mgx_8000_multiservice_switch;' + c,
1527			'Cisco_cisco_microphone' : s + 'cisco.computers_and_peripherals.microphone;' + c,
1528			'Cisco_cisco_mini_vax' : s + 'cisco.misc.mini_vax;' + c,
1529			'Cisco_cisco_mobile_access_ip_phone' : s + 'cisco.modems_and_phones.mobile_access_ip_phone;' + c,
1530			'Cisco_cisco_mobile_access_router' : s + 'cisco.routers.mobile_access_router;' + c,
1531			'Cisco_cisco_modem' : s + 'cisco.modems_and_phones.modem;' + c,
1532			'Cisco_cisco_moh_server' : s + 'cisco.servers.moh_server;' + c,
1533			'Cisco_cisco_MSE' : s + 'cisco.misc.mse;' + c,
1534			'Cisco_cisco_mulitswitch_device' : s + 'cisco.switches.multiswitch_device;' + c,
1535			'Cisco_cisco_multi_fabric_server_switch' : s + 'cisco.switches.multi-fabric_server_switch;' + c,
1536			'Cisco_cisco_multilayer_remote_switch' : s + 'cisco.switches.multilayer_remote_switch;' + c,
1537			'Cisco_cisco_mux' : s + 'cisco.misc.mux;' + c,
1538			'Cisco_cisco_MXE' : s + 'cisco.misc.mxe;' + c,
1539			'Cisco_cisco_nac_appliance' : s + 'cisco.misc.nac_appliance;' + c,
1540			'Cisco_cisco_NCE' : s + 'cisco.misc.nce;' + c,
1541			'Cisco_cisco_NCE_router' : s + 'cisco.routers.nce_router;' + c,
1542			'Cisco_cisco_netflow_router' : s + 'cisco.routers.netflow_router;' + c,
1543			'Cisco_cisco_netranger' : s + 'cisco.misc.netranger;' + c,
1544			'Cisco_cisco_netsonar' : s + 'cisco.misc.netsonar;' + c,
1545			'Cisco_cisco_network_management' : s + 'cisco.misc.network_management;' + c,
1546			'Cisco_cisco_Nexus_1000' : s + 'cisco.misc.nexus_1000;' + c,
1547			'Cisco_cisco_Nexus_2000' : s + 'cisco.misc.nexus_2000_fabric_extender;' + c,
1548			'Cisco_cisco_Nexus_5000' : s + 'cisco.misc.nexus_5000;' + c,
1549			'Cisco_cisco_Nexus_7000' : s + 'cisco.misc.nexus_7000;' + c,
1550			'Cisco_cisco_octel' : s + 'cisco.misc.octel;' + c,
1551			'Cisco_cisco_ons15500' : s + 'cisco.misc.ons15500;' + c,
1552			'Cisco_cisco_optical_amplifier' : s + 'cisco.misc.optical_amplifier;' + c,
1553			'Cisco_cisco_optical_services_router' : s + 'cisco.routers.optical_services_router;' + c,
1554			'Cisco_cisco_optical_transport' : s + 'cisco.misc.optical_transport;' + c,
1555			'Cisco_cisco_pad' : s + 'cisco.misc.pad_2;' + c,
1556			'Cisco_cisco_pad_x' : s + 'cisco.misc.pad_1;' + c,
1557			'Cisco_cisco_page_icon' : s + 'cisco.misc.page_icon;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=#036897;',
1558			'Cisco_cisco_pbx' : s + 'cisco.misc.pbx;' + c,
1559			'Cisco_cisco_pbx_switch' : s + 'cisco.switches.pbx_switch;' + c,
1560			'Cisco_cisco_pc_adapter_card' : s + 'cisco.computers_and_peripherals.pc_adapter_card;' + c,
1561			'Cisco_cisco_pc_man' : s + 'cisco.people.pc_man;' + c,
1562			'Cisco_cisco_pc_routercard' : s + 'cisco.computers_and_peripherals.pc_routercard;' + c,
1563			'Cisco_cisco_pc_software' : s + 'cisco.misc.pc_software;' + c,
1564			'Cisco_cisco_pc_video' : s + 'cisco.misc.pc_video;' + c,
1565			'Cisco_cisco_phone_fax' : s + 'cisco.modems_and_phones.phone-fax;' + c,
1566			'Cisco_cisco_pix_firewall' : s + 'cisco.security.pix_firewall;' + c,
1567			'Cisco_cisco_pmc' : s + 'cisco.misc.pmc;' + c,
1568			'Cisco_cisco_programmable_switch' : s + 'cisco.switches.programmable_switch;' + c,
1569			'Cisco_cisco_protocol_translator' : s + 'cisco.misc.protocol_translator;' + c,
1570			'Cisco_cisco_pxf' : s + 'cisco.misc.pxf;' + c,
1571			'Cisco_cisco_radio_tower' : s + 'cisco.wireless.radio_tower;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=#036897',
1572			'Cisco_cisco_ratemux' : s + 'cisco.misc.ratemux;' + c,
1573			'Cisco_cisco_repeater' : s + 'cisco.misc.repeater;' + c,
1574			'Cisco_cisco_RF_modem' : s + 'cisco.modems_and_phones.rf_modem;' + c,
1575			'Cisco_cisco_router_firewall' : s + 'cisco.security.router_firewall;' + c,
1576			'Cisco_cisco_routerin_building' : s + 'cisco.routers.router_in_building;' + c,
1577			'Cisco_cisco_router_with_silicon_switch' : s + 'cisco.routers.router_with_silicon_switch;' + c,
1578			'Cisco_cisco_route_switch_processor' : s + 'cisco.misc.route_switch_processor;' + c,
1579			'Cisco_cisco_rpsrps' : s + 'cisco.misc.rpsrps;' + c,
1580			'Cisco_cisco_running_man' : s + 'cisco.people.running_man;' + c,
1581			'Cisco_cisco_sattelite_dish' : s + 'cisco.wireless.satellite_dish;' + c,
1582			'Cisco_cisco_sattelite' : s + 'cisco.wireless.satellite;' + c,
1583			'Cisco_cisco_scanner' : s + 'cisco.computers_and_peripherals.scanner;' + c,
1584			'Cisco_cisco_server_switch' : s + 'cisco.switches.server_switch;' + c,
1585			'Cisco_cisco_server_with_router' : s + 'cisco.servers.server_with_router;' + c,
1586			'Cisco_cisco_service_control' : s + 'cisco.misc.service_control;' + c,
1587			'Cisco_cisco_Service_Module' : s + 'cisco.controllers_and_modules.service_module;' + c,
1588			'Cisco_cisco_Service_router' : s + 'cisco.routers.service_router;' + c,
1589			'Cisco_cisco_Services' : s + 'cisco.misc.services;' + c,
1590			'Cisco_cisco_Set_top_box' : s + 'cisco.misc.set_top_box;' + c,
1591			'Cisco_cisco_simulitlayer_switch' : s + 'cisco.switches.simultilayer_switch;' + c,
1592			'Cisco_cisco_sip_proxy_werver' : s + 'cisco.servers.sip_proxy_server;' + c,
1593			'Cisco_cisco_sitting_woman' : s + 'cisco.people.sitting_woman;' + c,
1594			'Cisco_cisco_small_business' : s + 'cisco.buildings.small_business;' + c,
1595			'Cisco_cisco_small_hub' : s + 'cisco.hubs_and_gateways.small_hub;' + c,
1596			'Cisco_cisco_softphone' : s + 'cisco.modems_and_phones.softphone;' + c,
1597			'Cisco_cisco_softswitch_pgw_mgc' : s + 'cisco.switches.softswitch_pgw_mgc;' + c,
1598			'Cisco_cisco_software_based_server' : s + 'cisco.servers.software_based_server;' + c,
1599//			'Cisco_cisco_Space_router' NA
1600			'Cisco_cisco_speaker' : s + 'cisco.computers_and_peripherals.speaker;' + c,
1601			'Cisco_cisco_ssc' : s + 'cisco.misc.ssc;' + c,
1602			'Cisco_cisco_ssl_terminator' : s + 'cisco.misc.ssl_terminator;' + c,
1603			'Cisco_cisco_standard_host' : s + 'cisco.servers.standard_host;' + c,
1604			'Cisco_cisco_stb' : s + 'cisco.misc.stb;' + c,
1605			'Cisco_cisco_storage_router' : s + 'cisco.routers.storage_router;' + c,
1606			'Cisco_cisco_storage_server' : s + 'cisco.servers.storage_server;' + c,
1607			'Cisco_cisco_stp' : s + 'cisco.misc.stp;' + c,
1608			'Cisco_cisco_streamer' : s + 'cisco.misc.streamer;' + c,
1609			'Cisco_cisco_sun_workstation' : s + 'cisco.computers_and_peripherals.workstation;' + c,
1610			'Cisco_cisco_supercomputer' : s + 'cisco.computers_and_peripherals.supercomputer;' + c,
1611			'Cisco_cisco_svx' : s + 'cisco.misc.svx;' + c,
1612			'Cisco_cisco_system_controller' : s + 'cisco.controllers_and_modules.system_controller;' + c,
1613			'Cisco_cisco_tablet' : s + 'cisco.computers_and_peripherals.tablet;' + c,
1614			'Cisco_cisco_tape_array' : s + 'cisco.storage.tape_array;' + c,
1615			'Cisco_cisco_tdm_router' : s + 'cisco.routers.tdm_router;' + c,
1616			'Cisco_cisco_telecommuter_house_pc' : s + 'cisco.buildings.telecommuter_house_pc;' + c,
1617			'Cisco_cisco_telecommuter_house' : s + 'cisco.buildings.telecommuter_house;' + c,
1618			'Cisco_cisco_telecommuter_icon' : s + 'cisco.misc.telecommuter_icon;' + c,
1619//			'Cisco_cisco_Telepresence_1000' NA
1620//			'Cisco_cisco_Telepresence_3000' NA
1621			'Cisco_cisco_Telepresence_3200' : s + 'cisco.misc.telepresence;' + c,
1622//			'Cisco_cisco_Telepresence_500' NA
1623			'Cisco_cisco_terminal' : s + 'cisco.computers_and_peripherals.terminal;' + c,
1624			'Cisco_cisco_token' : s + 'cisco.misc.token;verticalLabelPosition=bottom;verticalAlign=top;strokeColor=#036897',
1625			'Cisco_cisco_TP_MCU' : s + 'cisco.misc.tp_mcu;' + c,
1626			'Cisco_cisco_transpath' : s + 'cisco.misc.transpath;' + c,
1627			'Cisco_cisco_truck' : s + 'cisco.misc.truck;' + c,
1628			'Cisco_cisco_turret' : s + 'cisco.misc.turret;' + c,
1629			'Cisco_cisco_tv' : s + 'cisco.misc.tv;' + c,
1630			'Cisco_cisco_ubr910' : s + 'cisco.misc.ubr910;' + c,
1631			'Cisco_cisco_umg_series' : s + 'cisco.misc.umg_series;' + c,
1632			'Cisco_cisco_unity_server' : s + 'cisco.servers.unity_server;' + c,
1633			'Cisco_cisco_universal_gateway' : s + 'cisco.hubs_and_gateways.universal_gateway;' + c,
1634			'Cisco_cisco_university' : s + 'cisco.buildings.university;' + c,
1635			'Cisco_cisco_upc' : s + 'cisco.computers_and_peripherals.upc;' + c,
1636			'Cisco_cisco_vault' : s + 'cisco.misc.vault;' + c,
1637			'Cisco_cisco_video_camera' : s + 'cisco.computers_and_peripherals.video_camera;' + c,
1638			'Cisco_cisco_vip' : s + 'cisco.misc.vip;' + c,
1639			'Cisco_cisco_virtual_layer_switch' : s + 'cisco.switches.virtual_layer_switch;' + c,
1640			'Cisco_cisco_virtual_switch_controller__vsc3000_' : s + 'cisco.controllers_and_modules.virtual_switch_controller_(vsc3000);' + c,
1641			'Cisco_cisco_voice_atm_switch' : s + 'cisco.switches.voice_atm_switch;' + c,
1642			'Cisco_cisco_voice_commserver' : s + 'cisco.servers.voice_commserver;' + c,
1643			'Cisco_cisco_voice_router' : s + 'cisco.routers.voice_router;' + c,
1644			'Cisco_cisco_voice_switch' : s + 'cisco.switches.voice_switch;' + c,
1645			'Cisco_cisco_vpn_concentrator' : s + 'cisco.misc.vpn_concentrator;' + c,
1646			'Cisco_cisco_vpn_gateway' : s + 'cisco.hubs_and_gateways.vpn_gateway;' + c,
1647			'Cisco_cisco_VSS' : s + 'cisco.misc.vss;' + c,
1648			'Cisco_cisco_wae' : s + 'cisco.misc.wae;' + c,
1649			'Cisco_cisco_wavelength_router' : s + 'cisco.routers.wavelength_router;' + c,
1650			'Cisco_cisco_web_browser' : s + 'cisco.computers_and_peripherals.web_browser;' + c,
1651			'Cisco_cisco_web_cluster' : s + 'cisco.storage.web_cluster;' + c,
1652			'Cisco_cisco_wi_fi_tag' : s + 'cisco.wireless.wi-fi_tag;' + c,
1653			'Cisco_cisco_wireless_bridge' : s + 'cisco.wireless.wireless_bridge;' + c,
1654			'Cisco_cisco_wireless_location_appliance' : s + 'cisco.wireless.wireless_location_appliance;' + c,
1655			'Cisco_cisco_wireless' : s + 'cisco.wireless.wireless;' + c,
1656			'Cisco_cisco_wireless_transport' : s + 'cisco.wireless.wireless_transport;' + c,
1657			'Cisco_cisco_wism' : s + 'cisco.misc.wism;' + c,
1658			'Cisco_cisco_wlan_controller' : s + 'cisco.wireless.wlan_controller;' + c,
1659			'Cisco_cisco_workgroup_director' : s + 'cisco.directors.workgroup_director;' + c,
1660			'Cisco_cisco_workgroup_switch' : s + 'cisco.switches.workgroup_switch;' + c,
1661			'Cisco_cisco_workstation' : s + 'cisco.computers_and_peripherals.workstation;' + c,
1662			'Cisco_cisco_www_server' : s + 'cisco.servers.www_server;' + c,
1663//Computers and Monitors
1664			'NET_PC' : s + 'networks.pc;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1665			'NET_Virtual-PC' : s + 'networks.virtual_pc;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1666			'NET_Terminal' : s + 'networks.terminal;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1667			'NET_DataPipe' : s + 'networks.bus;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1668			'NET_SlateDevice' : s + 'networks.tablet;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1669			'NET_TabletDevice' : s + 'networks.tablet;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1670			'NET_Laptop' : s + 'networks.laptop;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1671			'NET_PDA' : s + 'networks.mobile;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1672			'NET_CRTMonitor' : s + 'networks.monitor;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1673			'NET_LCDMonitor' : s + 'networks.monitor;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1674//Detailed Network Diagrams
1675//			'NET_ABSwitch' NA
1676//			'NET_Repeater' NA
1677//			'NET_DiagnosticDevice' NA
1678//			'NET_CardReader' NA
1679//			'NET_PatchPanel' NA
1680			'NET_RadioTower' : s + 'networks.radio_tower;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1681//			'NET_BiometricReader' NA
1682			'NET_ExternalHardDrive' : s + 'networks.external_storage;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1683//			'NET_WebService' NA
1684//			'NET_FiberOptic' NA
1685			'NET_SatelliteDish' : s + 'networks.satellite_dish;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1686			'NET_Satellite' : s + 'networks.satellite;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1687//			'NET_VoIPPhone' NA
1688//			'NET_PBX' NA
1689//			'NET_MLPS' NA
1690//Basic Network Shapes
1691			'NET_WirelessAccessPoint' : s + 'networks.radio_tower;fillColor=#29AAE1;strokeColor=#29AAE1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1692			'NET_RingNetwork' : cs,
1693			'NET_Ethernet' : cs,
1694			'NET_Server' : s + 'networks.server;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1695//			'NET_ExternalMediaDrive' NA
1696			'NET_Mainframe' : s + 'networks.mainframe;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1697			'NET_Router' : s + 'networks.wireless_hub;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1698			'NET_Switch' : s + 'networks.switch;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1699			'NET_Firewall' : s + 'networks.firewall;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1700			'NET_User' : s + 'networks.user_male;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1701			'NET_CommLink' : s + 'networks.comm_link_edge;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1702			'NET_SuperComputer' : s + 'networks.supercomputer;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1703			'NET_VirtualServer' : s + 'networks.virtual_server;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1704			'NET_Printer' : s + 'networks.printer;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1705//			'NET_Plotter' NA
1706			'NET_Scanner' : s + 'networks.scanner;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1707			'NET_Copier' : s + 'networks.copier;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1708//			'NET_FaxMachine' NA
1709			'NET_MultiFunctionMachine' : s + 'networks.copier;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1710			'NET_Projector' : s + 'networks.video_projector;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1711			'NET_ProjectorScreen' : s + 'networks.video_projector_screen;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1712			'NET_Bridge' : s + 'networks.router;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1713			'NET_Hub' : s + 'networks.hub;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1714			'NET_Modem' : s + 'networks.modem;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1715			'NET_Telephone' : s + 'signs.tech.telephone_5;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1716			'NET_CellPhone' : s + 'networks.mobile;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1717			'NET_SmartPhone' : s + 'networks.mobile;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1718//			'NET_VideoPhone' NA
1719			'NET_Camera' : s + 'signs.tech.camera_2;fillColor=#29AAE1;strokeColor=#ffffff;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;',
1720//			'NET_VideoCamera' NA
1721//Server Racks
1722			'RackServerRack' : s + 'rackGeneral.container;container=1;collapsible=0;childLayout=rack;marginLeft=9;marginRight=9;marginTop=21;marginBottom=22;textColor=#000000;numDisp=off',
1723			'RackBlank' : s + 'rackGeneral.plate;strokeColor=#666666;labelPosition=left;align=right;spacingRight=15;fillColor=#e8e8e8',
1724			'RackRaidArray' : s + 'rack.cisco.cisco_carrier_packet_transport_50;labelPosition=left;align=right;spacingRight=15',
1725			'RackServer' : s + 'rack.oracle.sunfire_x4100;labelPosition=left;align=right;spacingRight=15',
1726			'RackEthernetSwitch' : s + 'rack.cisco.cisco_nexus_3016_switch;labelPosition=left;align=right;spacingRight=15',
1727			'RackPatchPanel' : s + 'rack.general.cat5e_rack_mount_patch_panel_24_ports;strokeColor=#666666;labelPosition=left;align=right;spacingRight=15',
1728			'RackRouter' : s + 'rack.cisco.cisco_asr_1001_router;labelPosition=left;align=right;spacingRight=15',
1729			'RackMonitor' : s + 'rack.ibm.ibm_1u_flat_panel_console_kit;labelPosition=left;align=right;spacingRight=15',
1730			'RackKeyboard' : s + 'rack.cisco.cisco_1905_serial_integrated_services_router;labelPosition=left;align=right;spacingRight=15',
1731			'RackPowerStrip' : s + 'rack.dell.power_strip;labelPosition=left;align=right;spacingRight=15',
1732			'RackPowerSupply' : s + 'rack.cisco.cisco_web_security_appliance_s170;labelPosition=left;align=right;spacingRight=15',
1733			'RackBridge' : s + 'rack.cisco.cisco_nexus_5548p_switch;labelPosition=left;align=right;spacingRight=15',
1734			'RackTapeDrive' : s + 'rack.ibm.ibm_1754_local_console_manager;labelPosition=left;align=right;spacingRight=15',
1735//Network
1736			'Image_network_server' : 'image;image=img/lib/clip_art/computers/Server_Tower_128x128.png;flipH=1',
1737			'Image_network_server_file' : 'image;image=img/lib/clip_art/computers/Server_128x128.png',
1738			'Image_network_server_net' : 'image;image=img/lib/clip_art/networking/Print_Server_128x128.png',
1739			'Image_network_server_net_large' : 'image;image=img/lib/clip_art/computers/Server_128x128.png',
1740			'Image_network_raid' : 'image;image=img/lib/clip_art/computers/Server_Tower_128x128.png;flipH=1',
1741			'Image_network_raid_large' : 'image;image=img/lib/clip_art/computers/Server_Tower_128x128.png;flipH=1',
1742			'Image_network_rack_server' : 'image;image=img/lib/clip_art/computers/Server_Rack_128x128.png',
1743			'Image_network_rack_tape' : 'image;image=img/lib/clip_art/computers/Server_Rack_Partial_128x128.png',
1744			'Image_network_printer_small' : 'image;image=img/lib/clip_art/computers/Printer_128x128.png;flipH=1',
1745			'Image_network_printer_large' : 'image;image=img/lib/clip_art/computers/Printer_128x128.png;flipH=1',
1746			'Image_network_printer_multipurpose' : 'image;image=img/lib/clip_art/computers/Printer_Commercial_128x128.png;flipH=1',
1747			'Image_network_copier_small' : 'image;image=img/lib/clip_art/computers/Printer_Commercial_128x128.png',
1748			'Image_network_copier_large' : 'image;image=img/lib/clip_art/computers/Printer_Commercial_128x128.png',
1749//			'Image_network_printer_largeformat' NA
1750			'Image_network_router' : 'image;image=img/lib/clip_art/networking/Router_128x128.png',
1751			'Image_network_router_wireless' : 'image;image=img/lib/clip_art/networking/Wireless_Router_128x128.png',
1752			'Image_network_ups' : 'image;image=img/lib/clip_art/networking/UPS_128x128.png',
1753//Electronics
1754//			'Image_electronics_speakers_2' NA
1755//			'Image_electronics_scanner_slide' NA
1756//			'Image_electronics_speakers_2_1' NA
1757//			'Image_electronics_speakers_5_1' NA
1758			'Image_electronics_lcd' : 'image;image=img/lib/clip_art/computers/Monitor_128x128.png',
1759			'Image_electronics_pda' : 'image;image=img/lib/clip_art/telecommunication/Palm_Treo_128x128.png',
1760			'Image_electronics_drive_cardreader' : 'image;image=img/lib/clip_art/finance/Credit_Card_128x128.png',
1761			'Image_electronics_camcorder' : 'image;image=img/lib/clip_art/networking/Ip_Camera_128x128.png',
1762//			'Image_electronics_headset' NA
1763//			'Image_electronics_calculator_simple' NA
1764//			'Image_electronics_scanner_flatbed' NA
1765			'Image_electronics_printer_photo' : 'image;image=img/lib/clip_art/computers/Printer_128x128.png;flipH=1',
1766//			'Image_electronics_scanner_photo' NA
1767//			'Image_electronics_projector' NA
1768			'Image_electronics_drive_firewire' : 'image;image=img/lib/clip_art/computers/Harddrive_128x128.png;flipH=1',
1769			'Image_electronics_drive_usb' : 'image;image=img/lib/clip_art/computers/Harddrive_128x128.png;flipH=1',
1770			'Image_electronics_modem_external' : 'image;image=img/lib/clip_art/networking/Modem_128x128.png;flipH=1',
1771//			'Image_electronics_tv_tuner_external' NA
1772//			'Image_electronics_mp3' NA
1773//			'Image_electronics_sound_box' NA
1774			'Image_electronics_lcd_wide' : 'image;image=img/lib/clip_art/computers/Monitor_128x128.png',
1775//Audio Equipment
1776//			'Image_audio_speakers_2' NA
1777//			'Image_audio_speakers_2_1' NA
1778//			'Image_audio_speakers_5_1' NA
1779//			'Image_audio_record_player' NA
1780//			'Image_audio_headset' NA
1781//Electrical
1782			'EE_Amplifier' : s + 'electrical.abstract.amplifier',
1783			'EE_OpAmp' : cs,
1784			'EE_ControlledAmp' : s + 'electrical.abstract.controlled_amplifier',
1785			'EE_Multiplexer' : 'shape=mxgraph.electrical.abstract.mux2',
1786			'EE_Demultiplexer' : 'shape=mxgraph.electrical.abstract.mux2;operation=demux',
1787			'EE_Capacitor1' : s + 'electrical.capacitors.capacitor_1',
1788			'EE_Capacitor2' : s + 'electrical.capacitors.capacitor_3',
1789			'EE_Diode' : s + 'electrical.diodes.diode',
1790			'EE_Resistor' : s + 'electrical.resistors.resistor_2',
1791			'EE_VarResistor' : s + 'electrical.resistors.variable_resistor_2',
1792			'EE_Potentiometer' : s + 'electrical.resistors.potentiometer_2',
1793			'EE_ProtGround' : s + 'electrical.signal_sources.protective_earth',
1794			'EE_SignalGround' : s + 'electrical.signal_sources.signal_ground',
1795			'EE_Transformer' : s + 'electrical.inductors.transformer_1',
1796			'EE_Inductor' : s + 'electrical.inductors.inductor_3',
1797			'EE_Variable Inductor' : s + 'electrical.inductors.variable_inductor',
1798			'EE_TwoWaySwitch' : s + 'electrical.electro-mechanical.2-way_switch',
1799			'EE_OnOffSwitch' : s + 'electrical.electro-mechanical.simple_switch',
1800			'EE_Loudspeaker' : s + 'electrical.electro-mechanical.loudspeaker',
1801			'EE_Motor' : s + 'electrical.electro-mechanical.motor_1',
1802			'EE_LED1' : s + 'electrical.opto_electronics.led_2',
1803			'EE_Lightbulb' : s + 'electrical.miscellaneous.light_bulb',
1804			'EE_IntegratedCircuit' : 'shape=mxgraph.electrical.logic_gates.dual_inline_ic',
1805//Power Sources
1806			'EE_AcSource' : s + 'electrical.signal_sources.ac_source;strokeWidth=1;verticalLabelPosition=middle;align=left;verticalAlign=top;labelPosition=right;',
1807			'EE_VoltageSource' : s + 'electrical.signal_sources.dc_source_3;verticalLabelPosition=middle;align=left;verticalAlign=top;labelPosition=right;',
1808			'EE_CurrentSource' : s + 'electrical.signal_sources.dc_source_2;direction=north;verticalLabelPosition=middle;align=left;verticalAlign=top;labelPosition=right;',
1809			'EE_ControlledCurrentSource' : s + 'electrical.signal_sources.dependent_source_2;direction=west;verticalLabelPosition=middle;align=left;verticalAlign=top;labelPosition=right;',
1810			'EE_ControlledVoltageSource' : s + 'electrical.signal_sources.dependent_source_3;verticalLabelPosition=middle;align=left;verticalAlign=top;labelPosition=right;',
1811			'EE_DcSource1' : s + 'electrical.miscellaneous.monocell_battery;flipH=1;verticalLabelPosition=bottom;verticalAlign=top',
1812			'EE_DcSource2' : s + 'electrical.miscellaneous.multicell_battery;flipH=1;verticalLabelPosition=bottom;verticalAlign=top',
1813			'EE_Vss' : s + 'electrical.signal_sources.vss2;verticalLabelPosition=top;verticalAlign=bottom;fontSize=24',
1814			'EE_Vdd' : s + 'electrical.signal_sources.vdd;verticalLabelPosition=bottom;verticalAlign=top',
1815//Transistors
1816
1817			'EE_BJT_NPN1' : s + 'electrical.transistors.pnp_transistor_1',
1818			'EE_BJT_NPN1_V2' : s + 'electrical.transistors.npn_transistor_1;',
1819			'EE_BJT_PNP1' : s + 'electrical.transistors.npn_transistor_1',
1820			'EE_BJT_PNP1_V2' : s + 'electrical.transistors.pnp_transistor_1',
1821			'EE_JFET_P' : s + 'electrical.transistors.p-channel_jfet_1;flipV=1',
1822			'EE_JFET_P_V2' : s + 'electrical.transistors.p-channel_jfet_1;flipV=1',
1823			'EE_JFET_N' : s + 'electrical.transistors.n-channel_jfet_1',
1824			'EE_JFET_N_V2' : s + 'electrical.transistors.n-channel_jfet_1',
1825			'EE_MOSFET_P1' : s + 'electrical.mosfets1.mosfet_ic_p;flipV=1',
1826			'EE_MOSFET_P1_V2' : s + 'electrical.mosfets1.mosfet_ic_p;flipV=1',
1827			'EE_MOSFET_P2' : s + 'electrical.mosfets1.mosfet_p_no_bulk',
1828			'EE_MOSFET_P2_V2' : s + 'electrical.mosfets1.mosfet_p_no_bulk',
1829			'EE_MOSFET_P3' : s + 'electrical.mosfets1.p-channel_mosfet_1;flipV=1',
1830			'EE_MOSFET_P3_V2' : s + 'electrical.mosfets1.p-channel_mosfet_1;flipV=1',
1831			'EE_MOSFET_N1' : s + 'electrical.mosfets1.mosfet_ic_n',
1832			'EE_MOSFET_N1_V2' : s + 'electrical.mosfets1.mosfet_ic_n',
1833			'EE_MOSFET_N2' : s + 'electrical.mosfets1.mosfet_n_no_bulk',
1834			'EE_MOSFET_N2_V2' : s + 'electrical.mosfets1.mosfet_n_no_bulk',
1835			'EE_MOSFET_N3' : s + 'electrical.mosfets1.n-channel_mosfet_1',
1836			'EE_MOSFET_N3_V2' : s + 'electrical.mosfets1.n-channel_mosfet_1',
1837//Relays
1838//			'EE_SPST' NA
1839//			'EE_SPDT' NA
1840//			'EE_DPST' NA
1841//			'EE_DPDT' NA
1842//Logic Gates
1843			'EE_AND' : s + 'electrical.logic_gates.and',
1844			'EE_OR' : s + 'electrical.logic_gates.or',
1845			'EE_Inverter' : s + 'electrical.logic_gates.inverter',
1846			'EE_NAND' : s + 'electrical.logic_gates.nand',
1847			'EE_NOR' : s + 'electrical.logic_gates.nor',
1848			'EE_XOR' : s + 'electrical.logic_gates.xor',
1849			'EE_NXOR' : s + 'electrical.logic_gates.xnor',
1850			'EE_DTypeRSFlipFlop' : s + 'electrical.logic_gates.d_type_rs_flip-flop',
1851			'EE_DTypeFlipFlop' : s + 'electrical.logic_gates.d_type_flip-flop',
1852			'EE_DTypeFlipFlopWithClear' : s + 'electrical.logic_gates.d_type_flip-flop_with_clear',
1853			'EE_RSLatch' : s + 'electrical.logic_gates.rs_latch',
1854			'EE_SyncRSLatch' : s + 'electrical.logic_gates.synchronous_rs_latch',
1855			'EE_TTypeFlipFlop' : s + 'electrical.logic_gates.t_type_flip-flop',
1856//Miscellaneous
1857			'EE_Plus' : s + 'ios7.misc.flagged',
1858			'EE_Negative' : 'shape=line',
1859			'EE_InverterContact' : 'ellipse',
1860			'EE_Voltmeter' : s + 'electrical.instruments.voltmeter',
1861			'EE_Ammeter' : s + 'electrical.instruments.ampermeter',
1862			'EE_SineWave' : s + 'electrical.waveforms.sine_wave',
1863			'EE_Sawtooth' : s + 'electrical.waveforms.sawtooth',
1864			'EE_SquareWave' : s + 'electrical.waveforms.square_wave',
1865//Messaging Systems
1866			'EIChannelBlock' : s + 'eip.messageChannel;verticalLabelPosition=bottom;verticalAlign=top',
1867			'EIMessageChannelBlock' : cs,
1868			'EIMessageBlock' : cs,
1869			'EIMessageRouterBlock' : s + 'eip.content_based_router;verticalLabelPosition=bottom;verticalAlign=top',
1870			'EIMessageTranslatorBlock' : s + 'eip.message_translator;verticalLabelPosition=bottom;verticalAlign=top',
1871			'EIMessageEndpointBlock' : cs,
1872//Messaging Channels
1873			'EIPublishSubscribeChannelBlock' : cs,
1874			'EIDatatypeChannelBlock' : cs,
1875			'EIInvalidMessageChannelBlock' : cs,
1876			'EIDeadLetterChannelBlock' : cs,
1877			'EIGuaranteedDeliveryBlock' : cs,
1878			'EIChannelAdapterBlock' : cs,
1879			'EIMessagingBridgeBlock' : s + 'eip.messaging_bridge;verticalLabelPosition=bottom;verticalAlign=top',
1880			'EIMessageBusBlock' : cs,
1881//Message Construction
1882			'EICommandMessageBlock' : cs,
1883			'EIDocumentMessageBlock' : cs,
1884			'EIEventMessageBlock' : cs,
1885			'EIRequestReplyBlock' : cs,
1886			'EIReturnAddressBlock' : cs,
1887			'EICorrelationIDBlock' : cs,
1888			'EIMessageSequenceBlock' : cs,
1889			'EIMessageExpirationBlock' : cs,
1890//Message Routing
1891			'EIContentBasedRouterBlock' : s + 'eip.content_based_router;verticalLabelPosition=bottom;verticalAlign=top',
1892			'EIMessageFilterBlock' : s + 'eip.message_filter;verticalLabelPosition=bottom;verticalAlign=top',
1893			'EIDynamicRouterBlock' : s + 'eip.dynamic_router;verticalLabelPosition=bottom;verticalAlign=top',
1894			'EIRecipientListBlock' : s + 'eip.recipient_list;verticalLabelPosition=bottom;verticalAlign=top',
1895			'EISplitterBlock' : s + 'eip.splitter;verticalLabelPosition=bottom;verticalAlign=top',
1896			'EIAggregatorBlock' : s + 'eip.aggregator;verticalLabelPosition=bottom;verticalAlign=top',
1897			'EIResequencerBlock' : s + 'eip.resequencer;verticalLabelPosition=bottom;verticalAlign=top',
1898			'EIComposedMessageBlock' : s + 'eip.composed_message_processor;verticalLabelPosition=bottom;verticalAlign=top',
1899			'EIRoutingSlipBlock' : s + 'eip.routing_slip;verticalLabelPosition=bottom;verticalAlign=top',
1900			'EIProcessManagerBlock' : s + 'eip.process_manager;verticalLabelPosition=bottom;verticalAlign=top',
1901			'EIMessageBrokerBlock' : cs,
1902//Message Transformation
1903			'EIEnvelopeWrapperBlock' : s + 'eip.envelope_wrapper;verticalLabelPosition=bottom;verticalAlign=top',
1904			'EIContentEnricherBlock' : s + 'eip.content_enricher;verticalLabelPosition=bottom;verticalAlign=top',
1905			'EIContentFilterBlock' : s + 'eip.content_filter;verticalLabelPosition=bottom;verticalAlign=top',
1906			'EIClaimCheckBlock' : s + 'eip.claim_check;verticalLabelPosition=bottom;verticalAlign=top',
1907			'EINormalizerBlock' : s + 'eip.normalizer;verticalLabelPosition=bottom;verticalAlign=top',
1908//Messaging Endpoints
1909			'EIMessagingGatewayBlock' : s + 'eip.messaging_gateway;verticalLabelPosition=bottom;verticalAlign=top',
1910			'EITransactionalClientBlock' : s + 'eip.transactional_client;verticalLabelPosition=bottom;verticalAlign=top',
1911			'EIPollingConsumerBlock' : s + 'eip.polling_consumer;verticalLabelPosition=bottom;verticalAlign=top',
1912			'EIEventDrivenConsumerBlock' : s + 'eip.event_driven_consumer;verticalLabelPosition=bottom;verticalAlign=top',
1913			'EICompetingConsumersBlock' : s + 'eip.competing_consumers;verticalLabelPosition=bottom;verticalAlign=top',
1914			'EIMessageDispatcherBlock' : s + 'eip.message_dispatcher;verticalLabelPosition=bottom;verticalAlign=top',
1915			'EISelectiveConsumerBlock' : s + 'eip.selective_consumer;verticalLabelPosition=bottom;verticalAlign=top',
1916			'EIDurableSubscriberBlock' : cs,
1917			'EIServiceActivatorBlock' : s + 'eip.service_activator;verticalLabelPosition=bottom;verticalAlign=top',
1918//System Management
1919			'EIControlBusBlock' : cs,
1920			'EIDetourBlock' : s + 'eip.detour;verticalLabelPosition=bottom;verticalAlign=top',
1921			'EIWireTapBlock' : s + 'eip.wire_tap;verticalLabelPosition=bottom;verticalAlign=top',
1922			'EIMessageHistoryBlock' : cs,
1923			'EIMessageStoreBlock' : s + 'eip.message_store;verticalLabelPosition=bottom;verticalAlign=top',
1924			'EISmartProxyBlock' : s + 'eip.smart_proxy;verticalLabelPosition=bottom;verticalAlign=top',
1925			'EITestMessageBlock' : s + 'eip.test_message;verticalLabelPosition=bottom;verticalAlign=top',
1926			'EIChannelPurgerBlock' : s + 'eip.channel_purger;verticalLabelPosition=bottom;verticalAlign=top',
1927//Google Cloud Platform
1928			'GCPIconComputeEngineBlock' : gcpIcon + 'compute_engine',
1929			'GCPIconAppEngineBlock' : gcpIcon + 'app_engine',
1930			'GCPIconContainerEngineBlock' : gcpIcon + 'container_engine',
1931			'GCPIconContainerRegistryBlock' : gcpIcon + 'container_registry',
1932			'GCPIconCloudFunctionsBlock' : gcpIcon + 'cloud_functions',
1933			'GCPIconCloudStorageBlock' : gcpIcon + 'cloud_storage',
1934			'GCPIconCloudSQLBlock' : gcpIcon + 'cloud_sql',
1935			'GCPIconCloudBigtableBlock' : gcpIcon + 'cloud_bigtable',
1936			'GCPIconCloudDatastoreBlock' : gcpIcon + 'cloud_datastore',
1937			'GCPIconPersistentDiskBlock' : gcpIcon + 'persistent_disk',
1938			'GCPIconCloudVirtualNetworkBlock' : ss + 'gcp.networking.cloud_virtual_network;verticalLabelPosition=bottom;verticalAlign=top',
1939			'GCPIconCloudLoadBalancingBlock' : gcpIcon + 'cloud_load_balancing',
1940			'GCPIconCloudCDNBlock' : gcpIcon + 'cloud_cdn',
1941			'GCPIconCloudInterconnectBlock' : gcpIcon + 'dedicated_interconnect',
1942			'GCPIconCloudInterconnectBlock2' : gcpIcon + 'dedicated_interconnect',
1943			'GCPIconCloudDNSBlock' : gcpIcon + 'cloud_dns',
1944			'GCPIconBigQueryBlock' : gcpIcon + 'bigquery',
1945			'GCPIconCloudDataflowBlock' : gcpIcon + 'cloud_dataflow',
1946			'GCPIconCloudDataprocBlock' : gcpIcon + 'cloud_dataproc',
1947			'GCPIconCloudDatalabBlock' : gcpIcon + 'cloud_datalab',
1948			'GCPIconCloudPubSubBlock' : gcpIcon + 'cloud_pubsub',
1949			'GCPIconGenomicsBlock' : gcpIcon + 'genomics',
1950			'GCPIconCloudMachineLearningServicesBlock' : gcpIcon + 'cloud_machine_learning',
1951			'GCPIconCloudMachineLearningServicesBlock2' : gcpIcon + 'cloud_machine_learning',
1952			'GCPIconVisionAPIBlock' : gcpIcon + 'cloud_vision_api',
1953			'GCPIconVisionAPIBlock2' : gcpIcon + 'cloud_vision_api',
1954			'GCPIconSpeechAPIBlock' : gcpIcon + 'cloud_speech_api',
1955			'GCPIconSpeechAPIBlock2' : gcpIcon + 'cloud_speech_api',
1956			'GCPIconNaturalLanguageAPIBlock' : gcpIcon + 'cloud_natural_language_api',
1957			'GCPIconNaturalLanguageAPIBlock2' : gcpIcon + 'cloud_natural_language_api',
1958			'GCPIconTranslateAPIBlock' : gcpIcon + 'cloud_translation_api',
1959			'GCPIconTranslateAPIBlock2' : gcpIcon + 'cloud_translation_api',
1960			'GCPIconStackdriverOverviewBlock' : gcpIcon + 'stackdriver',
1961			'GCPIconStackdriverOverviewBlock2' : gcpIcon + 'stackdriver',
1962			'GCPIconMonitoringBlock' : gcpIcon + 'cloud_deployment_manager',
1963			'GCPIconLoggingBlock' : gcpIcon + 'logging',
1964			'GCPIconErrorReportingBlock' : gcpIcon + 'error_reporting',
1965			'GCPIconTraceBlock' : gcpIcon + 'trace',
1966			'GCPIconDebuggerBlock' : gcpIcon + 'debugger',
1967			'GCPIconDeploymentManagerBlock' : gcpIcon + 'cloud_deployment_manager',
1968			'GCPIconDeploymentManagerBlock2' : gcpIcon + 'cloud_deployment_manager',
1969			'GCPIconCloudEndpointsBlock' : gcpIcon + 'cloud_endpoints',
1970			'GCPIconCloudToolsForPowerShellBlock' : gcpIcon + 'cloud_tools_for_powershell',
1971			'GCPIconCloudToolsForVisualStudioBlock' : gcpIcon + 'cloud_tools_for_powershell',
1972			'GCPIconCloudIAMBlock' : gcpIcon + 'cloud_iam',
1973			'GCPIconGCPLogoBlock' : gcpIcon + 'placeholder',
1974			'GCPIconGCPLogoBlock2' : gcpIcon + 'placeholder',
1975			'GCPIconBlankBlock' : gcpIcon + 'blue_hexagon',
1976			'GCPIconBlankBlock2' : gcpIcon + 'blue_hexagon',
1977			'GCPIconAPIAnalyticsBlock' : gcpIcon + 'api_analytics',
1978			'GCPIconApigeeAPIPlatformBlock' : gcpIcon + 'apigee_api_platform',
1979			'GCPIconApigeeSenseBlock' : gcpIcon + 'apigee_sense',
1980			'GCPIconAPIMonetizationBlock' : gcpIcon + 'api_monetization',
1981			'GCPIconCloudEndpointsBlock2' : gcpIcon + 'cloud_endpoints',
1982			'GCPIconDeveloperPortalBlock' : gcpIcon + 'developer_portal',
1983			'GCPIconBigQueryBlock2' : gcpIcon + 'bigquery',
1984			'GCPIconCloudComposerBlock' : gcpIcon + 'cloud_composer',
1985			'GCPIconCloudDataflowBlock2' : gcpIcon + 'cloud_dataflow',
1986			'GCPIconCloudDatalabBlock2' : gcpIcon + 'cloud_datalab',
1987			'GCPIconCloudDataprepBlock' : gcpIcon + 'cloud_dataprep',
1988			'GCPIconCloudDataprocBlock2' : gcpIcon + 'cloud_dataproc',
1989			'GCPIconCloudPubSubBlock2' : gcpIcon + 'cloud_pubsub',
1990			'GCPIconDataStudioBlock' : gcpIcon + 'data_studio',
1991			'GCPIconGenomicsBlock2' : gcpIcon + 'genomics',
1992			'GCPIconAdvancedSolutionsLabBlock' : gcpIcon + 'advanced_solutions_lab',
1993			'GCPIconCloudAutoMLBlock' : gcpIcon + 'cloud_automl',
1994			'GCPIconCloudNaturalLanguageAPIBlock' : gcpIcon + 'cloud_natural_language_api',
1995			'GCPIconCloudJobsAPIBlock' : gcpIcon + 'cloud_jobs_api',
1996			'GCPIconCloudTPUBlock' : gcpIcon + 'cloud_tpu',
1997			'GCPIconCloudMachineLearningBlock' : gcpIcon + 'cloud_machine_learning',
1998			'GCPIconCloudVisionAPIBlock' : gcpIcon + 'cloud_vision_api',
1999			'GCPIconCloudTranslationAPIBlock' : gcpIcon + 'cloud_translation_api',
2000			'GCPIconDialogflowEnterpriseEditionBlock' : gcpIcon + 'dialogflow_enterprise_edition',
2001			'GCPIconCloudSpeechAPIBlock' : gcpIcon + 'cloud_speech_api',
2002			'GCPIconCloudTexttoSpeechBlock' : gcpIcon + 'cloud_text_to_speech',
2003			'GCPIconCloudVideoIntelligenceAPIBlock' : gcpIcon + 'cloud_video_intelligence_api',
2004			'GCPIconAppEngineBlock2' : gcpIcon + 'app_engine',
2005			'GCPIconCloudToolsforVisualStudioBlock' : gcpIcon + 'cloud_tools_for_powershell',
2006			'GCPIconCloudDeploymentManagerBlock' : gcpIcon + 'cloud_deployment_manager',
2007			'GCPIconCloudFunctionsBlock2' : gcpIcon + 'cloud_functions',
2008			'GCPIconContainerBuilderBlock' : gcpIcon + 'container_builder',
2009			'GCPIconCloudSDKBlock' : gcpIcon + 'placeholder',
2010			'GCPIconCloudSourceRepositoriesBlock' : gcpIcon + 'placeholder',
2011			'GCPIconContainerRegistryBlock2' : gcpIcon + 'container_registry',
2012			'GCPIconCloudTestLabBlock' : gcpIcon + 'placeholder',
2013			'GCPIconGPUBlock' : gcpIcon + 'gpu',
2014			'GCPIconContainerEngineBlock2' : gcpIcon + 'container_engine',
2015			'GCPIconTransferApplianceBlock' : gcpIcon + 'transfer_appliance',
2016			'GCPIconCloudToolsforPowerShellBlock' : gcpIcon + 'cloud_tools_for_powershell',
2017			'GCPIconCloudToolsforIntelliJBlock' : gcpIcon + 'placeholder',
2018			'GCPIconCloudToolsforAndroidStudioBlock' : gcpIcon + 'placeholder',
2019			'GCPIconGooglePluginforEclipseBlock' : gcpIcon + 'placeholder',
2020			'GCPIconContainerOptimizedOSBlock' : gcpIcon + 'container_optimized_os',
2021			'GCPIconComputeEngineBlock2' : gcpIcon + 'compute_engine',
2022			'GCPIconBeyondCorpBlock' : gcpIcon + 'beyondcorp',
2023			'GCPIconCloudIAMBlock2' : gcpIcon + 'cloud_iam',
2024			'GCPIconCloudResourceManagerBlock' : gcpIcon + 'cloud_iam',
2025			'GCPIconCloudSecurityCommandCenterBlock' : gcpIcon + 'cloud_security_command_center',
2026			'GCPIconCloudSecurityScannerBlock' : gcpIcon + 'cloud_security_scanner',
2027			'GCPIconDataLossPreventionAPIBlock' : gcpIcon + 'data_loss_prevention_api',
2028			'GCPIconIdentityAwareProxyBlock' : gcpIcon + 'identity_aware_proxy',
2029			'GCPIconKeyManagementServiceBlock' : gcpIcon + 'key_management_service',
2030			'GCPIconSecurityKeyEnforcementBlock' : gcpIcon + 'security_key_enforcement',
2031			'GCPIconCloudIoTCoreBlock' : gcpIcon + 'cloud_iot_core',
2032			'GCPIconCloudAPIsBlock' : gcpIcon + 'cloud_apis',
2033			'GCPIconCloudBillingAPIBlock' : gcpIcon + 'placeholder',
2034			'GCPIconCloudConsoleBlock' : gcpIcon + 'placeholder',
2035			'GCPIconCloudDeploymentManagerBlock2' : gcpIcon + 'cloud_deployment_manager',
2036			'GCPIconCloudMobileAppBlock' : gcpIcon + 'placeholder',
2037			'GCPIconCloudShellBlock' : gcpIcon + 'placeholder',
2038			'GCPIconDebuggerBlock2' : gcpIcon + 'debugger',
2039			'GCPIconErrorReportingBlock2' : gcpIcon + 'error_reporting',
2040			'GCPIconLoggingBlock2' : gcpIcon + 'logging',
2041			'GCPIconMonitoringBlock2' : gcpIcon + 'cloud_deployment_manager',
2042			'GCPIconStackdriverBlock' : gcpIcon + 'stackdriver',
2043			'GCPIconTraceBlock2' : gcpIcon + 'trace',
2044			'GCPIconCloudArmorBlock' : gcpIcon + 'cloud_armor',
2045			'GCPIconCloudCDNBlock2' : gcpIcon + 'cloud_cdn',
2046			'GCPIconCloudDNSBlock2' : gcpIcon + 'cloud_dns',
2047			'GCPIconCloudExternalIPAddressesBlock' : gcpIcon + 'cloud_external_ip_addresses',
2048			'GCPIconCloudFirewallRulesBlock' : gcpIcon + 'cloud_firewall_rules',
2049			'GCPIconCloudLoadBalancingBlock2' : gcpIcon + 'cloud_load_balancing',
2050			'GCPIconCloudNetworkBlock' : gcpIcon + 'cloud_network',
2051			'GCPIconCloudRouterBlock' : gcpIcon + 'cloud_router',
2052			'GCPIconCloudRoutesBlock' : gcpIcon + 'cloud_routes',
2053			'GCPIconCloudVPNBlock' : gcpIcon + 'cloud_vpn',
2054			'GCPIconDedicatedInterconnectBlock' : gcpIcon + 'dedicated_interconnect',
2055			'GCPIconPartnerInterconnectBlock' : gcpIcon + 'partner_interconnect',
2056			'GCPIconPremiumNetworkTierBlock' : gcpIcon + 'premium_network_tier',
2057			'GCPIconStandardNetworkTierBlock' : gcpIcon + 'standard_network_tier',
2058			'GCPIconVirtualPrivateCloudBlock' : gcpIcon + 'virtual_private_cloud',
2059			'GCPIconCloudBigtableBlock2' : gcpIcon + 'cloud_bigtable',
2060			'GCPIconCloudDatastoreBlock2' : gcpIcon + 'cloud_datastore',
2061			'GCPIconCloudFilestoreBlock' : gcpIcon + 'cloud_filestore',
2062			'GCPIconCloudMemorystoreBlock' : gcpIcon + 'cloud_memorystore',
2063			'GCPIconCloudSpannerBlock' : gcpIcon + 'cloud_spanner',
2064			'GCPIconCloudSQLBlock2' : gcpIcon + 'cloud_sql',
2065			'GCPIconCloudStorageBlock2' : gcpIcon + 'cloud_storage',
2066			'GCPIconPersistentDiskBlock2' : gcpIcon + 'persistent_disk',
2067			'GCPIconGoogleCloudPlatformBlock' : gcpIcon + 'google_cloud_platform',
2068			'GCPIconBlueHexagonBlock' : gcpIcon + 'blue_hexagon',
2069			'GCPIconGenericBlock' : gcpIcon + 'placeholder',
2070			'GCPIconPredictionAPIBlock' : gcpIcon + 'prediction_api',
2071			//'GCPGoogleCloudPlatformLockupBlock' : gcpIcon + 'gcp_google_cloud_platform_lockup',
2072			'GCPAutoScalingModifier' : 'shape=mxgraph.gcp2.modifiers_autoscaling;fillColor=#757575;strokeColor=none;',
2073			'GCPCustomVirtualMachineModifier' : 'shape=mxgraph.gcp2.modifiers_custom_virtual_machine;fillColor=#757575;strokeColor=none;',
2074			'GCPHighCPUMachineModifier' : 'shape=mxgraph.gcp2.modifiers_high_cpu_machine;fillColor=#757575;strokeColor=none;',
2075			'GCPHighMemoryMachineModifier' : 'shape=mxgraph.gcp2.modifiers_high_memory_machine;fillColor=#757575;strokeColor=none;',
2076			'GCPPreemptableVSModifier' : 'shape=mxgraph.gcp2.modifiers_preemptable_vm;fillColor=#757575;strokeColor=none;',
2077			'GCPSharedCoreMachineF1Modifier' : 'shape=mxgraph.gcp2.modifiers_shared_core_machine_f1;fillColor=#757575;strokeColor=none;',
2078			'GCPSharedCoreMachineG1Modifier' : 'shape=mxgraph.gcp2.modifiers_shared_core_machine_g1;fillColor=#757575;strokeColor=none;',
2079			'GCPStandardMachineModifier' : 'shape=mxgraph.gcp2.modifiers_standard_machine;fillColor=#757575;strokeColor=none;',
2080			'GCPStorageModifier' : 'shape=mxgraph.gcp2.modifiers_storage;fillColor=#757575;strokeColor=none;',
2081			'GCPAppEngineProductCard' : cs,
2082			'GCPCloudDataflowProductCard' : cs,
2083			'GCPCloudDataprocProductCard' : cs,
2084			'GCPComputeEngineProductCard' : cs,
2085			'GCPContainerEngineProductCard' : cs,
2086
2087//Kubernetes Icons
2088			'CronjobLabeledKub19' : kupIcon + 'cronjob',
2089			'CronjobKub19' : kupIcon + 'cronjob',
2090			'DeployLabeledKub19' : kupIcon + 'deploy',
2091			'DeployKub19' : kupIcon + 'deploy',
2092			'DsLabeledKub19' : kupIcon + 'ds',
2093			'DsKub19' : kupIcon + 'ds',
2094			'JobLabeledKub19' : kupIcon + 'job',
2095			'JobKub19' : kupIcon + 'job',
2096			'PodLabeledKub19' : kupIcon + 'pod',
2097			'PodKub19' : kupIcon + 'pod',
2098			'RsLabeledKub19' : kupIcon + 'rs',
2099			'RsKub19' : kupIcon + 'rs',
2100			'StsLabeledKub19' : kupIcon + 'sts',
2101			'StsKub19' : kupIcon + 'sts',
2102			'PvLabeledKub19' : kupIcon + 'pv',
2103			'PvKub19' : kupIcon + 'pv',
2104			'PvcLabeledKub19' : kupIcon + 'pvc',
2105			'PvcKub19' : kupIcon + 'pvc',
2106			'ScLabeledKub19' : kupIcon + 'sc',
2107			'ScKub19' : kupIcon + 'sc',
2108			'VolLabeledKub19' : kupIcon + 'vol',
2109			'VolKub19' : kupIcon + 'vol',
2110			'EpLabeledKub19' : kupIcon + 'ep',
2111			'EpKub19' : kupIcon + 'ep',
2112			'IngLabeledKub19' : kupIcon + 'ing',
2113			'IngKub19' : kupIcon + 'ing',
2114			'NetpolLabeledKub19' : kupIcon + 'netpol',
2115			'NetpolKub19' : kupIcon + 'netpol',
2116			'SvcLabeledKub19' : kupIcon + 'svc',
2117			'SvcKub19' : kupIcon + 'svc',
2118			'CrdLabeledKub19' : kupIcon + 'crd',
2119			'CrdKub19' : kupIcon + 'crd',
2120			'CroleLabeledKub19' : kupIcon + 'c_role',
2121			'CroleKub19' : kupIcon + 'c_role',
2122			'GroupLabeledKub19' : kupIcon + 'group',
2123			'GroupKub19' : kupIcon + 'group',
2124			'RbLabeledKub19' : kupIcon + 'rb',
2125			'RbKub19' : kupIcon + 'rb',
2126			'RoleLabeledKub19' : kupIcon + 'role',
2127			'RoleKub19' : kupIcon + 'role',
2128			'SaLabeledKub19' : kupIcon + 'sa',
2129			'SaKub19' : kupIcon + 'sa',
2130			'UserLabeledKub19' : kupIcon + 'user',
2131			'UserKub19' : kupIcon + 'user',
2132			'CmResourceLabeledKub19' : kupIcon + 'cm',
2133			'CmKub19' : kupIcon + 'cm',
2134			'SecretLabeledKub19' : kupIcon + 'secret',
2135			'SecretKub19' : kupIcon + 'secret',
2136			'HpaLabeledKub19' : kupIcon + 'hpa',
2137			'HpaKub19' : kupIcon + 'hpa',
2138			'LimitsLabeledKub19' : kupIcon + 'limits',
2139			'LimitsKub19' : kupIcon + 'limits',
2140			'QuotaLabeledKub19' : kupIcon + 'quota',
2141			'QuotaKub19' : kupIcon + 'quota',
2142			'CrbLabeledKub19' : kupIcon + 'crb',
2143			'CrbKub19' : kupIcon + 'crb',
2144			'LogoKub19' : 'aspect=fixed;html=1;align=center;image;image=img/lib/mscae/Kubernetes.svg',
2145			'NsLabeledKub19' : kupIcon + 'ns',
2146			'NsKub19' : kupIcon + 'ns',
2147			'PspLabeledKub19' : kupIcon + 'psp',
2148			'PspKub19' : kupIcon + 'psp',
2149			'EtcdLabeledKub19' : kupIcon + 'etcd',
2150			'EtcdKub19' : kupIcon + 'etcd',
2151			'MasterLabeledKub19' : kupIcon + 'master',
2152			'MasterKub19' : kupIcon + 'master',
2153			'NodeLabeledKub19' : kupIcon + 'node',
2154			'NodeKub19' : kupIcon + 'node',
2155			'ApiLabeledKub19' : kupIcon + 'api',
2156			'CcmLabeledKub19' : kupIcon + 'c_c_m',
2157			'CmLabeledKub19' : kupIcon + 'c_m',
2158			'KproxyLabeledKub19' : kupIcon + 'node',
2159			'KubeletLabeledKub19' : kupIcon + 'kubelet',
2160			'SchedLabeledKub19' : kupIcon + 'sched',
2161//Equation
2162			'Equation' : cs,
2163//Walls
2164			'fpWall' : cs,
2165//Rooms
2166//Doors & Windows
2167			'fpWindow' : s + 'floorplan.window;strokeWidth=3',
2168			'fpOpening' : 'shape=rect',
2169			'fpDoor' : cs,
2170			'fpDoubleDoor' : cs,
2171//Stairs
2172			'fpStairs' : s + 'floorplan.stairs;direction=north',
2173			'fpStairsDirectional' : s + 'floorplan.stairs;direction=north;verticalAlign=bottom',
2174//			'fpStairsCurved' NA
2175//			'fpStairsCurvedWide' NA
2176//Desks
2177//			'fpDeskEndSegment' NA
2178			'fpDeskLongSegment' : '',
2179			'fpDeskShortSegment' : '',
2180//			'fpDeskSmallCornerSegment' NA
2181			'fpDeskLargeCornerSegment' : s + 'floorplan.desk_corner',
2182//			'fpDeskMediumCornerSegment' NA
2183//			'fpDeskRoundedLSegment' NA
2184//			'fpDeskRoundedCornerSegment' NA
2185//Cubicle walls
2186			'fpCubiclePanel' : s + 'floorplan.wall;wallThickness=3',
2187			'fpCubicleWorkstation' : s + 'floorplan.wallU;wallThickness=3',
2188			'fpCubicleCorner5x5' : s + 'floorplan.wallCorner;wallThickness=3',
2189			'fpCubicleCorner6x6' : s + 'floorplan.wallCorner;wallThickness=3',
2190			'fpCubicleCorner8x8' : s + 'floorplan.wallCorner;wallThickness=3',
2191			'fpCubicleCorner8x6' : s + 'floorplan.wallCorner;wallThickness=3',
2192			'fpCubicleCornerOpen6x4' : s + 'floorplan.wallCorner;wallThickness=3',
2193			'fpCubicleDouble14x8' : s + 'floorplan.wallU;wallThickness=3',
2194			'fpCubicleEnclosed11x9' : s + 'floorplan.wallU;wallThickness=3',
2195//Tables & Chairs
2196			'fpTableConferenceOval' : 'ellipse',
2197			'fpTableConferenceBoat' : '',
2198			'fpTableConferenceRectangle' : '',
2199			'fpTableDiningRound' : 'ellipse',
2200			'fpTableDiningSquare' : '',
2201			'fpChairOffice' : s + 'floorplan.office_chair',
2202			'fpChairExecutive' : s + 'floorplan.office_chair',
2203			'fpChairLobby' : s + 'floorplan.office_chair',
2204			'fpChairDining' : s + 'floorplan.chair',
2205			'fpChairBarstool' : 'ellipse',
2206//Cubicles - Prebuilt
2207//Tables - Prebuilt
2208//Cabinets - we don't have corresponding stencils, just rounded rectangles
2209			'fpCabinetBasic' : '',
2210//			'fpCabinetCornerLarge' NA
2211			'fpCabinetDoubleWide' : '',
2212			'fpCabinetDoubleWithShelves' : '',
2213			'fpCabinetShelvesBasic' : '',
2214			'fpCabinetShelvesDouble' : '',
2215			'fpCabinetBasicWithShelves' : '',
2216			'fpCabinetsAboveDeskShelves' : '',
2217//Restroom
2218			'fpRestroomToiletPrivate' : s + 'floorplan.toilet',
2219			'fpRestroomToiletPublic' : s + 'floorplan.toilet',
2220//			'fpRestroomBidet' NA
2221			'fpRestroomLights' : cs,
2222			'fpRestroomSinks' : cs,
2223//			'fpRestroomGrabBar' NA
2224			'fpRestroomBathtub' : s + 'floorplan.bathtub;direction=south',
2225			'fpRestroomShower' : s + 'floorplan.shower;flipH=1',
2226//			'fpRestroomCornerSink' NA
2227			'fpRestroomPedastalSink' : s + 'floorplan.sink_1',
2228			'fpRestroomCountertop' : '',
2229			'fpRestroomMirror' : 'shape=line;strokeWidth=3',
2230//			'fpDresserOrnateMirror' NA
2231//			'fpRestroomToiletPaper' NA
2232			'fpRestroomStalls' : cs,
2233//Beds
2234			'fpBedDouble' : s + 'floorplan.bed_double',
2235			'fpBedSingle' : s + 'floorplan.bed_single',
2236			'fpBedQueen' : s + 'floorplan.bed_double',
2237			'fpBedKing' : s + 'floorplan.bed_double',
2238			'fpBedDoubleWithTrundle' : s + 'floorplan.bed_double',
2239			'fpBedBunk' : s + 'floorplan.bed_double',
2240//			'fpBedBunkL' NA
2241//			'fpBedCrib' NA
2242			'fpBedBassinet' : s + 'pid.fittings.compensator',
2243//Dressers
2244//			'fpDresserChest' NA
2245//			'fpDresserMirrorDresser' NA
2246//			'fpClosetRod' NA
2247//			'fpDresserOrnateMirror' NA
2248//Appliances
2249			'fpApplianceWasher' : '',
2250			'fpApplianceDryer' : '',
2251			'fpApplianceWaterHeater' : 'ellipse',
2252//			'fpApplianceRefrigerator' NA
2253			'fpApplianceStoveOven' : s + 'floorplan.range_1',
2254			'fpStoveOvenSixBurner' : s + 'floorplan.range_2',
2255			'fpApplianceDishwasher' : '',
2256//Kitchen
2257			'fpKitchenSink' : s + 'floorplan.sink_2',
2258			'fpKitchenDoubleSink' : s + 'floorplan.sink_double',
2259			'fpKitchenCountertop' : '',
2260			'fpKitchenCountertopCorner' : s + 'floorplan.desk_corner',
2261//Couches
2262			'fpCouchLoveSeat' : s + 'floorplan.couch',
2263			'fpCouchSofa' : s + 'floorplan.couch',
2264//			'fpCouchSectional' NA
2265			'fpCouchOttoman' : '',
2266//			'fpCouchPillow' NA
2267//Technology
2268			'fpMiscDesktopComputer' : s + 'floorplan.workstation',
2269			'fpMiscLaptopComputer' : s + 'floorplan.laptop',
2270			'fpComputerMonitor' : s + 'floorplan.flat_tv',
2271			'fpCRTTelevision' : s + 'floorplan.flat_tv',
2272//			'fpMiscProjector' NA
2273//			'fpMiscProjectorScreen' NA
2274//Misc Floorplan
2275			'fpMiscIndoorPlant' : s + 'floorplan.plant',
2276//			'fpMiscPodium' NA
2277			'fpPiano' : s + 'floorplan.piano',
2278//			'fpPianoBench' : 'absoluteArcSize=1;arcSize=' + arcSize + ';rounded=1',
2279//Equipment
2280			'PEAxialCompressor' : s + 'pid.compressors.centrifugal_compressor_-_turbine_driven;verticalLabelPosition=bottom;verticalAlign=top',
2281			'PECentrifugalCompressor' : s + 'pid.compressors.centrifugal_compressor;verticalLabelPosition=bottom;verticalAlign=top',
2282			'PECentrifugalCompressor2' : s + 'pid.compressors.centrifugal_compressor_-_turbine_driven;verticalLabelPosition=bottom;verticalAlign=top',
2283//			'PECentrifugalCompressor3' NA
2284			'PEReciprocationCompressor' : s + 'pid.compressors.reciprocating_compressor;verticalLabelPosition=bottom;verticalAlign=top',
2285			'PERotaryCompressorBlock' : s + 'pid.compressors.rotary_compressor;verticalLabelPosition=bottom;verticalAlign=top',
2286			'PERotaryCompressor2Block' : s + 'pid.compressors.compressor_and_silencers;verticalLabelPosition=bottom;verticalAlign=top',
2287			'PEConveyorBlock' : s + 'pid2misc.conveyor;verticalLabelPosition=bottom;verticalAlign=top',
2288//			'PEOverheadConveyorBlock' NA
2289//			'PEScraperConveyorBlock' NA
2290//			'PEScrewConveyorBlock' NA
2291//			'PEPositiveDisplacementBlock' NA
2292//			'PEPositiveDisplacement2' NA
2293			'PEElevator1Block' : s + 'pid.misc.bucket_elevator;flipH=1;verticalLabelPosition=bottom;verticalAlign=top',
2294//			'PEElevator2Block' NA
2295//			'PEHoistBlock' NA
2296//			'PESkipHoistBlock' NA
2297//			'PEMotorBlock' NA
2298//			'PEDieselMotorBlock' NA
2299//			'PEElectricMotorBlock' NA
2300//			'PELiquidRingVacuumBlock' NA
2301//			'PETurbineDriverBlock' NA
2302//			'PEDoubleFlowTurbineBlock' NA
2303			'PEAgitatorMixerBlock' : s + 'pid.agitators.agitator_(propeller);verticalLabelPosition=bottom;verticalAlign=top',
2304			'PEDrumBlock' : s + 'pid.vessels.drum_or_condenser;verticalLabelPosition=bottom;verticalAlign=top',
2305			'PETankEquipmentBlock' : s + 'pid.vessels.tank;verticalLabelPosition=bottom;verticalAlign=top',
2306//			'PECentrifugalBlower' NA
2307//			'PEAlkylationBlock' NA
2308//			'PEBoomLoaderBlock' NA
2309//			'PEFluidCatalyticCrackingBlock' NA
2310//			'PEFluidCookingBlock' NA
2311//			'PEFluidizedReactorBlock' NA
2312//			'PETubularBlock' NA
2313//			'PEReformerBlock' NA
2314			'PEMixingReactorBlock' : s + 'pid.vessels.mixing_reactor;verticalLabelPosition=bottom;verticalAlign=top',
2315//			'PEHydrodesulferizationBlock' NA
2316//			'PEHydrocrackingBlock' NA
2317			'PEPlateTowerBlock' : s + 'pid2misc.column;columnType=baffle;verticalLabelPosition=bottom;verticalAlign=top',
2318			'PEPackedTowerBlock' : s + 'pid2misc.column;columnType=fixed;verticalLabelPosition=bottom;verticalAlign=top',
2319//			'PEAutomaticStokerBlock' NA
2320//			'PEOilBurnerBlock' NA
2321//			'PECounterflowForcedDraftBlock' NA
2322//			'PECounterflowNaturalDraftBlock' NA
2323//			'PECrossflowInductedBlock' NA
2324			'PEFurnaceBlock' : s + 'pid.vessels.furnace;verticalLabelPosition=bottom;verticalAlign=top',
2325//			'PEChimneyTowerBlock' NA
2326//Piping
2327			'PEOneToMany' : cs, //TODO
2328			'PEMultilines' : cs, //TODO
2329			'PEMidArrow' : 'shape=triangle;anchorPointDirection=0',
2330			'PEButtWeld' : s + 'sysml.x',
2331			'PETopToTop' : s + 'pid.vessels.container,_tank,_cistern',
2332//			'PESonicSignal' NA
2333			'PENuclear' : s + 'electrical.waveforms.sine_wave',
2334//			'PEPneumatic' NA
2335//			'PEHydraulicSignalLine' NA
2336			'PEMechanicalLink' : 'ellipse',
2337			'PESolderedSolvent' : 'ellipse',
2338			'PEDoubleContainment' : 'shape=hexagon;perimeter=hexagonPerimeter2',
2339			'PEFlange' : s + 'pid.piping.double_flange',
2340			'PEFlange2' : s + 'pid.piping.flange_in;flipH=1',
2341			'PEEndCap' : s + 'pid.piping.cap',
2342			'PEEndCap2' : s + 'pid.vessels.container,_tank,_cistern;direction=north',
2343			'PEBreather' : s + 'pid.piping.breather',
2344			'PEElectronicallyInsulated' : s + 'pid.piping.double_flange',
2345			'PEReducer' : s + 'pid.piping.concentric_reducer',
2346			'PEInlineMixer' : s + 'pid.piping.in-line_mixer',
2347//			'PESeparator' NA
2348//			'PEBurstingDisc' NA
2349			'PEFlameArrester' : s + 'pid.piping.flame_arrestor',
2350//			'PEFlameArrester2' NA
2351			'PEDetonationArrester' : s + 'pid.piping.detonation_arrestor',
2352//			'PEDrainSilencer' NA
2353			'PETriangleSeparator' : 'shape=triangle;direction=west;anchorPointDirection=0',
2354//			'PETriangleSeparator2' NA
2355			'PETundish' : s + 'ios7.misc.left',
2356			'PEOpenVent' : s + 'pid.vessels.vent_(bent)',
2357//			'PESiphonDrain' NA
2358			'PERemovableSpool' : s + 'pid.piping.removable_spool',
2359			'PEYTypeStrainer' : s + 'pid.piping.y-type_strainer',
2360			'PEDiverterValve' : s + 'pid.piping.diverter_valve',
2361			'PEPulsationDampener' : s + 'pid.piping.pulsation_dampener',
2362			'PEDuplexStrainer' : s + 'pid.piping.duplex_strainer',
2363			'PEBasketStrainer' : s + 'pid.piping.basket_strainer',
2364			'PEVentSilencer' : s + 'pid.piping.vent_silencer',
2365			'PEInlineSilencer' : s + 'pid.piping.in-line_silencer',
2366			'PESteamTrap' : s + 'pid.piping.steam_trap',
2367			'PEDesuperheater' : s + 'pid.piping.desuper_heater',
2368			'PEEjectorOrEductor' : s + 'pid.fittings.injector',
2369			'PEExhaustHead' : s + 'pid.piping.exhaust_head',
2370			'PERotaryValve' : s + 'pid.piping.rotary_valve',
2371			'PEExpansionJoint' : s + 'pid.piping.expansion_joint',
2372//Vessels
2373			'PEVesselBlock' : cs,
2374			'PEOpenTankBlock' : s + 'pid.vessels.container,_tank,_cistern;verticalLabelPosition=bottom;verticalAlign=top', //not all versions supported
2375			'PEOpenTopTank' : s + 'pid.vessels.container,_tank,_cistern;verticalLabelPosition=bottom;verticalAlign=top',
2376			'PEClosedTankBlock' : cs,
2377			'PEStorageSphereBlock' : s + 'pid.vessels.storage_sphere;verticalLabelPosition=bottom;verticalAlign=top',
2378			'PEColumnBlock' : cs,
2379			'PEBagBlock' : s + 'pid.vessels.bag;verticalLabelPosition=bottom;verticalAlign=top',
2380			'PEGasCylinderBlock' : s + 'pid.vessels.gas_bottle;verticalLabelPosition=bottom;verticalAlign=top',
2381			'PEGasHolderBlock' : s + 'pid.vessels.gas_holder;verticalLabelPosition=bottom;verticalAlign=top',
2382			'PEClarifierBlock' : s + 'pid.vessels.bunker_(conical_bottom);verticalLabelPosition=bottom;verticalAlign=top',
2383			'PETankBlock' : s + 'pid.vessels.tank_(conical_roof);verticalLabelPosition=bottom;verticalAlign=top',
2384			'PETrayColumnBlock' : s + 'pid2misc.column;columnType=tray;verticalLabelPosition=bottom;verticalAlign=top',
2385			'PEReactionVesselBlock' : s + 'pid.vessels.reactor;verticalLabelPosition=bottom;verticalAlign=top',
2386			'PEBin' : s + 'pid.vessels.tank_(conical_bottom)',
2387			'PEDomeRoofTank' : s + 'pid.vessels.tank_(dished_roof)',
2388			'PEConeRoofTank' : s + 'pid.vessels.tank_(conical_roof)',
2389//			'PEInternalFloatingRoof' NA
2390//			'PEDoubleWallTank' NA
2391//			'PEOnionTank' NA
2392//Heat Exchangers
2393			'PEBoilerBlock' : s + 'pid.misc.boiler_(dome);verticalLabelPosition=bottom;verticalAlign=top',
2394			'PEEquipmentBoilerBlock' : s + 'pid.misc.boiler_(dome);verticalLabelPosition=bottom;verticalAlign=top',
2395			'PEReboilerBlock' : s + 'pid.heat_exchangers.reboiler;verticalLabelPosition=bottom;verticalAlign=top',
2396			'PECondenserBlock' : s + 'pid.heat_exchangers.heat_exchanger_(straight_tubes);verticalLabelPosition=bottom;verticalAlign=top',
2397			'PEEquipmentCondenserBlock' : s + 'pid.heat_exchangers.condenser;verticalLabelPosition=bottom;verticalAlign=top',
2398//			'PEEvaporativeCondenserBlock' NA
2399			'PECoolingTowerBlock' : s + 'pid.misc.cooling_tower;verticalLabelPosition=bottom;verticalAlign=top',
2400			'PEHeatExchangerBlock' : s + 'pid.heat_exchangers.shell_and_tube_heat_exchanger_1;verticalLabelPosition=bottom;verticalAlign=top',
2401//			'PEAirCooledExchangerBlock' NA
2402			'PEHairpinExchangerBlock' : s + 'pid.heat_exchangers.hairpin_exchanger;verticalLabelPosition=bottom;verticalAlign=top',
2403			'PEPlateAndFrameHeatExchangerBlock' : s + 'pid.heat_exchangers.plate_and_frame_heat_exchanger;verticalLabelPosition=bottom;verticalAlign=top',
2404			'PESpiralHeatExchanger' : s + 'pid.heat_exchangers.spiral_heat_exchanger;verticalLabelPosition=bottom;verticalAlign=top',
2405			'PEUTubeHeatExchangerBlock' : s + 'pid.heat_exchangers.u-tube_heat_exchanger;verticalLabelPosition=bottom;verticalAlign=top',
2406			'PEDoublePipeHeatBlock' : s + 'pid.heat_exchangers.double_pipe_heat_exchanger;verticalLabelPosition=bottom;verticalAlign=top',
2407			'PEShellAndTubeHeat1Block' : s + 'pid.heat_exchangers.shell_and_tube_heat_exchanger_1;verticalLabelPosition=bottom;verticalAlign=top',
2408			'PEShellAndTubeHeat2Block' : s + 'pid.heat_exchangers.shell_and_tube_heat_exchanger_2;verticalLabelPosition=bottom;verticalAlign=top',
2409			'PEShellAndTubeHeat3Block' : s + 'pid.heat_exchangers.shell_and_tube_heat_exchanger_1;direction=north;verticalLabelPosition=bottom;verticalAlign=top',
2410			'PESinglePassHeatBlock' : s + 'pid.heat_exchangers.single_pass_heat_exchanger;verticalLabelPosition=bottom;verticalAlign=top',
2411			'PEHeaterBlock' : s + 'pid.heat_exchangers.heater;verticalLabelPosition=bottom;verticalAlign=top',
2412//Pumps
2413			'PEEjectorInjectorBlock' : s + 'pid.fittings.injector;verticalLabelPosition=bottom;verticalAlign=top',
2414			'PECompressorTurbineBlock' : cs,
2415			'PEMotorDrivenTurbineBlock' : cs,
2416//			'PETripleFanBlades2Block' NA
2417//			'PEFanBlades2Block' : NA
2418			'PECentrifugalPumpBlock' : s + 'pid.pumps.gas_blower;flipH=1;verticalLabelPosition=bottom;verticalAlign=top',
2419			'PECentrifugalPump' : s + 'pid.pumps.centrifugal_pump_1;verticalLabelPosition=bottom;verticalAlign=top',
2420			'PECentrifugalPump2' : s + 'pid.pumps.centrifugal_pump_2;verticalLabelPosition=bottom;verticalAlign=top',
2421			'PECentrifugalPump3' : s + 'pid.pumps.centrifugal_pump_1;flipH=1;verticalLabelPosition=bottom;verticalAlign=top',
2422			'PEGearPumpBlock' : s + 'pid.pumps.gear_pump;verticalLabelPosition=bottom;verticalAlign=top',
2423			'PEHorizontalPump' : s + 'pid.pumps.horizontal_pump;verticalLabelPosition=bottom;verticalAlign=top',
2424			'PEProgressiveCavityPump' : s + 'pid.pumps.cavity_pump;flipH=1;flipV=1;verticalLabelPosition=bottom;verticalAlign=top',
2425			'PEScrewPump' : s + 'pid.pumps.screw_pump;verticalLabelPosition=bottom;verticalAlign=top',
2426			'PEScrewPump2' : s + 'pid.pumps.screw_pump_2;flipH=1;verticalLabelPosition=bottom;verticalAlign=top',
2427			'PESumpPump' : s + 'pid.pumps.sump_pump;verticalLabelPosition=bottom;verticalAlign=top',
2428			'PEVacuumPump' : s + 'pid.pumps.vacuum_pump;verticalLabelPosition=bottom;verticalAlign=top',
2429			'PEVerticalPump' : s + 'pid.pumps.vertical_pump;verticalLabelPosition=bottom;verticalAlign=top',
2430			'PEVerticalPump2' : s + 'pid.pumps.vertical_pump;verticalLabelPosition=bottom;verticalAlign=top',
2431//Instruments
2432			'PEIndicatorBlock' : cs,
2433			'PEIndicator2Block' : cs,
2434			'PEIndicator3Block' : s + 'pid2inst.discInst;mounting=field',
2435			'PEIndicator4Block' : s + 'pid2inst.indicator;mounting=field;indType=inst',
2436//			'PEIndicator5Block' NA
2437			'PESharedIndicatorBlock' : cs,
2438			'PESharedIndicator2Block' : cs,
2439			'PEComputerIndicatorBlock' : cs,
2440			'PEProgrammableIndicatorBlock' : cs,
2441//Valves
2442			'PEGateValveBlock' : cs, //TODO not all variants covered
2443			'PEGlobeValveBlock' : cs,
2444			'PEControlValveBlock' : s + 'pid2valves.valve;valveType=gate;actuator=diaph;verticalLabelPosition=bottom;verticalAlign=top',  //TODO not all variants covered
2445			'PENeedleValveBlock' : s + 'pid2valves.valve;valveType=needle;verticalLabelPosition=bottom;verticalAlign=top',
2446//			'PEButterflyValveBlock' NA
2447			'PEButterflyValve2Block' : s + 'pid2valves.valve;flipH=1;valveType=butterfly;verticalLabelPosition=bottom;verticalAlign=top',
2448			'PEBallValveBlock' : s + 'pid2valves.valve;valveType=ball;verticalLabelPosition=bottom;verticalAlign=top',
2449			'PEDiaphragmBlock' : s + 'pid2valves.valve;valveType=ball;verticalLabelPosition=bottom;verticalAlign=top',
2450			'PEPlugValveBlock' : s + 'pid2valves.valve;valveType=ball;verticalLabelPosition=bottom;verticalAlign=top',
2451			'PECheckValveBlock' : s + 'pid2valves.valve;valveType=check;verticalLabelPosition=bottom;verticalAlign=top',
2452			'PECheckValve2Block' : s + 'pid2valves.valve;valveType=check;verticalLabelPosition=bottom;verticalAlign=top',
2453			'PEAngleValveBlock' : cs,
2454			'PEAngleGlobeValveBlock' : cs,
2455			'PEPoweredValveBlock' : cs,
2456			'PEFloatOperatedValveBlock' : s + 'pid2valves.valve;valveType=gate;actuator=singActing;verticalLabelPosition=bottom;verticalAlign=top',
2457			'PENeedleValve2Block' : s + 'pid2valves.valve;valveType=needle;verticalLabelPosition=bottom;verticalAlign=top',
2458			'PEThreeWayValveBlock' : s + 'pid2valves.valve;valveType=threeWay;actuator=none;verticalLabelPosition=bottom;verticalAlign=top',
2459//			'PEFourWayValveBlock' NA
2460//			'PEGaugeBlock' NA
2461			'PEBleederValveBlock' : s + 'pid2valves.blockBleedValve;actuator=none;verticalLabelPosition=bottom;verticalAlign=top',
2462//			'PEOrificeBlock' NA
2463			'PERotameterBlock' : s + 'pid.flow_sensors.rotameter;flipH=1;verticalLabelPosition=bottom;verticalAlign=top',
2464//Venn Gradient
2465			'VennGradientColor1' : 'ellipse;fillOpacity=35',
2466			'VennGradientColor2' : 'ellipse;fillOpacity=35',
2467			'VennGradientColor3' : 'ellipse;fillOpacity=35',
2468			'VennGradientColor4' : 'ellipse;fillOpacity=35',
2469			'VennGradientColor5' : 'ellipse;fillOpacity=35',
2470			'VennGradientColor6' : 'ellipse;fillOpacity=35',
2471			'VennGradientColor7' : 'ellipse;fillOpacity=35',
2472			'VennGradientColor8' : 'ellipse;fillOpacity=35',
2473//Venn Plain
2474			'VennPlainColor1' : 'ellipse;fillOpacity=35',
2475			'VennPlainColor2' : 'ellipse;fillOpacity=35',
2476			'VennPlainColor3' : 'ellipse;fillOpacity=35',
2477			'VennPlainColor4' : 'ellipse;fillOpacity=35',
2478			'VennPlainColor5' : 'ellipse;fillOpacity=35',
2479			'VennPlainColor6' : 'ellipse;fillOpacity=35',
2480			'VennPlainColor7' : 'ellipse;fillOpacity=35',
2481			'VennPlainColor8' : 'ellipse;fillOpacity=35',
2482//iOS Devices
2483			'iOS7DeviceiPhone5Portrait' : s + 'ios.iPhone;bgStyle=bgGreen', //TODO
2484			'iOS7DeviceiPhone5Landscape' : s + 'ios.iPhone;bgStyle=bgGreen', //TODO
2485			'iOS7DeviceiPadPortrait' : s + 'ios.iPad;bgStyle=bgGreen', //TODO
2486			'iOS7DeviceiPadLandscape' : s + 'ios.iPad;bgStyle=bgGreen', //TODO
2487			'iOS7DeviceiPhone6Portrait' : s + 'ios.iPhone;bgStyle=bgGreen', //TODO
2488			'iOS7DeviceiPhone6Landscape' : s + 'ios.iPhone;bgStyle=bgGreen', //TODO
2489			'iOS7DeviceiPhone6PlusPortrait' : s + 'ios.iPhone;bgStyle=bgGreen', //TODO
2490			'iOS7DeviceiPhone6PlusLandscape' : s + 'ios.iPhone;bgStyle=bgGreen', //TODO
2491//iPhone Elements
2492			'iOS7StatusBariPhone' : s + 'ios7ui.appBar',
2493//			'iOS7NavBariPhone' NA
2494//			'iOS7TabsiPhone' : cs, //TODO
2495//			'iOS7iPhoneActionSheet' : cs, //TODO
2496			'iOS7iPhoneKeyboard' : s + 'ios7.misc.keyboard_(letters)',
2497//			'iOS7TableView' : cs, //TODO
2498//iPad Elements
2499			'iOS7StatusBariPad' : s + 'ios7ui.appBar',
2500//			'iOS7NavBariPad' : cs, //TODO
2501//			'iOS7TabsiPad' : cs, //TODO
2502//			'iOS7iPadActionSheet' : cs, //TODO
2503			'iOS7iPadKeyboard' : s + 'ios7.misc.keyboard_(letters)',
2504//			'iOS7SplitView'
2505//			'iOS7iPadPopover'
2506//Common Elements
2507//			'iOS7AlertDialog' : cs, //TODO
2508			'iOS7ProgressBar' : s + 'ios7ui.downloadBar', //TODO
2509			'iOS7Slider' : s + 'ios7ui.searchBox', //TODO
2510			'iOS7SearchBar' : s + 'ios7ui.searchBox',
2511			'iOS7Button' : '',
2512			'iOS7TextField' : '',
2513			'iOS7TextView' : '',
2514//			'iOS7SegmentedControl' : cs, //TODO
2515			'iOS7Toggle' : s + 'ios7ui.onOffButton;buttonState=on;strokeColor=#38D145;strokeColor2=#aaaaaa;fillColor=#38D145;fillColor2=#ffffff', //TODO
2516			'iOS7Stepper' : s + 'ios7.misc.adjust;fillColor=#ffffff;gradientColor=none',
2517			'iOS7PageControls' : s + 'ios7ui.pageControl;fillColor=#666666;strokeColor=#bbbbbb', //TODO
2518			'iOS7Block' : '',
2519//			'iOS7DatePicker' : cs, //TODO
2520//			'iOS7TimePicker' : cs, //TODO
2521//			'iOS7CountdownPicker' : cs, //TODO
2522//iOS Icons
2523			'iOS7IconArrow left' : s + 'ios7.misc.left',
2524			'iOS7IconArrow' : s + 'ios7.misc.right',
2525			'iOS7IconArrow up' : s + 'ios7.misc.up',
2526			'iOS7IconArrow down' : s + 'ios7.misc.down',
2527			'iOS7IconWifi' : s + 'ios7.icons.wifi',
2528			'iOS7IconBluetooth' : s + 'ios7.icons.bluetooth',
2529			'iOS7IconBattery' : s + 'ios7.icons.battery',
2530			'iOS7IconSiri' : s + 'ios7.icons.microphone',
2531			'iOS7IconCheck' : s + 'ios7.icons.select',
2532			'iOS7IconCreate' : s + 'ios7.icons.add',
2533			'iOS7IconInfo' : s + 'ios7.icons.info',
2534			'iOS7IconLocation' : s + 'ios7.icons.location_2',
2535			'iOS7IconQuestion' : s + 'ios7.icons.help',
2536			'iOS7IconSearch' : s + 'ios7.icons.looking_glass',
2537			'iOS7IconToolbox' : s + 'ios7.icons.briefcase',
2538			'iOS7IconOptions' : s + 'ios7.icons.options',
2539			'iOS7IconShare' : s + 'ios7.icons.share',
2540			'iOS7IconTyping' : s + 'ios7.icons.message',
2541			'iOS7IconCopy' : s + 'ios7.icons.folders_2',
2542			'iOS7IconChat' : s + 'ios7.icons.messages',
2543			'iOS7IconOrganize' : s + 'ios7.icons.folder',
2544			'iOS7IconTrash' : s + 'ios7.icons.trashcan',
2545			'iOS7IconReply' : s + 'ios7.icons.back',
2546			'iOS7IconArchive' : s + 'ios7.icons.box',
2547			'iOS7IconCompose' : s + 'ios7.icons.compose',
2548			'iOS7IconSend' : s + 'ios7.icons.pointer',
2549			'iOS7IconDrawer' : s + 'ios7.icons.storage',
2550			'iOS7IconMail' : s + 'ios7.icons.mail',
2551			'iOS7IconDocument' : s + 'ios7.icons.document',
2552			'iOS7IconFlag' : s + 'ios7.icons.flag',
2553			'iOS7IconBookmarks' : s + 'ios7.icons.book',
2554			'iOS7IconGlasses' : s + 'ios7.icons.glasses',
2555			'iOS7IconFiles' : s + 'ios7.icons.folders',
2556			'iOS7IconDownloads' : s + 'ios7.icons.down',
2557			'iOS7IconLock' : s + 'ios7.icons.locked',
2558//			'iOS7IconUnlock' NA
2559			'iOS7IconCloud' : s + 'ios7.icons.cloud',
2560//			'iOS7IconCloud-lock' NA
2561			'iOS7IconOrientation Lock' : s + 'ios7.icons.orientation_lock',
2562//			'iOS7IconNotification' NA
2563			'iOS7IconContacts' : s + 'ios7.icons.user',
2564			'iOS7IconGlobal' : s + 'ios7.icons.globe',
2565			'iOS7IconSettings' : s + 'ios7.icons.settings',
2566			'iOS7IconAirplay' : s + 'ios7.icons.move_to_folder',
2567			'iOS7IconCamera' : s + 'ios7.icons.camera',
2568			'iOS7IconAirplane' : s + 'signs.transportation.airplane_6;direction=south',
2569			'iOS7IconCalculator' : s + 'ios7.icons.calculator',
2570			'iOS7IconPreferences' : s + 'ios7.icons.most_viewed',
2571			'iOS7IconPhone' : s + 'signs.tech.telephone_3',
2572			'iOS7IconKeypad' : s + 'ios7.icons.keypad',
2573			'iOS7IconVoicemail' : s + 'ios7.icons.tape',
2574			'iOS7IconStar' : s + 'ios7.icons.star',
2575			'iOS7IconMost Viewed' : s + 'ios7.icons.most_viewed',
2576			'iOS7IconVideo' : s + 'ios7.icons.video_conversation',
2577			'iOS7IconVolumne Controls' : s + 'ios7.icons.volume',
2578			'iOS7IconLocation pin' : s + 'ios7.icons.location',
2579			'iOS7IconCalendar' : s + 'ios7.icons.calendar',
2580			'iOS7IconAlarm' : s + 'ios7.icons.alarm_clock',
2581			'iOS7IconClock' : s + 'ios7.icons.clock',
2582			'iOS7IconTimer' : s + 'ios7.icons.gauge',
2583			'iOS7IconVolume down' : s + 'ios7.icons.silent',
2584			'iOS7IconVolume' : s + 'ios7.icons.volume_2',
2585			'iOS7IconVolume up' : s + 'ios7.icons.loud',
2586			'iOS7IconRepeat' : s + 'ios7.icons.reload',
2587			'iOS7IconRewind' : s + 'ios7.icons.backward',
2588			'iOS7IconPlay' : s + 'ios7.icons.play',
2589			'iOS7IconPause' : s + 'ios7.icons.pause',
2590			'iOS7IconFast forward' : s + 'ios7.icons.forward',
2591//			'iOS7IconArtists' NA
2592//			'iOS7IconPlaylist' NA
2593			'iOS7IconControls' : s + 'ios7.icons.controls',
2594//			'iOS7IconShuffle' NA
2595			'iOS7IconPrivacy' : s + 'ios7.icons.privacy',
2596			'iOS7IconLink' : s + 'ios7.icons.link',
2597			'iOS7IconLight' : s + 'ios7.icons.flashlight',
2598			'iOS7IconBrightness' : s + 'ios7.icons.sun',
2599			'iOS7IconHeart' : s + 'ios7.icons.heart',
2600			'iOS7IconJava' : s + 'ios7.icons.cup',
2601			'iOS7IconBox' : s + 'ios7.icons.bag',
2602			'iOS7IconEye' : s + 'ios7.icons.eye',
2603			'iOS7IconDo not disturb' : s + 'ios7.icons.moon',
2604//iOS Activity
2605//			'iOS7ActivityAdd bookmark' NA
2606//			'iOS7ActivityAdd to home screen' NA
2607//			'iOS7ActivityAdd to reading list' NA
2608//			'iOS7ActivityAirplay' NA
2609//			'iOS7ActivityAssign to contact' NA
2610//			'iOS7ActivityCopy' NA
2611//			'iOS7ActivityPrint' NA
2612//			'iOS7ActivitySlideshow' NA
2613//			'iOS7ActivityUse as wallpaper' NA
2614//UI Containers
2615			'UI2BrowserBlock' : cs,
2616			'UI2WindowBlock' : cs,
2617			'UI2DialogBlock' : cs,
2618			'UI2AreaBlock' : 'rounded=1;arcSize=3',
2619			'UIAreaBlock' : 'rounded=1;arcSize=3;fillColor=none',
2620			'UI2ElementBlock' : '',
2621			'UI2AccordionBlock' : cs,
2622			'UI2TabBarContainerBlock' : cs,
2623			'UI2TabBar2ContainerBlock' : cs,
2624			'UI2VTabBarContainerBlock' : cs,
2625			'UI2VScrollBlock' : s + 'mockup.navigation.scrollBar;direction=north',
2626			'UI2HScrollBlock' : s + 'mockup.navigation.scrollBar',
2627			'UI2VerticalSplitterBlock' : s + 'mockup.forms.splitter;direction=north',
2628			'UI2HorizontalSplitterBlock' : s + 'mockup.forms.splitter',
2629//UI Widgets
2630			'UI2ImageBlock' : s + 'mockup.graphics.simpleIcon',
2631			'UI2VideoBlock' : s + 'mockup.containers.videoPlayer;barHeight=30',
2632			'UI2AudioBlock' : s + 'mockup.misc.playbackControls',
2633			'UI2MapBlock' : s + 'mockup.misc.map',
2634//			'UI2CalendarBlock' NA
2635			'UI2BarChartBlock' : s + 'mockup.graphics.barChart;strokeColor=none;strokeColor2=none',
2636			'UI2ColumnChartBlock' : s + 'mockup.graphics.columnChart;strokeColor=none;strokeColor2=none',
2637			'UI2LineChartBlock' : s + 'mockup.graphics.lineChart;strokeColor=none',
2638			'UI2PieChartBlock' : s + 'mockup.graphics.pieChart;parts=10,20,35',
2639			'UI2WebcamBlock' : s + 'mockup.containers.userMale',
2640			'UI2CaptchaBlock' : s + 'mockup.text.captcha;mainText=',
2641//			'Image_ui_formatting_toolbar2'
2642//UI Input
2643			'UI2ButtonBlock' : 'rounded=1;arcSize=25;',
2644			'UI2CheckBoxBlock' : cs,
2645			'UI2HorizontalCheckBoxBlock' : cs,
2646			'UI2RadioBlock' : cs,
2647			'UI2HorizontalRadioBlock' : cs,
2648			'UI2ColorPickerBlock' : s + 'mockup.forms.colorPicker;chosenColor=#aaddff',
2649			'UI2TextInputBlock' : '',
2650			'UI2SelectBlock' : cs,
2651			'UI2VSliderBlock' : cs,
2652			'UI2HSliderBlock' : cs,
2653			'UI2DatePickerBlock' : cs,
2654			'UI2SearchBlock' : cs,
2655			'UI2NumericStepperBlock' : cs,
2656			'UI2TableBlock' : cs,
2657//UI Menus
2658			'UI2ButtonBarBlock' : cs,
2659			'UI2VerticalButtonBarBlock' : cs,
2660			'UI2LinkBarBlock' : cs,
2661			'UI2BreadCrumbsBlock' : cs,
2662			'UI2MenuBarBlock' : cs,
2663			'UI2AtoZBlock' : cs,
2664			'UI2PaginationBlock' : cs,
2665			'UI2ContextMenuBlock' : cs,
2666//			'UI2TreePaneBlock' : cs, //TODO
2667			'UI2PlaybackControlsBlock' : s + 'mockup.misc.playbackControls;fillColor=#ffffff;strokeColor=#999999;fillColor2=#99ddff;strokeColor2=none;fillColor3=#ffffff;strokeColor3=none',
2668			'Image_ui_formatting_toolbar' : s + 'mockup.menus_and_buttons.font_style_selector_2',
2669//UI Misc
2670			'UI2ProgressBarBlock' : cs,
2671			'UI2HelpIconBlock' : s + 'mockup.misc.help_icon',
2672			'UI2BraceNoteBlock' : cs,
2673			'UI2TooltipBlock' : s + 'basic.rectangular_callout;flipV=1',
2674			'UI2TooltipSquareBlock' : cs,
2675			'UI2CalloutBlock' : cs,
2676			'UI2AlertBlock' : cs,
2677//iOS 6 iPad Elements
2678			'Image_ipad_ipad' : s + 'ios.iPad;bgStyle=bgGreen',
2679			'iPadGrayBackgroundBlock' : '',
2680			'Image_ipad_top_bar' : s + 'ios.iTopBar2;opacity=50;fillColor=#999999;strokeColor=#cccccc',
2681//			'Image_ipad_bar_gray' : '',
2682//			'Image_ipad_bar_semi_trans_black' : '',
2683//			'Image_ipad_bar_black' : '',
2684//			'Image_ipad_safari_top' NA
2685			'Image_ipad_search' : s + 'mockup.forms.searchBox;mainText=;flipH=1',
2686//			'Image_ipad_alert_dialog' : cs, //TODO
2687//			'Image_ipad_dialog' : cs, //TODO
2688			'Image_ipad_popover' : s + 'ios.iOption;barPos=50;pointerPos=top;buttonText=',
2689//			'Image_ipad_table' : cs, //TODO
2690//			'Image_ipad_vtab' : cs, //TODO
2691//iOS 6 iPad Controls
2692			'Image_ipad_button_black' : '',
2693			'Image_ipad_button_blue' : '',
2694			'Image_ipad_button_grayblue' : '',
2695			'Image_ipad_button_red' : '',
2696			'Image_ipad_back_button_gray' : s + 'ios.iButtonBack;buttonText=;fillColor=#eeeeee;fillColor2=#aaaaaa',
2697			'Image_ipad_back_button_black' : s + 'ios.iButtonBack;buttonText=;fillColor=#888888;fillColor2=#000000',
2698			'Image_ipad_sort_handle' : s + 'ios7.icons.options',
2699			'Image_ipad_dropdown' : s + 'ios.iComboBox;buttonText=;fillColor=#dddddd;fillColor2=#3D5565',
2700			'Image_ipad_email_name' : '',
2701			'Image_ipad_prev_next' : s + 'ios.iPrevNext;strokeColor=#444444;fillColor=#dddddd;fillColor2=#3D5565;fillColor3=#ffffff',
2702			'Image_ipad_keyboard_portrait' : s + 'ios.iKeybLett',
2703			'Image_ipad_keyboard_landscape' : s + 'ios.iKeybLett',
2704//			'Image_ipad_large_tabbed_button' : cs, //TODO
2705//			'Image_ipad_sort_button' : cs, //TODO
2706//			'Image_ipad_tab_bar' : cs, //TODO
2707			'Image_ipad_slider' : s + 'ios.iSlider;barPos=20',
2708//			'Image_ipad_switch_off'
2709//iOS 6 iPad Icons
2710			'Image_ipad_add_icon_blue' : s + 'ios.iAddIcon;fillColor=#8BbEff;fillColor2=#135Ec8;strokeColor=#ffffff',
2711			'Image_ipad_add_icon_green' : s + 'ios.iAddIcon;fillColor=#7AdF78;fillColor2=#1A9917;strokeColor=#ffffff',
2712			'Image_ipad_remove_icon' : s + 'ios.iDeleteIcon;fillColor=#e8878E;fillColor2=#BD1421;strokeColor=#ffffff',
2713			'Image_ipad_arrow_icon' : s + 'ios.iArrowIcon;fillColor=#8BbEff;fillColor2=#135Ec8;strokeColor=#ffffff',
2714			'Image_ipad_arrow' : s + 'ios7.misc.more',
2715			'Image_ipad_checkmark' : s + 'ios7.misc.check',
2716			'Image_ipad_check_off' : 'ellipse', //TODO
2717			'Image_ipad_location_dot' : 'ellipse',
2718			'Image_ipad_mark_as_read' : 'ellipse',
2719			'Image_ipad_pin_green' : s + 'ios.iPin;fillColor2=#00dd00;fillColor3=#004400;strokeColor=#006600',
2720			'Image_ipad_pin_red' : s + 'ios.iPin;fillColor2=#dd0000;fillColor3=#440000;strokeColor=#660000',
2721			'Image_ipad_radio_off' : 'ellipse', //TODO
2722			'Image_ipad_checkbox_off' : 'absoluteArcSize=1;arcSize=' + arcSize + ';rounded=1', //TODO
2723			'Image_ipad_indicator' : 'absoluteArcSize=1;arcSize=' + arcSize + ';rounded=1;fillColor=#e8878E;gradientColor=#BD1421;strokeColor=#ffffff',
2724//iOS 6 iPhone Elements
2725			'Image_iphone_iphone_4' : s + 'ios.iPhone;bg=bgGreen',
2726			'Image_iphone_bg_black' : '',
2727			'Image_iphone_bg_gray' : '',
2728			'Image_iphone_bg_stripe_drk' : s + 'ios.iBgStriped;strokeColor=#18211b;fillColor=#5D7585;strokeColor2=#657E8F',
2729			'Image_iphone_bg_stripe_lt' : s + 'ios.iBgStriped;strokeColor=#18211b;fillColor=#5D7585;strokeColor2=#657E8F',
2730			'Image_iphone_bg_white' : '',
2731			'Image_iphone_top_bar_app' : s + 'ios.iAppBar',
2732			'Image_iphone_top_bar_home' : s + 'ios.iTopBar2;opacity=50;fillColor=#999999;strokeColor=#cccccc;strokeWidth=1',
2733			'Image_iphone_bar_top' : '',
2734			'Image_iphone_bar_semi_trans_black' : '',
2735			'Image_iphone_bar_semi_trans_blue' : '',
2736			'Image_iphone_search' : s + 'mockup.forms.searchBox;mainText=;flipH=1',
2737//			'Image_iphone_table' : cs, //TODO
2738//			'Image_iphone_table_w_buttons' : cs, //TODO
2739//			'Image_iphone_table_w_icons' : cs, //TODO
2740//			'Image_iphone_list' : cs, //TODO
2741//			'Image_iphone_safari_top' NA
2742//			'Image_iphone_safari_bottom' NA
2743//			'Image_iphone_gray_grad_list' : '', //TODO
2744//			'Image_iphone_alert_bar' NA
2745//			'Image_iphone_alert_dialog' : cs, //TODO
2746//			'Image_iphone_dialog' : cs, //TODO
2747//			'Image_iphone_scroll_pane' : cs, //TODO
2748			'Image_iphone_alpha_list' : s + 'ios.iAlphaList',
2749//iOS 6 iPhone Controls
2750			'Image_iphone_button_black' : '',
2751			'Image_iphone_button_blue' : '',
2752			'Image_iphone_button_grayblue' : '',
2753			'Image_iphone_button_red' : '',
2754			'Image_iphone_button_lg_light' : '',
2755			'Image_iphone_button_lg_dark' : '',
2756			'Image_iphone_button_lg_green' : '',
2757			'Image_iphone_button_lg_red' : '',
2758			'Image_iphone_button_lg_yellow' : '',
2759			'Image_iphone_button_xl_green' : '',
2760			'Image_iphone_back_button' : s + 'ios.iButtonBack;strokeColor=#444444;buttonText=;fillColor=#dddddd;fillColor2=#3D5565',
2761			'Image_iphone_prev_next' : s + 'ios.iPrevNext;strokeColor=#444444;fillColor=#dddddd;fillColor2=#3D5565;fillColor3=#ffffff',
2762			'Image_iphone_sort_handle' : s + 'ios7.icons.options',
2763			'Image_iphone_slider' : s + 'ios.iSlider;barPos=60',
2764			'Image_iphone_dropdown' : s + 'ios.iComboBox;buttonText=;fillColor=#dddddd;fillColor2=#3D5565',
2765			'Image_iphone_email_name' : '',
2766			'Image_iphone_switch_off' : s + 'android.switch_off;fillColor=#666666', //TODO
2767			'Image_iphone_keyboard_button_blue' : '',
2768			'Image_iphone_keyboard_letters' : s + 'ios.iKeybLett',
2769			'Image_iphone_keyboard_landscape' : s + 'ios.iKeybLett',
2770//			'Image_iphone_large_tabbed_button' : cs, //TODO
2771//			'Image_iphone_sort_button' : cs, //TODO
2772//			'Image_iphone_tab_bar' : cs, //TODO
2773//			'Image_iphone_picker_multi' : cs, //TODO
2774//			'Image_iphone_picker_web' : cs, //TODO
2775//iOS 6 iPhone Icons
2776			'Image_iphone_add_icon_blue' : s + 'ios.iAddIcon;fillColor=#8BbEff;fillColor2=#135Ec8;strokeColor=#ffffff',
2777			'Image_iphone_add_icon_green' : s + 'ios.iAddIcon;fillColor=#7AdF78;fillColor2=#1A9917;strokeColor=#ffffff',
2778			'Image_iphone_remove_icon' : s + 'ios.iDeleteIcon;fillColor=#e8878E;fillColor2=#BD1421;strokeColor=#ffffff',
2779			'Image_iphone_arrow_icon' : s + 'ios.iArrowIcon;fillColor=#8BbEff;fillColor2=#135Ec8;strokeColor=#ffffff',
2780			'Image_iphone_arrow' : s + 'ios7.misc.more',
2781			'Image_iphone_checkmark' : s + 'ios7.misc.check',
2782			'Image_iphone_check_off' : 'ellipse', //TODO
2783			'Image_iphone_location_dot' : 'ellipse',
2784			'Image_iphone_mark_as_read' : 'ellipse',
2785			'Image_iphone_pin_green' : s + 'ios.iPin;fillColor2=#00dd00;fillColor3=#004400;strokeColor=#006600',
2786			'Image_iphone_pin_red' : s + 'ios.iPin;fillColor2=#dd0000;fillColor3=#440000;strokeColor=#660000',
2787			'Image_iphone_radio_off' : 'ellipse', //TODO
2788//			'Image_iphone_checkbox_off' : '', //TODO
2789			'Image_iphone_indicator' : 'fillColor=#e8878E;gradientColor=#BD1421;strokeColor=#ffffff',
2790			'Image_iphone_thread_count' : '',
2791
2792//***************************************************************************************************************
2793// 2019 mapping
2794//***************************************************************************************************************
2795
2796
2797// AWS 17 - Analytics
2798			'AmazonAthena2017' : 'shape=mxgraph.aws3.athena;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2799			'AmazonCloudSearch2017' : 'shape=mxgraph.aws3.cloudsearch;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2800			'AmazonCloudSearchsearchdocuments2017' : 'shape=mxgraph.aws3.search_documents;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2801			'AmazonEMR2017' : 'shape=mxgraph.aws3.emr;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2802			'AmazonEMRcluster2017' : 'shape=mxgraph.aws3.emr_cluster;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2803			'AmazonEMREMRengine2017' : 'shape=mxgraph.aws3.emr_engine;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2804			'AmazonEMREMRengineMapRM32017' : 'shape=mxgraph.aws3.emr_engine_mapr_m3;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2805			'AmazonEMREMRengineMapRM52017' : 'shape=mxgraph.aws3.emr_engine_mapr_m5;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2806			'AmazonEMREMRengineMapRM72017' : 'shape=mxgraph.aws3.emr_engine_mapr_m7;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2807			'AmazonEMRHDFScluster2017' : 'shape=mxgraph.aws3.hdfs_cluster;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2808			'AmazonES2017' : 'shape=mxgraph.aws3.elasticsearch_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2809			'AmazonKinesis2017' : 'shape=mxgraph.aws3.kinesis;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2810			'AmazonKinesisAmazonKinesisAnalytics2017' : 'shape=mxgraph.aws3.kinesis_analytics;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2811			'AmazonKinesisAmazonKinesisenabledapp2017' : 'shape=mxgraph.aws3.kinesis_enabled_app;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2812			'AmazonKinesisAmazonKinesisFirehose2017' : 'shape=mxgraph.aws3.kinesis_firehose;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2813			'AmazonKinesisAmazonKinesisStreams2017' : 'shape=mxgraph.aws3.kinesis_streams;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2814			'AmazonQuickSight2017' : 'shape=mxgraph.aws3.quicksight;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2815			'AmazonRedshift2017' : 'shape=mxgraph.aws3.redshift;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2816			'AmazonRedshiftdensecomputenode2017' : 'shape=mxgraph.aws3.dense_compute_node;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2817			'AmazonRedshiftdensestoragenode2017' : 'shape=mxgraph.aws3.dense_storage_node;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2818			'AWSDataPipeline2017' : 'shape=mxgraph.aws3.data_pipeline;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2819			'AWSGlue2017' : 'shape=mxgraph.aws3.glue;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2820
2821// AWS 17 - Application Services
2822			'AmazonAPIGateway2017' : 'shape=mxgraph.aws3.api_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2823			'AmazonAppStream22017' : 'shape=mxgraph.aws3.appstream;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2824			'AmazonElasticTranscoder2017' : 'shape=mxgraph.aws3.elastic_transcoder;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2825			'AmazonSWF2017' : 'shape=mxgraph.aws3.swf;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2826			'AmazonSWFdecider2017' : 'shape=mxgraph.aws3.decider;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2827			'AmazonSWFworker2017' : 'shape=mxgraph.aws3.worker;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2828			'AWSStepFunctions2017' : 'shape=mxgraph.aws3.step_functions;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2829
2830// AWS 17 - Artificial Intelligence
2831			'AmazonLex2017' : 'shape=mxgraph.aws3.lex;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2832			'AmazonMachineLearning2017' : 'shape=mxgraph.aws3.machine_learning;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2833			'AmazonPolly2017' : 'shape=mxgraph.aws3.polly;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2834			'AmazonRekognition2017' : 'shape=mxgraph.aws3.rekognition;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2835
2836// AWS 17 - Business Productivity
2837			'AmazonChime2017' : 'shape=mxgraph.aws3.chime;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2838			'AmazonWorkMail2017' : 'shape=mxgraph.aws3.workmail;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2839			'AmazonWorkDocs2017' : 'shape=mxgraph.aws3.workdocs;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2840
2841// AWS 17 - Compute
2842			'AmazonEC22017' : 'shape=mxgraph.aws3.ec2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2843			'AmazonEC2AMI2017' : 'shape=mxgraph.aws3.ami;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2844			'AmazonEC2AutoScaling2017' : 'shape=mxgraph.aws3.auto_scaling;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2845			'AmazonEC2DBoninstance2017' : 'shape=mxgraph.aws3.db_on_instance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2846			'AmazonEC2EC2rescue2017' : 'shape=mxgraph.aws3.rescue;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2847			'AmazonEC2ElasticIPaddress2017' : 'shape=mxgraph.aws3.elastic_ip;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2848			'AmazonEC2instance2017' : 'shape=mxgraph.aws3.instance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2849			'AmazonEC2instances2017' : 'shape=mxgraph.aws3.instances;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2850			'AmazonEC2instancewithCloudWatch2017' : 'shape=mxgraph.aws3.instance_with_cloudwatch;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2851			'AmazonEC2optimizedinstance2017' : 'shape=mxgraph.aws3.optimized_instance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2852//			'AmazonEC2SpotFleet2017' : composite,
2853			'AmazonEC2SpotInstance2017' : 'shape=mxgraph.aws3.spot_instance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2854			'AmazonEC2X1instance2017' : 'shape=mxgraph.aws3.x1_instance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2855			'AmazonECR2017' : 'shape=mxgraph.aws3.ecr;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2856			'AmazonECRECRRegistry2017' : 'shape=mxgraph.aws3.ecr_registry;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2857			'AmazonECS2017' : 'shape=mxgraph.aws3.ecs;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2858			'AmazonECSECScontainer2017' : 'shape=mxgraph.aws3.ec2_compute_container;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2859			'AmazonECSECScontainerAlt12017' : 'shape=mxgraph.aws3.ec2_compute_container_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2860			'AmazonECSECScontainerAlt22017' : 'shape=mxgraph.aws3.ec2_compute_container_3;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2861			'AmazonLightsail2017' : 'shape=mxgraph.aws3.lightsail;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2862			'AmazonVPC2017' : 'shape=mxgraph.aws3.vpc;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2863			'AmazonVPCcustomergateway2017' : 'shape=mxgraph.aws3.customer_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2864			'AmazonVPCelasticnetworkadapter2017' : 'shape=mxgraph.aws3.elastic_network_adapter;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2865			'AmazonVPCelasticnetworkinterface2017' : 'shape=mxgraph.aws3.elastic_network_interface;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2866			'AmazonVPCendpoints2017' : 'shape=mxgraph.aws3.endpoints;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2867			'AmazonVPCflowlogs2017' : 'shape=mxgraph.aws3.flow_logs;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2868			'AmazonVPCInternetgateway2017' : 'shape=mxgraph.aws3.internet_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2869			'AmazonVPCnetworkaccesscontrollist2017' : 'shape=mxgraph.aws3.network_access_controllist;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2870			'AmazonVPCrouter2017' : 'shape=mxgraph.aws3.router;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2871			'AmazonVPCVPCNATgateway2017' : 'shape=mxgraph.aws3.vpc_nat_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2872			'AmazonVPCVPCpeering2017' : 'shape=mxgraph.aws3.vpc_peering;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2873			'AmazonVPCVPNconnection2017' : 'shape=mxgraph.aws3.vpn_connection;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2874			'AmazonVPCVPNgateway2017' : 'shape=mxgraph.aws3.vpn_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2875			'AWSBatch2017' : 'shape=mxgraph.aws3.batch;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2876			'AWSElasticBeanstalk2017' : 'shape=mxgraph.aws3.elastic_beanstalk;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2877			'AWSElasticBeanstalkapplication2017' : 'shape=mxgraph.aws3.application;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2878			'AWSElasticBeanstalkdeployment2017' : 'shape=mxgraph.aws3.deployment;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2879			'AWSLambda2017' : 'shape=mxgraph.aws3.lambda;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2880			'AWSLambdaLambdaFunction2017' : 'shape=mxgraph.aws3.lambda_function;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2881			'ElasticLoadBalancing2017' : 'shape=mxgraph.aws3.elastic_load_balancing;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2882			'ElasticLoadBalancingApplicationLoadBalancer2017' : 'shape=mxgraph.aws3.application_load_balancer;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2883			'ElasticLoadBalancingELLoadBalancer2017' : 'shape=mxgraph.aws3.classic_load_balancer;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2884
2885// AWS 17 - Contact Center
2886			'AmazonConnect2017' : 'shape=mxgraph.aws3.connect;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2887
2888// AWS 17 - Containers
2889			'AutoScalingGroup2017' : 'rounded=1;arcSize=10;dashed=1;dashPattern=8 3 1 3;verticalAlign=bottom',
2890			'AvailabilityZone2017' : 'rounded=1;arcSize=10;dashed=1;dashPattern=8 4;verticalAlign=bottom',
2891			'Region2017' : 'rounded=1;arcSize=10;dashed=1;dashPattern=1 1;verticalAlign=bottom',
2892			'SecurityGroup2017' : 'verticalAlign=bottom',
2893			'ElasticBeanStalkContainer2017' : cs,
2894			'EC2InstanceContents2017' : cs,
2895			'VPCSubnet2017' : cs,
2896			'ServerContents2017' : 'rounded=1;arcSize=10;dashed=0;fillColor=#DBDBDB;gradientColor=none;verticalAlign=bottom',
2897			'VirtualPrivateCloudContainer2017' : cs,
2898			'AWSCloudContainer2017' : cs,
2899			'CorporateDataCenterContainer2017' : cs,
2900
2901// AWS 17 - Database
2902			'AmazonDynamoDB2017' : 'shape=mxgraph.aws3.dynamo_db;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2903			'AmazonDynamoDBAccelerator2017' : 'shape=mxgraph.aws3.db_accelerator;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2904			'AmazonDynamoDBattribute2017' : 'shape=mxgraph.aws3.attribute;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2905			'AmazonDynamoDBattributes2017' : 'shape=mxgraph.aws3.attributes;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2906			'AmazonDynamoDBglobalsecondaryindex2017' : 'shape=mxgraph.aws3.global_secondary_index;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2907			'AmazonDynamoDBitem2017' : 'shape=mxgraph.aws3.item;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2908			'AmazonDynamoDBitems2017' : 'shape=mxgraph.aws3.items;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2909			'AmazonDynamoDBtable2017' : 'shape=mxgraph.aws3.table;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2910			'AmazonElasticCache2017' : 'shape=mxgraph.aws3.elasticache;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2911			'AmazonElasticCachecachenode2017' : 'shape=mxgraph.aws3.cache_node;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2912			'AmazonElasticCacheMemcached2017' : 'shape=mxgraph.aws3.memcached;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2913			'AmazonElasticCacheRedis2017' : 'shape=mxgraph.aws3.redis;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2914			'AmazonRDS2017' : 'shape=mxgraph.aws3.rds;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2915			'AmazonRDSDBinstance2017' : 'shape=mxgraph.aws3.rds_db_instance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2916			'AmazonRDSinstancereadreplica2017' : 'shape=mxgraph.aws3.rds_db_instance_read_replica;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2917			'AmazonRDSinstancestandby2017' : 'shape=mxgraph.aws3.rds_db_instance_standby_multi_az;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2918			'AmazonRDSMSSQLinstance2017' : 'shape=mxgraph.aws3.ms_sql_instance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2919			'AmazonRDSMSSQLinstancealternate2017' : 'shape=mxgraph.aws3.ms_sql_instance_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2920			'AmazonRDSMySQLDBinstance2017' : 'shape=mxgraph.aws3.ms_sql_instance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2921			'AmazonRDSMySQLinstancealternate2017' : 'shape=mxgraph.aws3.mysql_db_instance_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2922			'AmazonRDSoracleDBinstance2017' : 'shape=mxgraph.aws3.oracle_db_instance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2923			'AmazonRDSOracleDBinstancealternate2017' : 'shape=mxgraph.aws3.oracle_db_instance_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2924			'AmazonRDSPIOP2017' : 'shape=mxgraph.aws3.piop;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2925			'AmazonRDSPostgreSQLinstance2017' : 'shape=mxgraph.aws3.postgre_sql_instance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2926			'AmazonRDSSQLmaster2017' : 'shape=mxgraph.aws3.sql_master;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2927			'AmazonRDSSQLslave2017' : 'shape=mxgraph.aws3.sql_slave;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2928			'AWSDMS2017' : 'shape=mxgraph.aws3.database_migration_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2929			'AWSDMSdatabasemigrationworkflowjob2017' : 'shape=mxgraph.aws3.database_migration_workflow_job;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2930
2931// AWS 17 - Desktop App Straning
2932			'AmazonWorkSpaces2017' : 'shape=mxgraph.aws3.workspaces;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2933
2934// AWS 17 - Developer Tools
2935			'AWSCodeBuild2017' : 'shape=mxgraph.aws3.codebuild;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2936			'AWSCodeCommit2017' : 'shape=mxgraph.aws3.codecommit;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2937			'AWSCodeDeploy2017' : 'shape=mxgraph.aws3.codedeploy;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2938			'AWSCodePipeline2017' : 'shape=mxgraph.aws3.codepipeline;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2939			'AWSCodeStar2017' : 'shape=mxgraph.aws3.codestar;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2940			'AWSXRay2017' : 'shape=mxgraph.aws3.x_ray;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2941
2942// AWS 17 - Game Development
2943			'AmazonGameLift2017' : 'shape=mxgraph.aws3.gamelift;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2944
2945// AWS 17 - General
2946			'AWScloud2017' : 'shape=mxgraph.aws3.cloud;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2947			'AWSManagementConsole2017' : 'shape=mxgraph.aws3.management_console;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2948			'client2017' : 'shape=mxgraph.aws3.management_console;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2949			'corporatedatacenter2017' : 'shape=mxgraph.aws3.corporate_data_center;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2950			'disk2017' : 'shape=mxgraph.aws3.disk;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2951			'forums2017' : 'shape=mxgraph.aws3.forums;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2952			'genericdatabase2017' : 'shape=mxgraph.aws3.generic_database;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2953			'Internet2017' : 'shape=mxgraph.aws3.internet;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2954			'Internetalternate12017' : 'shape=mxgraph.aws3.internet_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2955			'Internetalternate22017' : 'shape=mxgraph.aws3.internet_3;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2956			'mobileclient2017' : 'shape=mxgraph.aws3.mobile_client;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2957			'multimedia2017' : 'shape=mxgraph.aws3.multimedia;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2958			'officebuilding2017' : 'shape=mxgraph.aws3.office_building;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2959			'SAMLtoken2017' : 'shape=mxgraph.aws3.saml_token;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2960			'SSLpadlock2017' : 'shape=mxgraph.aws3.ssl_padlock;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2961			'tapestorage2017' : 'shape=mxgraph.aws3.tape_storage;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2962			'traditionalserver2017' : 'shape=mxgraph.aws3.traditional_server;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2963			'user2017' : 'shape=mxgraph.aws3.user;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2964			'users2017' : 'shape=mxgraph.aws3.users;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2965			'virtualprivatecloud2017' : 'shape=mxgraph.aws3.virtual_private_cloud;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2966
2967// AWS 17 - IoT
2968			'AWSIoTlambdafunction2017' : 'shape=mxgraph.aws3.lambda_function;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2969			'AWSIoTfireTVstick2017' : 'shape=mxgraph.aws3.fire_tv_stick;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2970			'AWSIoTfireTV2017' : 'shape=mxgraph.aws3.fire_tv;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2971			'AWSIoTecho2017' : 'shape=mxgraph.aws3.echo;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2972			'AWSIoTAVSenableddevice2017' : 'shape=mxgraph.aws3.alexa_enabled_device;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2973			'AWSIoTalexavoiceservice2017' : 'shape=mxgraph.aws3.alexa_voice_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2974			'AWSIoTalexasmarthomeskill2017' : 'shape=mxgraph.aws3.alexa_smart_home_skill;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2975			'AWSIoTalexaskill2017' : 'shape=mxgraph.aws3.alexa_skill;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2976			'AWSIoTHTTPprotocol2017' : 'shape=mxgraph.aws3.http_protocol;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2977			'AWSIoTHTTP2protocol2017' : 'shape=mxgraph.aws3.http_2_protocol;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2978			'AWSIoThardwareboard2017' : 'shape=mxgraph.aws3.hardware_board;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2979			'AWSIoTrule2017' : 'shape=mxgraph.aws3.rule;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2980			'AWSIoTpolicy2017' : 'shape=mxgraph.aws3.policy;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2981			'AWSIoTMQTTprotocol2017' : 'shape=mxgraph.aws3.mqtt_protocol;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2982			'AWSIoTaction2017' : 'shape=mxgraph.aws3.action;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2983			'AWSIoTtopic2017' : 'shape=mxgraph.aws3.topic;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2984			'AWSIoTshadow2017' : 'shape=mxgraph.aws3.shadow;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2985			'AWSIoTdesiredstate2017' : 'shape=mxgraph.aws3.desired_state;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2986			'AWSIoTcertificate2017' : 'shape=mxgraph.aws3.certificate;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2987			'AWSIoTreportedstate2017' : 'shape=mxgraph.aws3.reported_state;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2988			'AWSIoTsimulator2017' : 'shape=mxgraph.aws3.simulator;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2989			'AWSIoTservo2017' : 'shape=mxgraph.aws3.servo;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2990			'AWSIoTsensor2017' : 'shape=mxgraph.aws3.sensor;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2991			'AWSIoTactuator2017' : 'shape=mxgraph.aws3.actuator;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2992			'AWSIoTthingthermostat2017' : 'shape=mxgraph.aws3.thermostat;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2993			'AWSIoTthingmedicalemergency2017' : 'shape=mxgraph.aws3.medical_emergency;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2994			'AWSIoTthingtravel2017' : 'shape=mxgraph.aws3.travel;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2995			'AWSIoTthingcoffeepot2017' : 'shape=mxgraph.aws3.coffee_pot;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2996			'AWSIoTthingcart2017' : 'shape=mxgraph.aws3.cart;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2997			'AWSIoTthingcamera2017' : 'shape=mxgraph.aws3.camera;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2998			'AWSIoTthingpoliceemergency2017' : 'shape=mxgraph.aws3.police_emergency;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
2999			'AWSIoTthingdoorlock2017' : 'shape=mxgraph.aws3.door_lock;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3000			'AWSIoTthingutility2017' : 'shape=mxgraph.aws3.utility;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3001			'AWSIoTthingcar2017' : 'shape=mxgraph.aws3.car;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3002			'AWSIoTthingbank2017' : 'shape=mxgraph.aws3.bank;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3003			'AWSIoTthingwindfarm2017' : 'shape=mxgraph.aws3.windfarm;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3004			'AWSIoTthingbicycle2017' : 'shape=mxgraph.aws3.bicycle;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3005			'AWSIoTthinghouse2017' : 'shape=mxgraph.aws3.house;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3006			'AWSIoTthingfactory2017' : 'shape=mxgraph.aws3.factory;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3007			'AWSIoTthinglightbulb2017' : 'shape=mxgraph.aws3.lightbulb;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3008			'AWSIoTthinggeneric2017' : 'shape=mxgraph.aws3.generic;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3009			'AWSIoTAWSGreengrass2017' : 'shape=mxgraph.aws3.greengrass;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3010			'AWSIoT2017' : 'shape=mxgraph.aws3.aws_iot;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3011
3012// AWS 17 - Management
3013			'AmazonCloudWatch2017' : 'shape=mxgraph.aws3.cloudwatch;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3014			'AmazonCloudWatchalarm2017' : 'shape=mxgraph.aws3.alarm;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3015			'AmazonCloudWatcheventeventbased2017' : 'shape=mxgraph.aws3.event_event_based;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3016			'AmazonCloudWatcheventtimebased2017' : 'shape=mxgraph.aws3.event_time_based;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3017			'AmazonCloudWatchrule2017' : 'shape=mxgraph.aws3.config_rule;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3018			'AmazonEC2SystemsManager2017' : 'shape=mxgraph.aws3.ec2_systems_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3019			'AmazonEC2SystemsManagerAutomation2017' : 'shape=mxgraph.aws3.automation;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3020			'AmazonEC2SystemsManagerdocuments2017' : 'shape=mxgraph.aws3.documents;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3021			'AmazonEC2SystemsManagerInventory2017' : 'shape=mxgraph.aws3.inventory;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3022			'AmazonEC2SystemsManagerMaintenanceWindow2017' : 'shape=mxgraph.aws3.maintenance_window;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3023			'AmazonEC2SystemsManagerParameterStore2017' : 'shape=mxgraph.aws3.parameter_store;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3024			'AmazonEC2SystemsManagerPatchManager2017' : 'shape=mxgraph.aws3.patch_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3025			'AmazonEC2SystemsManagerRunCommand2017' : 'shape=mxgraph.aws3.run_command;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3026			'AmazonEC2SystemsManagerStateManager2017' : 'shape=mxgraph.aws3.state_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3027			'AWSCloudFormation2017' : 'shape=mxgraph.aws3.cloudformation;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3028			'AWSCloudFormationchangeset2017' : 'shape=mxgraph.aws3.change_set;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3029			'AWSCloudFormationstack2017' : 'shape=mxgraph.aws3.stack_aws_cloudformation;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3030			'AWSCloudFormationtemplate2017' : 'shape=mxgraph.aws3.template;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3031			'AWSCloudTrail2017' : 'shape=mxgraph.aws3.cloudtrail;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3032			'AWSConfig2017' : 'shape=mxgraph.aws3.config;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3033			'AWSManagedServices2017' : 'shape=mxgraph.aws3.managed_services;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3034			'AWSOpsWorks2017' : 'shape=mxgraph.aws3.opsworks;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3035			'AWSOpsWorksapps2017' : 'shape=mxgraph.aws3.apps;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3036			'AWSOpsWorksdeployments2017' : 'shape=mxgraph.aws3.deployments;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3037			'AWSOpsWorksinstances2017' : 'shape=mxgraph.aws3.instances_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3038			'AWSOpsWorkslayers2017' : 'shape=mxgraph.aws3.layers;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3039			'AWSOpsWorksmonitoring2017' : 'shape=mxgraph.aws3.monitoring;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3040			'AWSOpsWorkspermissions2017' : 'shape=mxgraph.aws3.permissions;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3041			'AWSOpsWorksresources2017' : 'shape=mxgraph.aws3.resources;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3042			'AWSOpsWorksstack2017' : 'shape=mxgraph.aws3.stack_aws_opsworks;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3043			'AWSServiceCatalog2017' : 'shape=mxgraph.aws3.service_catalog;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3044			'AWSTrustedAdvisor2017' : 'shape=mxgraph.aws3.trusted_advisor;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3045			'AWSTrustedAdvisorchecklist2017' : 'shape=mxgraph.aws3.checklist;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3046			'AWSTrustedAdvisorchecklistcost2017' : 'shape=mxgraph.aws3.checklist_cost;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3047			'AWSTrustedAdvisorchecklistfaulttolerance2017' : 'shape=mxgraph.aws3.checklist_fault_tolerance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3048			'AWSTrustedAdvisorchecklistperformance2017' : 'shape=mxgraph.aws3.checklist_performance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3049			'AWSTrustedAdvisorchecklistsecurity2017' : 'shape=mxgraph.aws3.checklist_security;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3050
3051// AWS 17 - Messaging
3052			'AmazonPinpoint2017' : 'shape=mxgraph.aws3.pinpoint;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3053			'AmazonSES2017' : 'shape=mxgraph.aws3.ses;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3054			'AmazonSESemail2017' : 'shape=mxgraph.aws3.email;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3055			'AmazonSNS2017' : 'shape=mxgraph.aws3.sns;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3056			'AmazonSNSemailnotification2017' : 'shape=mxgraph.aws3.email_notification;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3057			'AmazonSNSHTTPnotification2017' : 'shape=mxgraph.aws3.http_notification;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3058			'AmazonSNStopic2017' : 'shape=mxgraph.aws3.topic_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3059			'AmazonSQS2017' : 'shape=mxgraph.aws3.sqs;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3060			'AmazonSQSmessage2017' : 'shape=mxgraph.aws3.message;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3061			'AmazonSQSqueue2017' : 'shape=mxgraph.aws3.queue;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3062
3063// AWS 17 - Migration
3064			'AWSApplicationDiscoveryService2017' : 'shape=mxgraph.aws3.application_discovery_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3065			'AWSMigrationHub2017' : 'shape=mxgraph.aws3.migration_hub_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3066			'AWSSMS2017' : 'shape=mxgraph.aws3.server_migration_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3067			'AWSSnowball2017' : 'shape=mxgraph.aws3.snowball;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3068			'AWSSnowballimportexport2017' : 'shape=mxgraph.aws3.import_export;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3069
3070// AWS 17 - Mobile Services
3071			'AmazonCognito2017' : 'shape=mxgraph.aws3.cognito;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3072			'AmazonMobileAnalytics2017' : 'shape=mxgraph.aws3.mobile_analytics;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3073			'AWSDeviceFarm2017' : 'shape=mxgraph.aws3.device_farm;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3074			'AWSMobileHub2017' : 'shape=mxgraph.aws3.mobile_hub;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#AD688A;gradientColor=#F58435;gradientDirection=west;',
3075
3076// AWS 17 - Networking & Content Delivery
3077			'AmazonCloudFront2017' : 'shape=mxgraph.aws3.cloudfront;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3078			'AmazonCloudFrontdownloaddistribution2017' : 'shape=mxgraph.aws3.download_distribution;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3079			'AmazonCloudFrontedgelocation2017' : 'shape=mxgraph.aws3.edge_location;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3080			'AmazonCloudFrontstreamingdistribution2017' : 'shape=mxgraph.aws3.streaming_distribution;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3081			'AmazonRoute532017' : 'shape=mxgraph.aws3.route_53;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3082			'AmazonRoute53hostedzone2017' : 'shape=mxgraph.aws3.hosted_zone;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3083			'AmazonRoute53routetable2017' : 'shape=mxgraph.aws3.route_table;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3084			'AmazonVPCinternetgateway2017' : 'shape=mxgraph.aws3.internet_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3085			'AWSDirectConnect2017' : 'shape=mxgraph.aws3.direct_connect;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3086			'ElasticLoadBalancingClassicLoadBalancer2017' : 'shape=mxgraph.aws3.classic_load_balancer;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3087
3088// AWS 17 - On-Demand Workforce
3089			'AmazonMechanicalTurk2017' : 'shape=mxgraph.aws3.mechanical_turk;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3090			'AmazonMechanicalTurkassignmenttask2017' : 'shape=mxgraph.aws3.assignment_task;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3091			'AmazonMechanicalTurkhumanintelligencetasks2017' : 'shape=mxgraph.aws3.human_intelligence_tasks_hit;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3092			'AmazonMechanicalTurkrequester2017' : 'shape=mxgraph.aws3.requester;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3093			'AmazonMechanicalTurkworkers2017' : 'shape=mxgraph.aws3.users;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3094
3095// AWS 17 - SDKs
3096			'Xamarin2017' : 'shape=mxgraph.aws3.android;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3097			'Ruby2017' : 'shape=mxgraph.aws3.android;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3098			'Python2017' : 'shape=mxgraph.aws3.android;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3099			'PHP2017' : 'shape=mxgraph.aws3.android;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3100			'Nodejs2017' : 'shape=mxgraph.aws3.android;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3101			'Net2017' : 'shape=mxgraph.aws3.android;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3102			'JavaScript2017' : 'shape=mxgraph.aws3.android;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3103			'Java2017' : 'shape=mxgraph.aws3.android;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3104			'iOS2017' : 'shape=mxgraph.aws3.android;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3105			'AWSToolsForWindowsPowerShell2017' : 'shape=mxgraph.aws3.toolkit_for_windows_powershell;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3106			'AWSToolkitForVisualStudio2017' : 'shape=mxgraph.aws3.toolkit_for_visual_studio;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3107			'AWSToolkitForEclipse2017' : 'shape=mxgraph.aws3.toolkit_for_eclipse;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3108			'AWSCLI2017' : 'shape=mxgraph.aws3.cli;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3109			'Android2017' : 'shape=mxgraph.aws3.android;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3110
3111// AWS 17 - Serurity Identity and Compliance
3112			'ACMcertificatemanager2017' : 'shape=mxgraph.aws3.certificate_manager_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3113			'AmazonCloudDirectory2017' : 'shape=mxgraph.aws3.clouddirectory;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3114			'AmazonInspector2017' : 'shape=mxgraph.aws3.inspector;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3115			'AmazonInspectoragent2017' : 'shape=mxgraph.aws3.agent;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3116			'AmazonMacie2017' : 'shape=mxgraph.aws3.macie;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3117			'AWSArtifact2017' : 'shape=mxgraph.aws3.artifact;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3118			'AWSCertificateManager2017' : 'shape=mxgraph.aws3.certificate_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3119			'AWSCloudHSM2017' : 'shape=mxgraph.aws3.cloudhsm;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3120			'AWSDirectoryService2017' : 'shape=mxgraph.aws3.directory_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3121			'AWSKMS2017' : 'shape=mxgraph.aws3.kms;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3122			'AWSOrganizations2017' : 'shape=mxgraph.aws3.organizations;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3123			'AWSShield2017' : 'shape=mxgraph.aws3.shield;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3124			'AWSWAF2017' : 'shape=mxgraph.aws3.waf;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3125			'AWSWAFfilteringrule2017' : 'shape=mxgraph.aws3.filtering_rule;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3126			'IAM2017' : 'shape=mxgraph.aws3.iam;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3127			'IAMaddon2017' : 'shape=mxgraph.aws3.add_on;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3128			'IAMAWSSTS2017' : 'shape=mxgraph.aws3.sts;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3129			'IAMAWSSTS22017' : 'shape=mxgraph.aws3.sts_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3130			'IAMdataencryptionkey2017' : 'shape=mxgraph.aws3.data_encryption_key;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3131			'IAMencrypteddata2017' : 'shape=mxgraph.aws3.encrypted_data;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3132			'IAMlongtermsecuritycredential2017' : 'shape=mxgraph.aws3.long_term_security_credential;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#ffffff',
3133			'IAMMFAtoken2017' : 'shape=mxgraph.aws3.mfa_token;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3134			'IAMpermissions2017' : 'shape=mxgraph.aws3.permissions_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3135			'IAMrole2017' : 'shape=mxgraph.aws3.role;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3136			'IAMtemporarysecuritycredential2017' : 'shape=mxgraph.aws3.temporary_security_credential;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#ffffff',
3137
3138// AWS 17 - Storage
3139			'AmazonEBS2017' : 'shape=mxgraph.aws3.volume;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3140			'AmazonEFS2017' : 'shape=mxgraph.aws3.efs;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3141			'AmazonEFSEFSfilesystem2017' : 'shape=mxgraph.aws3.efs_share;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3142			'AmazonGlacier2017' : 'shape=mxgraph.aws3.glacier;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3143			'AmazonGlacierarchive2017' : 'shape=mxgraph.aws3.archive;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3144			'AmazonGlaciervault2017' : 'shape=mxgraph.aws3.vault;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3145			'AmazonS32017' : 'shape=mxgraph.aws3.s3;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3146			'AmazonS3bucket2017' : 'shape=mxgraph.aws3.bucket;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3147			'AmazonS3bucketwithobjects2017' : 'shape=mxgraph.aws3.bucket_with_objects;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3148			'AmazonS3object2017' : 'shape=mxgraph.aws3.object;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3149			'AWSStorageGateway2017' : 'shape=mxgraph.aws3.storage_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3150			'AWSStorageGatewaycachedvolume2017' : 'shape=mxgraph.aws3.cached_volume;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3151			'AWSStorageGatewaynoncachedvolume2017' : 'shape=mxgraph.aws3.non_cached_volume;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3152			'AWSStorageGatewayvirtualtapelibrary2017' : 'shape=mxgraph.aws3.virtual_tape_library;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3153			'snapshot2017' : 'shape=mxgraph.aws3.snapshot;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3154			'volume2017' : 'shape=mxgraph.aws3.volume;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3155
3156// AWS 19 Analytics
3157
3158			'AnalyticsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.analytics;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3159			'AmazonAthenaAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.athena;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3160			'AmazonCloudSearchAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloudsearch;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3161			'AmazonElasticsearchServiceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elasticsearch_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3162			'AmazonEMRAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.emr;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3163			'AmazonKinesisAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.kinesis;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3164			'AmazonKinesisDataAnalyticsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.kinesis_data_analytics;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3165			'AmazonKinesisDataFirehoseAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.kinesis_data_firehose;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3166			'AmazonKinesisDataStreamsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.kinesis_data_streams;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3167			'AmazonKinesisVideoStreamsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.kinesis_video_streams;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3168			'AmazonManagedStreamingforKafkaAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.managed_streaming_for_kafka;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3169			'AmazonQuickSightAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.quicksight;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3170			'AmazonRedshiftAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.redshift;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3171			'AWSDataPipelineAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.data_pipeline;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3172			'AWSGlueAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.glue;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3173			'AWSLakeFormationAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.lake_formation;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3174			'AmazonCloudSearch_SearchDocumentsAWS19' : 'shape=mxgraph.aws4.search_documents;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3175			'AmazonEMR_ClusterAWS19' : 'shape=mxgraph.aws4.cluster;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3176			'AmazonEMR_EMREngineAWS19' : 'shape=mxgraph.aws4.emr_engine;;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3177			'AmazonEMR_EMREngineMapRM3AWS19' : 'shape=mxgraph.aws4.emr_engine_mapr_m3;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3178			'AmazonEMR_EMREngineMapRM5AWS19' : 'shape=mxgraph.aws4.emr_engine_mapr_m5;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3179			'AmazonEMR_EMREngineMapRM7AWS19' : 'shape=mxgraph.aws4.emr_engine_mapr_m7;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3180			'AmazonRedshift_DenseComputeNodeAWS19' : 'shape=mxgraph.aws4.dense_compute_node;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3181			'AmazonRedshift_DenseStorageNodeAWS19' : 'shape=mxgraph.aws4.dense_storage_node;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3182			'AWSGlue_CrawlersAWS19' : 'shape=mxgraph.aws4.glue_crawlers;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3183			'AWSGlue_DataCatalogAWS19' : 'shape=mxgraph.aws4.glue_data_catalog;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3184			'AmazonEMR_HDFSClusterAWS19' : 'shape=mxgraph.aws4.cluster;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3185			'AWSDataLake_ResourceAWS19' : 'shape=mxgraph.aws4.data_lake_resource_icon;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3186
3187// AWS 19 - Application Integration
3188			'ApplicationIntegrationAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.application_integration;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3189			'AmazonMQAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.mq;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3190			'AmazonSimpleNotificationServiceSNSAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.sns;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3191			'AmazonSimpleQueueServiceSQSAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.sqs;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3192			'AWSAppSyncAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.sqs;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3193			'AWSStepFunctionsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.step_functions;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3194			'AmazonSimpleNotificationServiceSNS_EmailNotificationAWS19' : 'shape=mxgraph.aws4.email_notification;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3195			'AmazonSimpleNotificationServiceSNS_HTTPNotificationAWS19' : 'shape=mxgraph.aws4.http_notification;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3196			'AmazonSimpleNotificationServiceSNS_TopicAWS19' : 'shape=mxgraph.aws4.topic;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3197			'AmazonSimpleQueueServiceSQS_MessageAWS19' : 'shape=mxgraph.aws4.message;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3198			'AmazonSimpleQueueServiceSQS_QueueAWS19' : 'shape=mxgraph.aws4.queue;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3199			'AmazonAPIGateway_EndpointAWS19' : 'shape=mxgraph.aws4.endpoint;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3200			'AmazonEventBridgeAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.eventbridge;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3201			'AWSElementalAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elemental;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3202
3203// AWS 19 - AR & VR
3204			'ARVRAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.ar_vr;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3205			'AmazonSumerianAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.sumerian;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3206
3207// AWS 19 - Blockchain
3208			'BlockchainAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.blockchain;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3209			'AmazonManagedBlockchainAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.managed_blockchain;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3210			'AmazonQuantumLedgerDatabaseQLDBAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.quantum_ledger_database;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3211
3212// AWS 19 - Business Applications
3213			'BusinessApplicationAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.business_application;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3214			'AlexaForBusinessAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.alexa_for_business;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3215			'AmazonChimeAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.chime;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3216			'AmazonWorkDocsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.workdocs;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3217			'AmazonWorkMailAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.workmail;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3218
3219// AWS 19 - Compute
3220			'ComputeAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.compute;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3221			'AmazonEC2AWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.ec2;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3222			'AmazonEC2AutoScalingAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.auto_scaling2;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3223			'AmazonEC2ContainerRegistryAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.ecr;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3224			'AmazonElasticContainerServiceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.ecs;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3225			'AmazonElasticContainerServiceforKubernetesAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.eks;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3226			'AmazonLightsailAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.lightsail;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3227			'AWSBatchAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.batch;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3228			'AWSElasticBeanstalkAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elastic_beanstalk;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3229			'AWSFargateAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.fargate;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3230			'AWSLambdaAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.lambda;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3231			'AWSOutpostsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.outposts;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3232			'AWSServerlessApplicationRepositoryAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.serverless_application_repository;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3233			'ElasticLoadBalancingELBAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elastic_load_balancing;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3234			'VMwareCloudOnAWSAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.vmware_cloud_on_aws;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3235			'AmazonEC2_AMIAWS19' : 'shape=mxgraph.aws4.ami;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3236			'AmazonEC2_AutoScalingAWS19' : 'shape=mxgraph.aws4.auto_scaling2;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3237			'AmazonEC2ContainerRegistry_ImageAWS19' : 'shape=mxgraph.aws4.container_registry_image;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3238			'AmazonEC2ContainerRegistry_RegistryAWS19' : 'shape=mxgraph.aws4.registry;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3239			'AmazonEC2_ElasticIPAddressAWS19' : 'shape=mxgraph.aws4.elastic_ip_address;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3240			'AmazonEC2_RescueAWS19' : 'shape=mxgraph.aws4.rescue;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3241			'AmazonElasticContainerService_Container1AWS19' : 'shape=mxgraph.aws4.container_1;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3242			'AmazonElasticContainerService_Container2AWS19' : 'shape=mxgraph.aws4.container_2;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3243			'AmazonElasticContainerService_Container3AWS19' : 'shape=mxgraph.aws4.container_3;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3244			'AmazonElasticContainerService_ServiceAWS19' : 'shape=mxgraph.aws4.ecs_service;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3245			'AmazonElasticContainerService_TaskAWS19' : 'shape=mxgraph.aws4.ecs_task;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3246			'AWSElasticBeanstalk_ApplicationAWS19' : 'shape=mxgraph.aws4.application;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3247			'AWSElasticBeanstalk_DeploymentAWS19' : 'shape=mxgraph.aws4.deployment;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3248			'AWSLambda_LambdaFunctionAWS19' : 'shape=mxgraph.aws4.lambda_function;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3249			'AWSThinkboxDeadlineAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.thinkbox_deadline;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff;',
3250			'AWSThinkboxDraftAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.thinkbox_draft;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff;',
3251			'AWSThinkboxFrostAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.thinkbox_frost;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff;',
3252			'AWSThinkboxKrakatoaAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.thinkbox_krakatoa;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff;',
3253			'AWSThinkboxSequoiaAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.thinkbox_sequoia;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff;',
3254			'AWSThinkboxStokeAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.thinkbox_stoke;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff;',
3255			'AWSThinkboxXMeshAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.thinkbox_xmesh;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff;',
3256
3257
3258// AWS 19 - Cost Management
3259			'AWSCostManagementAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cost_management;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3260			'AWSBudgetsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.budgets;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3261			'AWSCostandUsageReportAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cost_and_usage_report;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3262			'AWSCostExplorerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cost_explorer;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3263			'ReservedInstanceReportingAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.reserved_instance_reporting;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3264
3265// AWS 19 - Customer Engagement
3266			'CustomerEngagementAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.customer_engagement;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3267			'AmazonConnectAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.connect;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3268			'AmazonPinpointAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.pinpoint;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3269			'AmazonSimpleEmailServiceSESAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.simple_email_service;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3270			'AmazonSimpleEmailServiceSES_EmailAWS19' : 'shape=mxgraph.aws4.email;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3271
3272// AWS 19 - Database
3273			'DatabaseAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.database;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3274			'AmazonAuroraAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.aurora;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3275			'AmazonDocumentDBwithMongoDBcompatibilityAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.documentdb_with_mongodb_compatibility;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3276			'AmazonDynamoDBAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.dynamodb;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3277			'AmazonElastiCacheAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elasticache;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3278			'AmazonNeptuneAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.neptune;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3279			'AmazonQuantumLedgerDatabase_QLDBAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.quantum_ledger_database;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3280			'AmazonRDSAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.rds;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3281			'AmazonRDSonVMwareAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.rds_on_vmware;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3282			'AmazonRedshift_blueAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.redshift;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3283			'AmazonTimestreamAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.timestream;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3284			'AWSDatabaseMigrationServiceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.database_migration_service;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3285			'AmazonDynamoDB_AttributeAWS19' : 'shape=mxgraph.aws4.attribute;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3286			'AmazonDynamoDB_AttributesAWS19' : 'shape=mxgraph.aws4.attributes;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3287			'AmazonDynamoDB_GlobalSecondaryIndexAWS19' : 'shape=mxgraph.aws4.global_secondary_index;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3288			'AmazonDynamoDB_ItemAWS19' : 'shape=mxgraph.aws4.item;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3289			'AmazonDynamoDB_ItemsAWS19' : 'shape=mxgraph.aws4.items;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3290			'AmazonDynamoDB_TableAWS19' : 'shape=mxgraph.aws4.table;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3291			'AmazonElastiCache_CacheNodeAWS19' : 'shape=mxgraph.aws4.cache_node;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3292			'AmazonElastiCache_ForMemcachedAWS19' : 'shape=mxgraph.aws4.elasticache_for_memcached;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3293			'AmazonElastiCache_ForRedisAWS19' : 'shape=mxgraph.aws4.elasticache_for_redis;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3294			'AmazonRedshift_DenseComputeNode_blueAWS19' : 'shape=mxgraph.aws4.dense_compute_node;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3295			'AmazonRedshift_DenseStorageNode_blueAWS19' : 'shape=mxgraph.aws4.dense_storage_node;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3296			'AWSDatabaseMigrationService_DatabaseMigrationWorkflowAWS19' : 'shape=mxgraph.aws4.database_migration_workflow_job;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3297			'AmazonDynamoDBDAXAWS19' : 'shape=mxgraph.aws4.dynamodb_dax;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3298
3299// AWS 19 - Desktop App Streaming
3300			'DesktopandAppStreamingAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.desktop_and_app_streaming;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3301			'AmazonAppstream2AWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.appstream_20;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3302			'AmazonWorkspacesAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.workspaces;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3303
3304// AWS 19 - Developer Tools
3305			'DeveloperToolsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.developer_tools;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3306			'AWSCloud9AWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloud9;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3307			'AWSCodeBuildAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.codebuild;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3308			'AWSCodeCommitAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.codecommit;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3309			'AWSCodeDeployAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.codedeploy;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3310			'AWSCodePipelineAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.codepipeline;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3311			'AWSCodeStarAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.codestar;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3312			'AWSCommandLineInterfaceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.command_line_interface;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3313			'AWSToolsAndSDKsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.tools_and_sdks;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3314			'AWSXRayAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.xray;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3315			'AWSCloudDevelopmentKitAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloud_development_kit;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3316
3317// AWS 19 - EC2 Instance Types
3318			'AmazonEC2_InstanceAWS19' : 'shape=mxgraph.aws4.instance2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3319			'AmazonEC2_InstancesAWS19' : 'shape=mxgraph.aws4.instances;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3320			'AmazonEC2_InstancewithCloudWatchAWS19' : 'shape=mxgraph.aws4.instance_with_cloudwatch2;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3321			'AmazonEC2_DBonInstanceAWS19' : 'shape=mxgraph.aws4.db_on_instance2;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3322			'AmazonEC2_SpotInstanceAWS19' : 'shape=mxgraph.aws4.spot_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3323			'AmazonEC2_HighMemoryInstanceAWS19' : 'shape=mxgraph.aws4.high_memory_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3324			'AmazonEC2_A1InstanceAWS19' : 'shape=mxgraph.aws4.a1_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3325			'AmazonEC2_OptimizedInstanceAWS19' : 'shape=mxgraph.aws4.optimized_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3326			'AmazonEC2_C4InstanceAWS19' : 'shape=mxgraph.aws4.c4_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3327			'AmazonEC2_C5InstanceAWS19' : 'shape=mxgraph.aws4.c5_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3328			'AmazonEC2_C5nInstanceAWS19' : 'shape=mxgraph.aws4.c5n_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3329			'AmazonEC2_D2InstanceAWS19' : 'shape=mxgraph.aws4.d2_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3330			'AmazonEC2_F1InstanceAWS19' : 'shape=mxgraph.aws4.f1_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3331			'AmazonEC2_G3InstanceAWS19' : 'shape=mxgraph.aws4.g3_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3332			'AmazonEC2_H1InstanceAWS19' : 'shape=mxgraph.aws4.h1_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3333			'AmazonEC2_I3InstanceAWS19' : 'shape=mxgraph.aws4.i3_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3334			'AmazonEC2_M4InstanceAWS19' : 'shape=mxgraph.aws4.m4_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3335			'AmazonEC2_M5aInstanceAWS19' : 'shape=mxgraph.aws4.m5a_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3336			'AmazonEC2_M5InstanceAWS19' : 'shape=mxgraph.aws4.m5_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3337			'AmazonEC2_P2InstanceAWS19' : 'shape=mxgraph.aws4.p2_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3338			'AmazonEC2_P3InstanceAWS19' : 'shape=mxgraph.aws4.p3_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3339			'AmazonEC2_R4InstanceAWS19' : 'shape=mxgraph.aws4.r4_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3340			'AmazonEC2_R5aInstanceAWS19' : 'shape=mxgraph.aws4.r5a_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3341			'AmazonEC2_R5InstanceAWS19' : 'shape=mxgraph.aws4.r5_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3342			'AmazonEC2_T2InstanceAWS19' : 'shape=mxgraph.aws4.t2_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3343			'AmazonEC2_T3aInstanceAWS19' : 'shape=mxgraph.aws4.t3a_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3344			'AmazonEC2_T3InstanceAWS19' : 'shape=mxgraph.aws4.t3_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3345			'AmazonEC2_X1eInstanceAWS19' : 'shape=mxgraph.aws4.x1e_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3346			'AmazonEC2_X1InstanceAWS19' : 'shape=mxgraph.aws4.x1_instance2;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3347			'AmazonEC2_z1dInstanceAWS19' : 'shape=mxgraph.aws4.z1d_instance;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3348
3349			'AmazonWorkLinkAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.worklink;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3350
3351// AWS 19 - Game Tech
3352			'GameTechAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.game_tech;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3353			'AmazonGameLiftAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.gamelift;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3354
3355// AWS 19 - General
3356			'AWSMarketplaceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.marketplace;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3357			'AWSGeneral_AWSCloudAWS19' : 'shape=mxgraph.aws4.aws_cloud;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3358			'AWSGeneral_CorporateDataCenterAWS19' : 'shape=mxgraph.aws4.corporate_data_center;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3359			'AWSGeneral_DiskAWS19' : 'shape=mxgraph.aws4.disk;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3360			'AWSGeneral_ForumsAWS19' : 'shape=mxgraph.aws4.forums;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3361			'AWSGeneral_GenericDatabaseAWS19' : 'shape=mxgraph.aws4.generic_database;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3362			'AWSGeneral_InternetAlt1AWS19' : 'shape=mxgraph.aws4.internet;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3363			'AWSGeneral_InternetAlt2AWS19' : 'shape=mxgraph.aws4.internet_alt1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3364			'AWSGeneral_InternetGatewayAWS19' : 'shape=mxgraph.aws4.internet_alt2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3365			'AWSGeneral_MobileClientAWS19' : 'shape=mxgraph.aws4.mobile_client;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3366			'AWSGeneral_MultimediaAWS19' : 'shape=mxgraph.aws4.multimedia;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3367			'AWSGeneral_OfficeBuildingAWS19' : 'shape=mxgraph.aws4.office_building;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3368			'AWSGeneral_SAMLTokenAWS19' : 'shape=mxgraph.aws4.saml_token;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3369			'AWSGeneral_SDKAWS19' : 'shape=mxgraph.aws4.external_sdk;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3370			'AWSGeneral_SSLPadlockAWS19' : 'shape=mxgraph.aws4.ssl_padlock;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3371			'AWSGeneral_TapeStorageAWS19' : 'shape=mxgraph.aws4.tape_storage;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3372			'AWSGeneral_ToolkitAWS19' : 'shape=mxgraph.aws4.external_toolkit;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3373			'AWSGeneral_TraditionalServerAWS19' : 'shape=mxgraph.aws4.traditional_server;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3374			'AWSGeneral_UserAWS19' : 'shape=mxgraph.aws4.user;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3375			'AWSGeneral_UsersAWS19' : 'shape=mxgraph.aws4.users;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3376			'AWSGeneral_VirtualPrivateCloudAWS19' : 'shape=mxgraph.aws4.virtual_private_cloud;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3377			'ClientAWS19' : 'shape=mxgraph.aws4.client;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3378			'External_SDKAWS19' : 'shape=mxgraph.aws4.external_sdk;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3379			'External_ToolkitAWS19' : 'shape=mxgraph.aws4.external_toolkit;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3380
3381// AWS 19 - Groups (Note: repeated below without _v2)
3382			'AWSCloudAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_aws_cloud;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fillColor=none',
3383			'AWSCloudaltAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_aws_cloud_alt;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fillColor=none',
3384			'RegionAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_region;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;dashed=1;fontColor=#0E82B8;fillColor=none',
3385			'AvailabilityZoneAWS19_v2' : 'verticalAlign=top;fillColor=none;fillOpacity=100;dashed=1;dashPattern=5 5;fontColor=#0E82B8',
3386			'SecuritygroupAWS19_v2' : 'verticalAlign=top;fillColor=none;fillOpacity=100',
3387			'AutoScalingAWS19_v2' : 'shape=mxgraph.aws4.groupCenter;grIcon=mxgraph.aws4.group_auto_scaling_group;grStroke=1;verticalAlign=top;fillColor=none;fillOpacity=100;fontColor=#D75F17;spacingTop=25;fillColor=none',
3388			'VirtualprivatecloudVPCAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_vpc;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#2C8723;fillColor=none',
3389			'PrivateSubnetAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_security_group;grStroke=0;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;strokeColor=#0E82B8;fillColor=none',
3390			'PublicSubnetAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_security_group;grStroke=0;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;strokeColor=#2C8723;fontColor=#2C8723;fillColor=none',
3391			'ServercontentsAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_on_premise;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#5A6C86;fillColor=none',
3392			'CorporatedatacenterAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_corporate_data_center;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#5A6C86;fillColor=none',
3393			'ElasticBeanstalkcontainerAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_elastic_beanstalk;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#D75F17;fillColor=none',
3394			'EC2instancecontentsAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_ec2_instance_contents;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#D75F17;fillColor=none',
3395			'SpotFleetAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_spot_fleet;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#D75F17;fillColor=none',
3396			'AWSStepFunctionAWS19_v2' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_aws_step_functions_workflow;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#CB1261;fillColor=none',
3397			'GenericGroup1AWS19_v2' : 'verticalAlign=top;align=center;fillColor=none;fillOpacity=100;dashed=1;dashPattern=5 5;strokeColor=#5A6C86;fontColor=#5A6C86',
3398			'GenericGroup2AWS19_v2' : 'verticalAlign=top;align=center',
3399
3400			//Repeated from the above
3401			'AWSCloudAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_aws_cloud;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fillColor=none',
3402			'AWSCloudaltAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_aws_cloud_alt;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fillColor=none',
3403			'RegionAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_region;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;dashed=1;fontColor=#0E82B8;fillColor=none',
3404			'AvailabilityZoneAWS19' : 'verticalAlign=top;fillColor=none;fillOpacity=100;dashed=1;dashPattern=5 5;fontColor=#0E82B8;strokeOpacity=100;strokeColor=#147eba',
3405			'SecuritygroupAWS19' : 'verticalAlign=top;fillColor=none;fillOpacity=100;fontColor=#DD3522',
3406			'AutoScalingAWS19' : 'shape=mxgraph.aws4.groupCenter;grIcon=mxgraph.aws4.group_auto_scaling_group;grStroke=1;verticalAlign=top;fillColor=none;fillOpacity=100;fontColor=#D75F17;spacingTop=25;fillColor=none',
3407			'VirtualprivatecloudVPCAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_vpc;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#2C8723;fillColor=none',
3408			'PrivateSubnetAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_security_group;grStroke=0;verticalAlign=top;align=left;spacingLeft=30;strokeColor=#0E82B8;fontColor=#0E82B8;fillOpacity=13;fillColor=#147eba',
3409			'PublicSubnetAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_security_group;grStroke=0;verticalAlign=top;align=left;spacingLeft=30;strokeColor=#2C8723;fontColor=#2C8723;fillOpacity=13;fillColor=#248814',
3410			'ServercontentsAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_on_premise;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#5A6C86;fillColor=none',
3411			'CorporatedatacenterAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_corporate_data_center;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#5A6C86;fillColor=none',
3412			'ElasticBeanstalkcontainerAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_elastic_beanstalk;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#D75F17;fillColor=none',
3413			'EC2instancecontentsAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_ec2_instance_contents;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#D75F17;fillColor=none',
3414			'SpotFleetAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_spot_fleet;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#D75F17;fillColor=none',
3415			'AWSStepFunctionAWS19' : 'shape=mxgraph.aws4.group;grIcon=mxgraph.aws4.group_aws_step_functions_workflow;verticalAlign=top;align=left;spacingLeft=30;fillOpacity=100;fontColor=#CB1261;fillColor=none',
3416			'GenericGroup1AWS19' : 'verticalAlign=top;align=center;fillColor=none;fillOpacity=100;dashed=1;dashPattern=5 5;strokeColor=#5A6C86;fontColor=#5A6C86',
3417			'GenericGroup2AWS19' : 'verticalAlign=top;align=center;fillOpacity=100;fillColor=#EAECEF',
3418// AWS 19 - Internet of Things
3419			'InternetofThingsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.internet_of_things;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3420			'AmazonFreeRTOSlightbgAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.freertos;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3421			'AWSIoT1ClickAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.iot_1click;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3422			'AWSIoTButtonAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.iot_button;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3423			'AWSIoTCoreAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.iot_core;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3424			'AWSIoTDeviceDefenderAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.iot_device_defender;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3425			'AWSIoTDeviceManagementAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.iot_device_management;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3426			'AWSIoTEventsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.iot_events;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3427			'AWSIoTGreengrassAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.greengrass;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3428			'AWSIoTSiteWiseAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.iot_sitewise;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3429			'AWSIoTThingsGraphAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.iot_things_graph;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3430			'AWSIoTAnalyticsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.iot_analytics;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3431			'AWSIoTAnalytics_ChannelAWS19' : 'shape=mxgraph.aws4.iot_analytics_channel;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3432			'AWSIoTAnalytics_DataStoreAWS19' : 'shape=mxgraph.aws4.iot_analytics_data_store;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3433			'AWSIoTAnalytics_PipelineAWS19' : 'shape=mxgraph.aws4.iot_analytics_pipeline;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3434			'IoT_ActionAWS19' : 'shape=mxgraph.aws4.action;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3435			'IoT_ActuatorAWS19' : 'shape=mxgraph.aws4.actuator;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3436			'IoT_AlexaEnabledDeviceAWS19' : 'shape=mxgraph.aws4.alexa_enabled_device;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3437			'IoT_AlexaSkillAWS19' : 'shape=mxgraph.aws4.alexa_skill;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3438			'IoT_AlexaVoiceServiceAWS19' : 'shape=mxgraph.aws4.alexa_skill;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3439			'IoT_BankAWS19' : 'shape=mxgraph.aws4.bank;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3440			'IoT_BicycleAWS19' : 'shape=mxgraph.aws4.bycicle;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3441			'IoT_CameraAWS19' : 'shape=mxgraph.aws4.camera;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3442			'IoT_CarAWS19' : 'shape=mxgraph.aws4.car;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3443			'IoT_CartAWS19' : 'shape=mxgraph.aws4.cart;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3444			'IoT_CertificateManagerAWS19' : 'shape=mxgraph.aws4.certificate_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3445			'IoT_CoffeePotAWS19' : 'shape=mxgraph.aws4.coffee_pot;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3446			'IoT_DesiredStateAWS19' : 'shape=mxgraph.aws4.desired_state;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3447			'IoT_DeviceGatewayAWS19' : 'shape=mxgraph.aws4.iot_device_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3448			'IoT_DoorLockAWS19' : 'shape=mxgraph.aws4.door_lock;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3449			'IoT_EchoAWS19' : 'shape=mxgraph.aws4.echo;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3450			'IoT_FactoryAWS19' : 'shape=mxgraph.aws4.factory;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3451			'IoT_FireTVAWS19' : 'shape=mxgraph.aws4.firetv;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3452			'IoT_FireTVStickAWS19' : 'shape=mxgraph.aws4.firetv_stick;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3453			'IoT_GenericAWS19' : 'shape=mxgraph.aws4.generic;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3454			'IoT_HardwareBoardAWS19' : 'shape=mxgraph.aws4.hardware_board;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3455			'IoT_HouseAWS19' : 'shape=mxgraph.aws4.house;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3456			'IoT_HTTP2ProtocolAWS19' : 'shape=mxgraph.aws4.http2_protocol;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3457			'IoT_HTTPProtocolAWS19' : 'shape=mxgraph.aws4.http_protocol;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3458			'IoT_LambdaFunctionAWS19' : 'shape=mxgraph.aws4.lambda_function;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3459			'IoT_LightbulbAWS19' : 'shape=mxgraph.aws4.lightbulb;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3460			'IoT_MedicalEmergencyAWS19' : 'shape=mxgraph.aws4.medical_emergency;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3461			'IoT_MQTTProtocolAWS19' : 'shape=mxgraph.aws4.mqtt_protocol;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3462			'IoT_OverTheAirUpdateAWS19' : 'shape=mxgraph.aws4.iot_over_the_air_update;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3463			'IoT_PoliceEmergencyAWS19' : 'shape=mxgraph.aws4.police_emergency;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3464			'IoT_PolicyAWS19' : 'shape=mxgraph.aws4.policy;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3465			'IoT_ReportedStateAWS19' : 'shape=mxgraph.aws4.reported_state;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3466			'IoT_RuleAWS19' : 'shape=mxgraph.aws4.rule;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3467			'IoT_SensorAWS19' : 'shape=mxgraph.aws4.sensor;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3468			'IoT_ServoAWS19' : 'shape=mxgraph.aws4.servo;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3469			'IoT_ShadowAWS19' : 'shape=mxgraph.aws4.shadow;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3470			'IoT_SimulatorAWS19' : 'shape=mxgraph.aws4.simulator;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3471			'IoT_ThermostatAWS19' : 'shape=mxgraph.aws4.thermostat;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3472			'IoT_TopicAWS19' : 'shape=mxgraph.aws4.topic_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3473			'IoT_TravelAWS19' : 'shape=mxgraph.aws4.travel;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3474			'IoT_UtilityAWS19' : 'shape=mxgraph.aws4.utility;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3475			'IoT_WindfarmAWS19' : 'shape=mxgraph.aws4.windfarm;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3476			'AWSIoTGreengrass_ConnectorAWS19' : 'shape=mxgraph.aws4.connector;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3477			'AWSIoTAnalytics_DataSetAWS19' : 'shape=mxgraph.aws4.data_set;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3478			'AWSIoTAnalytics_NotebookAWS19' : 'shape=mxgraph.aws4.notebook;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3479
3480// AWS 19 - Machine Learning
3481			'MachineLearningAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.machine_learning;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3482			'AmazonComprehendAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.comprehend;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3483			'AmazonElasticInferenceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elastic_inference;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3484			'AmazonForecastAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.forecast;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3485			'AmazonLexAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.lex;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3486			'AmazonPersonalizeAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.personalize;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3487			'AmazonPollyAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.polly;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3488			'AmazonRekognitionAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.rekognition;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3489			'AmazonSageMakerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.sagemaker;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3490			'AmazonSageMakerGroundTruthAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.sagemaker_ground_truth;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3491			'AmazonTextractAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.textract;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3492			'AmazonTranscribeAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.transcribe;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3493			'AmazonTranslateAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.translate;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3494			'ApacheMXNetonAWSAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.apache_mxnet_on_aws;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3495			'AWSDeepLearningAMIsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.deep_learning_amis;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3496			'AWSDeepLensAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.deeplens;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3497			'AWSDeepRacerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.deepracer;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3498			'TensorFlowonAWSAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.tensorflow_on_aws;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3499			'AmazonSageMaker_ModelAWS19' : 'shape=mxgraph.aws4.sagemaker_model;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3500			'AmazonSageMaker_NotebookAWS19' : 'shape=mxgraph.aws4.sagemaker_notebook;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3501			'AmazonSageMaker_TrainAWS19' : 'shape=mxgraph.aws4.sagemaker_train;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3502			'AmazonRekognition_ImageAWS19' : 'shape=mxgraph.aws4.rekognition_image;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3503			'AmazonRekognition_VideoAWS19' : 'shape=mxgraph.aws4.rekognition_video;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3504			'AWSDeepLearningContainersAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.deep_learning_containers;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3505
3506// AWS 19 - Management & Governance
3507			'ManagementandGovernanceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.management_and_governance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3508			'AmazonCloudWatchAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloudwatch;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3509			'AWSAutoScalingAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.autoscaling;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3510			'AWSCloudFormationAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloudformation;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3511			'AWSCloudTrailAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloudtrail;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3512			'AWSCommandLineInterface_pinkAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.command_line_interface;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3513			'AWSConfigAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.config;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3514			'AWSControlTowerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.control_tower;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3515			'AWSLicenseManagerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.license_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3516			'AWSManagedServicesAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.managed_services;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3517			'AWSManagementConsoleAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.management_console;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3518			'AWSOpsWorksAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.opsworks;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3519			'AWSPersonalHealthDashboardAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.personal_health_dashboard;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3520			'AWSServiceCatalogAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.service_catalog;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3521			'AWSSystemsManagerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.systems_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3522			'AWSTrustedAdvisorAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.trusted_advisor;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3523			'AWSWellArchitectedToolAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.well_architected_tool;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3524			'AmazonCloudWatch_AlarmAWS19' : 'shape=mxgraph.aws4.alarm;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3525			'AmazonCloudWatch_EventEventBasedAWS19' : 'shape=mxgraph.aws4.event_event_based;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3526			'AmazonCloudWatch_EventTimeBasedAWS19' : 'shape=mxgraph.aws4.event_time_based;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3527			'AmazonCloudWatch_RuleAWS19' : 'shape=mxgraph.aws4.rule_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3528			'AWSCloudFormation_ChangeSetAWS19' : 'shape=mxgraph.aws4.change_set;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3529			'AWSCloudFormation_StackAWS19' : 'shape=mxgraph.aws4.stack;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3530			'AWSCloudFormation_TemplateAWS19' : 'shape=mxgraph.aws4.template;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3531			'AWSOpsWorks_AppsAWS19' : 'shape=mxgraph.aws4.opsworks_apps;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3532			'AWSOpsWorks_DeploymentsAWS19' : 'shape=mxgraph.aws4.deployments;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3533			'AWSOpsWorks_InstancesAWS19' : 'shape=mxgraph.aws4.instances_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3534			'AWSOpsWorks_LayersAWS19' : 'shape=mxgraph.aws4.layers;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3535			'AWSOpsWorks_MonitoringAWS19' : 'shape=mxgraph.aws4.monitoring;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3536			'AWSOpsWorks_PermissionsAWS19' : 'shape=mxgraph.aws4.opsworks_permissions;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3537			'AWSOpsWorks_ResourcesAWS19' : 'shape=mxgraph.aws4.resources;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3538			'AWSOpsWorks_Stack2AWS19' : 'shape=mxgraph.aws4.stack2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3539			'AWSSystemsManager_AutomationAWS19' : 'shape=mxgraph.aws4.automation;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3540			'AWSSystemsManager_DocumentsAWS19' : 'shape=mxgraph.aws4.documents;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3541			'AWSSystemsManager_InventoryAWS19' : 'shape=mxgraph.aws4.inventory;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3542			'AWSSystemsManager_MaintenanceWindowsAWS19' : 'shape=mxgraph.aws4.maintenance_windows;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3543			'AWSSystemsManager_ParameterStoreAWS19' : 'shape=mxgraph.aws4.parameter_store;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3544			'AWSSystemsManager_PatchManagerAWS19' : 'shape=mxgraph.aws4.patch_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3545			'AWSSystemsManager_RunCommandAWS19' : 'shape=mxgraph.aws4.run_command;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3546			'AWSSystemsManager_StateManagerAWS19' : 'shape=mxgraph.aws4.state_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3547			'AWSTrustedAdvisor_ChecklistAWS19' : 'shape=mxgraph.aws4.checklist;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3548			'AWSTrustedAdvisor_ChecklistCostAWS19' : 'shape=mxgraph.aws4.checklist_cost;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3549			'AWSTrustedAdvisor_ChecklistFaultTolerantAWS19' : 'shape=mxgraph.aws4.checklist_fault_tolerant;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3550			'AWSTrustedAdvisor_ChecklistPerformanceAWS19' : 'shape=mxgraph.aws4.checklist_performance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3551			'AWSTrustedAdvisor_ChecklistSecurityAWS19' : 'shape=mxgraph.aws4.checklist_security;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3552			'AWSOrganizationsAWS19_v2' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.organizations;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3553			'AWSSystemsManagerOpsCenterAWS19' : 'shape=mxgraph.aws4.systems_manager_opscenter;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3554
3555// AWS 19 - Media Services
3556			'MediaServicesAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.media_services;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3557			'AmazonElasticTranscoderAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elastic_transcoder;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3558			'AmazonKinesisVideoStreams_orangeAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.kinesis_video_streams;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3559			'AWSElementalMediaConnectAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elemental_mediaconnect;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3560			'AWSElementalMediaConvertAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elemental_mediaconvert;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3561			'AWSElementalMediaLiveAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elemental_medialive;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3562			'AWSElementalMediaPackageAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elemental_mediapackage;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3563			'AWSElementalMediaStoreAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elemental_mediastore;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3564			'AWSElementalMediaTailorAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elemental_mediatailor;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3565
3566// AWS 19 - Migration & Transfer
3567			'MigrationandTransferAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.migration_and_transfer;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3568			'AWSApplicationDiscoveryServiceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.application_discovery_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3569			'AWSDatabaseMigrationService_greenAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.database_migration_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3570			'AWSDataSyncAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.datasync;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3571			'AWSMigrationHubAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.migration_hub;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3572			'AWSServerMigrationServiceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.server_migration_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3573			'AWSSnowballAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.snowball;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3574			'AWSSnowballEdgeAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.snowball_edge;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3575			'AWSSnowmobileAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.snowmobile;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3576			'AWSTransferforSFTPAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.transfer_for_sftp;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3577			'AWSDataSync_AgentAWS19' : 'shape=mxgraph.aws4.agent2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3578// AWS 19 - Mobile
3579			'MobileAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.mobile;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3580			'AmazonAPIGatewayAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.api_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3581			'AmazonPinpoint_redAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.pinpoint;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3582			'AWSAmplifyAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.amplify;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3583			'AWSAppSync_redAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.appsync;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3584			'AWSDeviceFarmAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.device_farm;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3585
3586// AWS 19 - Networking & Content Delivery
3587			'NetworkingandContentDeliveryAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.networking_and_content_delivery;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3588			'AmazonAPIGateway_purpleAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.api_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3589			'AmazonCloudFrontAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloudfront;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3590			'AmazonRoute53AWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.route_53;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3591			'AmazonVPCAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.vpc;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3592			'AmazonVPCPrivateLinkAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.vpc_privatelink;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3593			'AWSAppMeshAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.app_mesh;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3594			'AWSClientVPNAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.client_vpn;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3595			'AWSCloudMapAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloud_map;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3596			'AWSDirectConnectAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.direct_connect;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3597			'AWSGlobalAcceleratorAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.global_accelerator;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3598			'AWSTransitGatewayAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.transit_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3599			'AmazonCloudFront_DownloadDistributionAWS19' : 'shape=mxgraph.aws4.download_distribution;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3600			'AmazonCloudFront_EdgeLocationAWS19' : 'shape=mxgraph.aws4.edge_location;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3601			'AmazonCloudFront_StreamingDistributionAWS19' : 'shape=mxgraph.aws4.streaming_distribution;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3602			'AmazonRoute53_HostedZoneAWS19' : 'shape=mxgraph.aws4.hosted_zone;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3603			'AmazonRoute53_RouteTableAWS19' : 'shape=mxgraph.aws4.route_table;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3604			'AmazonVPC_CustomerGatewayAWS19' : 'shape=mxgraph.aws4.customer_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3605			'AmazonVPC_ElasticNetworkAdapterAWS19' : 'shape=mxgraph.aws4.elastic_network_adapter;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3606			'AmazonVPC_ElasticNetworkInterfaceAWS19' : 'shape=mxgraph.aws4.elastic_network_interface;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3607			'AmazonVPC_EndpointsAWS19' : 'shape=mxgraph.aws4.endpoints;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3608			'AmazonVPC_FlowLogsAWS19' : 'shape=mxgraph.aws4.flow_logs;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3609			'AmazonVPC_InternetGatewayAWS19' : 'shape=mxgraph.aws4.internet_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3610			'AmazonVPC_NATGatewayAWS19' : 'shape=mxgraph.aws4.nat_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3611			'AmazonVPC_NetworkAccessControlListAWS19' : 'shape=mxgraph.aws4.network_access_control_list;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3612			'AmazonVPC_PeeringAWS19' : 'shape=mxgraph.aws4.peering;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3613			'AmazonVPC_RouterAWS19' : 'shape=mxgraph.aws4.router;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3614			'AmazonVPC_VPNConnectionAWS19' : 'shape=mxgraph.aws4.vpn_connection;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3615			'AmazonVPC_VPNGatewayAWS19' : 'shape=mxgraph.aws4.vpn_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3616			'AmazonNetworkingAPIGateway_EndpointAWS19' : 'shape=mxgraph.aws4.endpoint;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3617			'AmazonVPCTrafficMirroringAWS19' : 'shape=mxgraph.aws4.vpc_traffic_mirroring;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3618			'AWSSitetoSiteVPNAWS19' : 'shape=mxgraph.aws4.site_to_site_vpn;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3619			'ElasticLoadBalancing_ApplicationloadbalancerAWS19' : 'shape=mxgraph.aws4.application_load_balancer;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3620			'ElasticLoadBalancingELBAWS19_v2' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elastic_load_balancing;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3621			'ElasticLoadBalancing_ClassicloadbalancerAWS19' : 'shape=mxgraph.aws4.classic_load_balancer;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3622			'ElasticLoadBalancing_NetworkloadbalancerAWS19' : 'shape=mxgraph.aws4.network_load_balancer;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3623
3624// AWS 19 - Robotics
3625			'RoboticsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.robotics;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3626			'AWSRoboMakerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.robotics;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3627			'AWSRoboMaker_CloudExtensionROSAWS19' : 'shape=mxgraph.aws4.cloud_extension_ros;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3628			'AWSRoboMaker_DevelopmentEnvironmentAWS19' : 'shape=mxgraph.aws4.development_environment;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3629			'AWSRoboMaker_FleetManagementAWS19' : 'shape=mxgraph.aws4.fleet_management;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3630			'AWSRoboMaker_SimulationAWS19' : 'shape=mxgraph.aws4.simulation;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3631
3632// AWS 19 - Satellite
3633			'SatelliteAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.satellite;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3634			'AWSGroundStationAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.ground_station;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3635
3636// AWS 19 - Security, Identity & Compliance
3637			'SecurityIdentityandComplianceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.security_identity_and_compliance;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3638			'AmazonCloudDirectoryAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloud_directory;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3639			'AmazonCognitoAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cognito;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3640			'AmazonGuardDutyAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.guardduty;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3641			'AmazonInspectorAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.inspector;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3642			'AmazonMacieAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.macie;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3643			'AWSArtifactAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.artifact;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3644			'AWSCertificateManagerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.certificate_manager_3;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3645			'AWSCloudHSMAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.cloudhsm;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3646			'AWSDirectoryServiceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.directory_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3647			'AWSFirewallManagerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.firewall_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3648			'AWSIdentityandAccessManagement_IAMAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.identity_and_access_management;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3649			'AWSKeyManagementServiceAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.key_management_service;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3650			'AWSOrganizationsAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.organizations;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3651			'AWSSecretsManagerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.secrets_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3652			'AWSSecurityHubAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.security_hub;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3653			'AWSShieldAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.shield;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3654			'AWSSingleSignOnAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.single_sign_on;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3655			'AWSWAFAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.waf;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3656			'AmazonInspector_AgentAWS19' : 'shape=mxgraph.aws4.agent;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3657			'AWSCertificateManager_CertificateManagerAWS19' : 'shape=mxgraph.aws4.certificate_manager_2;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3658			'AWSIdentityandAccessManagementIAM_AddonAWS19' : 'shape=mxgraph.aws4.addon;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3659			'AWSIdentityandAccessManagementIAM_AWSSTSAWS19' : 'shape=mxgraph.aws4.sts;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3660			'AWSIdentityandAccessManagementIAM_AWSSTSAlternateAWS19' : 'shape=mxgraph.aws4.sts_alternate;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3661			'AWSIdentityandAccessManagementIAM_DataEncryptionKeyAWS19' : 'shape=mxgraph.aws4.data_encryption_key;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3662			'AWSIdentityandAccessManagementIAM_EncryptedDataAWS19' : 'shape=mxgraph.aws4.encrypted_data;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3663			'AWSIdentityandAccessManagementIAM_LongtermSecurityCredentialAWS19' : 'shape=mxgraph.aws4.long_term_security_credential;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3664			'AWSIdentityandAccessManagementIAM_MFATokenAWS19' : 'shape=mxgraph.aws4.mfa_token;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3665			'AWSIdentityandAccessManagementIAM_PermissionsAWS19' : 'shape=mxgraph.aws4.permissions;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3666			'AWSIdentityandAccessManagementIAM_RoleAWS19' : 'shape=mxgraph.aws4.role;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3667			'AWSIdentityandAccessManagementIAM_TemporarySecurityCredentialAWS19' : 'shape=mxgraph.aws4.temporary_security_credential;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3668			'AWSOrganizations_AccountAWS19' : 'shape=mxgraph.aws4.organizations_account;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3669			'AWSOrganizations_OrganizationalUnitAWS19' : 'shape=mxgraph.aws4.organizations_organizational_unit;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3670			'AWSShield_ShieldAdvancedAWS19' : 'shape=mxgraph.aws4.shield_shield_advanced;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3671			'AWSWAF_FilteringruleAWS19' : 'shape=mxgraph.aws4.filtering_rule;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3672			'AWSADConnectorAWS19' : 'shape=mxgraph.aws4.ad_connector;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3673			'AWSSimpleADAWS19' : 'shape=mxgraph.aws4.simple_ad;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3674			'AWSManagedMicrosoftADAWS19' : 'shape=mxgraph.aws4.managed_ms_ad;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3675			'AWSResourceAccessManagerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.resource_access_manager;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3676
3677
3678// AWS 19 - Storage
3679			'StorageAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.storage;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top',
3680			'AmazonElasticBlockStoreEBSAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elastic_block_store;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3681			'AmazonElasticFileSystem_EFSAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.elastic_file_system;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3682			'AmazonFSxAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.fsx;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3683			'AmazonFSxforLustreAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.fsx_for_lustre;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3684			'AmazonFSxforWindowsFileServerAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.fsx_for_windows_file_server;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3685			'AmazonS3GlacierAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.glacier;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3686			'AmazonSimpleStorageServiceS3AWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.s3;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3687			'AWSBackupAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.backup;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3688			'AWSSnowball_greenAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.snowball;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3689			'AWSSnowballEdge_greenAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.snowball_edge;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3690			'AWSSnowmobile_greenAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.snowmobile;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3691			'AWSStorageGatewayAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.storage_gateway;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3692			'AmazonElasticBlockStoreEBS_SnapshotAWS19' : 'shape=mxgraph.aws4.snapshot;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3693			'AmazonElasticBlockStoreEBS_VolumeAWS19' : 'shape=mxgraph.aws4.volume;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3694			'AmazonS3Glacier_ArchiveAWS19' : 'shape=mxgraph.aws4.archive;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3695			'AmazonS3Glacier_VaultAWS19' : 'shape=mxgraph.aws4.vault;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3696			'AmazonSimpleStorageServiceS3_BucketAWS19' : 'shape=mxgraph.aws4.bucket;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3697			'AmazonSimpleStorageServiceS3_BucketwithObjectsAWS19' : 'shape=mxgraph.aws4.bucket_with_objects;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3698			'AmazonSimpleStorageServiceS3_ObjectAWS19' : 'shape=mxgraph.aws4.object;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3699			'AWSSnowFamily_SnowballImportExportAWS19' : 'shape=mxgraph.aws4.import_export;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3700			'AWSStorageGateway_CachedVolumeAWS19' : 'shape=mxgraph.aws4.cached_volume;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3701			'AWSStorageGateway_NonCachedVolumeAWS19' : 'shape=mxgraph.aws4.non_cached_volume;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3702			'AWSStorageGateway_VirtualTapeLibraryAWS19' : 'shape=mxgraph.aws4.virtual_tape_library;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3703			'AmazonElasticFileSystem_EFS_FilesystemAWS19' : 'shape=mxgraph.aws4.file_system;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=none',
3704			'EFSInfrequentAccessAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.efs_infrequentaccess;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3705			'EFSStandardAWS19' : 'shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.efs_standard;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;strokeColor=#ffffff',
3706
3707// GCP - Service Cards
3708			'GCPServiceCardApplicationSystemBlock' : cs,
3709			'GCPServiceCardAuthorizationBlock' : cs,
3710			'GCPServiceCardBlankBlock' : cs,
3711			'GCPServiceCardReallyBlankBlock' : cs,
3712			'GCPServiceCardBucketBlock' : cs,
3713			'GCPServiceCardCDNInterconnectBlock' : cs,
3714			'GCPServiceCardCloudDNSBlock' : cs,
3715			'GCPServiceCardClusterBlock' : cs,
3716			'GCPServiceCardDiskSnapshotBlock' : cs,
3717			'GCPServiceCardEdgePopBlock' : cs,
3718			'GCPServiceCardFrontEndPlatformServicesBlock' : cs,
3719			'GCPServiceCardGatewayBlock' : cs,
3720			'GCPServiceCardGoogleNetworkBlock' : cs,
3721			'GCPServiceCardImageServicesBlock' : cs,
3722			'GCPServiceCardLoadBalancerBlock' : cs,
3723			'GCPServiceCardLocalComputeBlock' : cs,
3724			'GCPServiceCardLocalStorageBlock' : cs,
3725			'GCPServiceCardLogsAPIBlock' : cs,
3726			'GCPServiceCardMemcacheBlock' : cs,
3727			'GCPServiceCardNATBlock' : cs,
3728			'GCPServiceCardPaymentFormBlock' : cs,
3729			'GCPServiceCardPushNotificationsBlock' : cs,
3730			'GCPServiceCardScheduledTasksBlock' : cs,
3731			'GCPServiceCardServiceDiscoveryBlock' : cs,
3732			'GCPServiceCardSquidProxyBlock' : cs,
3733			'GCPServiceCardTaskQueuesBlock' : cs,
3734			'GCPServiceCardVirtualFileSystemBlock' : cs,
3735			'GCPServiceCardVPNGatewayBlock' : cs,
3736
3737// GCP - Device Cards
3738			'GCPInputDatabase' : cs,
3739			'GCPInputRecord' : cs,
3740			'GCPInputPayment' : cs,
3741			'GCPInputGateway' : cs,
3742			'GCPInputLocalCompute' : cs,
3743			'GCPInputBeacon' : cs,
3744			'GCPInputStorage' : cs,
3745			'GCPInputList' : cs,
3746			'GCPInputStream' : cs,
3747			'GCPInputMobileDevices' : cs,
3748			'GCPInputCircuitBoard' : cs,
3749			'GCPInputLive' : cs,
3750			'GCPInputUsers' : cs,
3751			'GCPInputLaptop' : cs,
3752			'GCPInputApplication' : cs,
3753			'GCPInputLightbulb' : cs,
3754			'GCPInputGame' : cs,
3755			'GCPInputDesktop' : cs,
3756			'GCPInputDesktopAndMobile' : cs,
3757			'GCPInputWebcam' : cs,
3758			'GCPInputSpeaker' : cs,
3759			'GCPInputRetail' : cs,
3760			'GCPInputReport' : cs,
3761			'GCPInputPhone' : cs,
3762			'GCPInputBlank' : cs,
3763
3764// Site Map
3765			'SMPage' : cs,
3766			'SMHome' : s + 'sitemap.home;strokeColor=#000000;fillColor=#E6E6E6',
3767			'SMGallery' : s + 'sitemap.gallery;strokeColor=#000000;fillColor=#E6E6E6',
3768			'SMShopping' : s + 'sitemap.shopping;strokeColor=#000000;fillColor=#E6E6E6',
3769			'SMMap' : s + 'sitemap.map;strokeColor=#000000;fillColor=#E6E6E6',
3770			'SMAthletics' : s + 'sitemap.sports;strokeColor=#000000;fillColor=#E6E6E6',
3771			'SMLogin' : s + 'sitemap.login;strokeColor=#000000;fillColor=#E6E6E6',
3772			'SMPrint' : s + 'sitemap.print;strokeColor=#000000;fillColor=#E6E6E6',
3773			'SMScript' : s + 'sitemap.script;strokeColor=#000000;fillColor=#E6E6E6',
3774			'SMSearch' : s + 'sitemap.search;strokeColor=#000000;fillColor=#E6E6E6',
3775			'SMSettings' : s + 'sitemap.settings;strokeColor=#000000;fillColor=#E6E6E6',
3776			'SMSitemap' : s + 'sitemap.sitemap;strokeColor=#000000;fillColor=#E6E6E6',
3777			'SMSuccess' : s + 'sitemap.success;strokeColor=#000000;fillColor=#E6E6E6',
3778			'SMVideo' : s + 'sitemap.video;strokeColor=#000000;fillColor=#E6E6E6',
3779			'SMAudio' : s + 'sitemap.audio;strokeColor=#000000;fillColor=#E6E6E6',
3780			'SMBlog' : s + 'sitemap.blog;strokeColor=#000000;fillColor=#E6E6E6',
3781			'SMCalendar' : s + 'sitemap.calendar;strokeColor=#000000;fillColor=#E6E6E6',
3782			'SMChart' : s + 'sitemap.chart;strokeColor=#000000;fillColor=#E6E6E6',
3783			'SMCloud' : s + 'sitemap.cloud;strokeColor=#000000;fillColor=#E6E6E6',
3784			'SMDocument' : s + 'sitemap.document;strokeColor=#000000;fillColor=#E6E6E6',
3785			'SMDownload' : s + 'sitemap.download;strokeColor=#000000;fillColor=#E6E6E6',
3786			'SMError' : s + 'sitemap.error;strokeColor=#000000;fillColor=#E6E6E6',
3787			'SMForm' : s + 'sitemap.form;strokeColor=#000000;fillColor=#E6E6E6',
3788			'SMGame' : s + 'sitemap.game;strokeColor=#000000;fillColor=#E6E6E6',
3789			'SMJobs' : s + 'sitemap.jobs;strokeColor=#000000;fillColor=#E6E6E6',
3790			'SMLucid' : s + 'sitemap.home;strokeColor=#000000;fillColor=#E6E6E6',
3791			'SMNewspress' : s + 'sitemap.news;strokeColor=#000000;fillColor=#E6E6E6',
3792			'SMPhoto' : s + 'sitemap.photo;strokeColor=#000000;fillColor=#E6E6E6',
3793			'SMPortfolio' : s + 'sitemap.portfolio;strokeColor=#000000;fillColor=#E6E6E6',
3794			'SMPricing' : s + 'sitemap.pricing;strokeColor=#000000;fillColor=#E6E6E6',
3795			'SMProfile' : s + 'sitemap.profile;strokeColor=#000000;fillColor=#E6E6E6',
3796			'SMSlideshow' : s + 'sitemap.slideshow;strokeColor=#000000;fillColor=#E6E6E6',
3797			'SMUpload' : s + 'sitemap.upload;strokeColor=#000000;fillColor=#E6E6E6',
3798//SVG shapes
3799			'SVGPathBlock2' : cs,
3800//Special cases
3801			'PresentationFrameBlock' : cs,
3802//Timeline
3803//TODO Timeline shapes are postponed, this code is a work-in-progress
3804			'TimelineBlock' : cs,
3805			'TimelineMilestoneBlock' : cs,
3806			'TimelineIntervalBlock' : cs,
3807			'MinimalTextBlock' : 'strokeColor=none;fillColor=none',
3808//Freehand
3809			'FreehandBlock' : cs,
3810//ExtShapes
3811			'ExtShapeLaptopBlock': ss + 'citrix.laptop_2;verticalLabelPosition=bottom;verticalAlign=top',
3812			'ExtShapeServerBlock': ss + 'citrix.tower_server;verticalLabelPosition=bottom;verticalAlign=top',
3813			'ExtShapeCloudBlock': ss + 'citrix.cloud;verticalLabelPosition=bottom;verticalAlign=top',
3814			'ExtShapeUserBlock': ss + 'aws3d.end_user;verticalLabelPosition=bottom;verticalAlign=top;fillColor=#073763',
3815			'ExtShapeWorkstationLCDBlock': ss + 'veeam.3d.workstation;verticalLabelPosition=bottom;verticalAlign=top',
3816//Infographics
3817			'InfographicsBlock': cs,
3818//Other
3819			'FlexiblePolygonBlock': cs,
3820			'PersonRoleBlock' : cs
3821	};
3822
3823	function mapImgUrl(imgUrl)
3824	{
3825		if (imgUrl && LucidImporter.imgSrcRepl != null)
3826		{
3827			var attMap = LucidImporter.imgSrcRepl.attMap;
3828
3829			if (attMap[imgUrl])
3830			{
3831				imgUrl = attMap[imgUrl];
3832			}
3833			else
3834			{
3835				var imgRepl = LucidImporter.imgSrcRepl.imgRepl;
3836
3837				for (var i = 0; i < imgRepl.length; i++)
3838				{
3839					var repl = imgRepl[i];
3840					imgUrl = imgUrl.replace(repl.searchVal, repl.replVal);
3841				}
3842
3843				LucidImporter.hasExtImgs = true;
3844			}
3845		}
3846
3847		return imgUrl;
3848	};
3849
3850	function mapFontFamily(fontFamily)
3851	{
3852		//We support a single font only since we can have one mapping only
3853		gFontFamilyStyle = '';
3854
3855		try
3856		{
3857			if (fontFamily)
3858			{
3859				var mappedFont = null;
3860
3861				if (LucidImporter.advImpConfig && LucidImporter.advImpConfig.fontMapping)
3862				{
3863					mappedFont = LucidImporter.advImpConfig.fontMapping[fontFamily];
3864				}
3865
3866				if (mappedFont)
3867				{
3868					for (var key in mappedFont)
3869					{
3870						gFontFamilyStyle += key + '=' + mappedFont[key] + ';';
3871					}
3872
3873					return mappedFont['fontFamily']? 'font-family: ' + mappedFont['fontFamily'] : '';
3874				}
3875				else if (fontFamily != defaultLucidFont)
3876				{
3877					gFontFamilyStyle = 'fontFamily=' + fontFamily + ';';
3878					return 'font-family: ' + fontFamily + ';';
3879				}
3880			}
3881		}
3882		catch(e) {}
3883
3884		return '';
3885	};
3886
3887	function fix1Digit(num)
3888	{
3889		return  Math.round(num * 10) / 10;
3890	};
3891
3892	// actual code start
3893	//TODO This can be optimized more
3894	function convertTxt2Html(txt, srcM, props)
3895	{
3896		var blockStyles = {'a': true, 'il': true, 'ir': true, 'mt': true, 'mb': true, 'p': true, 't': true, 'l': true};
3897		var nonBlockStyles = {'lk': true, 's': true, 'c': true, 'b': true, 'fc': true, 'i': true, 'u': true, 'k': true, 'f': true, 'ac': true};
3898
3899		srcM.sort(function(a, b)
3900		{
3901			return a.s - b.s;
3902		});
3903
3904		var m = srcM.filter(function(m)
3905		{
3906			return nonBlockStyles[m.n];
3907		});
3908
3909		//To prevent losing beginning of a label when first one is not at zero (links case)
3910		if (m[0] && m[0].s != 0)
3911		{
3912			m.unshift({s: 0, n: 'dummy', v: '', e: m[0].s});
3913		}
3914
3915		var globalStyles = srcM.filter(function(m)
3916		{
3917			return blockStyles[m.n];
3918		});
3919
3920		//Add missing block that defauls to center
3921		var newlines = [0], nl = 0;
3922
3923		while ((nl = txt.indexOf('\n', nl)) > 0)
3924		{
3925			nl++;
3926			newlines.push(nl);
3927		}
3928
3929		var expectedS = 0;
3930
3931		for (var i = 0; i < globalStyles.length; i++)
3932		{
3933			if (globalStyles[i].s > newlines[expectedS])
3934			{
3935				globalStyles.splice(i, 0, {s: newlines[expectedS], n: 'a', v: props.TextAlign || 'center'});
3936			}
3937			else
3938			{
3939				var skip = 0;
3940
3941				while(i + skip < globalStyles.length && globalStyles[i + skip].s == newlines[expectedS])
3942				{
3943					skip++;
3944				}
3945
3946				if (skip > 1)
3947				{
3948					i += skip - 1; // -1 since loop will increment again
3949				}
3950			}
3951
3952			expectedS++;
3953		}
3954
3955		if (newlines[expectedS] != null)
3956		{
3957			globalStyles.push({s: newlines[expectedS], n: 'a', v: props.TextAlign || 'center'});
3958		}
3959
3960		var html = '', ends = m.slice();
3961
3962		ends.sort(function(a, b)
3963		{
3964			return a.e - b.e;
3965		});
3966
3967		var i = 0, j = 0, k = 0, curStyles = {}, curBlockStyles = {}, openTags = [], openTagsCount = [],
3968			openBlockTags = [], blockActive = false, listActive = false, listType;
3969
3970		function startBlockTag(styles, nonBlockStyles)
3971		{
3972			var str = '';
3973			var t = styles['t'];
3974
3975			var l = styles['l'] || {v: t && t.v == 'ul'? 'auto' : 'decimal'};
3976
3977			if (t != null && (listActive == false || listActive != t.v || listType != l.v))
3978			{
3979				if (listActive)
3980				{
3981					str += endBlockTag(true);
3982				}
3983
3984				listActive = t.v;
3985				listType = l.v;
3986
3987				if (t.v == 'ul')
3988				{
3989					str += '<ul ';
3990					openBlockTags.push('ul');
3991				}
3992				else
3993				{
3994					str += '<ol ';
3995					openBlockTags.push('ol');
3996				}
3997
3998				str += 'style="margin: 0px; padding-left: 10px;list-style-position: inside; list-style-type:';
3999
4000				if (t.v == 'hl')
4001				{
4002					str += 'upper-roman';
4003				}
4004				else
4005				{
4006					switch(l.v)
4007					{
4008						case 'auto':
4009							str += 'disc';
4010							break;
4011						case 'inv': //Approx
4012							str += 'circle';
4013							break;
4014						case 'disc':
4015							str += 'circle';
4016							break;
4017						case 'trib': //Approx
4018							str += 'square';
4019							break;
4020						case 'square':
4021							str += 'square';
4022							break;
4023						case 'dash': //Approx
4024							str += 'square';
4025							break;
4026						case 'heart': //Approx
4027							str += 'disc';
4028							break;
4029						default:
4030							str += 'decimal';
4031					}
4032				}
4033
4034				str += '">';
4035			}
4036			else if (t == null)
4037			{
4038				if (listActive)
4039				{
4040					str += endBlockTag(true);
4041					listActive = false;
4042				}
4043
4044				str += '<div style="';
4045				openBlockTags.push('div');
4046			}
4047
4048			if (t != null)
4049			{
4050				str += '<li style="text-align:' + (styles['a']? styles['a'].v : (props.TextAlign || 'center')) + ';';
4051				var color, fontSize;
4052
4053				// Find font size/color
4054				if (nonBlockStyles != null)
4055				{
4056					if (nonBlockStyles['c'])
4057					{
4058						color = nonBlockStyles['c'].v;
4059					}
4060
4061					if (nonBlockStyles['s'])
4062					{
4063						fontSize = nonBlockStyles['s'].v;
4064					}
4065				}
4066
4067				try
4068				{
4069					var s = m[i], e = ends[j];
4070					var it = i;
4071
4072					if (s && e && s.s < e.e) //s can be null when all starts are used, e ends after s BUT sometimes there are errors in the file
4073					{
4074						var curS = s.s;
4075
4076						while(s != null && s.s == curS)
4077						{
4078							if (s.n == 's')
4079							{
4080								fontSize = s.v;
4081							}
4082							else if (s.n == 'c')
4083							{
4084								color = s.v;
4085							}
4086
4087							s = m[++it];
4088						}
4089					}
4090				}
4091				catch(e)
4092				{
4093					console.log(e);
4094				}
4095
4096				color = rgbToHex(color);
4097
4098				if (color != null)
4099				{
4100					color = color.substring(0, 7);
4101					str += 'color:' + color + ';';
4102				}
4103
4104				if (fontSize != null)
4105				{
4106					str += 'font-size:' + fix1Digit(fontSize * scale) + 'px;';
4107				}
4108
4109				str += '">';
4110				openBlockTags.push('li');
4111				str += '<span style="';
4112				openBlockTags.push('span');
4113			}
4114
4115			if (!listActive)
4116			{
4117				var tmp = styles['a']? styles['a'].v : (props.TextAlign || 'center');
4118				var jc = tmp;
4119
4120				if (tmp == 'left')
4121				{
4122					jc = 'flex-start';
4123				}
4124				else if (tmp == 'right')
4125				{
4126					jc = 'flex-end';
4127				}
4128
4129				str += 'display: flex; justify-content: ' + jc + '; text-align: ' + tmp + '; align-items: baseline; font-size: 0; line-height: 1.25;';
4130			}
4131
4132			if (styles['il'])
4133			{
4134				str += 'margin-left: ' + Math.max(0, fix1Digit(styles['il'].v * scale - (listActive? 28 : 0))) + 'px;';
4135			}
4136
4137			if (styles['ir'])
4138			{
4139				str += 'margin-right: ' + fix1Digit(styles['ir'].v * scale) + 'px;';
4140			}
4141
4142			if (styles['mt'])
4143			{
4144				str += 'margin-top: ' + fix1Digit(styles['mt'].v * scale) + 'px;';
4145			}
4146
4147			if (styles['mb'])
4148			{
4149				str += 'margin-bottom: ' + fix1Digit(styles['mb'].v * scale) + 'px;';
4150			}
4151
4152			str += 'margin-top: -2px;">';
4153
4154			if (!listActive)
4155			{
4156				str += '<span>';// Is this needed?
4157				openBlockTags.push('span');
4158			}
4159
4160			return str;
4161		};
4162
4163
4164		function startTag(styles)
4165		{
4166			if (Object.keys(styles).length == 0) return '';
4167
4168			var str = '';
4169			var tagCount = 0;
4170
4171			if (styles['lk'])
4172			{
4173				var lk = styles['lk'];
4174
4175				if (lk.v != null && lk.v.length > 0)
4176				{
4177					str += '<a href="' + getLink(lk.v[0]) + '">';
4178					openTags.push('a');
4179					tagCount++;
4180				}
4181			}
4182
4183			str += '<span style="';
4184			openTags.push('span');
4185			tagCount++;
4186
4187			str += 'font-size:' + (styles['s']? fix1Digit(styles['s'].v * scale) : defaultFontSize) + 'px;';
4188
4189			if (styles['c'])
4190			{
4191				var v = rgbToHex(styles['c'].v);
4192
4193				if (v != null)
4194				{
4195					v = v.substring(0, 7);
4196					str += 'color:' + v + ';';
4197				}
4198			}
4199
4200			if ((styles['b'] && styles['b'].v) || (styles['fc'] && styles['fc'].v && styles['fc'].v.indexOf('Bold') == 0))
4201			{
4202				str += 'font-weight: bold;';
4203			}
4204
4205			if (styles['i'] && styles['i'].v)
4206			{
4207				str += 'font-style: italic;';
4208			}
4209
4210			if (styles['ac'] && styles['ac'].v)
4211			{
4212				str += 'text-transform: uppercase;';
4213			}
4214
4215			var fontFamily = null;
4216
4217			if (styles['f'])
4218			{
4219				fontFamily = styles['f'].v;
4220			}
4221			else if (props.Font)
4222			{
4223				fontFamily = props.Font;
4224			}
4225
4226			str += mapFontFamily(fontFamily);
4227
4228			var td = [];
4229
4230			if (styles['u'] && styles['u'].v)
4231			{
4232				td.push('underline');
4233			}
4234
4235			if (styles['k'] && styles['k'].v)
4236			{
4237				td.push('line-through');
4238			}
4239
4240			if (td.length > 0)
4241			{
4242				str += 'text-decoration: ' + td.join(' ') + ';';
4243			}
4244
4245			str += '">'
4246			openTagsCount.push(tagCount);
4247
4248			return str;
4249		};
4250
4251		function endBlockTag(force)
4252		{
4253			var str = '';
4254
4255			do
4256			{
4257				var tag = openBlockTags.pop();
4258
4259				if (!force && listActive && (tag == 'ul' || tag == 'ol'))
4260				{
4261					openBlockTags.push(tag);
4262					break;
4263				}
4264
4265				str += '</' + tag + '>';
4266			}
4267			while(openBlockTags.length > 0);
4268
4269			return str;
4270		};
4271
4272		function endTag(txt, curS, curE, all)
4273		{
4274			var str = txt? txt.substring(curS, curE) : '';
4275
4276			//TODO Check this is always the case. Most of the time this is correct, also, the empty tag should be removed
4277			if (listActive)
4278			{
4279				str = str.trim();
4280			}
4281
4282			//If an endTag is called with no open tags, add a dummy startTag to have a font size
4283			if (openTags.length == 0 && str.length > 0)
4284			{
4285				str = startTag({dummy: 1}) + str;
4286			}
4287
4288			str = str.replace(/</g, '&lt;').replace(/>/g, '&gt;');
4289
4290			do
4291			{
4292				var count = openTagsCount.pop();
4293
4294				for (var i = 0; i < count; i++)
4295				{
4296					var tag = openTags.pop();
4297					str += '</' + tag + '>';
4298				}
4299			}
4300			while(all && openTags.length > 0);
4301
4302			return str;
4303		};
4304
4305		var curS = 0, curE = 0, maxE = txt.length, firstBlock = true;
4306
4307		while (k < globalStyles.length || firstBlock)
4308		{
4309			firstBlock = false;
4310
4311			if (k < globalStyles.length)
4312			{
4313				var bs = globalStyles[k], curBS = globalStyles[k].s;
4314
4315				if (blockActive)
4316				{
4317					curBlockStyles = {};
4318					html += endTag(txt, curS, maxE, true); //End any open tag
4319					curE = curS = maxE;
4320					html += endBlockTag();
4321				}
4322
4323				while(bs != null && bs.s == curBS)
4324				{
4325					curBlockStyles[bs.n] = bs;
4326					bs = globalStyles[++k];
4327				}
4328
4329				if (bs != null)
4330				{
4331					maxE = bs.s;
4332				}
4333				else
4334				{
4335					maxE = txt.length;
4336				}
4337
4338				html += startBlockTag(curBlockStyles, curStyles);
4339
4340				if (blockActive)
4341				{
4342					html += startTag(curStyles);
4343				}
4344
4345				blockActive = true;
4346			}
4347
4348			while(i >= j && (i < m.length || j < ends.length))
4349			{
4350				var s = m[i], e = ends[j];
4351
4352				if (s && e && s.s < e.e) //s can be null when all starts are used, e ends after s BUT sometimes there are errors in the file
4353				{
4354					if (s.s >= maxE) break;
4355					curS = s.s;
4356
4357					if (curS - curE > 0)
4358					{
4359						//NOTE: After the fix in end where we add dummy start and end, this shouldn't be called
4360						//End any open tag and add remaining text with current style
4361						html += startTag(curStyles) + endTag(txt, curE, curS);
4362						curE = curS;
4363					}
4364
4365					while(s != null && s.s == curS)
4366					{
4367						curStyles[s.n] = s;
4368						s = m[++i];
4369					}
4370
4371					html += startTag(curStyles);
4372				}
4373				else if (e)
4374				{
4375					if (e.e > maxE) break;
4376					curE = e.e;
4377
4378					do
4379					{
4380						delete curStyles[e.n];
4381						e = ends[++j];
4382					}
4383					while(e != null && e.e == curE);
4384
4385					html += endTag(txt, curS, curE);
4386					curS = curE;
4387
4388					//Next start should be immidiately after this end or we add a dummy one
4389					if (openTagsCount.length == 0 && (s == null || s.s != curE))
4390					{
4391						m.splice(i, 0, {s: curE, n: 'dummy', v: ''});
4392						ends.splice(j, 0, {e: s? s.s : maxE, n: 'dummy', v: ''});
4393					}
4394				}
4395				else
4396				{
4397					break;
4398				}
4399			}
4400		}
4401
4402		html += endTag(null, null, null, true); //End any open tag
4403
4404		if (blockActive)
4405		{
4406			if (curE != maxE)
4407			{
4408				html += startTag({dummy: 1}) + endTag(txt, curE, maxE);
4409			}
4410
4411			html += endBlockTag(true);
4412		}
4413
4414		return html;
4415	};
4416
4417	function convertText(props, forceHTML)
4418	{
4419		isLastLblHTML = false;
4420		var text = (props.Text != null && props.Text.t) ? props.Text :
4421			((props.Value != null && props.Value.t) ? props.Value :
4422			((props.Lane_0 != null && props.Lane_0.t) ? props.Lane_0 : null));
4423		var text2 = null;
4424
4425		if (text == null && props.State != null)
4426		{
4427			if (props.State.t)
4428			{
4429				text = props.State;
4430			}
4431		}
4432		else if (text == null && props.Note != null)
4433		{
4434			if (props.Note.t)
4435			{
4436				text = props.Note;
4437			}
4438		}
4439		else if (text == null && props.Title != null)
4440		{
4441			if (props.Title.t)
4442			{
4443				text = props.Title;
4444			}
4445		}
4446		else if (props.t)
4447		{
4448			text = props;
4449		}
4450
4451		if (text == null && props.TextAreas != null)
4452		{
4453			if (props.TextAreas.Text != null)
4454			{
4455				if (props.TextAreas.Text.Value != null)
4456				{
4457					if (props.TextAreas.Text.Value.t)
4458					{
4459						text = props.TextAreas.Text.Value;
4460					}
4461				}
4462			}
4463		}
4464		else if (text == null && props.t0 != null)
4465		{
4466			if (props.t0.t)
4467			{
4468				text = props.t0;
4469			}
4470		}
4471
4472		// TODO: Convert text object to HTML. One case is covered. Is there others?
4473		// TODO: HTML text conversion looks stable now, maybe convert all using html?
4474		if (text != null)
4475		{
4476			if (text.t != null)
4477			{
4478				var txt = text.t;
4479				txt = txt.replace(/\u2028/g, '\n'); //Special unicide line separator
4480				var m = text.m;
4481
4482				//Convert text object to HTML if needed
4483				try
4484				{
4485					//If there are 3+ consecutive spaces, most probably it's spaces to create a new line
4486					if (/   /.test(txt))
4487					{
4488						LucidImporter.hasUnknownShapes = true;
4489					}
4490
4491					for (var i = 0; i < m.length; i++)
4492					{
4493						if (m[i].s > 0 || (m[i].e != null && m[i].e < txt.length) || m[i].n == 't' || m[i].n == 'ac' || m[i].n == 'lk')
4494						{
4495							isLastLblHTML = true;
4496							break;
4497						}
4498					}
4499
4500					isLastLblHTML = isLastLblHTML || forceHTML;
4501
4502					if (isLastLblHTML)
4503					{
4504						return convertTxt2Html(txt, m, props);
4505					}
4506				}
4507				catch(e)
4508				{
4509					console.log(e);
4510				}
4511
4512				txt = txt.replace(/</g, '&lt;');
4513				txt = txt.replace(/>/g, '&gt;');
4514
4515				return txt;
4516			}
4517
4518			if (text.Value != null)
4519			{
4520				if (text.Value.t != null)
4521				{
4522					text.Value.t = text.Value.t.replace(/</g, '&lt;');
4523					text.Value.t = text.Value.t.replace(/>/g, '&gt;');
4524
4525					return text.Value.t;
4526				}
4527			}
4528		}
4529
4530		return (text2 != null) ? text2 : '';
4531	};
4532
4533	function getAction(obj)
4534	{
4535		if (obj.Action != null)
4536		{
4537			return obj.Action;
4538		}
4539
4540		return obj;
4541	};
4542
4543	function getTextM(properties)
4544	{
4545		if (properties.Text != null)
4546		{
4547			if (properties.Text.m != null)
4548			{
4549				return properties.Text.m;
4550			}
4551		}
4552		else if(properties.TextAreas != null)
4553		{
4554			if (properties.TextAreas.Text != null)
4555			{
4556				if (properties.TextAreas.Text.Value != null)
4557				{
4558					if (properties.TextAreas.Text.Value.m != null)
4559					{
4560						return properties.TextAreas.Text.Value.m;
4561					}
4562				}
4563			}
4564		}
4565		else if (properties.m != null)
4566		{
4567			return properties.m;
4568		}
4569		else if (properties.Title != null)
4570		{
4571			if (properties.Title.m != null)
4572			{
4573				return properties.Title.m;
4574			}
4575		}
4576		else if (properties.State != null)
4577		{
4578			if (properties.State.m != null)
4579			{
4580				return properties.State.m;
4581			}
4582		}
4583		else if (properties.Note != null)
4584		{
4585			if (properties.Note.m != null)
4586			{
4587				return properties.Note.m;
4588			}
4589		}
4590
4591		return null;
4592	}
4593
4594	function getLabelStyle(properties, noLblStyle)
4595	{
4596		var style = 'whiteSpace=wrap;' + (noLblStyle?
4597				'overflow=block;blockSpacing=1;html=1;fontSize=' + defaultFontSize + ';' +
4598				gFontFamilyStyle
4599				:
4600				getFontSize(properties) +
4601				getFontFamily(properties) +
4602				getFontColor(properties) +
4603				getFontStyle(properties) +
4604				getTextAlignment(properties) +
4605				getTextLeftSpacing(properties) +
4606				getTextRightSpacing(properties) +
4607				getTextTopSpacing(properties) +
4608				getTextBottomSpacing(properties)
4609			  ) +
4610				getTextGlobalSpacing(properties) +
4611				getTextVerticalAlignment(properties) +
4612				getTextGlobalAlignment(properties);
4613
4614		gFontFamilyStyle = '';
4615		return style;
4616	}
4617
4618	function addAllStyles(style, properties, action, cell, noLblStyle)
4619	{
4620		var s = '';
4621
4622		if (style != null && style != '' && style.charAt(style.length - 1) != ';')
4623		{
4624			s = ';';
4625		}
4626
4627		s += 'whiteSpace=wrap;' +
4628		  (noLblStyle? (hasStyle(style, 'overflow')? '' : 'overflow=block;blockSpacing=1;') +
4629			(hasStyle(style, 'html')? '' : 'html=1;') + 'fontSize=' + defaultFontSize + ';' +
4630			gFontFamilyStyle
4631			:
4632			addStyle(mxConstants.STYLE_FONTSIZE, style, properties, action, cell) +
4633			addStyle(mxConstants.STYLE_FONTFAMILY, style, properties, action, cell) +
4634			addStyle(mxConstants.STYLE_FONTCOLOR, style, properties, action, cell) +
4635			addStyle(mxConstants.STYLE_FONTSTYLE, style, properties, action, cell) +
4636			addStyle(mxConstants.STYLE_ALIGN, style, properties, action, cell) +
4637			addStyle(mxConstants.STYLE_SPACING_LEFT, style, properties, action, cell) +
4638			addStyle(mxConstants.STYLE_SPACING_RIGHT, style, properties, action, cell) +
4639			addStyle(mxConstants.STYLE_SPACING_TOP, style, properties, action, cell) +
4640			addStyle(mxConstants.STYLE_SPACING_BOTTOM, style, properties, action, cell)
4641		  ) +
4642			addStyle(mxConstants.STYLE_ALIGN + 'Global', style, properties, action, cell) +
4643			addStyle(mxConstants.STYLE_SPACING, style, properties, action, cell) +
4644			addStyle(mxConstants.STYLE_VERTICAL_ALIGN, style, properties, action, cell) +
4645			addStyle(mxConstants.STYLE_STROKECOLOR, style, properties, action, cell) +
4646			addStyle(mxConstants.STYLE_OPACITY, style, properties, action, cell) +
4647			addStyle(mxConstants.STYLE_ROUNDED, style, properties, action, cell) +
4648			addStyle(mxConstants.STYLE_ROTATION, style, properties, action, cell) +
4649			addStyle(mxConstants.STYLE_FLIPH, style, properties, action, cell) +
4650			addStyle(mxConstants.STYLE_FLIPV, style, properties, action, cell) +
4651			addStyle(mxConstants.STYLE_SHADOW, style, properties, action, cell) +
4652			addStyle(mxConstants.STYLE_FILLCOLOR, style, properties, action, cell) +
4653			addStyle(mxConstants.STYLE_DASHED, style, properties, action, cell) +
4654			addStyle(mxConstants.STYLE_STROKEWIDTH, style, properties, action, cell) +
4655			addStyle(mxConstants.STYLE_IMAGE, style, properties, action, cell);
4656
4657		gFontFamilyStyle = '';
4658		return s;
4659	}
4660
4661	function addStyle(key, style, properties, action, cell)
4662	{
4663		if (!hasStyle(style, key))
4664		{
4665			switch(key)
4666			{
4667				case mxConstants.STYLE_FONTSIZE :
4668					return getFontSize(properties);
4669
4670				case mxConstants.STYLE_FONTFAMILY :
4671					return getFontFamily(properties);
4672
4673				case mxConstants.STYLE_FONTCOLOR :
4674					return getFontColor(properties);
4675
4676				case mxConstants.STYLE_FONTSTYLE :
4677					return getFontStyle(properties);
4678
4679				case mxConstants.STYLE_ALIGN :
4680					return getTextAlignment(properties);
4681
4682				case mxConstants.STYLE_ALIGN + 'Global':
4683					return getTextGlobalAlignment(properties);
4684
4685				case mxConstants.STYLE_SPACING_LEFT :
4686					return getTextLeftSpacing(properties);
4687
4688				case mxConstants.STYLE_SPACING_RIGHT :
4689					return getTextRightSpacing(properties);
4690
4691				case mxConstants.STYLE_SPACING_TOP :
4692					return getTextTopSpacing(properties);
4693
4694				case mxConstants.STYLE_SPACING_BOTTOM :
4695					return getTextBottomSpacing(properties);
4696
4697				case mxConstants.STYLE_SPACING :
4698					return getTextGlobalSpacing(properties);
4699
4700				case mxConstants.STYLE_VERTICAL_ALIGN :
4701					return getTextVerticalAlignment(properties);
4702
4703				case mxConstants.STYLE_STROKECOLOR :
4704					return getStrokeColor(properties, action);
4705
4706				case mxConstants.STYLE_OPACITY :
4707					return getOpacity(properties, action, cell);
4708
4709				case mxConstants.STYLE_ROUNDED :
4710					return getRounded(properties, action, cell);
4711
4712				case mxConstants.STYLE_ROTATION :
4713					return getRotation(properties, action, cell);
4714
4715				case mxConstants.STYLE_FLIPH :
4716					return getFlipH(properties);
4717
4718				case mxConstants.STYLE_FLIPV :
4719					return getFlipV(properties);
4720
4721				case mxConstants.STYLE_SHADOW :
4722					return getShadow(properties);
4723
4724				case mxConstants.STYLE_FILLCOLOR :
4725					return getFillColor(properties, action);
4726
4727				case mxConstants.STYLE_DASHED :
4728					return getStrokeStyle(properties);
4729
4730				case mxConstants.STYLE_STROKEWIDTH :
4731					return getStrokeWidth(properties);
4732
4733				case mxConstants.STYLE_IMAGE :
4734					return getImage(properties, action);
4735
4736				default :
4737					break;
4738			}
4739		}
4740
4741		return '';
4742	}
4743
4744	function getFontSize(properties)
4745	{
4746		//adds font size
4747		var isV = false;
4748
4749		var m = getTextM(properties);
4750
4751		if (m != null)
4752		{
4753			var i = 0;
4754
4755			while ((!isV) && (i < m.length))
4756			{
4757				var currM = m[i];
4758
4759				if (currM.n == 's')
4760				{
4761					if (currM.v != null)
4762					{
4763						isV = true;
4764
4765						return 'fontSize=' + fix1Digit(currM.v * scale) + ';';
4766					}
4767				}
4768				i++;
4769			}
4770		}
4771
4772		if (isV == 0)
4773		{
4774			return 'fontSize=' + defaultFontSize + ';';
4775		}
4776
4777		return '';
4778	}
4779
4780	function getFontFamily(properties)
4781	{
4782		var m = getTextM(properties);
4783		var fontFamily;
4784
4785		if (m != null)
4786		{
4787			for (var i = 0; i < m.length; i++)
4788			{
4789				if (m[i].n == 'f' && m[i].v)
4790				{
4791					fontFamily = m[i].v;
4792					break;
4793				}
4794			}
4795		}
4796
4797		if (!fontFamily && properties.Font)
4798		{
4799			fontFamily = properties.Font;
4800		}
4801
4802		mapFontFamily(fontFamily);
4803		return gFontFamilyStyle;
4804	};
4805
4806	function getLink(lnk)
4807	{
4808		if (lnk.tp == 'ext')
4809		{
4810			return lnk.url;
4811		}
4812		else if (lnk.tp == 'ml')
4813		{
4814			return 'mailto:' + lnk.eml;
4815		}
4816		else if (lnk.tp == 'pg')
4817		{
4818			return 'data:page/id,' + (LucidImporter.pageIdsMap[lnk.id] || 0);
4819		}
4820		else if (lnk.tp == 'c') //Confluence content
4821		{
4822			return 'data:confluence/id,' + lnk.ccid;
4823		}
4824		else
4825		{
4826			return null;
4827		}
4828	};
4829
4830	function getFontColor(properties)
4831	{
4832		//adds font color
4833		var isC = false;
4834		var m = getTextM(properties);
4835
4836		if (m != null)
4837		{
4838			var i = 0;
4839
4840			while ((!isC) && (i < m.length))
4841			{
4842				var currM = m[i];
4843
4844				if (currM.n == 'c')
4845				{
4846					if (currM.v != null)
4847					{
4848						isC = true;
4849
4850						var currV = rgbToHex(currM.v).substring(0, 7);
4851
4852						return mxConstants.STYLE_FONTCOLOR + '=' + currV + ';';
4853					}
4854				}
4855
4856				i++;
4857			}
4858		}
4859
4860		return '';
4861	}
4862
4863	function getFontStyle(properties)
4864	{
4865		return getFontStyleString(getTextM(properties));
4866	}
4867
4868	function getFontStyleString(m)
4869	{
4870		if (m != null)
4871		{
4872			var fontStyle = 0;
4873			//check for bold text
4874			var isBT = false;
4875
4876			if (m != null)
4877			{
4878				var i = 0;
4879
4880				while ((!isBT) && (i < m.length))
4881				{
4882					var currM = m[i];
4883
4884					if (currM.n == 'b')
4885					{
4886						if (currM.v != null && currM.v)
4887						{
4888							isBT = true;
4889							fontStyle += 1;
4890						}
4891					}
4892					else if (currM.n == 'fc' && currM.v == 'Bold')
4893					{
4894						isBT = true;
4895						fontStyle += 1;
4896					}
4897
4898					i++;
4899				}
4900			}
4901
4902			//check for italic text
4903			var isIT = false;
4904
4905			if (m != null)
4906			{
4907				var i = 0;
4908
4909				while ((!isIT) && (i < m.length))
4910				{
4911					var currM = m[i];
4912
4913					if (currM.n == 'i')
4914					{
4915						if (currM.v != null && currM.v)
4916						{
4917							isIT = true;
4918							fontStyle += 2;
4919						}
4920					}
4921
4922					i++;
4923				}
4924			}
4925
4926			//check for underline text
4927			var isUT = false;
4928
4929			if (m != null)
4930			{
4931				var i = 0;
4932
4933				while ((!isUT) && (i < m.length))
4934				{
4935					var currM = m[i];
4936
4937					if (currM.n == 'u')
4938					{
4939						if (currM.v != null && currM.v)
4940						{
4941							isUT = true;
4942							fontStyle += 4;
4943						}
4944					}
4945
4946					i++;
4947				}
4948			}
4949
4950			if (fontStyle > 0)
4951			{
4952				return 'fontStyle=' + fontStyle + ';';
4953			}
4954		}
4955
4956		return '';
4957	}
4958
4959	function getTextAlignment(properties)
4960	{
4961		var m = getTextM(properties);
4962
4963		//adds text alignment
4964		if (m != null)
4965		{
4966			var i = 0;
4967
4968			while (i < m.length)
4969			{
4970				var currM = m[i];
4971
4972				if (currM.n == 'a')
4973				{
4974					if (currM.v != null)
4975					{
4976						return 'align=' + currM.v + ';';
4977					}
4978				}
4979
4980				i++;
4981			}
4982		}
4983
4984		return '';
4985	}
4986
4987	function getTextLeftSpacing(properties)
4988	{
4989		var m = getTextM(properties);
4990
4991		if (m != null)
4992		{
4993			//adds left spacing
4994			var i = 0;
4995
4996			while (i < m.length)
4997			{
4998				var currM = m[i];
4999
5000				if (currM.v != null)
5001				{
5002					if (currM.n == 'il')
5003					{
5004						return 'spacingLeft=' + fix1Digit(currM.v * scale) + ';';
5005					}
5006					/*else
5007					{
5008						var align = getTextAlignment(properties);
5009
5010						if (currM.n == 's' && align != 'align=center;' && align != '')
5011						{
5012							// TODO: Fix condition to apply this only when necessary
5013							//return 'spacingLeft=' + currM.v * scale + ';';
5014						}
5015					}*/
5016				}
5017
5018				i++;
5019			}
5020		}
5021
5022		return '';
5023	}
5024
5025	function getTextRightSpacing(properties)
5026	{
5027		//adds right spacing
5028		var isIR = false;
5029		var m = getTextM(properties);
5030
5031		if (m != null)
5032		{
5033			var i = 0;
5034
5035			while ((!isIR) && (i < m.length))
5036			{
5037				var currM = m[i];
5038
5039				if (currM.n == 'ir')
5040				{
5041					if (currM.v != null)
5042					{
5043						isIR = true;
5044
5045						return 'spacingRight=' + fix1Digit(currM.v * scale) + ';';
5046					}
5047				}
5048
5049				i++;
5050			}
5051		}
5052
5053		return '';
5054	}
5055
5056	function getTextTopSpacing(properties)
5057	{
5058		//adds top spacing
5059		var isMT = false;
5060		var m = getTextM(properties);
5061
5062		if (m != null)
5063		{
5064			var i = 0;
5065
5066			while ((!isMT) && (i < m.length))
5067			{
5068				var currM = m[i];
5069
5070				if (currM.n == 'mt')
5071				{
5072					if (currM.v != null)
5073					{
5074						isMT = true;
5075						return 'spacingTop=' + fix1Digit(currM.v * scale) + ';';
5076					}
5077				}
5078
5079				i++;
5080			}
5081		}
5082
5083		return '';
5084	}
5085
5086	function getTextBottomSpacing(properties)
5087	{
5088		//adds bottom spacing
5089		var isMB = false;
5090		var m = getTextM(properties);
5091
5092		if (m != null)
5093		{
5094			var i = 0;
5095
5096			while ((!isMB) && (i < m.length))
5097			{
5098				var currM = m[i];
5099
5100				if (currM.n == 'mb')
5101				{
5102					if (currM.v != null)
5103					{
5104						isMB = true;
5105						return 'spacingBottom=' + fix1Digit(currM.v * scale) + ';';
5106					}
5107				}
5108
5109				i++;
5110			}
5111		}
5112
5113		return '';
5114	}
5115
5116	function getTextGlobalSpacing(properties)
5117	{
5118		//adds global spacing
5119		if (typeof properties.InsetMargin === 'number')
5120		{
5121			return 'spacing=' + Math.max(0, fix1Digit((properties.InsetMargin) * scale)) + ';';
5122		}
5123
5124		return '';
5125	}
5126
5127	function getTextVerticalAlignment(properties)
5128	{
5129		// adds text vertical alignment
5130		if (properties.Text_VAlign != null)
5131		{
5132			if (typeof properties.Text_VAlign === 'string')
5133			{
5134				return 'verticalAlign=' + properties.Text_VAlign + ';';
5135			}
5136		}
5137
5138		if (properties.Title_VAlign != null && typeof properties.Title_VAlign === 'string')
5139		{
5140			return 'verticalAlign=' + properties.Title_VAlign + ';';
5141		}
5142
5143		return createStyle(mxConstants.STYLE_VERTICAL_ALIGN, properties.TextVAlign, 'middle');
5144	}
5145
5146	function getTextGlobalAlignment(properties)
5147	{
5148		return createStyle(mxConstants.STYLE_ALIGN, properties.TextAlign, 'center');
5149	}
5150
5151	function getStrokeColor(properties, action)
5152	{
5153		if (properties.LineWidth == 0)
5154		{
5155			return mxConstants.STYLE_STROKECOLOR + '=none;';
5156		}
5157		else
5158		{
5159			return createStyle(mxConstants.STYLE_STROKECOLOR, getColor(properties.LineColor), '#000000');
5160		}
5161	}
5162
5163	function getHeaderColor(color)
5164	{
5165		if (color != null)
5166		{
5167			return mxConstants.STYLE_FILLCOLOR + '=' + getColor(color) + ';';
5168		}
5169
5170		return '';
5171	}
5172
5173	function getLaneColor(color)
5174	{
5175		if (color != null)
5176		{
5177			return 'swimlaneFillColor=' + getColor(color) + ';';
5178		}
5179
5180		return '';
5181	}
5182
5183	function getOpacity(properties, action, cell)
5184	{
5185		var style = '';
5186
5187		if (typeof properties.LineColor === 'string')
5188		{
5189			properties.LineColor = rgbToHex(properties.LineColor);
5190
5191			if (properties.LineColor.length > 7)
5192			{
5193				var sOpac = "0x" + properties.LineColor.substring(properties.LineColor.length - 2, properties.LineColor.length);
5194
5195				if(!cell.style.includes('strokeOpacity'))
5196				{
5197					style += 'strokeOpacity=' + Math.round(parseInt(sOpac) / 2.55) + ';';
5198				}
5199			}
5200		}
5201
5202		if (typeof properties.FillColor === 'string')
5203		{
5204			properties.FillColor = rgbToHex(properties.FillColor);
5205
5206			if (properties.FillColor.length > 7)
5207			{
5208				var fOpac = "0x" + properties.FillColor.substring(properties.FillColor.length - 2, properties.FillColor.length);
5209
5210				if(!cell.style.includes('fillOpacity'))
5211				{
5212					style += 'fillOpacity=' + Math.round(parseInt(fOpac) / 2.55) + ';';
5213				}
5214			}
5215		}
5216
5217		return style;
5218	}
5219
5220	function getRounded(properties, action, cell)
5221	{
5222		if (!cell.edge && !cell.style.includes('rounded'))
5223		{
5224			//rounding check
5225			if (properties.Rounding != null)
5226			{
5227				if (properties.Rounding > 0)
5228				{
5229					return 'rounded=1;absoluteArcSize=1;arcSize=' + fix1Digit(properties.Rounding * scale) + ';';
5230				}
5231			}
5232//			else if (properties.Rounding == null)
5233//			{
5234//				return 'rounded=1;absoluteArcSize=1;arcSize=8;';
5235//			}
5236		}
5237
5238		return '';
5239	}
5240
5241	function getRotation(properties, action, cell)
5242	{
5243		var s = '';
5244
5245		// Converts rotation
5246		if (properties.Rotation != null)
5247		{
5248			// KNOWN: TextRotation currently ignored
5249			var deg = mxUtils.toDegree(parseFloat(properties.Rotation));
5250			var h = true;
5251
5252			// Fixes the case for horizontal swimlanes where we use horizontal=0
5253			// and Lucid uses rotation
5254			if (deg != 0 && action.Class && ((action.Class == 'UMLSwimLaneBlockV2') || ((action.Class.indexOf('Rotated') >= 0 || deg == -90 || deg == 270) && (action.Class.indexOf('Pool') >= 0 || action.Class.indexOf('SwimLane') >= 0))))
5255			{
5256				deg += 90;
5257				cell.geometry.rotate90();
5258				cell.geometry.isRotated = true;
5259				h = false;
5260			}
5261			else if (mxUtils.indexOf(rccw, action.Class) >= 0)
5262			{
5263				deg -= 90;
5264				cell.geometry.rotate90();
5265			}
5266			else if (mxUtils.indexOf(rcw2, action.Class) >= 0)
5267			{
5268				deg += 180;
5269			}
5270
5271			if (deg != 0)
5272			{
5273				s += 'rotation=' + deg + ';'
5274			}
5275
5276			if (!h)
5277			{
5278				s +=  'horizontal=0;';
5279			}
5280		}
5281
5282		return s;
5283	}
5284
5285	function getFlipH(properties)
5286	{
5287		if (properties.FlipX)
5288		{
5289			return 'flipH=1;';
5290		}
5291
5292		return '';
5293	}
5294
5295	function getFlipV(properties)
5296	{
5297		if (properties.FlipY)
5298		{
5299			return 'flipV=1;';
5300		}
5301
5302		return '';
5303	}
5304
5305	function getShadow(properties)
5306	{
5307		// Shadow is mapped simple shadow style
5308		if (properties.Shadow != null)
5309		{
5310			return mxConstants.STYLE_SHADOW + '=1;';
5311		}
5312
5313		return '';
5314	}
5315
5316	function rgbToHex(color)
5317	{
5318		if (color)
5319		{
5320			if (typeof color === 'object')
5321			{
5322				try
5323				{
5324					color = color.cs[0].c; //TODO support gradient colors
5325				}
5326				catch(e)
5327				{
5328					console.log(e);
5329					color = '#ffffff';
5330				}
5331			}
5332
5333			if (color.substring(0, 3) == 'rgb')
5334			{
5335				color = '#' + color.match(/\d+/g).map(function(n)
5336				{
5337					var s = parseInt(n).toString(16);
5338					return (s.length == 1? '0' : '') + s;
5339				}).join('');
5340			}
5341			else if (color.charAt(0) != '#')
5342			{
5343				color = '#' + color;
5344			}
5345		}
5346
5347		return color;
5348	};
5349
5350	function getColor(color)
5351	{
5352		color = rgbToHex(color);
5353		return color? color.substring(0, 7) : null;
5354	}
5355
5356	function getOpacity2(color, style)
5357	{
5358		color = rgbToHex(color);
5359		return color && color.length > 7? (style + '=' + Math.round(parseInt('0x' + color.substr(7)) / 2.55) + ';') : '';
5360	}
5361
5362	function getFillColor(properties, action)
5363	{
5364		// Gradients and fill color
5365		if (properties.FillColor != null)
5366		{
5367			if (typeof properties.FillColor === 'object')
5368			{
5369				if (properties.FillColor.cs != null && properties.FillColor.cs.length > 1)
5370				{
5371					return createStyle(mxConstants.STYLE_FILLCOLOR, getColor(properties.FillColor.cs[0].c)) + createStyle(mxConstants.STYLE_GRADIENTCOLOR, getColor(properties.FillColor.cs[1].c));
5372				}
5373			}
5374			else if (typeof properties.FillColor === 'string')
5375			{
5376				return createStyle(mxConstants.STYLE_FILLCOLOR, getColor(properties.FillColor), '#FFFFFF');
5377			}
5378			else
5379			{
5380				return createStyle(mxConstants.STYLE_FILLCOLOR, 'none');
5381			}
5382		}
5383
5384		return '';
5385	}
5386
5387	function getStrokeStyle(properties)
5388	{
5389		// Stroke style
5390		if (properties.StrokeStyle == 'dotted')
5391		{
5392			return 'dashed=1;fixDash=1;dashPattern=1 4;';
5393		}
5394		else if (properties.StrokeStyle == 'dashdot')
5395		{
5396			return 'dashed=1;fixDash=1;dashPattern=10 5 1 5;';
5397		}
5398		else if (properties.StrokeStyle == 'dashdotdot')
5399		{
5400			return 'dashed=1;fixDash=1;dashPattern=10 5 1 5 1 5;';
5401		}
5402		else if (properties.StrokeStyle == 'dotdotdot')
5403		{
5404			return 'dashed=1;fixDash=1;dashPattern=1 2;';
5405		}
5406		else if (properties.StrokeStyle == 'longdash')
5407		{
5408			return 'dashed=1;fixDash=1;dashPattern=16 6;';
5409		}
5410		else if (properties.StrokeStyle == 'dashlongdash')
5411		{
5412			return 'dashed=1;fixDash=1;dashPattern=10 6 16 6;';
5413		}
5414		else if (properties.StrokeStyle == 'dashed24')
5415		{
5416			return 'dashed=1;fixDash=1;dashPattern=3 8;';
5417		}
5418		else if (properties.StrokeStyle == 'dashed32')
5419		{
5420			return 'dashed=1;fixDash=1;dashPattern=6 5;';
5421		}
5422		else if (properties.StrokeStyle == 'dashed44')
5423		{
5424			return 'dashed=1;fixDash=1;dashPattern=8 8;';
5425		}
5426		else if (properties.StrokeStyle != null && properties.
5427			StrokeStyle.substring(0, 6) == 'dashed')
5428		{
5429			return 'dashed=1;fixDash=1;';
5430		}
5431
5432		return '';
5433	}
5434
5435	function getStrokeWidth(properties)
5436	{
5437		return properties.LineWidth != null? createStyle(mxConstants.STYLE_STROKEWIDTH, fix1Digit(parseFloat(properties.LineWidth) * scale), '1') : '';
5438	}
5439
5440	function getImage(properties, action, url)
5441	{
5442		var imgUrl = url, extraStyles = '';
5443
5444		// Converts images
5445		if (properties.FillColor && properties.FillColor.url)
5446		{
5447			imgUrl = properties.FillColor.url;
5448			//Check if image is cropped, stretched, ...
5449			if (properties.FillColor.pos == 'fill')
5450			{
5451				extraStyles = 'imageAspect=0;';
5452			}
5453			//TODO Support non-destructive cropping
5454			/*else if (typeof properties.FillColor.pos == 'object')
5455			{
5456				"pos": {
5457		            "pin": {
5458		                "x": 0.5765582655826557,
5459		                "y": 0.6180376215526864
5460		            },
5461		            "size": {
5462		                "w": 0.7764227642276422,
5463		                "h": 1.5284871672246134
5464		            }
5465            	}
5466			}*/
5467		}
5468		else if (action.Class == 'ImageSearchBlock2')
5469		{
5470			imgUrl = properties.URL;
5471		}
5472		else if (action.Class == 'UserImage2Block' && properties.ImageFillProps != null &&
5473				properties.ImageFillProps.url != null)
5474		{
5475			imgUrl = properties.ImageFillProps.url;
5476		}
5477
5478		if (imgUrl != null)
5479		{
5480			return 'image=' + mapImgUrl(imgUrl) + ';' + extraStyles;
5481		}
5482
5483		return '';
5484	}
5485
5486	// Adds metadata, link, converts placeholders
5487	function addCustomData(cell, p, graph)
5488	{
5489		if (p.Link != null && p.Link.length > 0)
5490		{
5491			graph.setAttributeForCell(cell, 'link', getLink(p.Link[0]));
5492		}
5493
5494		replacePlaceholders(cell, graph);
5495
5496		for (var property in p)
5497		{
5498			if (p.hasOwnProperty(property) &&
5499				property.toString().startsWith('ShapeData_'))
5500			{
5501				try
5502				{
5503					var data = p[property];
5504					var key = mxUtils.trim(data.Label).replace(/[^a-z0-9]+/ig, '_').
5505						replace(/^\d+/, '').replace(/_+$/, '');
5506					setAttributeForCell(cell, key, data.Value, graph);
5507				}
5508				catch (e)
5509				{
5510					if (window.console)
5511					{
5512						console.log('Ignored ' + property + ':', e);
5513					}
5514				}
5515			}
5516		}
5517	};
5518
5519	var placeholderPattern = new RegExp('{{(date\{.*\}|[^%^\{^\}]+)}}', 'g');
5520
5521	function replacePlaceholders(cell, graph)
5522	{
5523		var result = [];
5524		var str = graph.convertValueToString(cell);
5525		var doReplace = false;
5526
5527		if (str != null)
5528		{
5529			var last = 0;
5530
5531			while (match = placeholderPattern.exec(str))
5532			{
5533				var val = match[0];
5534				doReplace = true;
5535
5536				if (val.length > 2)
5537				{
5538					var tmp = val.substring(2, val.length - 2);
5539
5540					if (tmp == 'documentName')
5541					{
5542						tmp = 'filename';
5543					}
5544					else if (tmp == 'pageName')
5545					{
5546						tmp = 'page';
5547					}
5548					else if (tmp == 'totalPages')
5549					{
5550						tmp = 'pagecount';
5551					}
5552					else if (tmp == 'page')
5553					{
5554						tmp = 'pagenumber';
5555					}
5556					else if (tmp.substring(0, 5) == 'date:')
5557					{
5558						// LATER: Convert more date masks
5559						tmp = 'date{' + tmp.substring(5).replace(/MMMM/g, 'mmmm').replace(/MM/g, 'mm').replace(/YYYY/g, 'yyyy') + '}';
5560					}
5561					else if (tmp.substring(0, 16) == 'lastModifiedTime')
5562					{
5563						// LATER: Convert more date masks
5564						tmp = tmp.replace(/MMMM/g, 'mmmm').replace(/MM/g, 'mm').replace(/YYYY/g, 'yyyy');
5565					}
5566					else if (tmp.substring(0, 9) == 'i18nDate:')
5567					{
5568						// LATER: Convert more named date masks
5569						tmp = 'date{' + tmp.substring(9).replace(/i18nShort/g, 'shortDate')
5570							.replace(/i18nMediumWithTime/g, 'mmm d, yyyy hh:MM TT') + '}';
5571					}
5572
5573					tmp = '%' + tmp + '%';
5574					result.push(str.substring(last, match.index) + ((tmp != null) ? tmp : val));
5575					last = match.index + val.length;
5576				}
5577			}
5578
5579			if (doReplace)
5580			{
5581				result.push(str.substring(last));
5582				graph.setAttributeForCell(cell, 'label', result.join(''));
5583				graph.setAttributeForCell(cell, 'placeholders', '1');
5584			}
5585		}
5586	};
5587
5588	function setAttributeForCell(cell, key, value, graph)
5589	{
5590		var currentKey = key;
5591		var counter = 0;
5592
5593		// Resolves conflicts by adding counter postfix
5594		while (graph.getAttributeForCell(cell, currentKey) != null)
5595		{
5596			counter++;
5597			currentKey = key + '_' + counter;
5598		}
5599
5600		graph.setAttributeForCell(cell, currentKey, (value != null) ? value : '');
5601	};
5602
5603	function updateCell(cell, obj, graph, source, target, ignoreLabel)
5604	{
5605		var a = getAction(obj);
5606
5607		if (a != null)
5608		{
5609			var s = styleMap[a.Class];
5610
5611			if (s != null)
5612			{
5613				cell.style += s + ';';
5614			}
5615			else if (!cell.edge)
5616			{
5617				console.log('No mapping found for: ' + a.Class);
5618				LucidImporter.hasUnknownShapes = true;
5619			}
5620
5621			var p = (a.Properties != null) ? a.Properties : a;
5622
5623			if (p != null)
5624			{
5625				// Adds label
5626				cell.value = (!ignoreLabel) ? convertText(p) : '';
5627				cell.style += addAllStyles(cell.style, p, a, cell, isLastLblHTML);
5628
5629				if (!cell.style.includes('strokeColor'))
5630				{
5631					cell.style += getStrokeColor(p, a);
5632				}
5633
5634				addCustomData(cell, p, graph);
5635
5636				if (p.Title && p.Title.t && p.Text && p.Text.t && a.Class.substr(0, 8) != 'ExtShape')
5637				{
5638					var geo = cell.geometry;
5639					var title = new mxCell(convertText(p.Title), new mxGeometry(0, geo.height,geo.width, 10), 'strokeColor=none;fillColor=none;');
5640					title.vertex = true;
5641					cell.insert(title);
5642					title.style += getLabelStyle(p.Title, isLastLblHTML);
5643				}
5644
5645				// Edge style
5646				if (cell.edge)
5647				{
5648					if (p.Rounding != null && p.Shape != 'diagonal') //No rounding for diagornal edges
5649					{
5650						cell.style += 'rounded=1;arcSize=' + p.Rounding + ';';
5651					}
5652					else
5653					{
5654						cell.style += 'rounded=0;';
5655					}
5656					var isCurved = p.Shape == 'curve';
5657
5658					if (p.Shape != 'diagonal')
5659					{
5660						if (p.ElbowPoints != null && p.ElbowPoints.length > 0)
5661						{
5662							cell.geometry.points = [];
5663
5664							for (var i = 0; i < p.ElbowPoints.length; i++)
5665							{
5666								cell.geometry.points.push(new mxPoint(
5667									Math.round(p.ElbowPoints[i].x * scale + dx),
5668									Math.round(p.ElbowPoints[i].y * scale + dy)));
5669							}
5670						}
5671						else if (p.Shape == 'elbow')
5672						{
5673							cell.style += 'edgeStyle=orthogonalEdgeStyle;';
5674						}
5675						else if (p.Endpoint1.Block != null && p.Endpoint2.Block != null)
5676						{
5677							cell.style += 'edgeStyle=orthogonalEdgeStyle;';
5678
5679							if (isCurved)
5680							{
5681								cell.style += 'curved=1;';
5682							}
5683						}
5684					}
5685
5686					if (p.LineJumps || LucidImporter.globalProps.LineJumps)
5687					{
5688						cell.style += 'jumpStyle=arc;';
5689					}
5690
5691					if (p.Endpoint1.Style != null)
5692					{
5693						var startStyle = edgeStyleMap[p.Endpoint1.Style];
5694
5695						if (startStyle != null)
5696						{
5697							startStyle = startStyle.replace(/xyz/g, 'start');
5698							cell.style += 'startArrow=' + startStyle + ';';
5699						}
5700						else
5701						{
5702							LucidImporter.hasUnknownShapes = true;
5703
5704							if (window.console)
5705							{
5706								console.log('Unknown endpoint style: ' + p.Endpoint1.Style);
5707							}
5708						}
5709					}
5710
5711					if (p.Endpoint2.Style != null)
5712					{
5713						var endStyle = edgeStyleMap[p.Endpoint2.Style];
5714
5715						if (endStyle != null)
5716						{
5717							endStyle = endStyle.replace(/xyz/g, 'end');
5718							cell.style += 'endArrow=' + endStyle + ';';
5719						}
5720						else
5721						{
5722							LucidImporter.hasUnknownShapes = true;
5723
5724							if (window.console)
5725							{
5726								console.log('Unknown endpoint style: ' + p.Endpoint2.Style);
5727							}
5728						}
5729					}
5730
5731					var waypoints = p.ElbowControlPoints != null && p.ElbowControlPoints.length > 0? p.ElbowControlPoints :
5732						(isCurved && p.BezierJoints != null && p.BezierJoints.length > 0? p.BezierJoints : p.Joints);
5733
5734					if (waypoints != null)
5735					{
5736						cell.geometry.points = [];
5737
5738						for (var i = 0; i < waypoints.length; i++)
5739						{
5740							var pt = waypoints[i].p ? waypoints[i].p : waypoints[i];
5741
5742							cell.geometry.points.push(new mxPoint(
5743								Math.round(pt.x * scale + dx),
5744								Math.round(pt.y * scale + dy)));
5745						}
5746
5747						if (waypoints == p.BezierJoints)
5748						{
5749							console.log('Curved edge case');
5750							LucidImporter.hasUnknownShapes = true;
5751						}
5752					}
5753
5754					// Inserts implicit or explicit control points for loops
5755					var implicitY = false, implicitX = false;
5756
5757					if ((cell.geometry.points == null || cell.geometry.points.length == 0) &&
5758						p.Endpoint1.Block != null && p.Endpoint1.Block == p.Endpoint2.Block &&
5759						source != null && target != null)
5760					{
5761						{
5762							var exit = new mxPoint(Math.round(source.geometry.x + source.geometry.width * p.Endpoint1.LinkX),
5763								Math.round(source.geometry.y + source.geometry.height * p.Endpoint1.LinkY));
5764							var entry = new mxPoint(Math.round(target.geometry.x + target.geometry.width * p.Endpoint2.LinkX),
5765								Math.round(target.geometry.y + target.geometry.height * p.Endpoint2.LinkY));
5766							dx = (exit.x == entry.x) ? (Math.abs(exit.x - source.geometry.x) < source.geometry.width / 2? -20 : 20) : 0;
5767							dy = (exit.y == entry.y) ? (Math.abs(exit.y - source.geometry.y) < source.geometry.height / 2? -20 : 20) : 0;
5768
5769							var p1 = new mxPoint(exit.x + dx, exit.y + dy), p2 = new mxPoint(entry.x + dx, entry.y + dy);
5770							p1.generated = true;
5771							p2.generated = true;
5772							cell.geometry.points = [p1, p2];
5773							implicitX = (exit.y == entry.y); //TODO Check these implicit variables effect
5774							implicitY = (exit.x == entry.x);
5775						}
5776					}
5777
5778					// Anchor points and arrows
5779					var p1, p2;
5780
5781					if (source == null || !source.geometry.isRotated) //TODO Rotate the endpoint instead of ignoring it
5782					{
5783						p1 = updateEndpoint(cell, p.Endpoint1, true, implicitY, null, source);
5784					}
5785
5786					if (source != null && p1 != null)
5787					{
5788						if (source.stylePoints == null)
5789						{
5790							source.stylePoints = [];
5791						}
5792
5793						source.stylePoints.push(p1);
5794						LucidImporter.stylePointsSet.add(source);
5795					}
5796
5797					if (target == null || !target.geometry.isRotated) //TODO Rotate the endpoint instead of ignoring it
5798					{
5799						p2 = updateEndpoint(cell, p.Endpoint2, false, implicitY, null, target);
5800					}
5801
5802					if (target != null && p2 != null)
5803					{
5804						if (target.stylePoints == null)
5805						{
5806							target.stylePoints = [];
5807						}
5808
5809						target.stylePoints.push(p2);
5810						LucidImporter.stylePointsSet.add(target);
5811					}
5812				}
5813			}
5814		}
5815
5816		if (obj.id != null)
5817		{
5818			setAttributeForCell(cell, 'lucidchartObjectId', obj.id, graph);
5819		}
5820	};
5821
5822	function createVertex(obj, graph)
5823	{
5824		var a = getAction(obj);
5825		var p = a.Properties;
5826		var b = p.BoundingBox;
5827
5828		if (obj.Class != null && (obj.Class.substring(0, 3) === "AWS" || obj.Class.substring(0, 6) === "Amazon" ) && !obj.Class.includes('AWS19'))
5829		{
5830			b.h = b.h - 20;
5831		}
5832
5833		v = new mxCell('', new mxGeometry(Math.round(b.x * scale + dx), Math.round(b.y * scale + dy),
5834				Math.round(b.w * scale), Math.round(b.h * scale)), vertexStyle);
5835	    v.vertex = true;
5836	    updateCell(v, obj, graph);
5837
5838	    //Store z-order to use it in groups
5839		v.zOrder = p.ZOrder;
5840
5841	    //FillOpacity affects icon also, so create a parent as a background color
5842	    if (v != null && v.style.indexOf(';grIcon=') >= 0)
5843    	{
5844	    	var parent = new mxCell('', new mxGeometry(v.geometry.x, v.geometry.y,
5845	    			v.geometry.width, v.geometry.height), vertexStyle);
5846	    	parent.vertex = true;
5847			parent.style += addAllStyles(parent.style, p, a, parent);
5848
5849		    v.geometry.x = 0;
5850		    v.geometry.y = 0;
5851		    v.style += 'part=1;';
5852		    parent.insert(v);
5853		    v = parent;
5854    	}
5855
5856	    handleTextRotation(v, p);
5857
5858	    if (p.Hidden)
5859		{
5860			v.visible = false;
5861		}
5862
5863	    return v;
5864	};
5865
5866	function createEdge(obj, graph, source, target)
5867	{
5868		var e = new mxCell('', new mxGeometry(0, 0, 100, 100), edgeStyle);
5869		e.geometry.relative = true;
5870		e.edge = true;
5871		updateCell(e, obj, graph, source, target, true);
5872
5873		// Adds text labels
5874		var a = getAction(obj);
5875		var p = a.Properties;
5876		var ta = (p != null) ? p.TextAreas : obj.TextAreas;
5877
5878		if (ta != null)
5879		{
5880			var count = 0;
5881
5882			while (ta['t' + count] !== undefined) //Some files has null for some labels
5883			{
5884				var tmp = ta['t' + count];
5885
5886				if (tmp != null)
5887				{
5888					e = insertLabel(tmp, e, obj, source, target);
5889				}
5890
5891				count++;
5892			}
5893
5894			count = 0;
5895
5896			while (ta['m' + count] !== undefined || count < 1)
5897			{
5898				var tmp = ta['m' + count];
5899
5900				if (tmp != null)
5901				{
5902					e = insertLabel(tmp, e, obj, source, target);
5903				}
5904
5905				count++;
5906			}
5907
5908			if (ta.Text != null)
5909			{
5910				e = insertLabel(ta.Text, e, obj, source, target);
5911			}
5912
5913			var ta = (p != null) ? p.TextAreas : obj.TextAreas;
5914
5915			if (ta.Message != null)
5916			{
5917				e = insertLabel(ta.Message, e, obj, source, target);
5918			}
5919		}
5920
5921		if (obj.Hidden)
5922		{
5923			e.visible = false;
5924		}
5925
5926		return e;
5927	}
5928
5929	function insertLabel(textArea, e, obj, src, trg)
5930	{
5931		var x = (parseFloat(textArea.Location) - 0.5) * 2;
5932
5933		if (isNaN(x) && textArea.Text != null && textArea.Text.Location != null)
5934		{
5935			x = (parseFloat(textArea.Text.Location) - 0.5) * 2;
5936		}
5937
5938		var lblTxt = convertText(textArea);
5939		var lab = new mxCell(lblTxt, new mxGeometry((!isNaN(x)) ? x : 0, 0, 0, 0),
5940			labelStyle + getEdgeLabelStyle(textArea, obj, isLastLblHTML));
5941		lab.geometry.relative = true;
5942		lab.vertex = true;
5943
5944		if (textArea.Side)
5945		{
5946			try
5947			{
5948				if (obj.Action && obj.Action.Properties)
5949				{
5950					obj = obj.Action.Properties;
5951				}
5952
5953				var dx, dy;
5954
5955				//Sometimes x, y info in the Endpoint is incorrect when the edge is connected!
5956				if (src != null && trg != null)
5957				{
5958					var srcGeo = src.geometry, trgGeo = trg.geometry;
5959					dx = Math.abs((srcGeo.x + srcGeo.width * obj.Endpoint1.LinkX) -
5960									(trgGeo.x + trgGeo.width * obj.Endpoint2.LinkX));
5961					dy = Math.abs((srcGeo.y + srcGeo.height * obj.Endpoint1.LinkY) -
5962									(trgGeo.y + trgGeo.height * obj.Endpoint2.LinkY));
5963				}
5964				else
5965				{
5966					dx = Math.abs(obj.Endpoint1.x - obj.Endpoint2.x);
5967					dy = Math.abs(obj.Endpoint1.y - obj.Endpoint2.y);
5968				}
5969
5970				var strSize = mxUtils.getSizeForString(lblTxt.replace(/\n/g, '<br>'));
5971
5972				if (dx == 0 || dx < dy)
5973				{
5974					lab.geometry.offset = new mxPoint(Math.sign(obj.Endpoint1.y - obj.Endpoint2.y) * textArea.Side * (strSize.width / 2 + 5 + dx), 0);
5975				}
5976				else
5977				{
5978					lab.geometry.offset = new mxPoint(0, Math.sign(obj.Endpoint2.x - obj.Endpoint1.x) * textArea.Side * (strSize.height / 2 + 5 + dy));
5979				}
5980			}
5981			catch(e)
5982			{
5983				console.log(e);
5984			}
5985		}
5986
5987		e.insert(lab);
5988
5989		return e;
5990	};
5991
5992	function getEdgeLabelStyle(obj, pObj, noLblStyle)
5993	{
5994		if (noLblStyle)
5995		{
5996			return gFontFamilyStyle;
5997		}
5998
5999		var size = defaultFontSize;
6000		var style = '';
6001
6002		if (obj != null && obj.Value != null && obj.Value.m != null)
6003		{
6004			style = getFontStyleString(obj.Value.m);
6005
6006			for (var i = 0; i < obj.Value.m.length; i++)
6007			{
6008				if (obj.Value.m[i].n == 's')
6009				{
6010					size = fix1Digit(scale * parseFloat(obj.Value.m[i].v));
6011				}
6012				else if (obj.Value.m[i].n == 'c')
6013				{
6014					var v = rgbToHex(obj.Value.m[i].v);
6015
6016					if (v != null)
6017					{
6018						v = v.substring(0, 7);
6019					}
6020
6021					style += 'fontColor=' + v + ';'
6022				}
6023			}
6024
6025			style += getFontFamily(pObj);
6026			gFontFamilyStyle = '';
6027		}
6028
6029		return style + ';fontSize=' + size + ';';
6030	};
6031
6032	function createStyle(key, prop, defaultValue, fn)
6033	{
6034		if (prop != null && fn != null)
6035		{
6036			prop = fn(prop);
6037		}
6038
6039		if (prop != null && prop != defaultValue)
6040		{
6041			return key + '=' + prop + ';';
6042		}
6043
6044		return '';
6045	};
6046
6047	function updateEndpoint(cell, endpoint, source, ignoreX, ignoreY, endCell)
6048	{
6049		if (endpoint != null)
6050		{
6051			if (endpoint.LinkX != null && endpoint.LinkY != null)
6052			{
6053				endpoint.LinkX = Math.round(endpoint.LinkX * 1000) / 1000;
6054				endpoint.LinkY = Math.round(endpoint.LinkY * 1000) / 1000;
6055
6056				if (endCell != null && endCell.style && endCell.style.indexOf('flipH=1') > -1)
6057				{
6058					endpoint.LinkX = 1 - endpoint.LinkX;
6059				}
6060
6061				if (endCell != null && endCell.style && endCell.style.indexOf('flipV=1') > -1)
6062				{
6063					endpoint.LinkY = 1 - endpoint.LinkY;
6064				}
6065
6066				cell.style += ((!ignoreX) ? ((source) ? 'exitX' : 'entryX') + '=' + endpoint.LinkX + ';' : '') +
6067					((!ignoreY) ? (((source) ? 'exitY' : 'entryY') + '=' + endpoint.LinkY + ';') : '') +
6068					((source) ? 'exitPerimeter' : 'entryPerimeter') + '=0;'; //perimeter as 0 works with both cases better
6069
6070				if (endpoint.Inside)
6071				{
6072
6073					return '[' + endpoint.LinkX + ',' + endpoint.LinkY + ',0]';
6074				}
6075			}
6076		}
6077	};
6078
6079	function createGroup(obj, lookup, edgesGroups, blocksMap)
6080	{
6081		try
6082		{
6083			if (obj.Action != null && obj.Action.Properties != null)
6084			{
6085				obj = obj.Action.Properties;
6086			}
6087
6088			var group = new mxCell('', new mxGeometry(), 'group;dropTarget=0;');
6089			group.vertex = true;
6090			//Store z-order to use it in groups
6091			group.zOrder = obj.ZOrder;
6092
6093			var minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
6094			var members = obj.Members, memberCells = [];
6095
6096			for (var key in members)
6097			{
6098				var v = lookup[key];
6099
6100				if (v != null)
6101				{
6102					memberCells.push(v);
6103				}
6104				else if (blocksMap[key] != null)
6105				{
6106					memberCells.push(blocksMap[key]);
6107					//Edges are not yet created, so, create a map for them
6108					edgesGroups[key] = group;
6109				}
6110			}
6111
6112			memberCells.sort(function(a, b)
6113			{
6114				var ai = a.zOrder || a.ZOrder; // for edges we need ZOrder since they aren't created yet
6115				var bi = b.zOrder || b.ZOrder;
6116
6117				return (ai != null && bi != null) ? (ai > bi? 1 : (ai < bi? -1 : 0)) : 0; //ZOrder can be negative
6118			});
6119
6120			function updateMinMax(e, scaleIt)
6121			{
6122				if (e != null)
6123				{
6124					if (Array.isArray(e))
6125					{
6126						for (var i = 0; i < e.length; i++)
6127                        {
6128                        	updateMinMax(e[i].p? e[i].p : e[i], scaleIt);
6129                        }
6130					}
6131					else
6132					{
6133						var s = scaleIt? scale : 1;
6134						minX = Math.min(minX, e.x * s);
6135						minY = Math.min(minY, e.y * s);
6136						maxX = Math.max(maxX, (e.x + (e.width? e.width : 0)) * s);
6137						maxY = Math.max(maxY, (e.y + (e.height? e.height : 0)) * s);
6138					}
6139				}
6140			};
6141
6142			var index = 0;
6143
6144			for (var i = 0; i < memberCells.length; i++)
6145			{
6146				var v = memberCells[i];
6147
6148				if (v.vertex)
6149				{
6150					updateMinMax(v.geometry);
6151					v.parent = group;
6152					group.insert(v, index++);
6153				}
6154				else
6155				{
6156					var vProp = v.Action != null && v.Action.Properties? v.Action.Properties : v;
6157					updateMinMax(vProp.Endpoint1, true);
6158					updateMinMax(vProp.Endpoint2, true);
6159					updateMinMax(vProp.ElbowPoints, true);
6160					updateMinMax(vProp.ElbowControlPoints, true);
6161					updateMinMax(vProp.BezierJoints, true);
6162					updateMinMax(vProp.Joints, true);
6163				}
6164			}
6165
6166			group.geometry.x = minX;
6167			group.geometry.y = minY;
6168			group.geometry.width = maxX - minX;
6169			group.geometry.height = maxY - minY;
6170
6171			if (group.children != null)
6172			{
6173				for (var i = 0; i < group.children.length; i++)
6174				{
6175					var geo = group.children[i].geometry;
6176					geo.x -= minX;
6177					geo.y -= minY;
6178				}
6179			}
6180
6181			if (obj.IsState)
6182			{
6183				group.lucidLayerInfo = {
6184					name: obj.Name,
6185					visible: !obj.Hidden,
6186					locked: obj.Restrictions.b && obj.Restrictions.p && obj.Restrictions.c
6187				};
6188			}
6189			else if (obj.Hidden)
6190			{
6191				group.visible = false;
6192			}
6193
6194			return group;
6195		}
6196		catch(e)
6197		{
6198			console.log(e);
6199		}
6200	};
6201
6202	function importLucidPage(graph, g, noSelection)
6203	{
6204		LucidImporter.hasMath = false;
6205		LucidImporter.stylePointsSet = new Set();
6206
6207		graph.getModel().beginUpdate();
6208		try
6209		{
6210			var select = [];
6211			var lookup = {};
6212			var edgesGroups = {};
6213			var blocksMap = {};
6214			var queue = [];
6215
6216			if (g.Lines != null)
6217			{
6218				blocksMap = g.Lines;
6219			}
6220
6221			// Vertices first (populates lookup table for connecting edges)
6222			if (g.Blocks != null)
6223			{
6224				Object.assign(blocksMap, g.Blocks);
6225
6226				for (var key in g.Blocks)
6227				{
6228					var obj = g.Blocks[key];
6229					obj.id = key;
6230
6231					var created = false;
6232
6233					if (styleMap[obj.Class] != null)
6234					{
6235						if (styleMap[obj.Class] == 'mxCompositeShape')
6236						{
6237							lookup[obj.id] = addCompositeShape(obj, select, graph);
6238							queue.push(obj);
6239							created = true;
6240						}
6241					}
6242
6243					if (!created)
6244					{
6245						lookup[obj.id] = createVertex(obj, graph);
6246						queue.push(obj);
6247					}
6248				}
6249
6250				if (g.Generators != null)
6251				{
6252					for (var key in g.Generators)
6253					{
6254						if (g.Generators[key].ClassName == 'OrgChart2018')
6255						{
6256							LucidImporter.hasUnknownShapes = true;
6257							createOrgChart(key, g.Generators[key], g.Data, graph, lookup);
6258						}
6259						else
6260						{
6261							LucidImporter.hasUnknownShapes = true;
6262						}
6263					}
6264				}
6265			}
6266			else
6267			{
6268				for (var i = 0; i < g.Objects.length; i++)
6269				{
6270					var obj = g.Objects[i];
6271					blocksMap[obj.id] = obj;
6272
6273					if (obj.Action != null && styleMap[obj.Action.Class] == 'mxCompositeShape')
6274					{
6275						lookup[obj.id] = addCompositeShape(obj, select, graph);
6276					}
6277					else if (obj.IsBlock && obj.Action != null && obj.Action.Properties != null)
6278					{
6279					    lookup[obj.id] = createVertex(obj, graph);
6280					}
6281					else if (obj.IsGenerator && obj.GeneratorData && obj.GeneratorData.p)
6282					{
6283						if (obj.GeneratorData.p.ClassName == 'OrgChart2018')
6284						{
6285							LucidImporter.hasUnknownShapes = true;
6286							createOrgChart(obj.GeneratorData.id, obj.GeneratorData.p, obj.GeneratorData.gs, graph, lookup);
6287						}
6288						else
6289						{
6290							LucidImporter.hasUnknownShapes = true;
6291						}
6292					}
6293
6294					queue.push(obj);
6295				}
6296
6297				//Add groups
6298				for (var i = 0; i < g.Objects.length; i++)
6299				{
6300					var obj = g.Objects[i];
6301
6302					if (obj.IsGroup)
6303					{
6304						var group = createGroup(obj, lookup, edgesGroups, blocksMap);
6305
6306						if (group)
6307						{
6308							lookup[obj.id] = group;
6309							queue.push(obj);
6310						}
6311					}
6312				}
6313			}
6314
6315			//Create groups
6316			if (g.Groups != null)
6317			{
6318				try
6319				{
6320					for (var key in g.Groups)
6321					{
6322						var obj = g.Groups[key];
6323						obj.id = key;
6324
6325						var group = createGroup(obj, lookup, edgesGroups, blocksMap);
6326
6327						if (group)
6328						{
6329							lookup[obj.id] = group;
6330							queue.push(obj);
6331						}
6332					}
6333				}
6334				catch(e)
6335				{
6336					console.log(e);
6337				}
6338			}
6339
6340			if (g.Lines != null)
6341			{
6342				for (var key in g.Lines)
6343				{
6344					var obj = g.Lines[key];
6345					obj.id = key;
6346
6347					queue.push(obj);
6348				}
6349			}
6350
6351			// Sorts all cells by ZOrder
6352			queue.sort(function(a, b)
6353			{
6354				a = getAction(a);
6355				b = getAction(b);
6356
6357				var ai = (a.Properties != null) ? a.Properties.ZOrder : a.ZOrder;
6358				var bi = (b.Properties != null) ? b.Properties.ZOrder : b.ZOrder;
6359
6360				return (ai != null && bi != null) ? (ai > bi? 1 : (ai < bi? -1 : 0)) : 0; //ZOrder can be negative
6361			});
6362
6363			function addLine(obj, p)
6364			{
6365				var src = (p.Endpoint1.Block != null) ? lookup[p.Endpoint1.Block] : null;
6366				var trg = (p.Endpoint2.Block != null) ? lookup[p.Endpoint2.Block] : null;
6367				var e = createEdge(obj, graph, src, trg);
6368
6369				if ((p.Endpoint1 && p.Endpoint1.Line) || (p.Endpoint2 && p.Endpoint2.Line))
6370				{
6371					console.log('Edge to Edge case');
6372					LucidImporter.hasUnknownShapes = true;
6373				}
6374
6375				if (src == null && p.Endpoint1 != null)
6376				{
6377					e.geometry.setTerminalPoint(new mxPoint(Math.round(p.Endpoint1.x * scale),
6378						Math.round(p.Endpoint1.y * scale)), true);
6379				}
6380
6381				if (trg == null && p.Endpoint2 != null)
6382				{
6383					e.geometry.setTerminalPoint(new mxPoint(Math.round(p.Endpoint2.x * scale),
6384						Math.round(p.Endpoint2.y * scale)), false);
6385				}
6386
6387				var group = edgesGroups[obj.id];
6388
6389				function fixPoint(p, px, py)
6390				{
6391					if (p != null && !p.generated)
6392					{
6393						p.x -= px;
6394						p.y -= py;
6395					}
6396				};
6397
6398				if (group != null)
6399				{
6400					//Correct edge geometry
6401					var geo = e.geometry, px = 0, py = 0, prnt = group;
6402
6403					while (prnt != null && prnt.geometry != null)
6404					{
6405						px += prnt.geometry.x;
6406						py += prnt.geometry.y;
6407						prnt = prnt.parent;
6408					}
6409
6410					fixPoint(geo.sourcePoint, px, py);
6411					fixPoint(geo.targetPoint, px, py);
6412					fixPoint(geo.offset, px, py);
6413                    var points = geo.points;
6414
6415                    if (points != null)
6416                    {
6417                        for (var i = 0; i < points.length; i++)
6418                        {
6419                        	fixPoint(points[i], px, py);
6420                        }
6421                    }
6422				}
6423
6424				select.push(graph.addCell(e, group, null, src, trg));
6425			};
6426
6427			// Inserts cells in ZOrder and connects edges via lookup
6428			for (var i = 0; i < queue.length; i++)
6429			{
6430				var obj = queue[i];
6431				var v = lookup[obj.id];
6432
6433				if (v != null)
6434				{
6435					if (v.parent == null)
6436					{
6437						if (v.lucidLayerInfo)
6438						{
6439							var layerCell = new mxCell();
6440					        graph.addCell(layerCell, graph.model.root);
6441
6442					        layerCell.setVisible(v.lucidLayerInfo.visible);
6443
6444					        if (v.lucidLayerInfo.locked)
6445					        {
6446					            layerCell.setStyle("locked=1;");
6447					        }
6448
6449					        layerCell.setValue(v.lucidLayerInfo.name);
6450					        delete v.lucidLayerInfo;
6451					        graph.addCell(v, layerCell);
6452						}
6453						else
6454						{
6455							select.push(graph.addCell(v));
6456						}
6457					}
6458				}
6459				else if (obj.IsLine && obj.Action != null && obj.Action.Properties != null)
6460				{
6461					var p = obj.Action.Properties;
6462					addLine(obj, p);
6463				}
6464				else if (obj.StrokeStyle != null)
6465				{
6466					addLine(obj, obj);
6467				}
6468			}
6469
6470			LucidImporter.stylePointsSet.forEach(function(v)
6471			{
6472				v.style = 'points=[' + v.stylePoints.join(',') + '];' + v.style;
6473				delete v.stylePoints;
6474			});
6475
6476			//Cleanup added properties
6477			try
6478			{
6479				var allCells = graph.getModel().cells;
6480
6481				for (var id in allCells)
6482				{
6483					var c = allCells[id];
6484					delete c.zOrder;
6485				}
6486			} catch(e){}
6487
6488			if (!noSelection)
6489				graph.setSelectionCells(select);
6490		}
6491		finally
6492		{
6493			graph.getModel().endUpdate();
6494		}
6495
6496	};
6497
6498	function createGraph()
6499	{
6500		//TODO Set the graph defaults
6501		var graph = new Graph();
6502        graph.setExtendParents(false);
6503        graph.setExtendParentsOnAdd(false);
6504        graph.setConstrainChildren(false);
6505        graph.setHtmlLabels(true);
6506        graph.getModel().maintainEdgeParent = false;
6507        return graph;
6508	};
6509
6510	//Code adopted from vsdx importer
6511
6512	/**
6513	 * Holds the NURBS array that is part of the VSDX NURBSTo element, together with some helper functions
6514	 */
6515    function Nurbs(x1, y1, n1x, n1y, x2, y2, n2x, n2y)
6516	{
6517        this.nurbsValues = [1, 3, 0, 0,
6518			(x1 + n1x) * 100,
6519			100 - (1 - (y1 + n1y)) * 100,
6520			0, 1,
6521			(x2 + n2x) * 100,
6522			100 - (1 - (y2 + n2y)) * 100,
6523			0, 1
6524		];
6525    }
6526    /**
6527     * @return {number} number of points, not including the last one (which is outside of the nurbs string)
6528     */
6529    Nurbs.prototype.getSize = function () {
6530        return (((this.nurbsValues.length / 4 | 0)) - 1);
6531    };
6532    /**
6533     * @return {number} the i-th X coordinate
6534     * @param {number} i
6535     */
6536    Nurbs.prototype.getX = function (i) {
6537        return Math.round(this.nurbsValues[(i + 1) * 4] * 100.0) / 100.0;;
6538    };
6539    /**
6540     * @return {number} the i-th Y coordinate
6541     * @param {number} i
6542     */
6543    Nurbs.prototype.getY = function (i) {
6544        return Math.round(this.nurbsValues[(i + 1) * 4 + 1] * 100.0) / 100.0;;
6545    };
6546
6547	//A: 0, B: 1, C: 0, D: 1
6548	function NURBSTo(x, y, w, h, px1, py1, n1x, n1y, px2, py2, n2x, n2y)
6549	{
6550        var nurbs = new Nurbs(px1, py1, n1x, n1y, px2, py2, n2x, n2y);
6551
6552        if (nurbs.getSize() >= 2)
6553		{
6554            var x1 = nurbs.getX(0);
6555            var y1 = nurbs.getY(0);
6556            var x2 = nurbs.getX(1);
6557            var y2 = nurbs.getY(1);
6558            y = y * 100.0 / h;
6559            x = x * 100.0 / w;
6560            x = Math.round(x * 100.0) / 100.0;
6561            y = Math.round(y * 100.0) / 100.0;
6562
6563            var cp1 = ([]);
6564            var cp2 = ([]);
6565            var nut = ([]);
6566            var nurbsize = nurbs.getSize();
6567
6568			for (var i = 0; i < nurbsize - 1; i = i + 3)
6569			{
6570                cp1.push(new mxPoint(nurbs.getX(i), nurbs.getY(i)));
6571                cp2.push(new mxPoint(nurbs.getX(i + 1), nurbs.getY(i + 1)));
6572
6573				if (i < nurbsize - 2) {
6574                    nut.push(new mxPoint(nurbs.getX(i + 2), nurbs.getY(i + 2)));
6575                }
6576                else {
6577                    nut.push(new mxPoint(x, y));
6578                }
6579            }
6580
6581            var result = "";
6582            for (var i = 0; i < cp1.length; i++) {
6583                result += "<curve x1=\"" + cp1[i].x + "\" y1=\"" + cp1[i].y + "\" x2=\"" + cp2[i].x + "\" y2=\"" + cp2[i].y + "\" x3=\"" + nut[i].x + "\" y3=\"" + nut[i].y + "\"/>";
6584            }
6585
6586            return result;
6587        }
6588    };
6589
6590	function addStencil(id, obj)
6591	{
6592		try
6593		{
6594			var stencils = [];
6595			var w = obj.BoundingBox.w;
6596			var h = obj.BoundingBox.h;
6597
6598			for (var i = 0; i < obj.Shapes.length; i++)
6599			{
6600				var shape = obj.Shapes[i];
6601				var fillClr = shape.FillColor;
6602				var strokeClr = shape.StrokeColor;
6603				var lineW = shape.LineWidth;
6604				var points = shape.Points;
6605				var lines = shape.Lines;
6606				var parts = ["<shape strokewidth=\"inherit\"><foreground>"];
6607				parts.push("<path>");
6608				var lastP = null;
6609
6610				for (var j = 0; j < lines.length; j++)
6611				{
6612					var line = lines[j];
6613
6614					if (lastP != line.p1) //Add move to when last point is different from current first poinnt
6615					{
6616						var x = points[line.p1].x, y = points[line.p1].y;
6617						x = x * 100.0 / w;
6618						y = y * 100.0 / h;
6619						x = Math.round(x * 100.0) / 100.0;
6620						y = Math.round(y * 100.0) / 100.0;
6621						parts.push("<move x=\"" + x + "\" y=\"" + y + "\"/>");
6622					}
6623
6624					if (line.n1 != null) // Curve
6625					{
6626						var curve =  NURBSTo(points[line.p2].x, points[line.p2].y, w, h,
6627								points[line.p1].x / w, points[line.p1].y / h, line.n1.x / w, line.n1.y / h,
6628								points[line.p2].x / w, points[line.p2].y / h, line.n2.x / w, line.n2.y / h);
6629						parts.push(curve);
6630					}
6631					else //line
6632					{
6633						var x = points[line.p2].x, y = points[line.p2].y;
6634						x = x * 100.0 / w;
6635						y = y * 100.0 / h;
6636						x = Math.round(x * 100.0) / 100.0;
6637						y = Math.round(y * 100.0) / 100.0;
6638						parts.push("<line x=\"" + x + "\" y=\"" + y + "\"/>");
6639					}
6640
6641					lastP = line.p2;
6642				}
6643
6644				parts.push("</path>");
6645				parts.push("<fillstroke/>");
6646				parts.push("</foreground></shape>");
6647				stencils.push({
6648					shapeStencil: "stencil(" + Graph.compress(parts.join('')) + ")",
6649					FillColor: fillClr,
6650					LineColor: strokeClr,
6651					LineWidth: lineW,
6652				});
6653			}
6654
6655			LucidImporter.stencilsMap[id] = {
6656				text: obj.Text,
6657				w: w,
6658				h: h,
6659				x: obj.BoundingBox.x,
6660				y: obj.BoundingBox.y,
6661				stencils: stencils
6662			};
6663		}
6664		catch(e)
6665		{
6666			console.log('Stencil parsing error:', e);
6667		}
6668	};
6669
6670	LucidImporter.importState = function(state, imgSrcRepl, advImpConfig)
6671	{
6672		LucidImporter.stencilsMap = {}; //Reset stencils cache
6673		LucidImporter.imgSrcRepl = imgSrcRepl; //Use LucidImporter object to store the map since it is used deep inside
6674		LucidImporter.advImpConfig = advImpConfig;
6675		LucidImporter.globalProps = {};
6676		LucidImporter.pageIdsMap = {};
6677		LucidImporter.hasUnknownShapes = false;
6678		LucidImporter.hasOrgChart = false;
6679		LucidImporter.hasTimeLine = false;
6680		LucidImporter.hasExtImgs = false;
6681		var xml = ['<?xml version=\"1.0\" encoding=\"UTF-8\"?>', '<mxfile type="Lucidchart-Import" version="' +
6682			EditorUi.VERSION + '" host="' + mxUtils.htmlEntities(window.location.hostname) +
6683			'" agent="' + mxUtils.htmlEntities(navigator.appVersion) +
6684			'" modified="' + mxUtils.htmlEntities(new Date().toISOString()) + '">'];
6685
6686		if (advImpConfig && advImpConfig.transparentEdgeLabels)
6687		{
6688			labelStyle = labelStyle.replace('labelBackgroundColor=#ffffff;', 'labelBackgroundColor=none;');
6689		}
6690
6691		// Extracts and sorts all pages
6692		var pages = [];
6693
6694		function addPages(obj)
6695		{
6696			//Build stencils map
6697			if (obj.Properties)
6698			{
6699				for (var key in obj.Properties)
6700				{
6701					if (key.substr(0, 8) == 'Stencil-')
6702					{
6703						addStencil(key.substr(8), obj.Properties[key]);
6704					}
6705				}
6706
6707				LucidImporter.globalProps = obj.Properties;
6708			}
6709
6710			for (var id in obj.Pages)
6711			{
6712				var pg = obj.Pages[id];
6713				pg.id = id;
6714				pg.Data = obj.Data;
6715				pages.push(pg);
6716			}
6717
6718			pages.sort(function(a, b)
6719			{
6720			    if (a.Properties.Order < b.Properties.Order)
6721			    {
6722			    	return -1;
6723			    }
6724			    else if (a.Properties.Order > b.Properties.Order)
6725			    {
6726			    	return 1;
6727			    }
6728			    else
6729			    {
6730			    	return 0;
6731			    }
6732			});
6733
6734			for (var i = 0; i < pages.length; i++)
6735			{
6736				LucidImporter.pageIdsMap[pages[i].id] = i;
6737			}
6738		};
6739
6740		if (state.state != null && urlParams['dev'] == '1' && window.console != null)
6741		{
6742			console.log(JSON.stringify(JSON.parse(state.state), null, 2));
6743		}
6744
6745		if (state.state != null)
6746		{
6747			addPages(JSON.parse(state.state));
6748		}
6749		else if (state.Page == null && state.Pages != null)
6750		{
6751			addPages(state);
6752		}
6753		else
6754		{
6755			pages.push(state);
6756		}
6757
6758		var graph = createGraph();
6759		var codec = new mxCodec();
6760
6761		for (var i = 0; i < pages.length; i++)
6762		{
6763            xml.push('<diagram');
6764
6765            if (pages[i].Properties != null && pages[i].Properties.Title != null)
6766            {
6767            	xml.push(' name="' + mxUtils.htmlEntities(pages[i].Properties.Title) + '"');
6768            }
6769
6770            xml.push(' id="' + i + '"'); //Add page ids in case it is needed in aspects
6771			importLucidPage(graph, pages[i], true);
6772            var node = codec.encode(graph.getModel());
6773
6774			if (pages[i].Properties != null)
6775            {
6776				if (pages[i].Properties.FillColor)
6777				{
6778            		node.setAttribute('background', getColor(pages[i].Properties.FillColor));
6779				}
6780
6781				if (pages[i].Properties.InfiniteCanvas)
6782				{
6783					node.setAttribute('page', 0);
6784				}
6785				else if (pages[i].Properties.Size != null)
6786				{
6787					node.setAttribute('page', 1);
6788					node.setAttribute('pageWidth', pages[i].Properties.Size.w * scale);
6789					node.setAttribute('pageHeight', pages[i].Properties.Size.h * scale);
6790				}
6791
6792				if (pages[i].Properties.GridSpacing != null)
6793				{
6794					node.setAttribute('grid', 1);
6795					node.setAttribute('gridSize', pages[i].Properties.GridSpacing * scale);
6796				}
6797            }
6798
6799			if (LucidImporter.hasMath)
6800			{
6801				node.setAttribute('math', 1);
6802			}
6803
6804            graph.getModel().clear();
6805
6806            xml.push('>' + Graph.compress(mxUtils.getXml(node)) + '</diagram>');
6807		}
6808
6809		xml.push('</mxfile>');
6810		LucidImporter.imgSrcRepl = null; //Reset the map so it doesn't affect next calls
6811
6812		return xml.join('');
6813	};
6814
6815	function addRouterEdge(x, y, edge, select, graph, cells, v, cell)
6816	{
6817	   	var dummy = new mxCell('', new mxGeometry(x, y, 0, 0), 'strokeColor=none;fillColor=none;');
6818	   	dummy.vertex = true;
6819	   	v.insert(dummy);
6820	   	cells = [dummy];
6821
6822		var e = edge.clone();
6823		cell.insertEdge(e, false);
6824		dummy.insertEdge(e, true);
6825		cells.push(e);
6826		select.push(graph.addCell(e, null, null, null, null));
6827	};
6828
6829	function addFloatingEdge(x1, y1, x2, y2, edge, select, graph, cells, v)
6830	{
6831	   	var dummy1 = new mxCell('', new mxGeometry(x1, y1, 0, 0), 'strokeColor=none;fillColor=none;');
6832	   	dummy1.vertex = true;
6833	   	v.insert(dummy1);
6834	   	cells = [dummy1];
6835
6836	   	var dummy2 = new mxCell('', new mxGeometry(x2, y2, 0, 0), 'strokeColor=none;fillColor=none;');
6837	   	dummy2.vertex = true;
6838	   	v.insert(dummy2);
6839	   	cells = [dummy2];
6840
6841		var e = edge.clone();
6842		dummy1.insertEdge(e, true);
6843		dummy2.insertEdge(e, false);
6844		cells.push(e);
6845		select.push(graph.addCell(e, null, null, null, null));
6846	};
6847
6848	function addGCP2ServiceCard(icon, w, h, v, p, a)
6849	{
6850		v.style = 'rounded=1;absoluteArcSize=1;fillColor=#ffffff;arcSize=2;strokeColor=#dddddd;';
6851		v.style += addAllStyles(v.style, p, a, v);
6852
6853		var label = convertText(p);
6854    	v.vertex = true;
6855	    var icon1 = new mxCell(label, new mxGeometry(0, 0.5, 24, 24),
6856	    		'dashed=0;connectable=0;html=1;strokeColor=none;' + mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.' + icon + ';part=1;shadow=0;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=5;');
6857	    icon1.style += addAllStyles(icon1.style, p, a, icon1, isLastLblHTML);
6858
6859	    icon1.geometry.relative = true;
6860	    icon1.geometry.offset = new mxPoint(5, -12);
6861    	icon1.vertex = true;
6862    	v.insert(icon1);
6863	};
6864
6865	function addGCP2UserDeviceCard(icon, scaleX, scaleY, w, h, v, p, a)
6866	{
6867		if (icon != 'transparent')
6868		{
6869			var s = mxConstants.STYLE_SHAPE + '=mxgraph.gcp2.';
6870		}
6871		else
6872		{
6873			var s = mxConstants.STYLE_SHAPE + '=';
6874		}
6875
6876		v.style = 'rounded=1;absoluteArcSize=1;arcSize=2;verticalAlign=bottom;fillColor=#ffffff;strokeColor=#dddddd;whiteSpace=wrap;';
6877		v.style += addAllStyles(v.style, p, a, v);
6878
6879		v.value = convertText(p);
6880    	v.vertex = true;
6881	    var icon1 = new mxCell(null, new mxGeometry(0.5, 0, w * 0.7 * scaleX, w * 0.7 * scaleY),
6882	    		s + icon + ';part=1;dashed=0;connectable=0;html=1;strokeColor=none;shadow=0;');
6883
6884	    icon1.geometry.relative = true;
6885	    icon1.geometry.offset = new mxPoint(- scaleX * w * 0.35, 10 + (1 - scaleY) * w * 0.35);
6886    	icon1.vertex = true;
6887    	icon1.style += addAllStyles(icon1.style, p, a, icon1, isLastLblHTML);
6888    	v.insert(icon1);
6889	};
6890
6891	function addGCP2ExpandedProductCard(icon, scaleX, scaleY, w, h, v, p, a)
6892	{
6893		if (icon != 'transparent')
6894		{
6895			var s = mxConstants.STYLE_SHAPE + '=mxgraph.gcp.';
6896		}
6897		else
6898		{
6899			var s = mxConstants.STYLE_SHAPE + '=';
6900		}
6901
6902		v.style = 'rounded=1;absoluteArcSize=1;arcSize=2;verticalAlign=bottom;fillColor=#ffffff;strokeColor=#dddddd;whiteSpace=wrap;';
6903		v.style += addAllStyles(v.style, p, a, v);
6904
6905		v.value = convertText(p);
6906    	v.vertex = true;
6907	    var icon1 = new mxCell(null, new mxGeometry(0.5, 0, w * 0.7 * scaleX, w * 0.7 * scaleY),
6908	    		s + icon + ';part=1;dashed=0;connectable=0;html=1;strokeColor=none;shadow=0;');
6909
6910	    icon1.geometry.relative = true;
6911	    icon1.geometry.offset = new mxPoint(- scaleX * w * 0.35, 10 + (1 - scaleY) * w * 0.35);
6912    	icon1.vertex = true;
6913    	icon1.style += addAllStyles(icon1.style, p, a, icon1, isLastLblHTML);
6914    	v.insert(icon1);
6915	};
6916
6917	function hasStyle(style, key)
6918	{
6919		if (style != null && key != null)
6920		{
6921			if (key == mxConstants.STYLE_ALIGN + 'Global')
6922			{
6923				key = mxConstants.STYLE_ALIGN;
6924			}
6925
6926			if (style.includes(';' + key + '='))
6927			{
6928				return true;
6929			}
6930
6931			if (style.substring(0,key.length + 1) == (key + '='))
6932			{
6933				return true;
6934			}
6935		}
6936
6937		return false;
6938	}
6939
6940	function getDarkerClr(clr, perc)
6941	{
6942		function modComp(comp)
6943		{
6944			var v = Math.round(parseInt('0x' + comp) * perc).toString(16);
6945			return v.length == 1? '0' + v : v;
6946		}
6947
6948		return '#' + modComp(clr.substr(1, 2)) +
6949						 		modComp(clr.substr(3, 2)) +
6950								modComp(clr.substr(5, 2));
6951	};
6952
6953	//composite shapes
6954	function addCompositeShape(obj, select, graph)
6955	{
6956		var a = getAction(obj);
6957		var p = a.Properties;
6958		var b = p.BoundingBox;
6959
6960		var w = Math.round(b.w * scale);
6961		var h = Math.round(b.h * scale);
6962		var x = Math.round(b.x * scale + dx);
6963		var y = Math.round(b.y * scale + dy);
6964
6965		if (obj.Class != null &&
6966				(obj.Class === "GCPInputDatabase" ||
6967				 obj.Class === "GCPInputRecord" ||
6968				 obj.Class === "GCPInputPayment" ||
6969				 obj.Class === "GCPInputGateway" ||
6970				 obj.Class === "GCPInputLocalCompute" ||
6971				 obj.Class === "GCPInputBeacon" ||
6972				 obj.Class === "GCPInputStorage" ||
6973				 obj.Class === "GCPInputList" ||
6974				 obj.Class === "GCPInputStream" ||
6975				 obj.Class === "GCPInputMobileDevices" ||
6976				 obj.Class === "GCPInputCircuitBoard" ||
6977				 obj.Class === "GCPInputLive" ||
6978				 obj.Class === "GCPInputUsers" ||
6979				 obj.Class === "GCPInputLaptop" ||
6980				 obj.Class === "GCPInputApplication" ||
6981				 obj.Class === "GCPInputLightbulb" ||
6982				 obj.Class === "GCPInputGame" ||
6983				 obj.Class === "GCPInputDesktop" ||
6984				 obj.Class === "GCPInputDesktopAndMobile" ||
6985				 obj.Class === "GCPInputWebcam" ||
6986				 obj.Class === "GCPInputSpeaker" ||
6987				 obj.Class === "GCPInputRetail" ||
6988				 obj.Class === "GCPInputReport" ||
6989				 obj.Class === "GCPInputPhone" ||
6990				 obj.Class === "GCPInputBlank"))
6991		{
6992			h = h + 20;
6993		}
6994
6995		v = new mxCell('', new mxGeometry(x, y, w, h), vertexStyle);
6996	    v.vertex = true;
6997
6998	    //Store z-order to use it in groups
6999		v.zOrder = p.ZOrder;
7000
7001	    var cls = (obj.Class != null) ? obj.Class : (a != null) ? a.Class : null;
7002
7003	    //composite shapes
7004		switch (cls)
7005		{
7006			case 'BraceNoteBlock' :
7007			case 'UI2BraceNoteBlock' :
7008
7009				var isRightBrace = false;
7010
7011				if (p.BraceDirection != null)
7012				{
7013					if (p.BraceDirection == 'Right')
7014					{
7015						isRightBrace = true;
7016					}
7017				}
7018
7019				var brace = null;
7020				var label = null;
7021				var lbl = convertText(p);
7022				//TODO Handle rotation of label correctly in all cases
7023				var lblSize = p.Rotation? mxUtils.getSizeForString(lbl.replace(/\n/g, '<br>'), null, null, Math.abs(w - h * 0.125)) : {width: 0, height: 0};
7024
7025				if (isRightBrace)
7026				{
7027					brace = new mxCell('', new mxGeometry(w - h * 0.125, 0,	h * 0.125, h), 'shape=curlyBracket;rounded=1;');
7028					label = new mxCell('', new mxGeometry(lblSize.height, -2 * lblSize.width, w - h * 0.125, h), 'strokeColor=none;fillColor=none;');
7029				}
7030				else
7031				{
7032					brace = new mxCell('', new mxGeometry(0, 0,	h * 0.125, h), 'shape=curlyBracket;rounded=1;flipH=1;');
7033					label = new mxCell('', new mxGeometry(h * 0.125 - lblSize.height, lblSize.width, w - h * 0.125, h), 'strokeColor=none;fillColor=none;');
7034				}
7035
7036				v.style = "strokeColor=none;fillColor=none;"
7037				v.style += addAllStyles(v.style, p, a, v);
7038
7039				brace.vertex = true;
7040				v.insert(brace);
7041
7042				brace.style +=
7043				addAllStyles(brace.style, p, a, brace);
7044
7045				label.vertex = true;
7046				label.value = lbl;
7047				v.insert(label);
7048
7049				label.style +=
7050					addAllStyles(label.style, p, a, label, isLastLblHTML);
7051				break;
7052			case 'BPMNAdvancedPoolBlockRotated' :
7053			case 'UMLMultiLanePoolRotatedBlock' :
7054			case 'UMLMultiLanePoolBlock' :
7055			case 'BPMNAdvancedPoolBlock' :
7056			case 'AdvancedSwimLaneBlockRotated' :
7057			case 'AdvancedSwimLaneBlock' :
7058			case 'UMLSwimLaneBlockV2':
7059				//Lucid changed swimlanes format
7060				var mainTxtFld = 'MainText', laneFld = null, headerFillFld = 'HeaderFill_', bodyFillFld = 'BodyFill_';
7061				var mainTxtHeight = 25, laneTxtHeight = 25;
7062				var lanesNum = 0;
7063
7064				if (p.Lanes != null)
7065				{
7066					lanesNum = p.Lanes.length;
7067				}
7068				else if (p.PrimaryLane != null)
7069				{
7070					lanesNum = p.PrimaryLane.length;
7071
7072					//In this format, boundingBox is not accurate!
7073					w = 0, h = 0;
7074
7075					for (var i = 0; i < lanesNum; i++)
7076					{
7077						w += p.PrimaryLane[i];
7078					}
7079
7080					for (var i = 0; i < p.SecondaryLane.length; i++)
7081					{
7082						h += p.SecondaryLane[i];
7083					}
7084
7085				    function fixTitleHeight(val)
7086					{
7087						if (!val)
7088						{
7089							return 0;
7090						}
7091						else if (val < 32)
7092						{
7093							val = 32;
7094						}
7095						else if (val > 208)
7096						{
7097							val = 208;
7098						}
7099
7100						return val * scale;
7101					};
7102
7103					mainTxtHeight = fixTitleHeight(p.PrimaryPoolTitleHeight);
7104					laneTxtHeight = fixTitleHeight(p.PrimaryLaneTitleHeight);
7105
7106					w = w * scale;
7107					h = h * scale + mainTxtHeight + laneTxtHeight;
7108					v.geometry.width = w;
7109					v.geometry.height = h;
7110
7111					mainTxtFld = 'poolPrimaryTitleKey';
7112					headerFillFld = 'PrimaryLaneHeaderFill_';
7113					bodyFillFld = 'CellFill_0,';
7114					laneFld = p.PrimaryLaneTextAreaIds;
7115
7116					if (laneFld == null)
7117					{
7118						laneFld = [];
7119
7120						for (var i = 0; i < lanesNum; i++)
7121						{
7122							laneFld.push('Primary_' + i);
7123						}
7124					}
7125				}
7126
7127				if (p.IsPrimaryLaneVertical == false)
7128				{
7129					p['Rotation'] = -1.5707963267948966; //-90
7130					var origX = v.geometry.x;
7131					var origY = v.geometry.y;
7132				}
7133
7134			    var rotatedSL = p['Rotation'] != 0;
7135			    var isPool = cls.indexOf('Pool') > 0;
7136			    var isBPMN = cls.indexOf('BPMN') == 0;
7137			    var hasTxt = p[mainTxtFld] != null;
7138
7139				v.style = (isPool? 'swimlane;startSize=' + mainTxtHeight + ';' : 'fillColor=none;strokeColor=none;pointerEvents=0;fontStyle=0;') +
7140					'html=1;whiteSpace=wrap;container=1;collapsible=0;childLayout=stackLayout;' +
7141					'resizeParent=1;dropTarget=0;' + (rotatedSL? 'horizontalStack=0;' : '');
7142				v.style += addAllStyles(v.style, p, a, v);
7143
7144				if (hasTxt)
7145				{
7146					v.value = convertText(p[mainTxtFld]);
7147					v.style += (isLastLblHTML? 'overflow=block;blockSpacing=1;fontSize=' + defaultFontSize + ';' +
7148							gFontFamilyStyle
7149							:
7150							getFontSize(p[mainTxtFld]) +
7151							getFontColor(p[mainTxtFld]) +
7152							getFontFamily(p[mainTxtFld]) +
7153							getFontStyle(p[mainTxtFld]) +
7154							getTextAlignment(p[mainTxtFld], v) +
7155							getTextLeftSpacing(p[mainTxtFld]) +
7156							getTextRightSpacing(p[mainTxtFld]) +
7157							getTextTopSpacing(p[mainTxtFld]) +
7158							getTextBottomSpacing(p[mainTxtFld])
7159							) +
7160							getTextGlobalSpacing(p[mainTxtFld]) +
7161							getTextVerticalAlignment(p[mainTxtFld]);
7162				}
7163
7164				var totalOffset = 0; //relative
7165				var lane = new Array();
7166
7167				var laneStyle = 'swimlane;html=1;whiteSpace=wrap;container=1;connectable=0;collapsible=0;fontStyle=0;startSize=' + laneTxtHeight + ';dropTarget=0;rounded=0;' +
7168								(rotatedSL? 'horizontal=0;': '') +
7169								(isBPMN? 'swimlaneLine=0;fillColor=none;' : '');
7170				p['Rotation'] = 0; //Override rotation such that it doesn't mess with our coordinates
7171
7172				for (var j = 0; j < lanesNum; j++)
7173				{
7174					if (laneFld == null)
7175					{
7176						var currOffset = parseFloat(p.Lanes[j].p);
7177						var i = parseInt(p.Lanes[j].tid) || j;
7178						var curLane = 'Lane_' + i;
7179					}
7180					else
7181					{
7182						var currOffset = (p.PrimaryLane[j] * scale)/ w;
7183						var i = j;
7184						var curLane = laneFld[j];
7185					}
7186
7187					var childX = w * totalOffset;
7188					var childY = isPool? mainTxtHeight : 0;
7189					lane.push(new mxCell('', rotatedSL? new mxGeometry(childY, childX,	h - childY, w * currOffset) :
7190						new mxGeometry(childX, childY,	w * currOffset, h - childY), laneStyle));
7191
7192					lane[j].vertex = true;
7193					v.insert(lane[j]);
7194					lane[j].value = convertText(p[curLane]);
7195					lane[j].style +=
7196									addAllStyles(lane[j].style, p, a, lane[j], isLastLblHTML) +
7197									(isLastLblHTML? 'fontSize=' + defaultFontSize + ';' :
7198									getFontSize(p[curLane]) +
7199									getFontColor(p[curLane]) +
7200									getFontStyle(p[curLane]) +
7201									getTextAlignment(p[curLane], lane[j]) +
7202									getTextLeftSpacing(p[curLane]) +
7203									getTextRightSpacing(p[curLane]) +
7204									getTextTopSpacing(p[curLane]) +
7205									getTextBottomSpacing(p[curLane])
7206									) +
7207									getTextGlobalSpacing(p[curLane]) +
7208									getTextVerticalAlignment(p[curLane]) +
7209									getHeaderColor(p[headerFillFld + i]) +
7210									getLaneColor(p[bodyFillFld + i]);
7211
7212					totalOffset += currOffset;
7213				}
7214
7215				if (origX != null)
7216				{
7217					v.geometry.x = origX;
7218					v.geometry.y = origY;
7219				}
7220				break;
7221			case 'UMLMultidimensionalSwimlane' :
7222				var rowsNum = 0;
7223				var colsNum = 0;
7224				var rowFld = null, colFld = null;
7225
7226				if (p.Rows != null && p.Columns != null)
7227				{
7228					rowsNum = p.Rows.length;
7229					colsNum = p.Columns.length;
7230					var colStartSize = p.TitleHeight * scale || 25;
7231					var rowStartSize = p.TitleWidth  * scale || 25;
7232				}
7233				else if (p.PrimaryLane != null && p.SecondaryLane != null)
7234				{
7235					rowsNum = p.SecondaryLane.length;
7236					colsNum = p.PrimaryLane.length;
7237					var rowStartSize = p.SecondaryLaneTitleHeight  * scale || 25;
7238					var colStartSize = p.PrimaryLaneTitleHeight * scale || 25;
7239
7240					//In this format, boundingBox is not accurate!
7241					w = 0, h = 0;
7242
7243					for (var i = 0; i < rowsNum; i++)
7244					{
7245						h += p.SecondaryLane[i];
7246					}
7247
7248					for (var i = 0; i < colsNum; i++)
7249					{
7250						w += p.PrimaryLane[i];
7251					}
7252
7253					w = w * scale + rowStartSize;
7254					h = h * scale + colStartSize;
7255					v.geometry.width = w;
7256					v.geometry.height = h;
7257
7258					rowFld = p.SecondaryLaneTextAreaIds;
7259					colFld = p.PrimaryLaneTextAreaIds;
7260				}
7261
7262				v.style = 'group;';
7263				var contStyle = 'fillColor=none;strokeColor=none;html=1;whiteSpace=wrap;container=1;collapsible=0;childLayout=stackLayout;' +
7264									'resizeParent=1;dropTarget=0;';
7265				var rows = new mxCell('', new mxGeometry(0, colStartSize, w, h - colStartSize), contStyle + 'horizontalStack=0;');
7266				rows.vertex = true;
7267				var cols = new mxCell('', new mxGeometry(rowStartSize, 0, w - rowStartSize, h), contStyle);
7268				cols.vertex = true;
7269
7270				v.insert(rows);
7271				v.insert(cols);
7272				var y = 0;
7273
7274				var rowStyle = 'swimlane;html=1;whiteSpace=wrap;container=1;connectable=0;collapsible=0;dropTarget=0;horizontal=0;fontStyle=0;startSize=' + rowStartSize + ';';
7275
7276				for (var j = 0; j < rowsNum; j++)
7277				{
7278					if (rowFld == null)
7279					{
7280						var rh = parseInt(p.Rows[j].height) * scale;
7281						var i = parseInt(p.Rows[j].id) || j;
7282						var curRow = 'Row_' + i;
7283					}
7284					else
7285					{
7286						var rh = p.SecondaryLane[j] * scale;
7287						var curRow = rowFld[j];
7288					}
7289
7290					var r = new mxCell('', new mxGeometry(0, y, w, rh), rowStyle);
7291					y += rh;
7292					r.vertex = true;
7293					rows.insert(r);
7294					r.value = convertText(p[curRow]);
7295					r.style +=
7296									addAllStyles(r.style, p, a, r, isLastLblHTML) +
7297									(isLastLblHTML? 'fontSize=' + defaultFontSize + ';' :
7298									getFontSize(p[curRow]) +
7299									getFontColor(p[curRow]) +
7300									getFontStyle(p[curRow]) +
7301									getTextAlignment(p[curRow], r) +
7302									getTextLeftSpacing(p[curRow]) +
7303									getTextRightSpacing(p[curRow]) +
7304									getTextTopSpacing(p[curRow]) +
7305									getTextBottomSpacing(p[curRow])
7306									) +
7307									getTextGlobalSpacing(p[curRow]) +
7308									getTextVerticalAlignment(p[curRow]);
7309				}
7310
7311				var colStyle = 'swimlane;html=1;whiteSpace=wrap;container=1;connectable=0;collapsible=0;dropTarget=0;fontStyle=0;startSize=' + colStartSize + ';';
7312				var x = 0;
7313
7314				for (var j = 0; j < colsNum; j++)
7315				{
7316					if (colFld == null)
7317					{
7318						var cw = parseInt(p.Columns[j].width) * scale;
7319						var i = parseInt(p.Columns[j].id) || j;
7320						var curCol = 'Column_' + i;
7321					}
7322					else
7323					{
7324						var cw = p.PrimaryLane[j] * scale;
7325						var curCol = colFld[j];
7326					}
7327
7328					var c = new mxCell('', new mxGeometry(x, 0, cw, h), colStyle);
7329					x += cw;
7330					c.vertex = true;
7331					cols.insert(c);
7332					c.value = convertText(p[curCol]);
7333					c.style +=
7334									addAllStyles(c.style, p, a, c, isLastLblHTML) +
7335									(isLastLblHTML? 'fontSize=' + defaultFontSize + ';' :
7336									getFontSize(p[curCol]) +
7337									getFontColor(p[curCol]) +
7338									getFontStyle(p[curCol]) +
7339									getTextAlignment(p[curCol], c) +
7340									getTextLeftSpacing(p[curCol]) +
7341									getTextRightSpacing(p[curCol]) +
7342									getTextTopSpacing(p[curCol]) +
7343									getTextBottomSpacing(p[curCol])
7344									) +
7345									getTextGlobalSpacing(p[curCol]) +
7346									getTextVerticalAlignment(p[curCol]);
7347				}
7348				break;
7349			case 'UMLStateBlock' :
7350				if (p.Composite == 0)
7351				{
7352					v.style = 'rounded=1;arcSize=20';
7353					v.value = convertText(p.State, true);
7354					v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
7355				}
7356				else
7357				{
7358					v.style = 'swimlane;startSize=25;html=1;whiteSpace=wrap;container=1;collapsible=0;childLayout=stackLayout;' +
7359								'resizeParent=1;dropTarget=0;rounded=1;arcSize=20;fontStyle=0;';
7360					v.value = convertText(p.State, true);
7361					v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
7362					v.style += getFillColor(p, a).replace('fillColor', 'swimlaneFillColor');
7363
7364					var content = new mxCell('', new mxGeometry(0, 25, w, h - 25), 'rounded=1;arcSize=20;strokeColor=none;fillColor=none');
7365					content.value = convertText(p.Action, true);
7366					content.style += addAllStyles(content.style, p, a, content, isLastLblHTML);
7367					content.vertex = true;
7368					v.insert(content);
7369				}
7370				break;
7371			case 'GSDFDProcessBlock' :
7372				var startSize = Math.round(p.nameHeight * scale);
7373				v.style = 'shape=swimlane;html=1;rounded=1;arcSize=10;collapsible=0;fontStyle=0;startSize=' + startSize;
7374				v.value = convertText(p.Number, true);
7375				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
7376				v.style += getFillColor(p, a).replace('fillColor', 'swimlaneFillColor');
7377
7378				var content = new mxCell('', new mxGeometry(0, startSize, w, h - startSize), 'rounded=1;arcSize=10;strokeColor=none;fillColor=none');
7379				content.value = convertText(p.Text, true);
7380				content.style += addAllStyles(content.style, p, a, content, isLastLblHTML);
7381				content.vertex = true;
7382				v.insert(content);
7383				break;
7384			case 'AndroidDevice' :
7385				if (p.AndroidDeviceName != null)
7386				{
7387					var rotation = getRotation(p, a, v);
7388					v.style = "fillColor=#000000;strokeColor=#000000;";
7389					var background = null;
7390					var keyboard = null;
7391					var statusBar = null;
7392
7393					if (p.AndroidDeviceName == 'Tablet' || p.AndroidDeviceName == 'Mini Tablet' ||  (p.AndroidDeviceName == 'custom' && p.CustomDeviceType == 'Tablet'))
7394					{
7395						v.style += "shape=mxgraph.android.tab2;"
7396						background = new mxCell('', new mxGeometry(0.112, 0.077, w * 0.77, h * 0.85), rotation);
7397
7398						if (p.KeyboardShown)
7399						{
7400							keyboard = new mxCell('', new mxGeometry(0.112, 0.727, w * 0.77, h * 0.2), 'shape=mxgraph.android.keyboard;' + rotation);
7401						}
7402
7403						if (!p.FullScreen)
7404						{
7405							statusBar = new mxCell('', new mxGeometry(0.112, 0.077, w * 0.77, h * 0.03), 'shape=mxgraph.android.statusBar;strokeColor=#33b5e5;fillColor=#000000;fontColor=#33b5e5;fontSize=' + h * 0.015 + ';' + rotation);
7406						}
7407					}
7408					else if (p.AndroidDeviceName == 'Large Phone' || p.AndroidDeviceName == 'Phone' ||  (p.AndroidDeviceName == 'custom' && p.CustomDeviceType == 'Phone'))
7409					{
7410						v.style += "shape=mxgraph.android.phone2;"
7411						background = new mxCell('', new mxGeometry(0.04, 0.092, w * 0.92, h * 0.816), rotation);
7412
7413						if (p.KeyboardShown)
7414						{
7415							keyboard = new mxCell('', new mxGeometry(0.04, 0.708, w * 0.92, h * 0.2), 'shape=mxgraph.android.keyboard;' + rotation);
7416						}
7417
7418						if (!p.FullScreen)
7419						{
7420							statusBar = new mxCell('', new mxGeometry(0.04, 0.092, w * 0.92, h * 0.03), 'shape=mxgraph.android.statusBar;strokeColor=#33b5e5;fillColor=#000000;fontColor=#33b5e5;fontSize=' + h * 0.015 + ';' + rotation);
7421						}
7422					}
7423
7424					background.vertex = true;
7425					background.geometry.relative = true;
7426					v.insert(background);
7427
7428					if (p.Scheme == "Dark")
7429					{
7430						background.style += "fillColor=#111111;"
7431					}
7432					else if (p.Scheme == "Light")
7433					{
7434						background.style += "fillColor=#ffffff;"
7435					}
7436
7437					if (keyboard != null)
7438					{
7439						keyboard.vertex = true;
7440						keyboard.geometry.relative = true;
7441						v.insert(keyboard);
7442					}
7443
7444					if (statusBar != null)
7445					{
7446						statusBar.vertex = true;
7447						statusBar.geometry.relative = true;
7448						v.insert(statusBar);
7449					}
7450				}
7451
7452				v.style += addAllStyles(v.style, p, a, v);
7453				break;
7454
7455			case 'AndroidAlertDialog' :
7456				var dialog = new mxCell('', new mxGeometry(0, 0, w, 30), 'strokeColor=none;fillColor=none;spacingLeft=9;');
7457				dialog.vertex = true;
7458				v.insert(dialog);
7459				var line = new mxCell('', new mxGeometry(0, 25, w, 10), 'shape=line;strokeColor=#33B5E5;');
7460				line.vertex = true;
7461				v.insert(line);
7462				var dialogText = new mxCell('', new mxGeometry(0, 30, w, h - 30), 'strokeColor=none;fillColor=none;verticalAlign=top;');
7463				dialogText.vertex = true;
7464				v.insert(dialogText);
7465				var cancelButton = new mxCell('', new mxGeometry(0, h - 25, w * 0.5, 25), 'fillColor=none;');
7466				cancelButton.vertex = true;
7467				v.insert(cancelButton);
7468				var okButton = new mxCell('', new mxGeometry(w * 0.5, h - 25, w * 0.5, 25), 'fillColor=none;');
7469				okButton.vertex = true;
7470				v.insert(okButton);
7471				dialog.value = convertText(p.DialogTitle);
7472				dialog.style += getLabelStyle(p.DialogTitle, isLastLblHTML);
7473				dialogText.value = convertText(p.DialogText);
7474				dialogText.style += getLabelStyle(p.DialogText, isLastLblHTML);
7475				cancelButton.value = convertText(p.Button_0);
7476				cancelButton.style += getLabelStyle(p.Button_0, isLastLblHTML);
7477				okButton.value = convertText(p.Button_1);
7478				okButton.style += getLabelStyle(p.Button_1, isLastLblHTML);
7479
7480				if (p.Scheme == 'Dark')
7481				{
7482					v.style += 'strokeColor=#353535;fillColor=#282828;shadow=1;';
7483					cancelButton.style += 'strokeColor=#353535;';
7484					okButton.style += 'strokeColor=#353535;';
7485				}
7486				else
7487				{
7488					v.style += 'strokeColor=none;fillColor=#ffffff;shadow=1;';
7489					cancelButton.style += 'strokeColor=#E2E2E2;';
7490					okButton.style += 'strokeColor=#E2E2E2;';
7491				}
7492
7493				v.style += addAllStyles(v.style, p, a, v);
7494				break;
7495
7496			case 'AndroidDateDialog' :
7497			case 'AndroidTimeDialog' :
7498				var dialog = new mxCell('', new mxGeometry(0, 0, w, 30), 'strokeColor=none;fillColor=none;spacingLeft=9;');
7499				dialog.vertex = true;
7500				v.insert(dialog);
7501				dialog.value = convertText(p.DialogTitle);
7502				dialog.style += getLabelStyle(p.DialogTitle, isLastLblHTML);
7503				var line = new mxCell('', new mxGeometry(0, 25, w, 10), 'shape=line;strokeColor=#33B5E5;');
7504				line.vertex = true;
7505				v.insert(line);
7506				var cancelButton = new mxCell('', new mxGeometry(0, h - 25, w * 0.5, 25), 'fillColor=none;');
7507				cancelButton.vertex = true;
7508				v.insert(cancelButton);
7509				cancelButton.value = convertText(p.Button_0);
7510				cancelButton.style += getLabelStyle(p.Button_0, isLastLblHTML);
7511				var okButton = new mxCell('', new mxGeometry(w * 0.5, h - 25, w * 0.5, 25), 'fillColor=none;');
7512				okButton.vertex = true;
7513				v.insert(okButton);
7514				okButton.value = convertText(p.Button_1);
7515				okButton.style += getLabelStyle(p.Button_1, isLastLblHTML);
7516
7517				var triangle1 = new mxCell('', new mxGeometry(w * 0.5 - 4, 41, 8, 4), 'shape=triangle;direction=north;');
7518				triangle1.vertex = true;
7519				v.insert(triangle1);
7520				var triangle2 = new mxCell('', new mxGeometry(w * 0.25 - 4, 41, 8, 4), 'shape=triangle;direction=north;');
7521				triangle2.vertex = true;
7522				v.insert(triangle2);
7523				var triangle3 = new mxCell('', new mxGeometry(w * 0.75 - 4, 41, 8, 4), 'shape=triangle;direction=north;');
7524				triangle3.vertex = true;
7525				v.insert(triangle3);
7526
7527				var prevDate1 = new mxCell('', new mxGeometry(w * 0.375, 50, w * 0.2, 15), 'strokeColor=none;fillColor=none;');
7528				prevDate1.vertex = true;
7529				v.insert(prevDate1);
7530				prevDate1.value = convertText(p.Label_1);
7531				prevDate1.style += getLabelStyle(p.Label_1, isLastLblHTML);
7532				var prevDate2 = new mxCell('', new mxGeometry(w * 0.125, 50, w * 0.2, 15), 'strokeColor=none;fillColor=none;');
7533				prevDate2.vertex = true;
7534				v.insert(prevDate2);
7535				prevDate2.value = convertText(p.Label_0);
7536				prevDate2.style += getLabelStyle(p.Label_0, isLastLblHTML);
7537
7538				var prevDate3 = null;
7539
7540				if (obj.Class == 'AndroidDateDialog')
7541				{
7542					prevDate3 = new mxCell('', new mxGeometry(w * 0.625, 50, w * 0.2, 15), 'strokeColor=none;fillColor=none;');
7543					prevDate3.vertex = true;
7544					v.insert(prevDate3);
7545					prevDate3.value = convertText(p.Label_2);
7546					prevDate3.style += getLabelStyle(p.Label_2, isLastLblHTML);
7547				}
7548
7549				var line1 = new mxCell('', new mxGeometry(w * 0.43, 60, w * 0.14, 10), 'shape=line;strokeColor=#33B5E5;');
7550				line1.vertex = true;
7551				v.insert(line1);
7552				var line2 = new mxCell('', new mxGeometry(w * 0.18, 60, w * 0.14, 10), 'shape=line;strokeColor=#33B5E5;');
7553				line2.vertex = true;
7554				v.insert(line2);
7555				var line3 = new mxCell('', new mxGeometry(w * 0.68, 60, w * 0.14, 10), 'shape=line;strokeColor=#33B5E5;');
7556				line3.vertex = true;
7557				v.insert(line3);
7558
7559				var date1 = new mxCell('', new mxGeometry(w * 0.375, 65, w * 0.2, 15), 'strokeColor=none;fillColor=none;');
7560				date1.vertex = true;
7561				v.insert(date1);
7562				date1.value = convertText(p.Label_4);
7563				date1.style += getLabelStyle(p.Label_4, isLastLblHTML);
7564
7565				var sep = null;
7566
7567				if (obj.Class == 'AndroidTimeDialog')
7568				{
7569					sep = new mxCell('', new mxGeometry(w * 0.3, 65, w * 0.1, 15), 'strokeColor=none;fillColor=none;');
7570					sep.vertex = true;
7571					v.insert(sep);
7572					sep.value = convertText(p.Label_Colon);
7573					sep.style += getLabelStyle(p.Label_Colon, isLastLblHTML);
7574				}
7575
7576				var date2 = new mxCell('', new mxGeometry(w * 0.125, 65, w * 0.2, 15), 'strokeColor=none;fillColor=none;');
7577				date2.vertex = true;
7578				v.insert(date2);
7579				date2.value = convertText(p.Label_3);
7580				date2.style += getLabelStyle(p.Label_3, isLastLblHTML);
7581				var date3 = new mxCell('', new mxGeometry(w * 0.625, 65, w * 0.2, 15), 'strokeColor=none;fillColor=none;');
7582				date3.vertex = true;
7583				v.insert(date3);
7584				date3.value = convertText(p.Label_5);
7585				date3.style += getLabelStyle(p.Label_5, isLastLblHTML);
7586
7587				var line4 = new mxCell('', new mxGeometry(w * 0.43, 75, w * 0.14, 10), 'shape=line;strokeColor=#33B5E5;');
7588				line4.vertex = true;
7589				v.insert(line4);
7590				var line5 = new mxCell('', new mxGeometry(w * 0.18, 75, w * 0.14, 10), 'shape=line;strokeColor=#33B5E5;');
7591				line5.vertex = true;
7592				v.insert(line5);
7593				var line6 = new mxCell('', new mxGeometry(w * 0.68, 75, w * 0.14, 10), 'shape=line;strokeColor=#33B5E5;');
7594				line6.vertex = true;
7595				v.insert(line6);
7596
7597				var nextDate1 = new mxCell('', new mxGeometry(w * 0.375, 80, w * 0.2, 15), 'strokeColor=none;fillColor=none;');
7598				nextDate1.vertex = true;
7599				v.insert(nextDate1);
7600				nextDate1.value = convertText(p.Label_7);
7601				nextDate1.style += getLabelStyle(p.Label_7, isLastLblHTML);
7602				var nextDate2 = new mxCell('', new mxGeometry(w * 0.125, 80, w * 0.2, 15), 'strokeColor=none;fillColor=none;');
7603				nextDate2.vertex = true;
7604				v.insert(nextDate2);
7605				nextDate2.value = convertText(p.Label_6);
7606				nextDate2.style += getLabelStyle(p.Label_6, isLastLblHTML);
7607				var nextDate3 = new mxCell('', new mxGeometry(w * 0.625, 80, w * 0.2, 15), 'strokeColor=none;fillColor=none;');
7608				nextDate3.vertex = true;
7609				v.insert(nextDate3);
7610				nextDate3.value = convertText(p.Label_8);
7611				nextDate3.style += getLabelStyle(p.Label_8, isLastLblHTML);
7612
7613				var triangle4 = new mxCell('', new mxGeometry(w * 0.5 - 4, 99, 8, 4), 'shape=triangle;direction=south;');
7614				triangle4.vertex = true;
7615				v.insert(triangle4);
7616				var triangle5 = new mxCell('', new mxGeometry(w * 0.25 - 4, 99, 8, 4), 'shape=triangle;direction=south;');
7617				triangle5.vertex = true;
7618				v.insert(triangle5);
7619				var triangle6 = new mxCell('', new mxGeometry(w * 0.75 - 4, 99, 8, 4), 'shape=triangle;direction=south;');
7620				triangle6.vertex = true;
7621				v.insert(triangle6);
7622
7623				if (p.Scheme == 'Dark')
7624				{
7625					v.style += 'strokeColor=#353535;fillColor=#282828;shadow=1;';
7626					cancelButton.style += 'strokeColor=#353535;';
7627					okButton.style += 'strokeColor=#353535;';
7628					triangle1.style += 'strokeColor=none;fillColor=#7E7E7E;';
7629					triangle2.style += 'strokeColor=none;fillColor=#7E7E7E;';
7630					triangle3.style += 'strokeColor=none;fillColor=#7E7E7E;';
7631					triangle4.style += 'strokeColor=none;fillColor=#7E7E7E;';
7632					triangle5.style += 'strokeColor=none;fillColor=#7E7E7E;';
7633					triangle6.style += 'strokeColor=none;fillColor=#7E7E7E;';
7634				}
7635				else
7636				{
7637					v.style += 'strokeColor=none;fillColor=#ffffff;shadow=1;';
7638					cancelButton.style += 'strokeColor=#E2E2E2;';
7639					okButton.style += 'strokeColor=#E2E2E2;';
7640					triangle1.style += 'strokeColor=none;fillColor=#939393;';
7641					triangle2.style += 'strokeColor=none;fillColor=#939393;';
7642					triangle3.style += 'strokeColor=none;fillColor=#939393;';
7643					triangle4.style += 'strokeColor=none;fillColor=#939393;';
7644					triangle5.style += 'strokeColor=none;fillColor=#939393;';
7645					triangle6.style += 'strokeColor=none;fillColor=#939393;';
7646				}
7647
7648				v.style += addAllStyles(v.style, p, a, v);
7649				break;
7650
7651			case 'AndroidListItems' :
7652				var itemFullH = h;
7653				var startH = 0;
7654
7655				if (p.ShowHeader)
7656				{
7657					startH = 8;
7658
7659					var header = new mxCell('', new mxGeometry(0, 0, w, startH), 'strokeColor=none;fillColor=none;');
7660					header.vertex = true;
7661					v.insert(header);
7662					header.value = convertText(p.Header);
7663					header.style += getLabelStyle(p.Header, isLastLblHTML);
7664
7665					itemFullH -= startH;
7666
7667					var lineH = new mxCell('', new mxGeometry(0, startH - 2, w, 4), 'shape=line;strokeColor=#999999;');
7668					lineH.vertex = true;
7669					v.insert(lineH);
7670				}
7671
7672				var numItems = parseInt(p.Items);
7673
7674				if (numItems > 0)
7675				{
7676					itemFullH = itemFullH / numItems;
7677				}
7678
7679				var item = new Array();
7680				var line = new Array();
7681
7682				for (var i = 0; i < numItems; i++)
7683				{
7684					item[i] = new mxCell('', new mxGeometry(0, startH + i * itemFullH, w, itemFullH), 'strokeColor=none;fillColor=none;');
7685					item[i].vertex = true;
7686					v.insert(item[i]);
7687					item[i].value = convertText(p["Item_" + i]);
7688					item[i].style += getLabelStyle(p["Item_" + i], isLastLblHTML);
7689
7690					if (i > 0)
7691					{
7692						line[i] = new mxCell('', new mxGeometry(0, startH + i * itemFullH - 2, w, 4), 'shape=line;');
7693						line[i].vertex = true;
7694						v.insert(line[i]);
7695
7696						if (p.Scheme == 'Dark')
7697						{
7698							line[i].style += 'strokeColor=#ffffff;';
7699						}
7700						else
7701						{
7702							line[i].style += 'strokeColor=#D9D9D9;';
7703						}
7704					}
7705				}
7706
7707				if (p.Scheme == 'Dark')
7708				{
7709					v.style += 'strokeColor=none;fillColor=#111111;';
7710				}
7711				else
7712				{
7713					v.style += 'strokeColor=none;fillColor=#ffffff;';
7714				}
7715
7716				v.style += addAllStyles(v.style, p, a, v);
7717				break;
7718
7719			case 'AndroidTabs' :
7720				var numTabs = parseInt(p.Tabs);
7721				var tabFullW = w;
7722
7723				if (numTabs > 0)
7724				{
7725					tabFullW = tabFullW / numTabs;
7726				}
7727
7728				var tab = new Array();
7729				var line = new Array();
7730
7731				for (var i = 0; i < numTabs; i++)
7732				{
7733					tab[i] = new mxCell('', new mxGeometry(i * tabFullW, 0, tabFullW, h), 'strokeColor=none;fillColor=none;');
7734					tab[i].vertex = true;
7735					v.insert(tab[i]);
7736					tab[i].value = convertText(p["Tab_" + i]);
7737					tab[i].style += getLabelStyle(p["Tab_" + i], isLastLblHTML);
7738
7739					if (i > 0)
7740					{
7741						line[i] = new mxCell('', new mxGeometry(i * tabFullW - 2, h * 0.2, 4, h * 0.6), 'shape=line;direction=north;');
7742						line[i].vertex = true;
7743						v.insert(line[i]);
7744
7745						if (p.Scheme == 'Dark')
7746						{
7747							line[i].style += 'strokeColor=#484848;';
7748						}
7749						else
7750						{
7751							line[i].style += 'strokeColor=#CCCCCC;';
7752						}
7753					}
7754				}
7755
7756				var selectedMarker = new mxCell('', new mxGeometry(p.Selected * tabFullW + 2, h - 3, tabFullW - 4, 3), 'strokeColor=none;fillColor=#33B5E5;');
7757				selectedMarker.vertex = true;
7758				v.insert(selectedMarker);
7759
7760				if (p.Scheme == 'Dark')
7761				{
7762					v.style += 'strokeColor=none;fillColor=#333333;';
7763				}
7764				else
7765				{
7766					v.style += 'strokeColor=none;fillColor=#DDDDDD;';
7767				}
7768
7769				v.style += addAllStyles(v.style, p, a, v);
7770				break;
7771
7772			case 'AndroidProgressBar' :
7773				v = new mxCell('', new mxGeometry(Math.round(x), Math.round(y + h * 0.25), Math.round(w), Math.round(h * 0.5)), vertexStyle);
7774			    v.vertex = true;
7775
7776				var progressBar = new mxCell('', new mxGeometry(0, 0, w * p.BarPosition, Math.round(h * 0.5)), 'strokeColor=none;fillColor=#33B5E5;');
7777				progressBar.vertex = true;
7778				v.insert(progressBar);
7779
7780				if (p.Scheme == 'Dark')
7781				{
7782					v.style += 'strokeColor=none;fillColor=#474747;';
7783				}
7784				else
7785				{
7786					v.style += 'strokeColor=none;fillColor=#BBBBBB;';
7787				}
7788
7789				v.style += addAllStyles(v.style, p, a, v);
7790				break;
7791
7792			case 'AndroidImageBlock' :
7793				if (p.Scheme == 'Dark')
7794				{
7795					v.style += 'shape=mxgraph.mockup.graphics.simpleIcon;strokeColor=#7E7E7E;fillColor=#111111;';
7796				}
7797				else
7798				{
7799					v.style += 'shape=mxgraph.mockup.graphics.simpleIcon;strokeColor=#939393;fillColor=#ffffff;';
7800				}
7801
7802				v.style += addAllStyles(v.style, p, a, v);
7803				break;
7804
7805			case 'AndroidTextBlock' :
7806				if (p.Scheme == 'Dark')
7807				{
7808					if (p.ShowBorder)
7809					{
7810						v.style += 'fillColor=#111111;strokeColor=#ffffff;';
7811					}
7812					else
7813					{
7814						v.style += 'fillColor=#111111;strokeColor=none;';
7815					}
7816				}
7817				else
7818				{
7819					if (p.ShowBorder)
7820					{
7821						v.style += 'fillColor=#ffffff;strokeColor=#000000;';
7822					}
7823					else
7824					{
7825						v.style += 'fillColor=#ffffff;strokeColor=none;';
7826					}
7827				}
7828
7829				v.value = convertText(p.Label);
7830				v.style += getLabelStyle(p.Label, isLastLblHTML);
7831				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
7832
7833				break;
7834
7835			case 'AndroidActionBar' :
7836				v.style += 'strokeColor=none;';
7837
7838				switch (p.BarBackground)
7839				{
7840					case 'Blue' :
7841						v.style += 'fillColor=#002E3E;';
7842						break;
7843					case 'Gray' :
7844						v.style += 'fillColor=#DDDDDD;';
7845						break;
7846					case 'Dark Gray' :
7847						v.style += 'fillColor=#474747;';
7848						break;
7849					case 'White' :
7850						v.style += 'fillColor=#ffffff;';
7851						break;
7852				}
7853
7854				if (p.HighlightShow)
7855				{
7856					var highlight = null;
7857
7858					if (p.HighlightTop)
7859					{
7860						highlight = new mxCell('', new mxGeometry(0, 0, w, 2), 'strokeColor=none;');
7861					}
7862					else
7863					{
7864						highlight = new mxCell('', new mxGeometry(0, h - 2, w, 2), 'strokeColor=none;');
7865					}
7866
7867					highlight.vertex = true;
7868					v.insert(highlight);
7869
7870					switch (p.HighlightColor)
7871					{
7872						case 'Blue' :
7873							highlight.style += 'fillColor=#33B5E5;';
7874							break;
7875						case 'Dark Gray' :
7876							highlight.style += 'fillColor=#B0B0B0;';
7877							break;
7878						case 'White' :
7879							highlight.style += 'fillColor=#ffffff;';
7880							break;
7881					}
7882				}
7883
7884				if (p.VlignShow)
7885				{
7886					var vLine = new mxCell('', new mxGeometry(20, 5, 2, h - 10), 'shape=line;direction=north;');
7887					vLine.vertex = true;
7888					v.insert(vLine);
7889
7890					switch (p.VlignColor)
7891					{
7892						case 'Blue' :
7893							vLine.style += 'strokeColor=#244C5A;';
7894							break;
7895						case 'White' :
7896							vLine.style += 'strokeColor=#ffffff;';
7897							break;
7898					}
7899				}
7900
7901				v.style += addAllStyles(v.style, p, a, v);
7902				break;
7903
7904			case 'AndroidButton' :
7905				v.value = convertText(p.Label);
7906				v.style += getLabelStyle(p.Label, isLastLblHTML) + 'shape=partialRectangle;left=0;right=0;';
7907
7908				if (p.Scheme == 'Dark')
7909				{
7910					v.style += 'fillColor=#474747;strokeColor=#C6C5C6;bottom=0;';
7911				}
7912				else
7913				{
7914					v.style += 'fillColor=#DFE0DF;strokeColor=#C6C5C6;top=0;';
7915				}
7916
7917				v.style += addAllStyles(v.style, p, a, v);
7918				break;
7919
7920			case 'AndroidTextBox' :
7921				v.value = convertText(p.Label);
7922				v.style += getLabelStyle(p.Label, isLastLblHTML);
7923
7924				var underline = new mxCell('', new mxGeometry(2, h - 6, w - 4, 4), 'shape=partialRectangle;top=0;fillColor=none;');
7925				underline.vertex = true;
7926				v.insert(underline);
7927
7928				if (p.Scheme == 'Dark')
7929				{
7930					v.style += 'fillColor=#111111;strokeColor=none;';
7931				}
7932				else
7933				{
7934					v.style += 'fillColor=#ffffff;strokeColor=none;';
7935				}
7936
7937				if (p.TextFocused)
7938				{
7939					underline.style += 'strokeColor=#33B5E5;';
7940				}
7941				else
7942				{
7943					underline.style += 'strokeColor=#A9A9A9;';
7944				}
7945
7946				v.style += addAllStyles(v.style, p, a, v);
7947				break;
7948
7949			case 'AndroidRadioButton' :
7950				var dot = null;
7951
7952				if (p.Checked)
7953				{
7954					dot = new mxCell('', new mxGeometry(w * 0.15, h * 0.15, w * 0.7, h * 0.7), 'ellipse;fillColor=#33B5E5;strokeWidth=1;');
7955					dot.vertex = true;
7956					v.insert(dot);
7957				}
7958
7959				if (p.Scheme == 'Dark')
7960				{
7961					v.style += 'shape=ellipse;perimeter=ellipsePerimeter;strokeWidth=1;strokeColor=#272727;';
7962
7963					if (p.Checked)
7964					{
7965						dot.style += 'strokeColor=#1F5C73;';
7966						v.style += 'fillColor=#193C49;';
7967					}
7968					else
7969					{
7970						v.style += 'fillColor=#111111;';
7971					}
7972				}
7973				else
7974				{
7975					v.style += 'shape=ellipse;perimeter=ellipsePerimeter;strokeWidth=1;fillColor=#ffffff;strokeColor=#5C5C5C;';
7976
7977					if (p.Checked)
7978					{
7979						dot.style += 'strokeColor=#999999;';
7980					}
7981				}
7982
7983				v.style += addAllStyles(v.style, p, a, v);
7984				break;
7985
7986			case 'AndroidCheckBox' :
7987				var check = null;
7988				if (p.Checked)
7989				{
7990					check = new mxCell('', new mxGeometry(w * 0.25, - h * 0.05, w, h * 0.8), 'shape=mxgraph.ios7.misc.check;strokeColor=#33B5E5;strokeWidth=2;');
7991					check.vertex = true;
7992					v.insert(check);
7993				}
7994
7995				if (p.Scheme == 'Dark')
7996				{
7997					v.style += 'strokeWidth=1;strokeColor=#272727;fillColor=#111111;';
7998				}
7999				else
8000				{
8001					v.style += 'strokeWidth=1;strokeColor=#5C5C5C;fillColor=#ffffff;';
8002				}
8003
8004				v.style += addAllStyles(v.style, p, a, v);
8005				break;
8006
8007			case 'AndroidToggle' :
8008				if (p.Scheme == 'Dark')
8009				{
8010					if (p.Checked)
8011					{
8012						v.style += 'shape=mxgraph.android.switch_on;fillColor=#666666;';
8013					}
8014					else
8015					{
8016						v.style += 'shape=mxgraph.android.switch_off;fillColor=#666666;';
8017					}
8018				}
8019				else
8020				{
8021					if (p.Checked)
8022					{
8023						v.style += 'shape=mxgraph.android.switch_on;fillColor=#E6E6E6;';
8024					}
8025					else
8026					{
8027						v.style += 'shape=mxgraph.android.switch_off;fillColor=#E6E6E6;';
8028					}
8029				}
8030
8031				v.style += addAllStyles(v.style, p, a, v);
8032				break;
8033
8034			case 'AndroidSlider' :
8035				v.style += 'shape=mxgraph.android.progressScrubberFocused;dx=' + p.BarPosition + ';fillColor=#33b5e5;';
8036				v.style += addAllStyles(v.style, p, a, v);
8037
8038				break;
8039
8040			case 'iOSSegmentedControl' :
8041				var numTabs = parseInt(p.Tabs);
8042				var tabFullW = w;
8043				v.style += 'strokeColor=none;fillColor=none;';
8044
8045				if (numTabs > 0)
8046				{
8047					tabFullW = tabFullW / numTabs;
8048				}
8049
8050				var tab = new Array();
8051				var line = new Array();
8052
8053				for (var i = 0; i < numTabs; i++)
8054				{
8055					tab[i] = new mxCell('', new mxGeometry(i * tabFullW, 0, tabFullW, h), 'strokeColor=' + p.FillColor + ';');
8056					tab[i].vertex = true;
8057					v.insert(tab[i]);
8058					tab[i].value = convertText(p["Tab_" + i]);
8059					tab[i].style += getLabelStyle(p["Tab_" + i], isLastLblHTML);
8060
8061					if (p.Selected == i)
8062					{
8063						tab[i].style += getFillColor(p, a);
8064					}
8065					else
8066					{
8067						tab[i].style += 'fillColor=none;';
8068					}
8069				}
8070
8071				v.style += addAllStyles(v.style, p, a, v);
8072				break;
8073
8074			case 'iOSSlider' :
8075				v.style += 'shape=mxgraph.ios7ui.slider;strokeColor=' + p.FillColor + ';fillColor=#ffffff;strokeWidth=2;barPos=' + p.BarPosition * 100 + ';';
8076				v.style += addAllStyles(v.style, p, a, v);
8077
8078				break;
8079
8080			case 'iOSProgressBar':
8081				v = new mxCell('', new mxGeometry(Math.round(x), Math.round(y + h * 0.25), Math.round(w), Math.round(h * 0.5)), vertexStyle + 'strokeColor=none;fillColor=#B5B5B5;');
8082			    v.vertex = true;
8083
8084				var progressBar = new mxCell('', new mxGeometry(0, 0, w * p.BarPosition, Math.round(h * 0.5)), 'strokeColor=none;' + getFillColor(p, a));
8085				progressBar.vertex = true;
8086				v.insert(progressBar);
8087
8088				v.style += addAllStyles(v.style, p, a, v);
8089				break;
8090
8091			case 'iOSPageControls' :
8092				v.style += 'shape=mxgraph.ios7ui.pageControl;strokeColor=#D6D6D6;';
8093				v.style += addAllStyles(v.style, p, a, v);
8094
8095				break;
8096
8097			case 'iOSStatusBar' :
8098				v.style += 'shape=mxgraph.ios7ui.appBar;strokeColor=#000000;';
8099
8100				var text1 = new mxCell(convertText(p.Text), new mxGeometry(w * 0.35, 0, w * 0.3, h), 'strokeColor=none;fillColor=none;');
8101				text1.vertex = true;
8102				v.insert(text1);
8103				text1.style += getLabelStyle(p.Text, isLastLblHTML);
8104
8105				var text2 = new mxCell(convertText(p.Carrier), new mxGeometry(w * 0.09, 0, w * 0.2, h), 'strokeColor=none;fillColor=none;');
8106				text2.vertex = true;
8107				v.insert(text2);
8108				text2.style += getLabelStyle(p.Carrier, isLastLblHTML);
8109
8110				v.style += addAllStyles(v.style, p, a, v);
8111				break;
8112
8113			case 'iOSSearchBar' :
8114				v.value = convertText(p.Search);
8115
8116				v.style += 'strokeColor=none;';
8117				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML) +
8118					getLabelStyle(p.Search, isLastLblHTML);
8119
8120				var icon1 = new mxCell('', new mxGeometry(w * 0.3, h * 0.3, h * 0.4, h * 0.4), 'shape=mxgraph.ios7.icons.looking_glass;strokeColor=#000000;fillColor=none;');
8121				icon1.vertex = true;
8122				v.insert(icon1);
8123
8124				break;
8125
8126			case 'iOSNavBar' :
8127				v.value = convertText(p.Title);
8128				v.style += 'shape=partialRectangle;top=0;right=0;left=0;strokeColor=#979797;'
8129					+ getLabelStyle(p.Title, isLastLblHTML);
8130				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
8131
8132				var text1 = new mxCell(convertText(p.LeftText), new mxGeometry(w * 0.03, 0, w * 0.3, h), 'strokeColor=none;fillColor=none;');
8133				text1.vertex = true;
8134				v.insert(text1);
8135				text1.style += getLabelStyle(p.LeftText, isLastLblHTML);
8136
8137				var text2 = new mxCell(convertText(p.RightText), new mxGeometry(w * 0.65, 0, w * 0.3, h), 'strokeColor=none;fillColor=none;');
8138				text2.vertex = true;
8139				v.insert(text2);
8140				text2.style += getLabelStyle(p.RightText, isLastLblHTML);
8141
8142				var icon1 = new mxCell('', new mxGeometry(w * 0.02, h * 0.2, h * 0.3, h * 0.5), 'shape=mxgraph.ios7.misc.left;strokeColor=#007AFF;strokeWidth=2;');
8143				icon1.vertex = true;
8144				v.insert(icon1);
8145
8146				break;
8147
8148			case 'iOSTabs' :
8149				var numTabs = parseInt(p.Tabs);
8150				var tabFullW = w;
8151				v.style += 'shape=partialRectangle;right=0;left=0;bottom=0;strokeColor=#979797;';
8152				v.style += addAllStyles(v.style, p, a, v);
8153
8154				if (numTabs > 0)
8155				{
8156					tabFullW = tabFullW / numTabs;
8157				}
8158
8159				var tab = new Array();
8160				var line = new Array();
8161
8162				for (var i = 0; i < numTabs; i++)
8163				{
8164					tab[i] = new mxCell('', new mxGeometry(i * tabFullW, 0, tabFullW, h), 'strokeColor=none;');
8165					tab[i].vertex = true;
8166					v.insert(tab[i]);
8167					tab[i].value = convertText(p["Tab_" + i]);
8168
8169					tab[i].style += (isLastLblHTML? 'overflow=block;blockSpacing=1;html=1;fontSize=' + defaultFontSize + ';' +
8170									gFontFamilyStyle
8171									:
8172									getFontSize(p["Tab_" + i]) +
8173									getFontFamily(p["Tab_" + i]) +
8174									getFontColor(p["Tab_" + i]) +
8175									getFontStyle(p["Tab_" + i]) +
8176									getTextAlignment(p["Tab_" + i]) +
8177									getTextLeftSpacing(p["Tab_" + i]) +
8178									getTextRightSpacing(p["Tab_" + i]) +
8179									getTextTopSpacing(p["Tab_" + i]) +
8180									getTextBottomSpacing(p["Tab_" + i]) +
8181									getTextGlobalSpacing(p["Tab_" + i]));
8182
8183					tab[i].style += 'verticalAlign=bottom;';
8184
8185					if (p.Selected == i)
8186					{
8187						tab[i].style += 'fillColor=#BBBBBB;';
8188					}
8189					else
8190					{
8191						tab[i].style += 'fillColor=none;';
8192					}
8193				}
8194
8195				break;
8196
8197			case 'iOSDatePicker' :
8198				var firstDate1 = new mxCell('', new mxGeometry(0, 0, w * 0.5, h * 0.2), 'strokeColor=none;fillColor=none;');
8199				firstDate1.vertex = true;
8200				v.insert(firstDate1);
8201				firstDate1.value = convertText(p.Option11);
8202				firstDate1.style += getLabelStyle(p.Option11, isLastLblHTML);
8203				var firstDate2 = new mxCell('', new mxGeometry(w * 0.5, 0, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8204				firstDate2.vertex = true;
8205				v.insert(firstDate2);
8206				firstDate2.value = convertText(p.Option21);
8207				firstDate2.style += getLabelStyle(p.Option21, isLastLblHTML);
8208				var firstDate3 = new mxCell('', new mxGeometry(w * 0.65, 0, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8209				firstDate3.vertex = true;
8210				v.insert(firstDate3);
8211				firstDate3.value = convertText(p.Option31);
8212				firstDate3.style += getLabelStyle(p.Option31, isLastLblHTML);
8213
8214				var secondDate1 = new mxCell('', new mxGeometry(0, h * 0.2, w * 0.5, h * 0.2), 'strokeColor=none;fillColor=none;');
8215				secondDate1.vertex = true;
8216				v.insert(secondDate1);
8217				secondDate1.value = convertText(p.Option12);
8218				secondDate1.style += getLabelStyle(p.Option12, isLastLblHTML);
8219				var secondDate2 = new mxCell('', new mxGeometry(w * 0.5, h * 0.2, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8220				secondDate2.vertex = true;
8221				v.insert(secondDate2);
8222				secondDate2.value = convertText(p.Option22);
8223				secondDate2.style += getLabelStyle(p.Option22, isLastLblHTML);
8224				var secondDate3 = new mxCell('', new mxGeometry(w * 0.65, h * 0.2, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8225				secondDate3.vertex = true;
8226				v.insert(secondDate3);
8227				secondDate3.value = convertText(p.Option32);
8228				secondDate3.style += getLabelStyle(p.Option32, isLastLblHTML);
8229
8230				var currDate1 = new mxCell('', new mxGeometry(0, h * 0.4, w * 0.5, h * 0.2), 'strokeColor=none;fillColor=none;');
8231				currDate1.vertex = true;
8232				v.insert(currDate1);
8233				currDate1.value = convertText(p.Option13);
8234				currDate1.style += getLabelStyle(p.Option13, isLastLblHTML);
8235				var currDate2 = new mxCell('', new mxGeometry(w * 0.5, h * 0.4, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8236				currDate2.vertex = true;
8237				v.insert(currDate2);
8238				currDate2.value = convertText(p.Option23);
8239				currDate2.style += getLabelStyle(p.Option23, isLastLblHTML);
8240				var currDate3 = new mxCell('', new mxGeometry(w * 0.65, h * 0.4, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8241				currDate3.vertex = true;
8242				v.insert(currDate3);
8243				currDate3.value = convertText(p.Option33);
8244				currDate3.style += getLabelStyle(p.Option33, isLastLblHTML);
8245				var currDate4 = new mxCell('', new mxGeometry(w * 0.80, h * 0.4, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8246				currDate4.vertex = true;
8247				v.insert(currDate4);
8248				currDate4.value = convertText(p.Option43);
8249				currDate4.style += getLabelStyle(p.Option43, isLastLblHTML);
8250
8251				var fourthDate1 = new mxCell('', new mxGeometry(0, h * 0.6, w * 0.5, h * 0.2), 'strokeColor=none;fillColor=none;');
8252				fourthDate1.vertex = true;
8253				v.insert(fourthDate1);
8254				fourthDate1.value = convertText(p.Option14);
8255				fourthDate1.style += getLabelStyle(p.Option14, isLastLblHTML);
8256				var fourthDate2 = new mxCell('', new mxGeometry(w * 0.5, h * 0.6, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8257				fourthDate2.vertex = true;
8258				v.insert(fourthDate2);
8259				fourthDate2.value = convertText(p.Option24);
8260				fourthDate2.style += getLabelStyle(p.Option24, isLastLblHTML);
8261				var fourthDate3 = new mxCell('', new mxGeometry(w * 0.65, h * 0.6, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8262				fourthDate3.vertex = true;
8263				v.insert(fourthDate3);
8264				fourthDate3.value = convertText(p.Option34);
8265				fourthDate3.style += getLabelStyle(p.Option34, isLastLblHTML);
8266				var fourthDate4 = new mxCell('', new mxGeometry(w * 0.8, h * 0.6, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8267				fourthDate4.vertex = true;
8268				v.insert(fourthDate4);
8269				fourthDate4.value = convertText(p.Option44);
8270				fourthDate4.style += getLabelStyle(p.Option44, isLastLblHTML);
8271
8272				var fifthDate1 = new mxCell('', new mxGeometry(0, h * 0.8, w * 0.5, h * 0.2), 'strokeColor=none;fillColor=none;');
8273				fifthDate1.vertex = true;
8274				v.insert(fifthDate1);
8275				fifthDate1.value = convertText(p.Option15);
8276				fifthDate1.style += getLabelStyle(p.Option15, isLastLblHTML);
8277				var fifthDate2 = new mxCell('', new mxGeometry(w * 0.5, h * 0.8, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8278				fifthDate2.vertex = true;
8279				v.insert(fifthDate2);
8280				fifthDate2.value = convertText(p.Option25);
8281				fifthDate2.style += getLabelStyle(p.Option25, isLastLblHTML);
8282				var fifthDate3 = new mxCell('', new mxGeometry(w * 0.65, h * 0.8, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8283				fifthDate3.vertex = true;
8284				v.insert(fifthDate3);
8285				fifthDate3.value = convertText(p.Option35);
8286				fifthDate3.style += getLabelStyle(p.Option35, isLastLblHTML);
8287
8288				var line1 = new mxCell('', new mxGeometry(0, h * 0.4 - 2, w, 4), 'shape=line;strokeColor=#888888;');
8289				line1.vertex = true;
8290				v.insert(line1);
8291				var line2 = new mxCell('', new mxGeometry(0, h * 0.6 - 2, w, 4), 'shape=line;strokeColor=#888888;');
8292				line2.vertex = true;
8293				v.insert(line2);
8294
8295				v.style += 'strokeColor=none;';
8296				v.style += addAllStyles(v.style, p, a, v);
8297
8298				break;
8299
8300			case 'iOSTimePicker' :
8301				var firstDate1 = new mxCell('', new mxGeometry(0, 0, w * 0.25, h * 0.2), 'strokeColor=none;fillColor=none;');
8302				firstDate1.vertex = true;
8303				v.insert(firstDate1);
8304				firstDate1.value = convertText(p.Option11);
8305				firstDate1.style += getLabelStyle(p.Option11, isLastLblHTML);
8306				var firstDate2 = new mxCell('', new mxGeometry(w * 0.25, 0, w * 0.3, h * 0.2), 'strokeColor=none;fillColor=none;');
8307				firstDate2.vertex = true;
8308				v.insert(firstDate2);
8309				firstDate2.value = convertText(p.Option21);
8310				firstDate2.style += getLabelStyle(p.Option21, isLastLblHTML);
8311
8312				var secondDate1 = new mxCell('', new mxGeometry(0, h * 0.2, w * 0.25, h * 0.2), 'strokeColor=none;fillColor=none;');
8313				secondDate1.vertex = true;
8314				v.insert(secondDate1);
8315				secondDate1.value = convertText(p.Option12);
8316				secondDate1.style += getLabelStyle(p.Option12, isLastLblHTML);
8317				var secondDate2 = new mxCell('', new mxGeometry(w * 0.25, h * 0.2, w * 0.3, h * 0.2), 'strokeColor=none;fillColor=none;');
8318				secondDate2.vertex = true;
8319				v.insert(secondDate2);
8320				secondDate2.value = convertText(p.Option22);
8321				secondDate2.style += getLabelStyle(p.Option22, isLastLblHTML);
8322
8323				var currDate1 = new mxCell('', new mxGeometry(0, h * 0.4, w * 0.25, h * 0.2), 'strokeColor=none;fillColor=none;');
8324				currDate1.vertex = true;
8325				v.insert(currDate1);
8326				currDate1.value = convertText(p.Option13);
8327				currDate1.style += getLabelStyle(p.Option13, isLastLblHTML);
8328				var currDate2 = new mxCell('', new mxGeometry(w * 0.25, h * 0.4, w * 0.3, h * 0.2), 'strokeColor=none;fillColor=none;');
8329				currDate2.vertex = true;
8330				v.insert(currDate2);
8331				currDate2.value = convertText(p.Option23);
8332				currDate2.style += getLabelStyle(p.Option23, isLastLblHTML);
8333				var currDate4 = new mxCell('', new mxGeometry(w * 0.7, h * 0.4, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8334				currDate4.vertex = true;
8335				v.insert(currDate4);
8336				currDate4.value = convertText(p.Option33);
8337				currDate4.style += getLabelStyle(p.Option33, isLastLblHTML);
8338
8339				var fourthDate1 = new mxCell('', new mxGeometry(0, h * 0.6, w * 0.25, h * 0.2), 'strokeColor=none;fillColor=none;');
8340				fourthDate1.vertex = true;
8341				v.insert(fourthDate1);
8342				fourthDate1.value = convertText(p.Option14);
8343				fourthDate1.style += getLabelStyle(p.Option14, isLastLblHTML);
8344				var fourthDate2 = new mxCell('', new mxGeometry(w * 0.25, h * 0.6, w * 0.3, h * 0.2), 'strokeColor=none;fillColor=none;');
8345				fourthDate2.vertex = true;
8346				v.insert(fourthDate2);
8347				fourthDate2.value = convertText(p.Option24);
8348				fourthDate2.style += getLabelStyle(p.Option24, isLastLblHTML);
8349				var fourthDate4 = new mxCell('', new mxGeometry(w * 0.7, h * 0.6, w * 0.15, h * 0.2), 'strokeColor=none;fillColor=none;');
8350				fourthDate4.vertex = true;
8351				v.insert(fourthDate4);
8352				fourthDate4.value = convertText(p.Option34);
8353				fourthDate4.style += getLabelStyle(p.Option34, isLastLblHTML);
8354
8355				var fifthDate1 = new mxCell('', new mxGeometry(0, h * 0.8, w * 0.25, h * 0.2), 'strokeColor=none;fillColor=none;');
8356				fifthDate1.vertex = true;
8357				v.insert(fifthDate1);
8358				fifthDate1.value = convertText(p.Option15);
8359				fifthDate1.style += getLabelStyle(p.Option15, isLastLblHTML);
8360				var fifthDate2 = new mxCell('', new mxGeometry(w * 0.25, h * 0.8, w * 0.3, h * 0.2), 'strokeColor=none;fillColor=none;');
8361				fifthDate2.vertex = true;
8362				v.insert(fifthDate2);
8363				fifthDate2.value = convertText(p.Option25);
8364				fifthDate2.style += getLabelStyle(p.Option25, isLastLblHTML);
8365
8366				var line1 = new mxCell('', new mxGeometry(0, h * 0.4 - 2, w, 4), 'shape=line;strokeColor=#888888;');
8367				line1.vertex = true;
8368				v.insert(line1);
8369				var line2 = new mxCell('', new mxGeometry(0, h * 0.6 - 2, w, 4), 'shape=line;strokeColor=#888888;');
8370				line2.vertex = true;
8371				v.insert(line2);
8372
8373				v.style += 'strokeColor=none;';
8374				v.style += addAllStyles(v.style, p, a, v);
8375
8376				break;
8377
8378			case 'iOSCountdownPicker' :
8379				var firstDate3 = new mxCell('', new mxGeometry(w * 0.45, 0, w * 0.2, h * 0.2), 'strokeColor=none;fillColor=none;');
8380				firstDate3.vertex = true;
8381				v.insert(firstDate3);
8382				firstDate3.value = convertText(p.Option31);
8383				firstDate3.style += getLabelStyle(p.Option31, isLastLblHTML);
8384
8385				var secondDate3 = new mxCell('', new mxGeometry(w * 0.45, h * 0.2, w * 0.2, h * 0.2), 'strokeColor=none;fillColor=none;');
8386				secondDate3.vertex = true;
8387				v.insert(secondDate3);
8388				secondDate3.value = convertText(p.Option32);
8389				secondDate3.style += getLabelStyle(p.Option32, isLastLblHTML);
8390
8391				var currDate1 = new mxCell('', new mxGeometry(0, h * 0.4, w * 0.25, h * 0.2), 'strokeColor=none;fillColor=none;');
8392				currDate1.vertex = true;
8393				v.insert(currDate1);
8394				currDate1.value = convertText(p.Option13);
8395				currDate1.style += getLabelStyle(p.Option13, isLastLblHTML);
8396				var currDate2 = new mxCell('', new mxGeometry(w * 0.2, h * 0.4, w * 0.25, h * 0.2), 'strokeColor=none;fillColor=none;');
8397				currDate2.vertex = true;
8398				v.insert(currDate2);
8399				currDate2.value = convertText(p.Option23);
8400				currDate2.style += getLabelStyle(p.Option23, isLastLblHTML);
8401				var currDate3 = new mxCell('', new mxGeometry(w * 0.45, h * 0.4, w * 0.2, h * 0.2), 'strokeColor=none;fillColor=none;');
8402				currDate3.vertex = true;
8403				v.insert(currDate3);
8404				currDate3.value = convertText(p.Option33);
8405				currDate3.style += getLabelStyle(p.Option33, isLastLblHTML);
8406				var currDate4 = new mxCell('', new mxGeometry(w * 0.6, h * 0.4, w * 0.2, h * 0.2), 'strokeColor=none;fillColor=none;');
8407				currDate4.vertex = true;
8408				v.insert(currDate4);
8409				currDate4.value = convertText(p.Option43);
8410				currDate4.style += getLabelStyle(p.Option43, isLastLblHTML);
8411
8412				var fourthDate1 = new mxCell('', new mxGeometry(0, h * 0.6, w * 0.25, h * 0.2), 'strokeColor=none;fillColor=none;');
8413				fourthDate1.vertex = true;
8414				v.insert(fourthDate1);
8415				fourthDate1.value = convertText(p.Option14);
8416				fourthDate1.style += getLabelStyle(p.Option14, isLastLblHTML);
8417				var fourthDate3 = new mxCell('', new mxGeometry(w * 0.45, h * 0.6, w * 0.2, h * 0.2), 'strokeColor=none;fillColor=none;');
8418				fourthDate3.vertex = true;
8419				v.insert(fourthDate3);
8420				fourthDate3.value = convertText(p.Option34);
8421				fourthDate3.style += getLabelStyle(p.Option34, isLastLblHTML);
8422
8423				var fifthDate1 = new mxCell('', new mxGeometry(0, h * 0.8, w * 0.25, h * 0.2), 'strokeColor=none;fillColor=none;');
8424				fifthDate1.vertex = true;
8425				v.insert(fifthDate1);
8426				fifthDate1.value = convertText(p.Option15);
8427				fifthDate1.style += getLabelStyle(p.Option15, isLastLblHTML);
8428				var fifthDate3 = new mxCell('', new mxGeometry(w * 0.45, h * 0.8, w * 0.2, h * 0.2), 'strokeColor=none;fillColor=none;');
8429				fifthDate3.vertex = true;
8430				v.insert(fifthDate3);
8431				fifthDate3.value = convertText(p.Option35);
8432				fifthDate3.style += getLabelStyle(p.Option35, isLastLblHTML);
8433
8434				var line1 = new mxCell('', new mxGeometry(0, h * 0.4 - 2, w, 4), 'shape=line;strokeColor=#888888;');
8435				line1.vertex = true;
8436				v.insert(line1);
8437				var line2 = new mxCell('', new mxGeometry(0, h * 0.6 - 2, w, 4), 'shape=line;strokeColor=#888888;');
8438				line2.vertex = true;
8439				v.insert(line2);
8440
8441				v.style += 'strokeColor=none;';
8442				v.style += addAllStyles(v.style, p, a, v);
8443
8444				break;
8445
8446			case 'iOSBasicCell' :
8447				v.value = convertText(p.text);
8448				v.style += 'shape=partialRectangle;left=0;top=0;right=0;fillColor=#ffffff;strokeColor=#C8C7CC;spacing=0;align=left;spacingLeft=' + (p.SeparatorInset * scale) + ';';
8449				v.style += (isLastLblHTML? 'fontSize=' + defaultFontSize + ';' :
8450					getFontSize(p.text) +
8451					getFontColor(p.text) +
8452					getFontStyle(p.text)) +
8453					getTextVerticalAlignment(p.text);
8454				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
8455
8456				switch (p.AccessoryIndicatorType)
8457				{
8458					case 'Disclosure' :
8459						var icon1 = new mxCell('', new mxGeometry(w * 0.91, h * 0.35, h * 0.15, h * 0.3), 'shape=mxgraph.ios7.misc.right;strokeColor=#D2D2D6;');
8460						icon1.vertex = true;
8461						v.insert(icon1);
8462
8463						break;
8464
8465					case 'DetailDisclosure' :
8466						var icon1 = new mxCell('', new mxGeometry(w * 0.91, h * 0.35, h * 0.15, h * 0.3), 'shape=mxgraph.ios7.misc.right;strokeColor=#D2D2D6;');
8467						icon1.vertex = true;
8468						v.insert(icon1);
8469
8470						var icon2 = new mxCell('', new mxGeometry(w * 0.79, h * 0.25, h * 0.5, h * 0.5), 'shape=mxgraph.ios7.icons.info;strokeColor=#007AFF;fillColor=#ffffff;');
8471						icon2.vertex = true;
8472						v.insert(icon2);
8473
8474						break;
8475
8476					case 'DetailIndicator' :
8477						var icon2 = new mxCell('', new mxGeometry(w * 0.87, h * 0.25, h * 0.5, h * 0.5), 'shape=mxgraph.ios7.icons.info;strokeColor=#007AFF;fillColor=#ffffff;');
8478						icon2.vertex = true;
8479						v.insert(icon2);
8480
8481						break;
8482
8483					case 'CheckMark' :
8484						var icon1 = new mxCell('', new mxGeometry(w * 0.89, h * 0.37, h * 0.4, h * 0.26), 'shape=mxgraph.ios7.misc.check;strokeColor=#007AFF;strokeWidth=2;');
8485						icon1.vertex = true;
8486						v.insert(icon1);
8487
8488						break;
8489				}
8490
8491				break;
8492
8493			case 'iOSSubtitleCell' :
8494				v.style += 'shape=partialRectangle;left=0;top=0;right=0;fillColor=#ffffff;strokeColor=#C8C7CC;align=left;spacing=0;verticalAlign=top;spacingLeft=' + (p.SeparatorInset * scale) + ';';
8495				v.value = convertText(p.subtext);
8496				v.style += (isLastLblHTML? 'fontSize=' + defaultFontSize + ';' :
8497					getFontSize(p.subtext) +
8498					getFontColor(p.subtext) +
8499					getFontStyle(p.subtext));
8500				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
8501
8502				var subtext = new mxCell('', new mxGeometry(0, h * 0.4, w, h * 0.6), 'fillColor=none;strokeColor=none;spacing=0;align=left;verticalAlign=bottom;spacingLeft=' + (p.SeparatorInset * scale) + ';');
8503				subtext.vertex = true;
8504				v.insert(subtext);
8505				subtext.value = convertText(p.text);
8506				subtext.style += (isLastLblHTML? 'html=1;fontSize=' + defaultFontSize + ';' +
8507					gFontFamilyStyle
8508					:
8509					getFontSize(p.text) +
8510					getFontFamily(p.text) +
8511					getFontColor(p.text) +
8512					getFontStyle(p.text));
8513
8514				switch (p.AccessoryIndicatorType)
8515				{
8516					case 'Disclosure' :
8517						var icon1 = new mxCell('', new mxGeometry(w * 0.91, h * 0.35, h * 0.15, h * 0.3), 'shape=mxgraph.ios7.misc.right;strokeColor=#D2D2D6;');
8518						icon1.vertex = true;
8519						v.insert(icon1);
8520
8521						break;
8522
8523					case 'DetailDisclosure' :
8524						var icon1 = new mxCell('', new mxGeometry(w * 0.91, h * 0.35, h * 0.15, h * 0.3), 'shape=mxgraph.ios7.misc.right;strokeColor=#D2D2D6;');
8525						icon1.vertex = true;
8526						v.insert(icon1);
8527
8528						var icon2 = new mxCell('', new mxGeometry(w * 0.79, h * 0.25, h * 0.5, h * 0.5), 'shape=mxgraph.ios7.icons.info;strokeColor=#007AFF;fillColor=#ffffff;');
8529						icon2.vertex = true;
8530						v.insert(icon2);
8531
8532						break;
8533
8534					case 'DetailIndicator' :
8535						var icon2 = new mxCell('', new mxGeometry(w * 0.87, h * 0.25, h * 0.5, h * 0.5), 'shape=mxgraph.ios7.icons.info;strokeColor=#007AFF;fillColor=#ffffff;');
8536						icon2.vertex = true;
8537						v.insert(icon2);
8538
8539						break;
8540
8541					case 'CheckMark' :
8542						var icon1 = new mxCell('', new mxGeometry(w * 0.89, h * 0.37, h * 0.4, h * 0.26), 'shape=mxgraph.ios7.misc.check;strokeColor=#007AFF;strokeWidth=2;');
8543						icon1.vertex = true;
8544						v.insert(icon1);
8545
8546						break;
8547				}
8548
8549				break;
8550
8551			case 'iOSRightDetailCell' :
8552				v.style += 'shape=partialRectangle;left=0;top=0;right=0;fillColor=#ffffff;strokeColor=#C8C7CC;align=left;spacing=0;verticalAlign=middle;spacingLeft=' + (p.SeparatorInset * scale) + ';';
8553				v.value = convertText(p.subtext);
8554				v.style += (isLastLblHTML? 'fontSize=' + defaultFontSize + ';' :
8555					getFontSize(p.subtext) +
8556					getFontColor(p.subtext) +
8557					getFontStyle(p.subtext));
8558				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
8559
8560				var subtext = null;
8561
8562				switch (p.AccessoryIndicatorType)
8563				{
8564					case 'Disclosure' :
8565						var icon1 = new mxCell('', new mxGeometry(w * 0.91, h * 0.35, h * 0.15, h * 0.3), 'shape=mxgraph.ios7.misc.right;strokeColor=#D2D2D6;');
8566						icon1.vertex = true;
8567						v.insert(icon1);
8568
8569						subtext = new mxCell('', new mxGeometry(w * 0.55, 0, w * 0.3, h), 'fillColor=none;strokeColor=none;spacing=0;align=right;');
8570
8571						break;
8572
8573					case 'DetailDisclosure' :
8574						var icon1 = new mxCell('', new mxGeometry(w * 0.91, h * 0.35, h * 0.15, h * 0.3), 'shape=mxgraph.ios7.misc.right;strokeColor=#D2D2D6;');
8575						icon1.vertex = true;
8576						v.insert(icon1);
8577
8578						var icon2 = new mxCell('', new mxGeometry(w * 0.79, h * 0.25, h * 0.5, h * 0.5), 'shape=mxgraph.ios7.icons.info;strokeColor=#007AFF;fillColor=#ffffff;');
8579						icon2.vertex = true;
8580						v.insert(icon2);
8581
8582						subtext = new mxCell('', new mxGeometry(w * 0.45, 0, w * 0.3, h), 'fillColor=none;strokeColor=none;spacing=0;align=right;');
8583
8584						break;
8585
8586					case 'DetailIndicator' :
8587						var icon2 = new mxCell('', new mxGeometry(w * 0.87, h * 0.25, h * 0.5, h * 0.5), 'shape=mxgraph.ios7.icons.info;strokeColor=#007AFF;fillColor=#ffffff;');
8588						icon2.vertex = true;
8589						v.insert(icon2);
8590
8591						subtext = new mxCell('', new mxGeometry(w * 0.52, 0, w * 0.3, h), 'fillColor=none;strokeColor=none;spacing=0;align=right;');
8592
8593						break;
8594
8595					case 'CheckMark' :
8596						var icon1 = new mxCell('', new mxGeometry(w * 0.89, h * 0.37, h * 0.4, h * 0.26), 'shape=mxgraph.ios7.misc.check;strokeColor=#007AFF;strokeWidth=2;');
8597						icon1.vertex = true;
8598						v.insert(icon1);
8599
8600						subtext = new mxCell('', new mxGeometry(w * 0.55, 0, w * 0.3, h), 'fillColor=none;strokeColor=none;spacing=0;align=right;');
8601
8602						break;
8603
8604					default :
8605						subtext = new mxCell('', new mxGeometry(w * 0.65, 0, w * 0.3, h), 'fillColor=none;strokeColor=none;spacing=0;align=right;');
8606				}
8607
8608				subtext.vertex = true;
8609				v.insert(subtext);
8610				subtext.value = convertText(p.text);
8611				subtext.style += (isLastLblHTML? 'html=1;fontSize=' + defaultFontSize + ';' +
8612					gFontFamilyStyle
8613					:
8614					getFontSize(p.text) +
8615					getFontFamily(p.text) +
8616					getFontColor(p.text) +
8617					getFontStyle(p.text));
8618
8619				break;
8620
8621			case 'iOSLeftDetailCell' :
8622				v.style += 'shape=partialRectangle;left=0;top=0;right=0;fillColor=#ffffff;strokeColor=#C8C7CC;';
8623				v.style += addAllStyles(v.style, p, a, v);
8624
8625				var text = new mxCell('', new mxGeometry(0, 0, w * 0.25, h), 'fillColor=none;strokeColor=none;spacing=0;align=right;verticalAlign=middle;spacingRight=3;');
8626				text.vertex = true;
8627				v.insert(text);
8628				text.value = convertText(p.subtext);
8629				text.style += (isLastLblHTML? 'html=1;fontSize=' + defaultFontSize + ';' +
8630					gFontFamilyStyle
8631					:
8632					getFontSize(p.subtext) +
8633					getFontFamily(p.subtext) +
8634					getFontColor(p.subtext) +
8635					getFontStyle(p.subtext));
8636
8637				var subtext = new mxCell('', new mxGeometry(w * 0.25, 0, w * 0.5, h), 'fillColor=none;strokeColor=none;spacing=0;align=left;verticalAlign=middle;spacingLeft=3;');
8638				subtext.vertex = true;
8639				v.insert(subtext);
8640				subtext.value = convertText(p.text);
8641				subtext.style += (isLastLblHTML? 'html=1;fontSize=' + defaultFontSize + ';' +
8642					gFontFamilyStyle
8643					:
8644					getFontSize(p.text) +
8645					getFontFamily(p.text) +
8646					getFontColor(p.text) +
8647					getFontStyle(p.text));
8648
8649				switch (p.AccessoryIndicatorType)
8650				{
8651					case 'Disclosure' :
8652						var icon1 = new mxCell('', new mxGeometry(w * 0.91, h * 0.35, h * 0.15, h * 0.3), 'shape=mxgraph.ios7.misc.right;strokeColor=#D2D2D6;');
8653						icon1.vertex = true;
8654						v.insert(icon1);
8655
8656						break;
8657
8658					case 'DetailDisclosure' :
8659						var icon1 = new mxCell('', new mxGeometry(w * 0.91, h * 0.35, h * 0.15, h * 0.3), 'shape=mxgraph.ios7.misc.right;strokeColor=#D2D2D6;');
8660						icon1.vertex = true;
8661						v.insert(icon1);
8662
8663						var icon2 = new mxCell('', new mxGeometry(w * 0.79, h * 0.25, h * 0.5, h * 0.5), 'shape=mxgraph.ios7.icons.info;strokeColor=#007AFF;fillColor=#ffffff;');
8664						icon2.vertex = true;
8665						v.insert(icon2);
8666
8667						break;
8668
8669					case 'DetailIndicator' :
8670						var icon2 = new mxCell('', new mxGeometry(w * 0.87, h * 0.25, h * 0.5, h * 0.5), 'shape=mxgraph.ios7.icons.info;strokeColor=#007AFF;fillColor=#ffffff;');
8671						icon2.vertex = true;
8672						v.insert(icon2);
8673
8674						break;
8675
8676					case 'CheckMark' :
8677						var icon1 = new mxCell('', new mxGeometry(w * 0.89, h * 0.37, h * 0.4, h * 0.26), 'shape=mxgraph.ios7.misc.check;strokeColor=#007AFF;strokeWidth=2;');
8678						icon1.vertex = true;
8679						v.insert(icon1);
8680
8681						break;
8682				}
8683
8684				break;
8685
8686			case 'iOSTableGroupedSectionBreak' :
8687				v.style += 'shape=partialRectangle;left=0;right=0;fillColor=#EFEFF4;strokeColor=#C8C7CC;';
8688
8689				var text1 = new mxCell('', new mxGeometry(0, 0, w, h * 0.4), 'fillColor=none;strokeColor=none;spacing=10;align=left;');
8690				text1.vertex = true;
8691				v.insert(text1);
8692				text1.value = convertText(p.text);
8693				text1.style += (isLastLblHTML? 'html=1;fontSize=' + defaultFontSize + ';' +
8694					gFontFamilyStyle
8695					:
8696					getFontSize(p.text) +
8697					getFontFamily(p.text) +
8698					getFontColor(p.text) +
8699					getFontStyle(p.text));
8700
8701				var text2 = new mxCell('', new mxGeometry(0, h * 0.6, w, h * 0.4), 'fillColor=none;strokeColor=none;spacing=10;align=left;');
8702				text2.vertex = true;
8703				v.insert(text2);
8704				text2.value = convertText(p["bottom-text"]);
8705				text2.style += (isLastLblHTML? 'html=1;fontSize=' + defaultFontSize + ';' +
8706					gFontFamilyStyle
8707					:
8708					getFontSize(p["bottom-text"]) +
8709					getFontFamily(p["bottom-text"]) +
8710					getFontColor(p["bottom-text"]) +
8711					getFontStyle(p["bottom-text"]));
8712
8713				break;
8714
8715			case 'iOSTablePlainHeaderFooter' :
8716				v.style += 'fillColor=#F7F7F7;strokeColor=none;align=left;spacingLeft=5;spacing=0;';
8717				v.value = convertText(p.text);
8718				v.style += (isLastLblHTML? 'fontSize=' + defaultFontSize + ';' :
8719					getFontSize(p.text) +
8720					getFontColor(p.text) +
8721					getFontStyle(p.text));
8722				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
8723
8724				break;
8725
8726			case 'SMPage' :
8727			//TODO Link icon (p.Url != "")
8728				if (p.Group)
8729				{
8730					v.style += 'strokeColor=none;fillColor=none;'
8731
8732					var item1 = new mxCell('', new mxGeometry(0, 0, w * 0.9, h * 0.9), 'rounded=1;arcSize=3;part=1;');
8733					item1.vertex = true;
8734					v.insert(item1);
8735
8736					item1.style += 	getStrokeColor(p, a) +
8737						getFillColor(p, a) +
8738						getOpacity(p, a, item1) +
8739						getShadow(p) +
8740						getStrokeWidth(p);
8741
8742					var item2 = new mxCell('', new mxGeometry(w * 0.1, h * 0.1, w * 0.9, h * 0.9), 'rounded=1;arcSize=3;part=1;');
8743					item2.vertex = true;
8744					v.insert(item2);
8745
8746					item2.value = convertText(p.Text);
8747					item2.style += 	getStrokeColor(p, a) +
8748						getFillColor(p, a) +
8749						getOpacity(p, a, item2) +
8750						getShadow(p) +
8751						getStrokeWidth(p) +
8752						getLabelStyle(p, isLastLblHTML);
8753
8754					if (p.Future)
8755					{
8756						item1.style += 'dashed=1;fixDash=1;';
8757						item2.style += 'dashed=1;fixDash=1;';
8758					}
8759				}
8760				else
8761				{
8762					v.style += 'rounded=1;arcSize=3;';
8763
8764					if (p.Future)
8765					{
8766						v.style += 'dashed=1;fixDash=1;';
8767					}
8768
8769					v.value = convertText(p.Text);
8770					v.style += 	getStrokeColor(p, a) +
8771						getFillColor(p, a) +
8772						getOpacity(p, a, v) +
8773						getShadow(p) +
8774						getStrokeWidth(p) +
8775						getLabelStyle(p, isLastLblHTML);
8776				}
8777
8778				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
8779
8780				break;
8781
8782			case 'SMHome' :
8783			case 'SMPrint' :
8784			case 'SMSearch' :
8785			case 'SMSettings' :
8786			case 'SMSitemap' :
8787			case 'SMSuccess' :
8788			case 'SMVideo' :
8789			case 'SMAudio' :
8790			case 'SMCalendar' :
8791			case 'SMChart' :
8792			case 'SMCloud' :
8793			case 'SMDocument' :
8794			case 'SMForm' :
8795			case 'SMGame' :
8796			case 'SMUpload' :
8797
8798				var item1 = null;
8799
8800				switch (obj.Class)
8801				{
8802					case 'SMHome' :
8803						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.4, h * 0.1, h * 0.8, h * 0.8), 'part=1;shape=mxgraph.office.concepts.home;flipH=1;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8804						break;
8805					case 'SMPrint' :
8806						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.4, h * 0.19, h * 0.8, h * 0.62), 'part=1;shape=mxgraph.office.devices.printer;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8807						break;
8808					case 'SMSearch' :
8809						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.4, h * 0.1, h * 0.8, h * 0.8), 'part=1;shape=mxgraph.office.concepts.search;flipH=1;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8810						break;
8811					case 'SMSettings' :
8812						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.35, h * 0.15, h * 0.7, h * 0.7), 'part=1;shape=mxgraph.mscae.enterprise.settings;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8813						break;
8814					case 'SMSitemap' :
8815						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.35, h * 0.2, h * 0.7, h * 0.6), 'part=1;shape=mxgraph.office.sites.site_collection;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8816						break;
8817					case 'SMSuccess' :
8818						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.3, h * 0.25, h * 0.6, h * 0.5), 'part=1;shape=mxgraph.mscae.general.checkmark;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8819						break;
8820					case 'SMVideo' :
8821						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.4, h * 0.2, h * 0.8, h * 0.6), 'part=1;shape=mxgraph.office.concepts.video_play;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8822						break;
8823					case 'SMAudio' :
8824						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.3, h * 0.2, h * 0.6, h * 0.6), 'part=1;shape=mxgraph.mscae.general.audio;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8825						break;
8826					case 'SMCalendar' :
8827						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.4, h * 0.15, h * 0.8, h * 0.7), 'part=1;shape=mxgraph.office.concepts.form;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8828						break;
8829					case 'SMChart' :
8830						var fc = getFillColor(p, a);
8831
8832						if (fc == '')
8833						{
8834							fc = '#ffffff;'
8835						}
8836						else
8837						{
8838							fc = fc.replace('fillColor=', '');
8839						}
8840
8841						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.35, h * 0.15, h * 0.7, h * 0.7), 'part=1;shape=mxgraph.ios7.icons.pie_chart;fillColor=#e6e6e6;fillOpacity=50;strokeWidth=4;strokeColor=' + fc);
8842						break;
8843					case 'SMCloud' :
8844						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.4, h * 0.27, h * 0.8, h * 0.46), 'part=1;shape=mxgraph.networks.cloud;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8845						break;
8846					case 'SMDocument' :
8847						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.25, h * 0.15, h * 0.5, h * 0.7), 'part=1;shape=mxgraph.mscae.enterprise.document;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8848						break;
8849					case 'SMForm' :
8850						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.4, h * 0.15, h * 0.8, h * 0.7), 'part=1;shape=mxgraph.office.concepts.form;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8851						break;
8852					case 'SMGame' :
8853						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.4, h * 0.2, h * 0.8, h * 0.6), 'part=1;shape=mxgraph.mscae.general.game_controller;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8854						break;
8855					case 'SMUpload' :
8856						item1 = new mxCell('', new mxGeometry(w * 0.5 - h * 0.4, h * 0.2, h * 0.8, h * 0.6), 'part=1;shape=mxgraph.mscae.enterprise.backup_online;fillColor=#e6e6e6;opacity=50;strokeColor=none;');
8857						break;
8858				}
8859
8860				item1.vertex = true;
8861				v.insert(item1);
8862
8863				item1.value = convertText(p.Text);
8864				item1.style += 	getLabelStyle(p, isLastLblHTML);
8865				v.style += addAllStyles(v.style, p, a, v);
8866
8867				break;
8868			case 'UMLMultiplicityBlock' :
8869				v.style += 'strokeColor=none;fillColor=none;'
8870
8871					var item1 = new mxCell('', new mxGeometry(w * 0.1, 0, w * 0.9, h * 0.9), 'part=1;');
8872					item1.vertex = true;
8873					v.insert(item1);
8874
8875					item1.style += addAllStyles(item1.style, p, a, item1);
8876
8877					var item2 = new mxCell('', new mxGeometry(0, h * 0.1, w * 0.9, h * 0.9), 'part=1;');
8878					item2.vertex = true;
8879					v.insert(item2);
8880
8881					item2.value = convertText(p.Text);
8882					item2.style +=
8883						getLabelStyle(p.Text, isLastLblHTML);
8884					item2.style += addAllStyles(item2.style, p, a, item2, isLastLblHTML);
8885				break;
8886
8887			case 'UMLConstraintBlock' :
8888
8889				var brace1 = new mxCell('', new mxGeometry(0, 0,	h * 0.25, h), 'shape=curlyBracket;rounded=1;');
8890				brace1.vertex = true;
8891				v.insert(brace1);
8892
8893				var brace2 = new mxCell('', new mxGeometry(w - h * 0.25, 0,	h * 0.25, h), 'shape=curlyBracket;rounded=1;flipH=1;');
8894				brace2.vertex = true;
8895				v.insert(brace2);
8896
8897				var label = new mxCell('', new mxGeometry(h * 0.25, 0,	w - h * 0.5, h), 'strokeColor=none;fillColor=none;');
8898				label.vertex = true;
8899				label.value = convertText(p);
8900				v.insert(label);
8901
8902				v.style = "strokeColor=none;fillColor=none;"
8903				v.style += addAllStyles(v.style, p, a, v);
8904
8905
8906				brace1.style +=
8907								getOpacity(p, a, brace1);
8908				brace2.style +=
8909								getOpacity(p, a, brace2);
8910				label.style +=
8911								getFontColor(p, label);
8912				brace1.style += addAllStyles(brace1.style, p, a, brace1);
8913				brace2.style += addAllStyles(brace2.style, p, a, brace2);
8914				label.style += addAllStyles(label.style, p, a, label, isLastLblHTML);
8915				break;
8916
8917			case 'UMLTextBlock' :
8918				v.value = convertText(p.Text);
8919				v.style += 'strokeColor=none;' +
8920					getLabelStyle(p.Text, isLastLblHTML);
8921				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
8922				break;
8923			case 'UMLProvidedInterfaceBlock' :
8924			case 'UMLProvidedInterfaceBlockV2' :
8925				var rotation = getRotation(p, a, v);
8926				p.Rotatio = null;
8927				var allStyle = addAllStyles(v.style, p, a, v, isLastLblHTML);
8928
8929				if (allStyle.indexOf(mxConstants.STYLE_STROKEWIDTH) == -1)
8930				{
8931					allStyle = mxConstants.STYLE_STROKEWIDTH + '=1;' + allStyle;
8932				}
8933
8934				v.style = 'group;dropTarget=0;' + rotation;
8935				var circleW = w * 0.8;
8936				var lineW = w - circleW;
8937				var circle = new mxCell('', new mxGeometry(0.2, 0, circleW, h), 'shape=ellipse;' + allStyle);
8938				circle.vertex = true;
8939				circle.geometry.relative = true;
8940				v.insert(circle);
8941				var line = new mxCell('', new mxGeometry(0, 0.5, lineW, 1), 'line;' + allStyle);
8942				line.geometry.relative = true;
8943				line.vertex = true;
8944				v.insert(line);
8945				break;
8946			case 'UMLComponentBoxBlock' :
8947			case 'UMLComponentBoxBlockV2':
8948				v.value = convertText(p);
8949				v.style = 'html=1;dropTarget=0;' + addAllStyles(v.style, p, a, v, isLastLblHTML);
8950
8951				var icon = new mxCell('', new mxGeometry(1, 0, 15, 15), 'shape=component;jettyWidth=8;jettyHeight=4;');
8952				icon.geometry.relative = true;
8953				icon.geometry.offset = new mxPoint(-20, 5);
8954				icon.vertex = true;
8955				v.insert(icon);
8956				break;
8957			case 'UMLAssemblyConnectorBlock':
8958			case 'UMLAssemblyConnectorBlockV2':
8959				var rotation = getRotation(p, a, v);
8960				p.Rotatio = null;
8961				var allStyle = addAllStyles(v.style, p, a, v, isLastLblHTML);
8962
8963				if (allStyle.indexOf(mxConstants.STYLE_STROKEWIDTH) == -1)
8964				{
8965					allStyle = mxConstants.STYLE_STROKEWIDTH + '=1;' + allStyle;
8966				}
8967
8968				v.style = 'group;dropTarget=0;' + rotation;
8969				var line1W = w * 0.225;
8970				var line2W = w * 0.1;
8971				var circleW = w - line1W - line2W;
8972				var circle = new mxCell('', new mxGeometry(0.225, 0, circleW, h), 'shape=providedRequiredInterface;verticalLabelPosition=bottom;' + allStyle);
8973				circle.vertex = true;
8974				circle.geometry.relative = true;
8975				v.insert(circle);
8976				var line1 = new mxCell('', new mxGeometry(0, 0.5, line1W, 1), 'line;' + allStyle);
8977				line1.geometry.relative = true;
8978				line1.vertex = true;
8979				v.insert(line1);
8980				var line2 = new mxCell('', new mxGeometry(0.9, 0.5, line2W, 1), 'line;' + allStyle);
8981				line2.geometry.relative = true;
8982				line2.vertex = true;
8983				v.insert(line2);
8984				break;
8985			case 'BPMNActivity' :
8986				v.value = convertText(p.Text);
8987
8988				switch (p.bpmnActivityType)
8989				{
8990					case 1:
8991						v.style +=
8992							getLabelStyle(p.Text, isLastLblHTML);
8993						break
8994					case 2:
8995						v.style += 'shape=ext;double=1;' +
8996							getLabelStyle(p.Text, isLastLblHTML);
8997						break
8998					case 3:
8999						v.style += 'shape=ext;dashed=1;dashPattern=2 5;' +
9000							getLabelStyle(p.Text, isLastLblHTML);
9001						break
9002					case 4:
9003						v.style += 'shape=ext;strokeWidth=2;' +
9004							getLabelStyle(p.Text, isLastLblHTML);
9005						break
9006				}
9007
9008				if (p.bpmnTaskType != 0)
9009				{
9010					switch (p.bpmnTaskType)
9011					{
9012						case 1:
9013							var item1 = new mxCell('', new mxGeometry(0, 0, 19, 12), 'shape=message;');
9014							item1.geometry.offset = new mxPoint(4, 7);
9015							break;
9016						case 2:
9017							var item1 = new mxCell('', new mxGeometry(0, 0, 19, 12), 'shape=message;');
9018							item1.geometry.offset = new mxPoint(4, 7);
9019							break;
9020						case 3:
9021							var item1 = new mxCell('', new mxGeometry(0, 0, 15, 15), 'shape=mxgraph.bpmn.user_task;');
9022							item1.geometry.offset = new mxPoint(4, 5);
9023							break;
9024						case 4:
9025							var item1 = new mxCell('', new mxGeometry(0, 0, 15, 10), 'shape=mxgraph.bpmn.manual_task;');
9026							item1.geometry.offset = new mxPoint(4, 7);
9027							break;
9028						case 5:
9029							var item1 = new mxCell('', new mxGeometry(0, 0, 18, 13), 'shape=mxgraph.bpmn.business_rule_task;');
9030							item1.geometry.offset = new mxPoint(4, 7);
9031							break;
9032						case 6:
9033							var item1 = new mxCell('', new mxGeometry(0, 0, 15, 15), 'shape=mxgraph.bpmn.service_task;');
9034							item1.geometry.offset = new mxPoint(4, 5);
9035							break;
9036						case 7:
9037							var item1 = new mxCell('', new mxGeometry(0, 0, 15, 15), 'shape=mxgraph.bpmn.script_task;');
9038							item1.geometry.offset = new mxPoint(4, 5);
9039							break;
9040					}
9041
9042					if (p.bpmnTaskType == 1)
9043					{
9044						var sc = getFillColor(p, a);
9045						var fc = getStrokeColor(p, a);
9046
9047						fc = fc.replace('strokeColor', 'fillColor');
9048						sc = sc.replace('fillColor', 'strokeColor');
9049
9050						if (fc == '')
9051						{
9052							fc = 'fillColor=#000000;'
9053						}
9054
9055						if (sc == '')
9056						{
9057							sc = 'strokeColor=#ffffff;'
9058						}
9059
9060						item1.style += sc + fc + 'part=1;';
9061
9062					}
9063					else
9064					{
9065						item1.style += getFillColor(p, a) + getStrokeColor(p, a) + 'part=1;';
9066					}
9067
9068					item1.geometry.relative = true;
9069					item1.vertex = true;
9070					v.insert(item1);
9071				}
9072
9073				var numIcons = 0;
9074
9075				if (p.bpmnActivityMarker1 != 0)
9076				{
9077					numIcons++;
9078				}
9079
9080				if (p.bpmnActivityMarker2 != 0)
9081				{
9082					numIcons++;
9083				}
9084
9085				var iconX = 0;
9086				var iconY = h - 20;
9087
9088				if (numIcons == 1)
9089				{
9090					iconX = -7.5;
9091				}
9092				else if (numIcons == 2)
9093				{
9094					iconX = -19;
9095				}
9096
9097				if (p.bpmnActivityMarker1 != 0)
9098				{
9099					switch (p.bpmnActivityMarker1)
9100					{
9101						case 1:
9102							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 15), 'shape=plus;part=1;');
9103							item1.geometry.offset = new mxPoint(iconX, -20);
9104							item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9105							break;
9106						case 2:
9107							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 15), 'shape=mxgraph.bpmn.loop;part=1;');
9108							item1.geometry.offset = new mxPoint(iconX, -20);
9109							item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9110							break;
9111						case 3:
9112							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 15), 'shape=parallelMarker;part=1;');
9113							item1.geometry.offset = new mxPoint(iconX, -20);
9114							item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9115							break;
9116						case 4:
9117							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 15), 'shape=parallelMarker;direction=south;part=1;');
9118							item1.geometry.offset = new mxPoint(iconX, -20);
9119							item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9120							break;
9121						case 5:
9122							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 10), 'shape=mxgraph.bpmn.ad_hoc;strokeColor=none;flipH=1;part=1;');
9123							item1.geometry.offset = new mxPoint(iconX, -17);
9124							var fc = getStrokeColor(p, a);
9125							fc = fc.replace('strokeColor', 'fillColor');
9126
9127							if (fc == '')
9128							{
9129								fc = 'fillColor=#000000;'
9130							}
9131
9132							item1.style += fc;
9133							break;
9134						case 6:
9135							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 11), 'shape=mxgraph.bpmn.compensation;part=1;');
9136							item1.geometry.offset = new mxPoint(iconX, -18);
9137							item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9138							break;
9139					}
9140
9141					item1.geometry.relative = true;
9142					item1.vertex = true;
9143					v.insert(item1);
9144				}
9145
9146				if (numIcons == 2)
9147				{
9148					iconX = 5;
9149				}
9150
9151				if (p.bpmnActivityMarker2 != 0)
9152				{
9153					switch (p.bpmnActivityMarker2)
9154					{
9155						case 1:
9156							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 15), 'shape=plus;part=1;');
9157							item1.geometry.offset = new mxPoint(iconX, -20);
9158							item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9159							break;
9160						case 2:
9161							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 15), 'shape=mxgraph.bpmn.loop;part=1;');
9162							item1.geometry.offset = new mxPoint(iconX, -20);
9163							item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9164							break;
9165						case 3:
9166							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 15), 'shape=parallelMarker;part=1;');
9167							item1.geometry.offset = new mxPoint(iconX, -20);
9168							item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9169							break;
9170						case 4:
9171							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 15), 'shape=parallelMarker;direction=south;part=1;');
9172							item1.geometry.offset = new mxPoint(iconX, -20);
9173							item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9174							break;
9175						case 5:
9176							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 10), 'shape=mxgraph.bpmn.ad_hoc;strokeColor=none;flipH=1;part=1;');
9177							item1.geometry.offset = new mxPoint(iconX, -17);
9178							var fc = getStrokeColor(p, a);
9179							fc = fc.replace('strokeColor', 'fillColor');
9180
9181							if (fc == '')
9182							{
9183								fc = 'fillColor=#000000;'
9184							}
9185
9186							item1.style += fc;
9187							break;
9188						case 6:
9189							var item1 = new mxCell('', new mxGeometry(0.5, 1, 15, 11), 'shape=mxgraph.bpmn.compensation;part=1;');
9190							item1.geometry.offset = new mxPoint(iconX, -18);
9191							item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9192							break;
9193					}
9194
9195					item1.geometry.relative = true;
9196					item1.vertex = true;
9197					v.insert(item1);
9198				}
9199
9200				v.style += addAllStyles(v.style, p, a, v);
9201
9202				break;
9203
9204			case 'BPMNEvent' :
9205				v.style += 'shape=mxgraph.bpmn.shape;verticalLabelPosition=bottom;verticalAlign=top;';
9206
9207				v.value = convertText(p.Text);
9208
9209				if (p.bpmnDashed == true)
9210				{
9211					switch (p.bpmnEventGroup)
9212					{
9213						case 0:
9214							v.style += 'outline=eventNonint;';
9215							break;
9216						case 1:
9217							v.style += 'outline=boundNonint;';
9218							break;
9219						case 2:
9220							v.style += 'outline=end;';
9221							break;
9222					}
9223				}
9224				else
9225				{
9226					switch (p.bpmnEventGroup)
9227					{
9228						case 0:
9229							v.style += 'outline=standard;';
9230							break;
9231						case 1:
9232							v.style += 'outline=throwing;';
9233							break;
9234						case 2:
9235							v.style += 'outline=end;';
9236							break;
9237					}
9238				}
9239
9240				switch(p.bpmnEventType)
9241				{
9242					case 1:
9243						v.style += 'symbol=message;';
9244						break;
9245					case 2:
9246						v.style += 'symbol=timer;';
9247						break;
9248					case 3:
9249						v.style += 'symbol=escalation;';
9250						break;
9251					case 4:
9252						v.style += 'symbol=conditional;';
9253						break;
9254					case 5:
9255						v.style += 'symbol=link;';
9256						break;
9257					case 6:
9258						v.style += 'symbol=error;';
9259						break;
9260					case 7:
9261						v.style += 'symbol=cancel;';
9262						break;
9263					case 8:
9264						v.style += 'symbol=compensation;';
9265						break;
9266					case 9:
9267						v.style += 'symbol=signal;';
9268						break;
9269					case 10:
9270						v.style += 'symbol=multiple;';
9271						break;
9272					case 11:
9273						v.style += 'symbol=parallelMultiple;';
9274						break;
9275					case 12:
9276						v.style += 'symbol=terminate;';
9277						break;
9278
9279				}
9280
9281				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9282
9283				break;
9284			case 'BPMNChoreography' :
9285				try
9286				{
9287					var st = getColor(p.FillColor);
9288					var darkerClr = getDarkerClr(st, 0.75);
9289
9290					var fz = getFontSize(p.Name).match(/\d+/);
9291					var th = Math.max(mxUtils.getSizeForString(p.Name.t, fz? fz[0] : defaultFontSize, null, w - 10).height, 24);
9292					st = 'swimlaneFillColor=' + darkerClr + ';'
9293
9294					v.value = convertText(p.Name);
9295					v.style += 'swimlane;childLayout=stackLayout;horizontal=1;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;' + st +
9296						'startSize=' + th + ';spacingLeft=3;spacingRight=3;fontStyle=0;' +
9297						getLabelStyle(p.Name, isLastLblHTML);
9298					v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9299
9300					var curY = th;
9301					var fz = getFontSize(p.TaskName).match(/\d+/);
9302					var curH = p.TaskHeight? p.TaskHeight * scale : Math.max(mxUtils.getSizeForString(p.TaskName.t, fz? fz[0] : defaultFontSize, null, w - 10).height + 15, 24);
9303					var task = new mxCell('', new mxGeometry(0, curY, w, curH), 'part=1;html=1;resizeHeight=0;spacingTop=-1;spacingLeft=3;spacingRight=3;');
9304					task.value = convertText(p.TaskName);
9305					task.vertex = true;
9306					v.insert(task);
9307					task.style += getLabelStyle(p.TaskName, isLastLblHTML);
9308					task.style += addAllStyles(task.style, p, a, task, isLastLblHTML);
9309					curY += curH;
9310
9311					var item = [];
9312
9313					for (var i = 0; i < p.Fields; i++)
9314					{
9315						var pTxt = p['Participant' + (i + 1)];
9316						var fz = getFontSize(pTxt).match(/\d+/);
9317						var curH =  Math.max(mxUtils.getSizeForString(pTxt.t, fz? fz[0] : defaultFontSize, null, w - 10).height, 24);
9318						item[i] = new mxCell('', new mxGeometry(0, curY, w, curH), 'part=1;html=1;resizeHeight=0;fillColor=none;spacingTop=-1;spacingLeft=3;spacingRight=3;');
9319						curY += curH;
9320						item[i].vertex = true;
9321						v.insert(item[i]);
9322						item[i].style += getLabelStyle(pTxt, isLastLblHTML);
9323						item[i].style += addAllStyles(item[i].style, p, a, item[i], isLastLblHTML);
9324						item[i].value = convertText(pTxt);
9325					}
9326	/*
9327	TODO: Add support for the following
9328					"bpmnChoreographyType": 0, //Plus sign
9329	                "initiatingMessage": 0, //Envelop before
9330	                "responseMessage": 0, //Envelop after
9331	*/
9332				}
9333				catch(e)
9334				{
9335					//Ignore
9336					console.log(e);
9337				}
9338				break;
9339			case 'BPMNConversation' :
9340				v.style += 'shape=hexagon;perimeter=hexagonPerimeter2;';
9341
9342				v.value = convertText(p.Text);
9343
9344				if (p.bpmnConversationType == 0)
9345				{
9346					v.style += getStrokeWidth(p);
9347				}
9348				else
9349				{
9350					v.style += 'strokeWidth=2;';
9351				}
9352
9353				if (p.bpmnIsSubConversation)
9354				{
9355					var item1 = new mxCell('', new mxGeometry(0.5, 1, 12, 12), 'shape=plus;part=1;');
9356					item1.geometry.offset = new mxPoint(-6, -17);
9357					item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9358					item1.geometry.relative = true;
9359					item1.vertex = true;
9360					v.insert(item1);
9361				}
9362
9363				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9364
9365				break;
9366			case 'BPMNGateway' :
9367				v.style += 'shape=mxgraph.bpmn.shape;perimeter=rhombusPerimeter;background=gateway;verticalLabelPosition=bottom;verticalAlign=top;';
9368
9369				switch (p.bpmnGatewayType)
9370				{
9371					case 0:
9372						v.style += 'outline=none;symbol=general;';
9373						break;
9374					case 1:
9375						v.style += 'outline=none;symbol=exclusiveGw;';
9376						break;
9377					case 2:
9378						v.style += 'outline=catching;symbol=multiple;';
9379						break;
9380					case 3:
9381						v.style += 'outline=none;symbol=parallelGw;';
9382						break;
9383					case 4:
9384						v.style += 'outline=end;symbol=general;';
9385						break;
9386					case 5:
9387						v.style += 'outline=standard;symbol=multiple;';
9388						break;
9389					case 6:
9390						v.style += 'outline=none;symbol=complexGw;';
9391						break;
9392					case 7:
9393						v.style += 'outline=standard;symbol=parallelMultiple;';
9394						break;
9395				}
9396
9397				v.style += addAllStyles(v.style, p, a, v);
9398				v.value = convertText(p.Text);
9399				v.style += getLabelStyle(p, isLastLblHTML);
9400				break;
9401			case 'BPMNData' :
9402				v.style += 'shape=note;size=14;';
9403
9404				switch (p.bpmnDataType)
9405				{
9406					case 0:
9407						v.value = convertText(p.Text);
9408
9409						if (p.Text && !p.Text.t)
9410						{
9411							p.Text.t = ' '; //Such that Title is catched and added later!
9412						}
9413						break;
9414					case 1:
9415						var item1 = new mxCell('', new mxGeometry(0.5, 1, 12, 10), 'shape=parallelMarker;part=1;');
9416						item1.geometry.offset = new mxPoint(-6, -15);
9417						item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9418						item1.geometry.relative = true;
9419						item1.vertex = true;
9420						v.insert(item1);
9421						break;
9422					case 2:
9423						var item1 = new mxCell('', new mxGeometry(0, 0, 12, 10), 'shape=singleArrow;part=1;arrowWidth=0.4;arrowSize=0.4;');
9424						item1.geometry.offset = new mxPoint(3, 3);
9425						item1.style += getFillColor(p, a) + getStrokeColor(p, a);
9426						item1.geometry.relative = true;
9427						item1.vertex = true;
9428						v.insert(item1);
9429						v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
9430
9431						var text1 = new mxCell('', new mxGeometry(0, 0, w, 20), 'strokeColor=none;fillColor=none;');
9432						text1.geometry.offset = new mxPoint(0, 14);
9433						text1.geometry.relative = true;
9434						text1.vertex = true;
9435						v.insert(text1);
9436						text1.value = convertText(p.Text);
9437						text1.style += getLabelStyle(p, isLastLblHTML);
9438						break;
9439					case 3:
9440						var item1 = new mxCell('', new mxGeometry(0, 0, 12, 10), 'shape=singleArrow;part=1;arrowWidth=0.4;arrowSize=0.4;');
9441						item1.geometry.offset = new mxPoint(3, 3);
9442						item1.style += getStrokeColor(p, a);
9443						item1.geometry.relative = true;
9444						item1.vertex = true;
9445						v.insert(item1);
9446
9447						var fc = getStrokeColor(p, a);
9448						fc = fc.replace('strokeColor', 'fillColor');
9449
9450						if (fc == '')
9451						{
9452							fc = 'fillColor=#000000;'
9453						}
9454
9455						item1.style += fc;
9456
9457						var text1 = new mxCell('', new mxGeometry(0, 0, w, 20), 'strokeColor=none;fillColor=none;');
9458						text1.geometry.offset = new mxPoint(0, 14);
9459						text1.geometry.relative = true;
9460						text1.vertex = true;
9461						v.insert(text1);
9462						text1.value = convertText(p.Text);
9463						text1.style += getLabelStyle(p, isLastLblHTML);
9464						break;
9465				}
9466
9467				v.style += addAllStyles(v.style, p, a, v);
9468
9469				break;
9470			case 'BPMNBlackPool' :
9471				v.value = convertText(p.Text);
9472				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9473
9474				var item1 = new mxCell('', new mxGeometry(0, 0, w, h), 'fillColor=#000000;strokeColor=none;opacity=30;');
9475				item1.vertex = true;
9476				v.insert(item1);
9477
9478				break;
9479
9480			case 'DFDExternalEntityBlock' :
9481
9482				v.style += 'strokeColor=none;fillColor=none;';
9483				v.style += addAllStyles(v.style, p, a, v);
9484
9485				var item1 = new mxCell('', new mxGeometry(0, 0, w * 0.95, h * 0.95), 'part=1;');
9486				item1.vertex = true;
9487				v.insert(item1);
9488
9489				item1.style += addAllStyles(item1.style, p, a, item1);
9490
9491				var item2 = new mxCell('', new mxGeometry(w * 0.05, h * 0.05, w * 0.95, h * 0.95), 'part=1;');
9492				item2.vertex = true;
9493				v.insert(item2);
9494				item2.value = convertText(p.Text);
9495				item2.style +=
9496					getLabelStyle(p.Text, isLastLblHTML);
9497				item2.style += addAllStyles(item2.style, p, a, item2, isLastLblHTML);
9498
9499				break;
9500
9501			case 'GSDFDDataStoreBlock' :
9502				v.value = convertText(p.Text);
9503				v.style += 'shape=partialRectangle;right=0;' +
9504					getLabelStyle(p.Text, isLastLblHTML);
9505				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9506
9507				var item1 = new mxCell('', new mxGeometry(0, 0, w * 0.2, h), 'part=1;');
9508				item1.vertex = true;
9509				v.insert(item1);
9510
9511				item1.value = convertText(p.Number);
9512				item1.style +=
9513					getLabelStyle(p.Number, isLastLblHTML);
9514				item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
9515
9516				break;
9517			case 'OrgBlock' :
9518				var lbls = '';
9519
9520				for (var key in p.Active)
9521				{
9522					if (key == 'Photo' || !p.Active[key]) continue;
9523
9524					lbls += convertText(p[key], true);
9525				}
9526
9527				if (p.Active.Photo)
9528				{
9529					var imgSize = w * 0.4;
9530					v.style += 'spacingLeft=' + imgSize + ';imageWidth=' + (imgSize - 4) + ';imageHeight=' + (imgSize - 4) +
9531						';imageAlign=left;imageVerticalAlign=top;image=' + mapImgUrl(p.Photo);
9532				}
9533
9534				v.value = lbls;
9535				v.style += addAllStyles(v.style, p, a, v, true);
9536
9537				break;
9538			case 'DefaultTableBlock' :
9539				try
9540				{
9541					var rowsNum = p.RowHeights.length;
9542					var colsNum = p.ColWidths.length;
9543					var rowHs = [], colWs = [];
9544
9545					for (var i = 0; i < rowsNum; i++)
9546					{
9547						rowHs[i] = p.RowHeights[i] * scale;
9548					}
9549
9550					for (var j = 0; j < colsNum; j++)
9551					{
9552						colWs[j] = p.ColWidths[j] * scale;
9553					}
9554
9555					//TODO Apply table layout when it's ready
9556					v.style = 'group;dropTarget=0;';
9557
9558					var bandedClr1 = p['BandedColor1'];
9559					var bandedClr2 = p['BandedColor2'];
9560					var bandedRows = p['BandedRows'];
9561					var bandedCols = p['BandedCols'];
9562					var hideH = p['HideH'];
9563					var hideV = p['HideV'];
9564					var tblVAlign = p['TextVAlign'];
9565					var tblFillClr = p['FillColor'];
9566					var tblStrokeStyle = p['StrokeStyle'];
9567					delete p['StrokeStyle'];
9568					var tblFillOp = getOpacity2(tblFillClr, 'fillOpacity');
9569					var tblLnClr = p['LineColor'];
9570					var tblLnOp = getOpacity2(tblLnClr, 'strokeOpacity');
9571					var y = 0;
9572					var skipCells = {};
9573
9574					for (var i = 0; i < rowsNum; i++)
9575					{
9576						var x = 0;
9577						var h = rowHs[i];
9578
9579						for (var j = 0; j < colsNum; j++)
9580						{
9581							var cellIndex = i + ',' + j;
9582
9583							if (skipCells[cellIndex])
9584							{
9585								x += colWs[j];
9586								continue;
9587							}
9588
9589							var fillClr = p['CellFill_' + cellIndex];
9590							var noBand = p['NoBand_' + cellIndex];
9591							var spans = p['CellSize_' + cellIndex];
9592							var cellLbl = p['Cell_' + cellIndex];
9593							var vAlign = p['Cell_' + cellIndex + '_VAlign'];
9594							var txtRot = p['Cell_' + cellIndex + '_TRotation'];
9595							var borderWH = p['CellBorderWidthH_' + cellIndex];
9596							var borderClrH = p['CellBorderColorH_' + cellIndex];
9597							var borderStyleH = p['CellBorderStrokeStyleH_' + cellIndex];
9598							var borderWV = p['CellBorderWidthV_' + cellIndex];
9599							var borderClrV = p['CellBorderColorV_' + cellIndex];
9600							var borderStyleV = p['CellBorderStrokeStyleV_' + cellIndex];
9601							var borderClr = hideH? borderClrV : borderClrH; //TODO Border color, width & opacity in more complex especially with different border color for horizontal and vertical
9602							var lnOp = getOpacity2(borderClr, 'strokeOpacity');
9603							var borderW = hideH? borderWV : borderWH;
9604							var borderStyle = hideH? borderStyleV : borderStyleH;
9605
9606							fillClr = bandedRows && !noBand? (i % 2 == 0? bandedClr1: (bandedCols && !noBand?
9607									(j % 2 == 0? bandedClr1 : bandedClr2) : bandedClr2)) : (bandedCols && !noBand?
9608									(j % 2 == 0? bandedClr1 : bandedClr2) : fillClr);
9609							var fillOp = getOpacity2(fillClr, 'fillOpacity') || tblFillOp;
9610
9611							var w = colWs[j];
9612							var ch = h;
9613							var cw = w;
9614
9615							//Spans
9616							for (var k = i + 1; k < i + spans.h; k++)
9617							{
9618								if (rowHs[k] == null) continue;
9619
9620								ch += rowHs[k];
9621								skipCells[k + ',' + j] = true;
9622
9623								for (var l = j + 1; l < j + spans.w; l++)
9624								{
9625									skipCells[k + ',' + l] = true;
9626								}
9627							}
9628
9629							for (var k = j + 1; k < j + spans.w; k++)
9630							{
9631								if (colWs[k] == null) continue;
9632
9633								cw += colWs[k];
9634								skipCells[i + ',' + k] = true;
9635
9636								for (var l = i + 1; l < i + spans.h; l++)
9637								{
9638									skipCells[l + ',' + k] = true;
9639								}
9640							}
9641
9642							var cell = new mxCell('', new mxGeometry(x, y, cw, ch), 'shape=partialRectangle;html=1;whiteSpace=wrap;connectable=0;'
9643									+ (hideV? 'left=0;right=0;' : '') + (hideH? 'top=0;bottom=0;' : '')
9644									+ getFillColor({FillColor: fillClr || tblFillClr})
9645									+ createStyle(mxConstants.STYLE_STROKECOLOR, getColor(borderClr), getColor(tblLnClr))
9646									+ (borderW != null ? createStyle(mxConstants.STYLE_STROKEWIDTH, Math.round(parseFloat(borderW) * scale), '1') : '')
9647									+ (lnOp? lnOp : tblLnOp)
9648									+ fillOp
9649									+ 'verticalAlign=' + (vAlign? vAlign : (tblVAlign? tblVAlign : 'middle')) + ';'
9650									+ getStrokeStyle({StrokeStyle : borderStyle? borderStyle : (tblStrokeStyle? tblStrokeStyle : 'solid')})
9651									+ (txtRot? 'horizontal=0;' : ''));
9652
9653							cell.vertex = true;
9654							cell.value = convertText(cellLbl);
9655							cell.style +=
9656								addAllStyles(cell.style, p, a, cell, isLastLblHTML) +
9657							  (isLastLblHTML? 'fontSize=' + defaultFontSize + ';' :
9658								getFontSize(cellLbl) +
9659								getFontColor(cellLbl) +
9660								getFontStyle(cellLbl) +
9661								getTextAlignment(cellLbl, cell) +
9662								getTextLeftSpacing(cellLbl) +
9663								getTextRightSpacing(cellLbl) +
9664								getTextTopSpacing(cellLbl) +
9665								getTextBottomSpacing(cellLbl)
9666							  ) +
9667								getTextGlobalSpacing(cellLbl) +
9668								getTextVerticalAlignment(cellLbl);
9669							v.insert(cell);
9670							x += w;
9671						}
9672
9673						y += h;
9674					}
9675				}
9676				catch(e)
9677				{
9678					console.log(e);
9679				}
9680				break;
9681			case 'VSMDedicatedProcessBlock' :
9682			case 'VSMProductionControlBlock' :
9683				v.style += 'shape=mxgraph.lean_mapping.manufacturing_process;spacingTop=15;';
9684
9685				if (obj.Class == 'VSMDedicatedProcessBlock')
9686				{
9687					v.value = convertText(p.Text);
9688				}
9689				else if (obj.Class == 'VSMProductionControlBlock')
9690				{
9691					v.value = convertText(p.Resources);
9692				}
9693
9694				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9695
9696				if (obj.Class == 'VSMDedicatedProcessBlock')
9697				{
9698					var item1 = new mxCell('', new mxGeometry(0, 1, 11, 9), 'part=1;shape=mxgraph.lean_mapping.operator;');
9699					item1.geometry.relative = true;
9700					item1.geometry.offset = new mxPoint(4, -13);
9701					item1.vertex = true;
9702					v.insert(item1);
9703
9704					item1.style += addAllStyles(item1.style, p, a, item1);
9705				}
9706
9707				var text1 = new mxCell('', new mxGeometry(0, 0, w, 15), 'strokeColor=none;fillColor=none;part=1;');
9708				text1.vertex = true;
9709				v.insert(text1);
9710				text1.value = convertText(p.Title);
9711				text1.style += getLabelStyle(p.Title, isLastLblHTML);
9712				p.Text = null;
9713				break;
9714
9715			case 'VSMSharedProcessBlock' :
9716				v.style += 'shape=mxgraph.lean_mapping.manufacturing_process_shared;spacingTop=-5;verticalAlign=top;';
9717
9718				v.value = convertText(p.Text);
9719				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9720
9721				var text1 = new mxCell('', new mxGeometry(w * 0.1, h * 0.3, w * 0.8, h * 0.6), 'part=1;');
9722				text1.vertex = true;
9723				v.insert(text1);
9724				text1.value = convertText(p.Resource);
9725				text1.style +=
9726					getLabelStyle(p.Resource, isLastLblHTML);
9727				text1.style += addAllStyles(text1.style, p, a, text1, isLastLblHTML);
9728
9729				break;
9730
9731			case 'VSMWorkcellBlock' :
9732				v.style += 'shape=mxgraph.lean_mapping.work_cell;verticalAlign=top;spacingTop=-2;';
9733				v.value = convertText(p.Text);
9734				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9735
9736				break;
9737			case 'VSMSafetyBufferStockBlock' :
9738			case 'VSMDatacellBlock' :
9739				v.style += 'strokeColor=none;fillColor=none;';
9740				v.style += addAllStyles(v.style, p, a, v);
9741
9742				var itemFullH = h;
9743
9744				var numItems = parseInt(p.Cells);
9745
9746				var st = addAllStyles('part=1;', p, a, v);
9747
9748				if (numItems > 0)
9749				{
9750					itemFullH = itemFullH / numItems;
9751				}
9752
9753				var item = new Array();
9754				var line = new Array();
9755
9756				for (var i = 1; i <= numItems; i++)
9757				{
9758					item[i] = new mxCell('', new mxGeometry(0, (i - 1) * itemFullH, w, itemFullH), st);
9759					item[i].vertex = true;
9760					v.insert(item[i]);
9761					item[i].value = convertText(p["cell_" + i]);
9762					item[i].style += getLabelStyle(p["cell_" + i], isLastLblHTML);
9763				}
9764
9765				break;
9766			case 'VSMInventoryBlock' :
9767				v.style += 'shape=mxgraph.lean_mapping.inventory_box;verticalLabelPosition=bottom;verticalAlign=top;';
9768				v.value = convertText(p.Text);
9769				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9770
9771				break;
9772			case 'VSMSupermarketBlock' :
9773				v.style += 'strokeColor=none;';
9774				v.style += addAllStyles(v.style, p, a, v);
9775
9776				var itemFullH = h;
9777
9778				var numItems = parseInt(p.Cells);
9779
9780				var st = addAllStyles('part=1;fillColor=none;', p, a, v);
9781
9782				if (numItems > 0)
9783				{
9784					itemFullH = itemFullH / numItems;
9785				}
9786
9787				var item = new Array();
9788				var text = new Array();
9789
9790				for (var i = 1; i <= numItems; i++)
9791				{
9792					item[i] = new mxCell('', new mxGeometry(w * 0.5, (i - 1) * itemFullH, w * 0.5, itemFullH), 'shape=partialRectangle;left=0;' + st);
9793					item[i].vertex = true;
9794					v.insert(item[i]);
9795
9796					text[i] = new mxCell('', new mxGeometry(0, (i - 1) * itemFullH, w, itemFullH), 'strokeColor=none;fillColor=none;part=1;');
9797					text[i].vertex = true;
9798					v.insert(text[i]);
9799					text[i].value = convertText(p["cell_" + i]);
9800					text[i].style += getLabelStyle(p["cell_" + i], isLastLblHTML);
9801				}
9802
9803				break;
9804			case 'VSMFIFOLaneBlock' :
9805				v.style += 'shape=mxgraph.lean_mapping.fifo_sequence_flow;fontStyle=0;fontSize=18';
9806				v.style += addAllStyles(v.style, p, a, v);
9807				v.value = 'FIFO';
9808				break;
9809			case 'VSMGoSeeProductionBlock' :
9810				v.style += 'shape=ellipse;perimeter=ellipsePerimeter;';
9811				v.value = convertText(p.Text);
9812				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9813
9814				var item1 = new mxCell('', new mxGeometry(w * 0.17, h * 0.2, 13, 6), 'shape=mxgraph.lean_mapping.go_see_production_scheduling;flipH=1;part=1;whiteSpace=wrap;html=1;');
9815				item1.vertex = true;
9816				v.insert(item1);
9817				item1.style += addAllStyles(item1.style, p, a, item1);
9818
9819				break;
9820			case 'VSMProductionKanbanBatchBlock' :
9821				v.style += 'strokeColor=none;fillColor=none;'
9822
9823				var st = 'shape=card;size=18;flipH=1;part=1;';
9824
9825				var item1 = new mxCell('', new mxGeometry(w * 0.1, 0, w * 0.9, h * 0.8), 'shape=mxgraph.lean_mapping.go_see_production_scheduling;flipH=1;part=1;' + st);
9826				item1.vertex = true;
9827				v.insert(item1);
9828				item1.style += addAllStyles(item1.style, p, a, item1);
9829
9830				var item2 = new mxCell('', new mxGeometry(w * 0.05, h * 0.1, w * 0.9, h * 0.8), 'shape=mxgraph.lean_mapping.go_see_production_scheduling;flipH=1;part=1;' + st);
9831				item2.vertex = true;
9832				v.insert(item2);
9833				item2.style += addAllStyles(item2.style, p, a, item2);
9834
9835				var item3 = new mxCell('', new mxGeometry(0, h * 0.2, w * 0.9, h * 0.8), 'shape=mxgraph.lean_mapping.go_see_production_scheduling;flipH=1;part=1;whiteSpace=wrap;html=1;spacing=2;' + st);
9836				item3.vertex = true;
9837				v.insert(item3);
9838				item3.value = convertText(p.Text);
9839				item3.style += addAllStyles(item3.style, p, a, item3, isLastLblHTML);
9840
9841				break;
9842			case 'VSMElectronicInformationArrow' :
9843				v.style = 'group;';
9844				v.value = convertText(p.Title);
9845				v.style += getLabelStyle(p.Title, isLastLblHTML);
9846				var edge = new mxCell('', new mxGeometry(0, 0, w, h), 'shape=mxgraph.lean_mapping.electronic_info_flow_edge;html=1;entryX=0;entryY=1;exitX=1;exitY=0;');
9847				edge.edge = true;
9848				edge.geometry.relative = 1;
9849				graph.addCell(edge, v, null, v, v);
9850				break;
9851			case 'AWSRoundedRectangleContainerBlock2' :
9852				v.style += 'strokeColor=none;fillColor=none;';
9853
9854				if (p.Spotfleet)
9855				{
9856					var item1 = new mxCell('', new mxGeometry(0, 0, w, h - 20), 'resizeWidth=1;resizeHeight=1;fillColor=none;align=center;verticalAlign=bottom;spacing=2;rounded=1;arcSize=10;');
9857					item1.geometry.offset = new mxPoint(0, 20);
9858					item1.geometry.relative = true;
9859					item1.vertex = true;
9860					v.insert(item1);
9861					item1.value = convertText(p.Title);
9862					item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
9863
9864					var item2 = new mxCell('', new mxGeometry(0, 0, 35, 40), 'strokeColor=none;shape=mxgraph.aws3.spot_instance;fillColor=#f58536;');
9865					item2.geometry.relative = true;
9866					item2.geometry.offset = new mxPoint(30, 0);
9867					item2.vertex = true;
9868					v.insert(item2);
9869				}
9870				else if (p.Beanstalk)
9871				{
9872					var item1 = new mxCell('', new mxGeometry(0, 0, w, h - 20), 'resizeWidth=1;resizeHeight=1;fillColor=none;align=center;verticalAlign=bottom;spacing=2;rounded=1;arcSize=10;');
9873					item1.geometry.offset = new mxPoint(0, 20);
9874					item1.geometry.relative = true;
9875					item1.vertex = true;
9876					v.insert(item1);
9877					item1.value = convertText(p.Title);
9878					item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
9879
9880					var item2 = new mxCell('', new mxGeometry(0, 0, 30, 40), 'strokeColor=none;shape=mxgraph.aws3.elastic_beanstalk;fillColor=#759C3E;');
9881					item2.geometry.relative = true;
9882					item2.geometry.offset = new mxPoint(30, 0);
9883					item2.vertex = true;
9884					v.insert(item2);
9885				}
9886				else if (p.EC2)
9887				{
9888					var item1 = new mxCell('', new mxGeometry(0, 0, w, h - 20), 'resizeWidth=1;resizeHeight=1;fillColor=none;align=center;verticalAlign=bottom;spacing=2;rounded=1;arcSize=10;');
9889					item1.geometry.offset = new mxPoint(0, 20);
9890					item1.geometry.relative = true;
9891					item1.vertex = true;
9892					v.insert(item1);
9893					item1.value = convertText(p.Title);
9894					item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
9895
9896					var item2 = new mxCell('', new mxGeometry(0, 0, 32, 40), 'strokeColor=none;shape=mxgraph.aws3.ec2;fillColor=#F58534;');
9897					item2.geometry.relative = true;
9898					item2.geometry.offset = new mxPoint(30, 0);
9899					item2.vertex = true;
9900					v.insert(item2);
9901				}
9902				else if (p.Subnet)
9903				{
9904					var item1 = new mxCell('', new mxGeometry(0, 0, w, h - 20), 'resizeWidth=1;resizeHeight=1;fillColor=none;align=center;verticalAlign=bottom;spacing=2;rounded=1;arcSize=10;');
9905					item1.geometry.offset = new mxPoint(0, 20);
9906					item1.geometry.relative = true;
9907					item1.vertex = true;
9908					v.insert(item1);
9909					item1.value = convertText(p.Title);
9910					item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
9911
9912					var item2 = new mxCell('', new mxGeometry(0, 0, 32, 40), 'strokeColor=none;shape=mxgraph.aws3.permissions;fillColor=#146EB4;');
9913					item2.geometry.relative = true;
9914					item2.geometry.offset = new mxPoint(30, 0);
9915					item2.vertex = true;
9916					v.insert(item2);
9917				}
9918				else if (p.VPC)
9919				{
9920					var item1 = new mxCell('', new mxGeometry(0, 0, w, h - 20), 'resizeWidth=1;resizeHeight=1;fillColor=none;align=center;verticalAlign=bottom;spacing=2;rounded=1;arcSize=10;');
9921					item1.geometry.offset = new mxPoint(0, 20);
9922					item1.geometry.relative = true;
9923					item1.vertex = true;
9924					v.insert(item1);
9925					item1.value = convertText(p.Title);
9926					item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
9927
9928					var item2 = new mxCell('', new mxGeometry(0, 0, 60, 40), 'strokeColor=none;shape=mxgraph.aws3.virtual_private_cloud;fillColor=#146EB4;');
9929					item2.geometry.relative = true;
9930					item2.geometry.offset = new mxPoint(30, 0);
9931					item2.vertex = true;
9932					v.insert(item2);
9933				}
9934				else if (p.AWS)
9935				{
9936					var item1 = new mxCell('', new mxGeometry(0, 0, w, h - 20), 'resizeWidth=1;resizeHeight=1;fillColor=none;align=center;verticalAlign=bottom;spacing=2;rounded=1;arcSize=10;');
9937					item1.geometry.offset = new mxPoint(0, 20);
9938					item1.geometry.relative = true;
9939					item1.vertex = true;
9940					v.insert(item1);
9941					item1.value = convertText(p.Title);
9942					item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
9943
9944					var item2 = new mxCell('', new mxGeometry(0, 0, 60, 40), 'strokeColor=none;shape=mxgraph.aws3.cloud;fillColor=#F58534;');
9945					item2.geometry.relative = true;
9946					item2.geometry.offset = new mxPoint(30, 0);
9947					item2.vertex = true;
9948					v.insert(item2);
9949				}
9950				else if (p.Corporate)
9951				{
9952					var item1 = new mxCell('', new mxGeometry(0, 0, w, h - 20), 'resizeWidth=1;resizeHeight=1;fillColor=none;align=center;verticalAlign=bottom;spacing=2;rounded=1;arcSize=10;');
9953					item1.geometry.offset = new mxPoint(0, 20);
9954					item1.geometry.relative = true;
9955					item1.vertex = true;
9956					v.insert(item1);
9957					item1.value = convertText(p.Title);
9958					item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
9959
9960					var item2 = new mxCell('', new mxGeometry(0, 0, 25, 40), 'strokeColor=none;shape=mxgraph.aws3.corporate_data_center;fillColor=#7D7C7C;');
9961					item2.geometry.relative = true;
9962					item2.geometry.offset = new mxPoint(30, 0);
9963					item2.vertex = true;
9964					v.insert(item2);
9965				}
9966				else
9967				{
9968					v.style = 'resizeWidth=1;resizeHeight=1;fillColor=none;align=center;verticalAlign=bottom;spacing=2;rounded=1;arcSize=10;';
9969					v.value = convertText(p.Title);
9970					v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9971				}
9972
9973				break;
9974			case 'AWSElasticComputeCloudBlock2' :
9975				v.style += 'strokeColor=none;shape=mxgraph.aws3.ec2;verticalLabelPosition=bottom;align=center;verticalAlign=top;';
9976				v.value = convertText(p.Title);
9977				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9978
9979				break;
9980
9981			case 'AWSRoute53Block2' :
9982				v.style += 'strokeColor=none;shape=mxgraph.aws3.route_53;verticalLabelPosition=bottom;align=center;verticalAlign=top;';
9983				v.value = convertText(p.Title);
9984				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9985
9986				break;
9987
9988			case 'AWSRDBSBlock2' :
9989				v.style += 'strokeColor=none;shape=mxgraph.aws3.rds;verticalLabelPosition=bottom;align=center;verticalAlign=top;';
9990				v.value = convertText(p.Title);
9991				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
9992
9993				break;
9994
9995			case 'NET_RingNetwork' :
9996				v.style += 'strokeColor=none;fillColor=none;';
9997
9998			   	var cell = new mxCell('', new mxGeometry(w * 0.25, h * 0.25, w * 0.5, h * 0.5), 'ellipse;html=1;strokeColor=#29AAE1;strokeWidth=2;');
9999			   	cell.vertex = true;
10000			   	v.insert(cell);
10001			   	var cells = [cell];
10002			   	cell.style += getFillColor(p, a);
10003
10004			   	var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=none;rounded=0;endArrow=none;dashed=0;html=1;strokeColor=#29AAE1;strokeWidth=2;');
10005			   	edge.geometry.relative = true;
10006		    	edge.edge = true;
10007
10008		    	addRouterEdge(w * 0.5, 0, edge, select, graph, cells, v, cell);
10009		    	addRouterEdge(w * 0.855, h * 0.145, edge, select, graph, cells, v, cell);
10010		    	addRouterEdge(w, h * 0.5, edge, select, graph, cells, v, cell);
10011		    	addRouterEdge(w * 0.855, h * 0.855, edge, select, graph, cells, v, cell);
10012		    	addRouterEdge(w * 0.5, h, edge, select, graph, cells, v, cell);
10013		    	addRouterEdge(w * 0.145, h * 0.855, edge, select, graph, cells, v, cell);
10014		    	addRouterEdge(0, h * 0.5, edge, select, graph, cells, v, cell);
10015		    	addRouterEdge(w * 0.145, h * 0.145, edge, select, graph, cells, v, cell);
10016				break;
10017
10018			case 'NET_Ethernet' :
10019				v.style += 'strokeColor=none;fillColor=none;';
10020
10021			   	var cell = new mxCell('', new mxGeometry(0, h * 0.5 - 10, w, 20), 'shape=mxgraph.networks.bus;gradientColor=none;gradientDirection=north;fontColor=#ffffff;perimeter=backbonePerimeter;backboneSize=20;fillColor=#29AAE1;strokeColor=#29AAE1;');
10022			   	cell.vertex = true;
10023			   	v.insert(cell);
10024			   	var cells = [cell];
10025
10026				var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'strokeColor=#29AAE1;edgeStyle=none;rounded=0;endArrow=none;html=1;strokeWidth=2;');
10027				edge.geometry.relative = true;
10028				edge.edge = true;
10029
10030			   	var cells = [cell];
10031		    	var stepX = w / p.NumTopNodes;
10032
10033			   	for (var i = 0; i < p.NumTopNodes; i++)
10034			   	{
10035			   		addRouterEdge(stepX * 0.5 + i * stepX, 0, edge, select, graph, cells, v, cell);
10036			   	}
10037
10038		    	stepX = w / p.NumBottomNodes;
10039
10040			   	for (var i = 0; i < p.NumBottomNodes; i++)
10041			   	{
10042			   		addRouterEdge(stepX * 0.5 + i * stepX, h, edge, select, graph, cells, v, cell);
10043			   	}
10044
10045				break;
10046
10047			case 'EE_OpAmp' :
10048				v.style += 'shape=mxgraph.electrical.abstract.operational_amp_1;';
10049				v.value = convertText(p.Title);
10050				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10051
10052				if (p.ToggleCharge)
10053				{
10054					v.style += 'flipV=1;';
10055				}
10056
10057				break;
10058
10059			case 'EIMessageChannelBlock' :
10060			case 'EIDatatypeChannelBlock' :
10061			case 'EIInvalidMessageChannelBlock' :
10062			case 'EIDeadLetterChannelBlock' :
10063			case 'EIGuaranteedDeliveryBlock' :
10064				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10065				v.value = convertText(p.Text);
10066				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10067
10068				if (obj.Class == 'EIMessageChannelBlock')
10069				{
10070					var item1 = new mxCell('', new mxGeometry(0.5, 0.5, w * 0.9, 20), 'shape=mxgraph.eip.messageChannel;fillColor=#818181;part=1;');
10071					item1.geometry.offset = new mxPoint( - w * 0.45, 0);
10072				}
10073				else if (obj.Class == 'EIDatatypeChannelBlock')
10074				{
10075					var item1 = new mxCell('', new mxGeometry(0.5, 0.5, w * 0.9, 20), 'shape=mxgraph.eip.dataChannel;fillColor=#818181;part=1;');
10076					item1.geometry.offset = new mxPoint( - w * 0.45, 0);
10077				}
10078				else if (obj.Class == 'EIInvalidMessageChannelBlock')
10079				{
10080					var item1 = new mxCell('', new mxGeometry(0.5, 0.5, w * 0.9, 20), 'shape=mxgraph.eip.invalidMessageChannel;fillColor=#818181;part=1;');
10081					item1.geometry.offset = new mxPoint( - w * 0.45, 0);
10082				}
10083				else if (obj.Class == 'EIDeadLetterChannelBlock')
10084				{
10085					var item1 = new mxCell('', new mxGeometry(0.5, 0.5, w * 0.9, 20), 'shape=mxgraph.eip.deadLetterChannel;fillColor=#818181;part=1;');
10086					item1.geometry.offset = new mxPoint( - w * 0.45, 0);
10087				}
10088				else if (obj.Class == 'EIGuaranteedDeliveryBlock')
10089				{
10090					var item1 = new mxCell('', new mxGeometry(0.5, 0.5, 20, 27), 'shape=cylinder;fillColor=#818181;part=1;');
10091					item1.geometry.offset = new mxPoint( -10, -7);
10092				}
10093
10094				item1.geometry.relative = true;
10095				item1.vertex = true;
10096				v.insert(item1);
10097
10098				item1.style += addAllStyles(item1.style, p, a, item1);
10099
10100			   	var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=none;rounded=0;endArrow=block;dashed=0;html=1;strokeColor=#818181;strokeWidth=1;endFill=1;endSize=6;');
10101			   	edge.geometry.relative = true;
10102		    	edge.edge = true;
10103
10104		    	addFloatingEdge(w * 0.15, h * 0.25, w * 0.85, h * 0.25, edge, select, graph, cells, v, cell);
10105
10106				break;
10107
10108			case 'EIChannelAdapterBlock' :
10109				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10110				v.value = convertText(p.Text);
10111				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10112
10113				var item1 = new mxCell('', new mxGeometry(0, h * 0.07, w * 0.21, h * 0.86), 'fillColor=#FFFF33;part=1;');
10114				item1.vertex = true;
10115				v.insert(item1);
10116				item1.style += addAllStyles(item1.style, p, a, item1);
10117
10118				var item2 = new mxCell('', new mxGeometry(w * 0.26, h * 0.09, w * 0.2, h * 0.82), 'shape=mxgraph.eip.channel_adapter;fillColor=#4CA3D9;part=1;');
10119				item2.vertex = true;
10120				v.insert(item2);
10121				item2.style += addAllStyles(item2.style, p, a, item2);
10122
10123				var item3 = new mxCell('', new mxGeometry(1, 0.5, w * 0.35, 20), 'shape=mxgraph.eip.messageChannel;fillColor=#818181;part=1;');
10124				item3.geometry.relative = true;
10125				item3.geometry.offset = new mxPoint( - w * 0.4, -10);
10126				item3.vertex = true;
10127				v.insert(item3);
10128				item3.style += addAllStyles(item3.style, p, a, item3);
10129
10130				edge1 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=1;exitY=0.5;entryX=0;entryY=0.5;endArrow=none;dashed=0;html=1;strokeWidth=1;endFill=1;endSize=2;');
10131		    	edge1.geometry.relative = true;
10132		    	edge1.edge = true;
10133		    	item1.insertEdge(edge1, true);
10134		    	item2.insertEdge(edge1, false);
10135				edge1.style += getStrokeColor(p, a);
10136
10137				select.push(graph.addCell(edge1, null, null, null, null));
10138
10139				edge2 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=1;exitY=0.5;entryX=0;entryY=0.5;endArrow=block;startArrow=block;dashed=0;html=1;strokeColor=#818181;strokeWidth=1;endFill=1;endSize=2;startFill=1;startSize=2;');
10140		    	edge2.geometry.relative = true;
10141		    	edge2.edge = true;
10142		    	item2.insertEdge(edge2, true);
10143		    	item3.insertEdge(edge2, false);
10144
10145				select.push(graph.addCell(edge2, null, null, null, null));
10146
10147				break;
10148
10149			case 'EIMessageBlock' :
10150			case 'EICommandMessageBlock' :
10151			case 'EIDocumentMessageBlock' :
10152			case 'EIEventMessageBlock' :
10153				v.style += 'strokeColor=none;fillColor=none;verticalLabelPosition=bottom;verticalAlign=top;';
10154				v.value = convertText(p.Text);
10155				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10156
10157				var item1 = new mxCell('', new mxGeometry(0, 0, 17, 17), 'ellipse;fillColor=#808080;part=1;');
10158				item1.vertex = true;
10159				v.insert(item1);
10160				item1.style += addAllStyles(item1.style, p, a, item1);
10161
10162				var messagesNum = p.Messages;
10163				var oneH = (h - 17) / messagesNum;
10164				var item2 = new Array();
10165				var edge = new Array();
10166
10167				for (var i = 0; i < messagesNum; i++)
10168				{
10169					var currY = oneH * (i + 1) - 3;
10170 					item2[i] = new mxCell('', new mxGeometry(w - 20, currY, 20, 20), 'part=1;');
10171					item2[i].vertex = true;
10172					v.insert(item2[i]);
10173
10174					switch(obj.Class)
10175					{
10176						case 'EIMessageBlock' :
10177							item2[i].value = convertText(p['message_' + (i + 1)]);
10178							item2.style += getLabelStyle(p['message_' + (i + 1)], isLastLblHTML);
10179							break;
10180						case 'EICommandMessageBlock' :
10181							item2[i].value = 'C';
10182							item2[i].style += 'fontStyle=1;fontSize=' + defaultFontSize + ';';
10183							break;
10184						case 'EIDocumentMessageBlock' :
10185							item2[i].value = 'D';
10186							item2[i].style += 'fontStyle=1;fontSize=' + defaultFontSize + ';';
10187							break;
10188						case 'EIEventMessageBlock' :
10189							item2[i].value = 'E';
10190							item2[i].style += 'fontStyle=1;fontSize=' + defaultFontSize + ';';
10191							break;
10192					}
10193
10194					item2[i].style += addAllStyles(item2[i].style, p, a, item2[i]);
10195					edge[i] = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;endArrow=none;dashed=0;html=1;');
10196			    	edge[i].geometry.relative = true;
10197			    	edge[i].edge = true;
10198			    	item1.insertEdge(edge[i], false);
10199			    	item2[i].insertEdge(edge[i], true);
10200			    	edge[i].style += addAllStyles(edge[i].style, p, a, edge[i]);
10201
10202					var wp = new Array();
10203					wp.push(new mxPoint(x + 8.5, y + currY + 10));
10204
10205					edge[i].geometry.points = wp;
10206					select.push(graph.addCell(edge[i], null, null, null, null));
10207				}
10208
10209				break;
10210
10211			case 'EIMessageEndpointBlock' :
10212				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10213				v.value = convertText(p.Text);
10214		    	v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10215
10216				var item1 = new mxCell('', new mxGeometry(w * 0.45, h * 0.25, w * 0.3, h * 0.5), 'part=1;fillColor=#ffffff');
10217				item1.vertex = true;
10218				v.insert(item1);
10219
10220				item1.style += addAllStyles(item1.style, p, a, item1);
10221
10222			   	var edge = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=none;rounded=0;endArrow=block;dashed=0;html=1;strokeColor=#818181;strokeWidth=1;endFill=1;endSize=6;');
10223			   	edge.geometry.relative = true;
10224		    	edge.edge = true;
10225
10226		    	addFloatingEdge(0, h * 0.5, w * 0.4, h * 0.5, edge, select, graph, cells, v, cell);
10227
10228				break;
10229			case 'EIPublishSubscribeChannelBlock' :
10230				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10231				v.value = convertText(p.Text);
10232		    	v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10233
10234			   	var edge1 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=none;rounded=0;endArrow=block;dashed=0;html=1;strokeColor=#818181;strokeWidth=1;endFill=1;endSize=6;');
10235			   	edge1.geometry.relative = true;
10236		    	edge1.edge = true;
10237		    	addFloatingEdge(w * 0.05, h * 0.5, w * 0.85, h * 0.5, edge1, select, graph, cells, v, cell);
10238
10239			   	var edge2 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=elbowEdgeStyle;rounded=0;endArrow=block;dashed=0;html=1;strokeColor=#818181;strokeWidth=1;endFill=1;endSize=6;');
10240			   	edge2.geometry.relative = true;
10241		    	edge2.edge = true;
10242		    	addFloatingEdge(w * 0.05, h * 0.5, w * 0.85, h * 0.15, edge2, select, graph, cells, v, cell);
10243
10244			   	var edge3 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=elbowEdgeStyle;rounded=0;endArrow=block;dashed=0;html=1;strokeColor=#818181;strokeWidth=1;endFill=1;endSize=6;');
10245			   	edge3.geometry.relative = true;
10246		    	edge3.edge = true;
10247		    	addFloatingEdge(w * 0.05, h * 0.5, w * 0.85, h * 0.85, edge3, select, graph, cells, v, cell);
10248
10249				break;
10250
10251			case 'EIMessageBusBlock' :
10252				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10253				v.value = convertText(p.Text);
10254		    	v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10255
10256			   	var edge1 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=none;rounded=0;endArrow=block;dashed=0;html=1;strokeWidth=1;endFill=1;endSize=4;startArrow=block;startFill=1;startSize=4;');
10257			   	edge1.geometry.relative = true;
10258		    	edge1.edge = true;
10259		    	edge1.style += getStrokeColor(p, a);
10260		    	addFloatingEdge(w * 0.05, h * 0.5, w * 0.95, h * 0.5, edge1, select, graph, cells, v, cell);
10261
10262			   	var edge2 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=elbowEdgeStyle;rounded=0;endArrow=block;dashed=0;html=1;strokeWidth=1;endFill=1;endSize=4;startArrow=block;startFill=1;startSize=4;');
10263			   	edge2.geometry.relative = true;
10264		    	edge2.edge = true;
10265		    	edge2.style += getStrokeColor(p, a);
10266		    	addFloatingEdge(w * 0.3, h * 0.1, w * 0.3, h * 0.5, edge2, select, graph, cells, v, cell);
10267
10268			   	var edge3 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=elbowEdgeStyle;rounded=0;endArrow=block;dashed=0;html=1;strokeWidth=1;endFill=1;endSize=4;startArrow=block;startFill=1;startSize=4;');
10269			   	edge3.geometry.relative = true;
10270		    	edge3.edge = true;
10271		    	edge3.style += getStrokeColor(p, a);
10272		    	addFloatingEdge(w * 0.7, h * 0.1, w * 0.7, h * 0.5, edge3, select, graph, cells, v, cell);
10273
10274			   	var edge4 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=elbowEdgeStyle;rounded=0;endArrow=block;dashed=0;html=1;strokeWidth=1;endFill=1;endSize=4;startArrow=block;startFill=1;startSize=4;');
10275			   	edge4.geometry.relative = true;
10276		    	edge4.edge = true;
10277		    	edge4.style += getStrokeColor(p, a);
10278		    	addFloatingEdge(w * 0.5, h * 0.5, w * 0.5, h * 0.9, edge4, select, graph, cells, v, cell);
10279
10280				break;
10281
10282			case 'EIRequestReplyBlock' :
10283				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10284				v.value = convertText(p.Text);
10285		    	v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10286
10287				var item1 = new mxCell('', new mxGeometry(w * 0.2, h * 0.21, w * 0.16, h * 0.24), 'part=1;fillColor=#ffffff;');
10288				item1.vertex = true;
10289				v.insert(item1);
10290				item1.style += addAllStyles(item1.style, p, a, item1);
10291
10292			   	var edge1 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=none;rounded=0;endArrow=block;dashed=0;html=1;strokeColor=#818181;strokeWidth=1;endFill=1;endSize=6;');
10293			   	edge1.geometry.relative = true;
10294		    	edge1.edge = true;
10295
10296		    	addFloatingEdge(w * 0.45, h * 0.33, w * 0.8, h * 0.33, edge1, select, graph, cells, v, cell);
10297
10298				var item2 = new mxCell('', new mxGeometry(w * 0.64, h * 0.55, w * 0.16, h * 0.24), 'part=1;fillColor=#ffffff;');
10299				item2.vertex = true;
10300				v.insert(item2);
10301				item2.style += addAllStyles(item2.style, p, a, item2);
10302
10303			   	var edge2 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=none;rounded=0;endArrow=block;dashed=0;html=1;strokeColor=#818181;strokeWidth=1;endFill=1;endSize=6;');
10304			   	edge2.geometry.relative = true;
10305		    	edge2.edge = true;
10306
10307		    	addFloatingEdge(w * 0.55, h * 0.67, w * 0.2, h * 0.67, edge2, select, graph, cells, v, cell);
10308
10309				break;
10310
10311			case 'EIReturnAddressBlock' :
10312				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10313				v.value = convertText(p.Text);
10314				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10315
10316				var item1 = new mxCell('', new mxGeometry(w * 0.1, h * 0.15, w * 0.8, h * 0.7), 'part=1;shape=mxgraph.eip.retAddr;fillColor=#FFE040;');
10317				item1.vertex = true;
10318				v.insert(item1);
10319				item1.style += addAllStyles(item1.style, p, a, item1);
10320
10321				break;
10322
10323			case 'EICorrelationIDBlock' :
10324				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10325				v.value = convertText(p.Text);
10326				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10327
10328				var item1 = new mxCell('', new mxGeometry(w * 0.04, h * 0.06, w * 0.18, h * 0.28), 'ellipse;fillColor=#808080;part=1;');
10329				item1.vertex = true;
10330				v.insert(item1);
10331				item1.style += addAllStyles(item1.style, p, a, item1);
10332
10333				item2 = new mxCell('', new mxGeometry(w * 0.2, h * 0.56, w * 0.2, h * 0.32), 'part=1;');
10334				item2.vertex = true;
10335				v.insert(item2);
10336
10337				item2.value = 'A';
10338				item2.style += 'fontStyle=1;fontSize=' + defaultFontSize + ';';
10339				item1.style += addAllStyles(item1.style, p, a, item1);
10340
10341				edge1 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;endArrow=none;dashed=0;html=1;part=1;');
10342		    	edge1.geometry.relative = true;
10343		    	edge1.edge = true;
10344		    	item1.insertEdge(edge1, false);
10345		    	item2.insertEdge(edge1, true);
10346		    	edge1.style += addAllStyles(edge1.style, p, a, edge1);
10347
10348				var wp = new Array();
10349				wp.push(new mxPoint(x + w * 0.13, y + h * 0.72));
10350
10351				edge1.geometry.points = wp;
10352				select.push(graph.addCell(edge1, null, null, null, null));
10353
10354				var item3 = new mxCell('', new mxGeometry(w * 0.6, h * 0.06, w * 0.18, h * 0.28), 'ellipse;fillColor=#808080;part=1;');
10355				item3.vertex = true;
10356				v.insert(item3);
10357				item3.style +=
10358					getStrokeColor(p, a) +
10359					getStrokeWidth(p);
10360				item3.style += addAllStyles(item3.style, p, a, item3);
10361
10362				item4 = new mxCell('', new mxGeometry(w * 0.76, h * 0.56, w * 0.2, h * 0.32), 'part=1;');
10363				item4.vertex = true;
10364				v.insert(item4);
10365				item4.style +=
10366					getStrokeColor(p, a) +
10367					getOpacity(p, a, item4) +
10368					getStrokeWidth(p) +
10369					getStrokeStyle(p);
10370
10371				item4.value = 'B';
10372				item4.style += 'fontStyle=1;fontSize=' + defaultFontSize + ';fillColor=#ffffff;';
10373				item4.style += addAllStyles(item4.style, p, a, item4);
10374
10375				edge2 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;endArrow=none;dashed=0;html=1;part=1;');
10376		    	edge2.geometry.relative = true;
10377		    	edge2.edge = true;
10378		    	item3.insertEdge(edge2, false);
10379		    	item4.insertEdge(edge2, true);
10380		    	edge2.style += addAllStyles(edge2.style, p, a, edge2);
10381
10382				var wp2 = new Array();
10383				wp2.push(new mxPoint(x + w * 0.69, y + h * 0.72));
10384
10385				edge2.geometry.points = wp2;
10386				select.push(graph.addCell(edge2, null, null, null, null));
10387
10388				edge3 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;endArrow=block;endFill=1;endSize=6;part=1;');
10389		    	edge3.geometry.relative = true;
10390		    	edge3.edge = true;
10391		    	item1.insertEdge(edge3, false);
10392		    	item3.insertEdge(edge3, true);
10393				edge3.style += addAllStyles(edge3.style, p, a, edge3);
10394
10395				select.push(graph.addCell(edge3, null, null, null, null));
10396
10397				break;
10398
10399			case 'EIMessageSequenceBlock' :
10400
10401				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10402				v.value = convertText(p.Text);
10403				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10404
10405				var item1 = new mxCell('1', new mxGeometry(w * 0.2, h * 0.4, w * 0.1, h * 0.19), 'fontStyle=1;fillColor=#ffffff;fontSize=' + defaultFontSize + ';part=1;');
10406				item1.vertex = true;
10407				v.insert(item1);
10408				item1.style += addAllStyles(item1.style, p, a, item1);
10409
10410				var item2 = new mxCell('2', new mxGeometry(w * 0.45, h * 0.4, w * 0.1, h * 0.19), 'fontStyle=1;fillColor=#ffffff;fontSize=' + defaultFontSize + ';part=1;');
10411				item2.vertex = true;
10412				v.insert(item2);
10413				item2.style += addAllStyles(item2.style, p, a, item2);
10414
10415				var item3 = new mxCell('3', new mxGeometry(w * 0.7, h * 0.4, w * 0.1, h * 0.19), 'fontStyle=1;fillColor=#ffffff;fontSize=' + defaultFontSize + ';part=1;');
10416				item3.vertex = true;
10417				v.insert(item3);
10418				item3.style += addAllStyles(item3.style, p, a, item3);
10419
10420				var edge1 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'curved=1;endArrow=block;html=1;endSize=3;part=1;');
10421				item1.insertEdge(edge1, false);
10422				item2.insertEdge(edge1, true);
10423
10424				edge1.geometry.points = [new mxPoint(x + w * 0.375, y + h * 0.15)];
10425				edge1.geometry.relative = true;
10426				edge1.edge = true;
10427				edge1.style += addAllStyles(edge1.style, p, a, edge1);
10428				select.push(graph.addCell(edge1, null, null, null, null));
10429
10430				var edge2 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'curved=1;endArrow=block;html=1;endSize=3;part=1;');
10431				item2.insertEdge(edge2, false);
10432				item3.insertEdge(edge2, true);
10433				edge2.geometry.points = [new mxPoint(x + w * 0.675, y + h * 0.15)];
10434				edge2.geometry.relative = true;
10435				edge2.edge = true;
10436				edge2.style += addAllStyles(edge2.style, p, a, edge2);
10437				select.push(graph.addCell(edge2, null, null, null, null));
10438
10439				break;
10440
10441			case 'EIMessageExpirationBlock' :
10442
10443				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10444				v.value = convertText(p.Text);
10445				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10446
10447				var item1 = new mxCell('', new mxGeometry(w * 0.3, h * 0.2, w * 0.4, h * 0.6), 'shape=mxgraph.ios7.icons.clock;fillColor=#ffffff;flipH=1;part=1;');
10448				item1.vertex = true;
10449				v.insert(item1);
10450				item1.style += addAllStyles(item1.style, p, a, item1);
10451
10452				break;
10453
10454			case 'EIMessageBrokerBlock' :
10455				v.style += 'strokeColor=none;fillColor=none;verticalLabelPosition=bottom;verticalAlign=top;';
10456				v.value = convertText(p.Text);
10457				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10458
10459				var item1 = new mxCell('', new mxGeometry(w * 0.38, h * 0.42, w * 0.24, h * 0.16), 'part=1;fillColor=#aefe7d;');
10460				item1.vertex = true;
10461				v.insert(item1);
10462				item1.style += addAllStyles(item1.style, p, a, item1);
10463
10464				var item2 = new mxCell('', new mxGeometry(w * 0.38, 0, w * 0.24, h * 0.16), 'part=1;');
10465				item2.vertex = true;
10466				v.insert(item2);
10467				item2.style += addAllStyles(item2.style, p, a, item2);
10468
10469				var item3 = new mxCell('', new mxGeometry(w * 0.76, h * 0.23, w * 0.24, h * 0.16), '');
10470				item3.vertex = true;
10471				v.insert(item3);
10472				item3.style = item2.style;
10473
10474				var item4 = new mxCell('', new mxGeometry(w * 0.76, h * 0.61, w * 0.24, h * 0.16), '');
10475				item4.vertex = true;
10476				v.insert(item4);
10477				item4.style = item2.style;
10478
10479				var item5 = new mxCell('', new mxGeometry(w * 0.38, h * 0.84, w * 0.24, h * 0.16), '');
10480				item5.vertex = true;
10481				v.insert(item5);
10482				item5.style = item2.style;
10483
10484				var item6 = new mxCell('', new mxGeometry(0, h * 0.61, w * 0.24, h * 0.16), '');
10485				item6.vertex = true;
10486				v.insert(item6);
10487				item6.style = item2.style;
10488
10489				var item7 = new mxCell('', new mxGeometry(0, h * 0.23, w * 0.24, h * 0.16), '');
10490				item7.vertex = true;
10491				v.insert(item7);
10492				item7.style = item2.style;
10493
10494				var edge1 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'endArrow=none;part=1;');
10495				item1.insertEdge(edge1, false);
10496				item2.insertEdge(edge1, true);
10497				edge1.edge = true;
10498				edge1.style += addAllStyles(edge1.style, p, a, edge1);
10499				select.push(graph.addCell(edge1, null, null, null, null));
10500
10501				var edge2 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'endArrow=none;part=1;');
10502				item1.insertEdge(edge2, false);
10503				item3.insertEdge(edge2, true);
10504				edge2.edge = true;
10505				edge2.style += addAllStyles(edge2.style, p, a, edge2);
10506				select.push(graph.addCell(edge2, null, null, null, null));
10507
10508				var edge3 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'endArrow=none;part=1;');
10509				item1.insertEdge(edge3, false);
10510				item4.insertEdge(edge3, true);
10511				edge3.edge = true;
10512				edge3.style += addAllStyles(edge3.style, p, a, edge3);
10513				select.push(graph.addCell(edge3, null, null, null, null));
10514
10515				var edge4 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'endArrow=none;part=1;');
10516				item1.insertEdge(edge4, false);
10517				item5.insertEdge(edge4, true);
10518				edge4.edge = true;
10519				edge4.style += addAllStyles(edge4.style, p, a, edge4);
10520				select.push(graph.addCell(edge4, null, null, null, null));
10521
10522				var edge5 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'endArrow=none;part=1;');
10523				item1.insertEdge(edge5, false);
10524				item6.insertEdge(edge5, true);
10525				edge5.edge = true;
10526				edge5.style += addAllStyles(edge5.style, p, a, edge5);
10527				select.push(graph.addCell(edge5, null, null, null, null));
10528
10529				var edge6 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'endArrow=none;part=1;');
10530				item1.insertEdge(edge6, false);
10531				item7.insertEdge(edge6, true);
10532				edge6.edge = true;
10533				edge6.style += addAllStyles(edge6.style, p, a, edge6);
10534				select.push(graph.addCell(edge6, null, null, null, null));
10535
10536				break;
10537			case 'EIDurableSubscriberBlock' :
10538				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10539				v.value = convertText(p.Text);
10540				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10541
10542			   	var edge1 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=elbowEdgeStyle;rounded=0;endArrow=block;endFill=1;endSize=6;');
10543			   	edge1.geometry.relative = true;
10544		    	edge1.edge = true;
10545		    	addFloatingEdge(w * 0.05, h * 0.5, w * 0.6, h * 0.25, edge1, select, graph, cells, v, cell);
10546
10547			   	var edge2 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=elbowEdgeStyle;rounded=0;endArrow=block;endFill=1;endSize=6;');
10548			   	edge2.geometry.relative = true;
10549		    	edge2.edge = true;
10550		    	addFloatingEdge(w * 0.05, h * 0.5, w * 0.6, h * 0.75, edge2, select, graph, cells, v, cell);
10551
10552				var item1 = new mxCell('', new mxGeometry(w * 0.7, h * 0.1, w * 0.15, h * 0.32), 'shape=mxgraph.eip.durable_subscriber;part=1;fillColor=#818181;');
10553				item1.vertex = true;
10554				v.insert(item1);
10555				item1.style += addAllStyles(item1.style, p, a, item1);
10556
10557				break;
10558
10559			case 'EIControlBusBlock' :
10560				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10561				v.value = convertText(p.Text);
10562				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10563
10564				var item1 = new mxCell('', new mxGeometry(w * 0.25, h * 0.25, w * 0.5, h * 0.5), 'shape=mxgraph.eip.control_bus;part=1;');
10565				item1.vertex = true;
10566				v.insert(item1);
10567				item1.style += addAllStyles(item1.style, p, a, item1);
10568
10569				break;
10570
10571			case 'EIMessageHistoryBlock' :
10572				v.style += 'strokeColor=none;fillColor=none;verticalLabelPosition=bottom;verticalAlign=top;';
10573				v.value = convertText(p.Text);
10574				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10575
10576				var item1 = new mxCell('', new mxGeometry(0, 0, 17, 17), 'ellipse;fillColor=#808080;part=1;');
10577				item1.vertex = true;
10578				v.insert(item1);
10579				item1.style += addAllStyles(item1.style, p, a, item1);
10580
10581				var item3 = new mxCell('', new mxGeometry(w - 45, 30, 30, 20), 'shape=mxgraph.mockup.misc.mail2;fillColor=#FFE040;part=1;');
10582				item3.vertex = true;
10583				v.insert(item3);
10584				item3.style += addAllStyles(item3.style, p, a, item3);
10585
10586				edge3 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;endArrow=none;dashed=0;html=1;');
10587		    	edge3.geometry.relative = true;
10588		    	edge3.edge = true;
10589		    	item1.insertEdge(edge3, false);
10590		    	item3.insertEdge(edge3, true);
10591		    	edge3.style += addAllStyles(edge3.style, p, a, edge3);
10592
10593				edge3.geometry.points = [new mxPoint(x + 8.5, y + 40)];
10594				select.push(graph.addCell(edge3, null, null, null, null));
10595
10596				var item4 = new mxCell('', new mxGeometry(w - 45, h - 20, 20, 20), 'part=1;');
10597				item4.vertex = true;
10598				v.insert(item4);
10599				item4.value = convertText(p.message_0);
10600				item4.style += getLabelStyle(p.message_0, isLastLblHTML);
10601
10602				item4.style += addAllStyles(item4.style, p, a, item4, isLastLblHTML);
10603
10604				edge4 = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;endArrow=none;dashed=0;html=1;');
10605		    	edge4.geometry.relative = true;
10606		    	edge4.edge = true;
10607
10608		    	item1.insertEdge(edge4, false);
10609		    	item4.insertEdge(edge4, true);
10610		    	edge4.style += addAllStyles(edge4.style, p, a, edge4);
10611
10612				edge4.geometry.points = [new mxPoint(x + 8.5, y + h - 10)];
10613				select.push(graph.addCell(edge4, null, null, null, null));
10614
10615				var messagesNum = p.HistoryMessages;
10616				var oneH = (h - 75) / messagesNum;
10617				var item2 = new Array();
10618				var edge = new Array();
10619
10620				for (var i = 0; i < messagesNum; i++)
10621				{
10622					var currY = oneH * (i + 1) + 30;
10623						item2[i] = new mxCell('', new mxGeometry(w - 20, currY, 20, 20), 'part=1;');
10624					item2[i].vertex = true;
10625					item2[i].value = convertText(p['message_' + (i + 1)]);
10626					item2.style += getLabelStyle(p['message_' + (i + 1)], isLastLblHTML);
10627					v.insert(item2[i]);
10628
10629					item2[i].style += addAllStyles(item2[i].style, p, a, item2[i], isLastLblHTML);
10630
10631					edge[i] = new mxCell('', new mxGeometry(0, 0, 0, 0), 'edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;endArrow=none;dashed=0;html=1;');
10632			    	edge[i].geometry.relative = true;
10633			    	edge[i].edge = true;
10634			    	item3.insertEdge(edge[i], false);
10635			    	item2[i].insertEdge(edge[i], true);
10636			    	edge[i].style += addAllStyles(edge[i].style, p, a, edge[i]);
10637
10638					var wp = new Array();
10639					wp.push(new mxPoint(x + w - 30, y + currY + 10));
10640
10641					edge[i].geometry.points = wp;
10642					select.push(graph.addCell(edge[i], null, null, null, null));
10643				}
10644
10645				break;
10646
10647			case 'Equation' :
10648				LucidImporter.hasMath = true;
10649				v.style += 'strokeColor=none;';
10650				v.style += addAllStyles(v.style, p, a, v);
10651				v.value = '$$' + p.Latex + '$$';
10652				break;
10653			case 'fpDoor' :
10654				v.style += 'shape=mxgraph.floorplan.doorRight;';
10655
10656				if (p.DoorAngle < 0)
10657				{
10658					v.style += 'flipV=1;'
10659				}
10660
10661		    	v.style += addAllStyles(v.style, p, a, v);
10662
10663				break;
10664			case 'fpWall' :
10665				v.style += 'labelPosition=center;verticalAlign=bottom;verticalLabelPosition=top;';
10666				v.value = convertText(p);
10667				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10668				v.style = v.style.replace('rotation=180;', ''); //180 rotation cause the labels to be upside down which doesn't match Lucid
10669			break;
10670			case 'fpDoubleDoor' :
10671				v.style += 'shape=mxgraph.floorplan.doorDouble;';
10672
10673				if (p.DoorAngle > 0)
10674				{
10675					v.style += 'flipV=1;'
10676				}
10677
10678		    	v.style += addAllStyles(v.style, p, a, v);
10679
10680				break;
10681
10682			case 'fpRestroomLights' :
10683				v.style += 'strokeColor=none;fillColor=none;';
10684		    	v.style += addAllStyles(v.style, p, a, v);
10685
10686				var item1 = new mxCell('', new mxGeometry(0, 0, w, h * 0.25), 'part=1;');
10687				item1.vertex = true;
10688				v.insert(item1);
10689				item1.style += addAllStyles(item1.style, p, a, item1);
10690
10691				var item2 = new Array();
10692				var lightOffset = w * 0.02;
10693				var lightW = (w - lightOffset * 2) / p.LightCount;
10694				var trueW = lightW * 0.8;
10695
10696				for (var i = 0; i < p.LightCount; i++)
10697				{
10698					item2[i] = new mxCell('', new mxGeometry(lightOffset + lightW * i + (lightW - trueW) / 2, h * 0.25, trueW, h * 0.75), 'ellipse;part=1;');
10699					item2[i].vertex = true;
10700					v.insert(item2[i]);
10701					item2[i].style += addAllStyles(item2[i].style, p, a, item2[i]);
10702				}
10703
10704				break;
10705
10706			case 'fpRestroomSinks' :
10707				v.style += 'strokeColor=none;fillColor=none;';
10708		    	v.style += addAllStyles(v.style, p, a, v);
10709
10710				var item1 = new Array();
10711				var sinkW = w / p.SinkCount;
10712
10713				for (var i = 0; i < p.SinkCount; i++)
10714				{
10715					item1[i] = new mxCell('', new mxGeometry(sinkW * i, 0, sinkW, h), 'part=1;shape=mxgraph.floorplan.sink_2;');
10716					item1[i].vertex = true;
10717					v.insert(item1[i]);
10718					item1[i].style += addAllStyles(item1[i].style, p, a, item1[i]);
10719				}
10720
10721				break;
10722
10723			case 'fpRestroomStalls' :
10724				v.style += 'strokeColor=none;fillColor=none;';
10725
10726				var wallW = w * 0.1 / p.StallCount;
10727
10728				var item1 = new mxCell('', new mxGeometry(0, 0, wallW, h), 'fillColor=#000000;part=1;');
10729				item1.vertex = true;
10730				v.insert(item1);
10731		    	item1.style += addAllStyles(item1.style, p, a, item1);
10732
10733				var stallW = (w - wallW) / p.StallCount;
10734
10735				var wall = new Array();
10736				var toilet = new Array();
10737				var door = new Array();
10738				var paper = new Array();
10739
10740				var fc = getStrokeColor(p, a);
10741
10742				if (fc == '')
10743				{
10744					fc = '#000000;'
10745				}
10746				else
10747				{
10748					fc = fc.replace('stokreColor=', '');
10749				}
10750
10751				var wallStyle = 'part=1;fillColor=' + fc;
10752				wallStyle += addAllStyles(wallStyle, p, a, v);
10753				var otherStyle = addAllStyles('', p, a, v);
10754
10755				for (var i = 0; i < p.StallCount; i++)
10756				{
10757					wall[i] = new mxCell('', new mxGeometry((i + 1) * stallW, 0, wallW, h), wallStyle);
10758					wall[i].vertex = true;
10759					v.insert(wall[i]);
10760
10761					door[i] = new mxCell('', new mxGeometry(wallW + i * stallW + (stallW - wallW) * 0.05, h - (stallW - wallW) * 0.92, (stallW - wallW) * 0.9, (stallW - wallW) * 0.92), 'shape=mxgraph.floorplan.doorRight;flipV=1;part=1;');
10762					door[i].vertex = true;
10763					v.insert(door[i]);
10764					door[i].style += otherStyle;
10765
10766					toilet[i] = new mxCell('', new mxGeometry(wallW + i * stallW + (stallW - wallW) * 0.2, 0, (stallW - wallW) * 0.6, (stallW - wallW) * 0.8), 'shape=mxgraph.floorplan.toilet;part=1;');
10767					toilet[i].vertex = true;
10768					v.insert(toilet[i]);
10769					toilet[i].style += otherStyle;
10770
10771					paper[i] = new mxCell('', new mxGeometry(wallW + i * stallW, h * 0.42, (stallW - wallW) * 0.15, (stallW - wallW) * 0.12), 'part=1;');
10772					paper[i].vertex = true;
10773					v.insert(paper[i]);
10774					paper[i].style += otherStyle;
10775				}
10776
10777				break;
10778			case 'PEOneToMany' :
10779				v.style += 'strokeColor=none;fillColor=none;';
10780
10781		    	var edgeStyle = 'edgeStyle=none;endArrow=none;part=1;';
10782
10783				var fc = getStrokeColor(p, a);
10784
10785				if (fc == '')
10786				{
10787					fc = '#000000;'
10788				}
10789				else
10790				{
10791					fc = fc.replace('strokeColor=', '');
10792				}
10793
10794				var endStyle = 'shape=triangle;part=1;fillColor=' + fc;
10795				endStyle += addAllStyles(endStyle, p, a, v);
10796
10797			   	var edge1 = new mxCell('', new mxGeometry(0, 0, 0, 0), edgeStyle);
10798			   	edge1.geometry.relative = true;
10799		    	edge1.edge = true;
10800
10801		    	addFloatingEdge(0, h * 0.5, w * 0.65, h * 0.5, edge1, select, graph, cells, v, cell);
10802
10803		    	var itemH = h / p.numLines;
10804		    	var edge2 = new Array();
10805		    	var endArrow = new Array();
10806
10807		    	for (var i = 0; i < p.numLines; i++)
10808		    	{
10809				   	edge2[i] = new mxCell('', new mxGeometry(0, 0, 0, 0), edgeStyle);
10810				   	edge2[i].geometry.relative = true;
10811			    	edge2[i].edge = true;
10812
10813			    	addFloatingEdge(w * 0.65, h * 0.5, w * 0.96, (i + 0.5) * itemH, edge2[i], select, graph, cells, v, cell);
10814
10815			    	endArrow[i] = new mxCell('', new mxGeometry(w * 0.95, (i + 0.2) * itemH, w * 0.05, itemH * 0.6), endStyle);
10816			    	endArrow[i].vertex = true;
10817					v.insert(endArrow[i]);
10818		    	}
10819
10820				break;
10821
10822			case 'PEMultilines' :
10823				v.style += 'strokeColor=none;fillColor=none;';
10824
10825		    	var edgeStyle = 'edgeStyle=none;endArrow=none;part=1;';
10826
10827				var fc = getStrokeColor(p, a);
10828
10829				if (fc == '')
10830				{
10831					fc = '#000000;'
10832				}
10833				else
10834				{
10835					fc = fc.replace('strokeColor=', '');
10836				}
10837
10838				var endStyle = 'shape=triangle;part=1;fillColor=' + fc;
10839				endStyle += addAllStyles(endStyle, p, a, v);
10840
10841		    	var itemH = h / p.numLines;
10842		    	var edge2 = new Array();
10843		    	var endArrow = new Array();
10844
10845		    	for (var i = 0; i < p.numLines; i++)
10846		    	{
10847				   	edge2[i] = new mxCell('', new mxGeometry(0, 0, 0, 0), edgeStyle);
10848				   	edge2[i].geometry.relative = true;
10849			    	edge2[i].edge = true;
10850
10851			    	addFloatingEdge(0, (i + 0.5) * itemH, w * 0.96, (i + 0.5) * itemH, edge2[i], select, graph, cells, v, cell);
10852
10853			    	endArrow[i] = new mxCell('', new mxGeometry(w * 0.95, (i + 0.2) * itemH, w * 0.05, itemH * 0.6), endStyle);
10854			    	endArrow[i].vertex = true;
10855					v.insert(endArrow[i]);
10856		    	}
10857
10858				break;
10859
10860			case 'PEVesselBlock' :
10861				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10862				v.value = convertText(p.Text);
10863
10864				switch (p.vesselType)
10865				{
10866					case 1 :
10867						v.style += 'shape=mxgraph.pid.vessels.pressurized_vessel;';
10868						break;
10869					case 2 :
10870						v.style += 'shape=hexagon;perimeter=hexagonPerimeter2;size=0.10;direction=south;';
10871						break;
10872				}
10873
10874		    	v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10875
10876				break;
10877
10878			case 'PEClosedTankBlock' :
10879				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10880				v.value = convertText(p.Text);
10881
10882				if (p.peakedRoof == 1 && p.stumpType == 0)
10883				{
10884					v.style += 'shape=mxgraph.pid.vessels.tank_(conical_roof);';
10885				}
10886				else if (p.stumpType == 1)
10887				{
10888					v.style += 'shape=mxgraph.pid.vessels.tank_(boot);';
10889				}
10890
10891		    	v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10892				break;
10893
10894			case 'PEColumnBlock' :
10895				v.style += 'verticalLabelPosition=bottom;verticalAlign=top;';
10896				v.value = convertText(p.Text);
10897
10898				if (p.columnType == 0)
10899				{
10900					v.style += 'shape=mxgraph.pid.vessels.pressurized_vessel;';
10901				}
10902				else
10903				{
10904					v.style += 'shape=mxgraph.pid.vessels.tank;';
10905				}
10906
10907		    	v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10908
10909				break;
10910
10911			case 'PECompressorTurbineBlock' :
10912				v.style += 'strokeColor=none;fillColor=none;';
10913				v.value = convertText(p.Text);
10914		    	v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10915
10916				var item1 = new mxCell('', new mxGeometry(0, h * 0.2, w, h * 0.6), 'part=1;shape=trapezoid;perimeter=trapezoidPerimeter;direction=south;');
10917				item1.vertex = true;
10918				v.insert(item1);
10919				item1.style += st;
10920				item1.style += addAllStyles(item1.style, p, a, item1);
10921
10922				var st = 'endSize=4;endArrow=block;endFill=1;';
10923
10924				if (p.compressorType == 0)
10925				{
10926				   	var edge1 = new mxCell('', new mxGeometry(0, 0, 0, 0), '');
10927				   	edge1.geometry.relative = true;
10928			    	edge1.edge = true;
10929					edge1.style += st;
10930					edge1.style += addAllStyles(edge1.style, p, a, edge1);
10931
10932			    	addFloatingEdge(0, 0, 0, h * 0.2, edge1, select, graph, cells, v, cell);
10933
10934				   	var edge2 = new mxCell('', new mxGeometry(0, 0, 0, 0), '');
10935				   	edge2.geometry.relative = true;
10936			    	edge2.edge = true;
10937					edge2.style += st;
10938					edge2.style += addAllStyles(edge2.style, p, a, edge2);
10939
10940			    	addFloatingEdge(w, h * 0.67, w, h, edge2, select, graph, cells, v, cell);
10941				}
10942				else
10943				{
10944
10945					item1.style += 'flipH=1;'
10946				   	var edge1 = new mxCell('', new mxGeometry(0, 0, 0, 0), '');
10947				   	edge1.geometry.relative = true;
10948			    	edge1.edge = true;
10949					edge1.style += st;
10950					edge1.style += addAllStyles(edge1.style, p, a, edge1);
10951
10952			    	addFloatingEdge(0, 0, 0, h * 0.33, edge1, select, graph, cells, v, cell);
10953
10954				   	var edge2 = new mxCell('', new mxGeometry(0, 0, 0, 0), '');
10955				   	edge2.geometry.relative = true;
10956			    	edge2.edge = true;
10957					edge2.style += st;
10958					edge2.style += addAllStyles(edge2.style, p, a, edge2);
10959
10960			    	addFloatingEdge(w, h * 0.8, w, h, edge2, select, graph, cells, v, cell);
10961				}
10962
10963		    	if (p.centerLineType == 1)
10964		    	{
10965				   	var edge3 = new mxCell('', new mxGeometry(0, 0, 0, 0), '');
10966				   	edge3.geometry.relative = true;
10967			    	edge3.edge = true;
10968					edge3.style += st;
10969					edge3.style += addAllStyles(edge3.style, p, a, edge3);
10970
10971			    	addFloatingEdge(w * 0.2, h * 0.5, w * 0.8, h * 0.5, edge3, select, graph, cells, v, cell);
10972		    	}
10973
10974				break;
10975
10976			case 'PEMotorDrivenTurbineBlock' :
10977
10978				v.style += 'shape=ellipse;perimeter=ellipsePerimeter;';
10979				v.value = convertText(p.Text);
10980				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
10981
10982				var item1 = new mxCell('', new mxGeometry(w * 0.2, h * 0.2, w * 0.6, h * 0.6), 'part=1;shape=trapezoid;perimeter=trapezoidPerimeter;direction=south;');
10983				item1.vertex = true;
10984				v.insert(item1);
10985				item1.style += addAllStyles(item1.style, p, a, item1);
10986
10987				break;
10988
10989			case 'PEFanBlades2Block' :
10990				break;
10991			case 'PECentrifugalPumpBlock' :
10992				break;
10993			case 'PEIndicatorBlock' :
10994			case 'PEIndicator2Block' :
10995			case 'PESharedIndicatorBlock' :
10996			case 'PEComputerIndicatorBlock' :
10997			case 'PESharedIndicator2Block' :
10998			case 'PEProgrammableIndicatorBlock' :
10999				switch(obj.Class)
11000				{
11001					case 'PEIndicatorBlock' :
11002						v.style += 'shape=mxgraph.pid2inst.discInst;';
11003						break;
11004					case 'PEIndicator2Block' :
11005						v.style += 'shape=mxgraph.pid2inst.indicator;indType=inst;';
11006						break;
11007					case 'PESharedIndicatorBlock' :
11008						v.style += 'shape=mxgraph.pid2inst.sharedCont;';
11009						break;
11010					case 'PEComputerIndicatorBlock' :
11011						v.style += 'shape=mxgraph.pid2inst.compFunc;';
11012						break;
11013					case 'PESharedIndicator2Block' :
11014						v.style += 'shape=mxgraph.pid2inst.indicator;indType=ctrl;';
11015						break;
11016					case 'PEProgrammableIndicatorBlock' :
11017						v.style += 'shape=mxgraph.pid2inst.progLogCont;';
11018						break;
11019				}
11020
11021				v.style += addAllStyles(v.style, p, a, v);
11022
11023				if (obj.Class == 'PEIndicator2Block' || obj.Class == 'PESharedIndicator2Block')
11024				{
11025					//scale labels to width
11026					var item1 = new mxCell('', new mxGeometry(0, 0, w, w * 0.5), 'part=1;strokeColor=none;fillColor=none;');
11027					item1.vertex = true;
11028					v.insert(item1);
11029					item1.value = convertText(p.TopText);
11030					item1.style += getLabelStyle(p.TopText, isLastLblHTML);
11031					item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
11032
11033					var item2 = new mxCell('', new mxGeometry(0, w * 0.5, w, w * 0.5), 'part=1;strokeColor=none;fillColor=none;');
11034					item2.vertex = true;
11035					v.insert(item2);
11036					item2.value = convertText(p.BotText);
11037					item2.style += getLabelStyle(p.BotText, isLastLblHTML);
11038					item2.style += addAllStyles(item2.style, p, a, item2, isLastLblHTML);
11039				}
11040				else
11041				{
11042					//scale labels as usual
11043					var item1 = new mxCell('', new mxGeometry(0, 0, w, h * 0.5), 'part=1;strokeColor=none;fillColor=none;');
11044					item1.vertex = true;
11045					v.insert(item1);
11046					item1.value = convertText(p.TopText);
11047					item1.style += getLabelStyle(p.TopText, isLastLblHTML);
11048					item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
11049
11050					var item2 = new mxCell('', new mxGeometry(0, h * 0.5, w, h * 0.5), 'part=1;strokeColor=none;fillColor=none;');
11051					item2.vertex = true;
11052					v.insert(item2);
11053					item2.value = convertText(p.BotText);
11054					item2.style += getLabelStyle(p.BotText, isLastLblHTML);
11055					item2.style += addAllStyles(item2.style, p, a, item2, isLastLblHTML);
11056				}
11057
11058				switch(p.instrumentLocation)
11059				{
11060					case 0 :
11061						v.style += 'mounting=field;';
11062						break;
11063					case 1 :
11064						v.style += 'mounting=inaccessible;';
11065						break;
11066					case 2 :
11067						v.style += 'mounting=room;';
11068						break;
11069					case 3 :
11070						v.style += 'mounting=local;';
11071						break;
11072				}
11073
11074				break;
11075
11076			case 'PEGateValveBlock' :
11077			case 'PEGlobeValveBlock' :
11078			case 'PEAngleValveBlock' :
11079			case 'PEAngleGlobeValveBlock' :
11080			case 'PEPoweredValveBlock' :
11081
11082				var actuator = false;
11083
11084				if (obj.Class == 'PEPoweredValveBlock')
11085				{
11086					if (p.poweredHandOperated != 1)
11087					{
11088						actuator = true;
11089					}
11090				}
11091				else
11092				{
11093					if (p.handOperated != 1)
11094					{
11095						actuator = true;
11096					}
11097				}
11098
11099				if (actuator)
11100				{
11101					var p = getAction(obj).Properties;
11102					var b = p.BoundingBox;
11103
11104					var oldH = b.h;
11105
11106					if (obj.Class == 'PEAngleValveBlock' || obj.Class == 'PEAngleGlobeValveBlock')
11107					{
11108						b.h = b.h * 0.7;
11109					}
11110					else
11111					{
11112						b.h = b.h * 0.6;
11113					}
11114
11115					v = new mxCell('', new mxGeometry(Math.round(b.x * scale + dx), Math.round((b.y + oldH - b.h) * scale + dy),
11116							Math.round(b.w * scale), Math.round(b.h * scale)), '');
11117				    v.vertex = true;
11118				    updateCell(v, obj, graph);
11119				}
11120
11121				if (obj.Class == 'PEPoweredValveBlock')
11122				{
11123					v.style += 'shape=mxgraph.pid2valves.valve;verticalLabelPosition=bottom;verticalAlign=top;';
11124					v.style += addAllStyles(v.style, p, a, v);
11125
11126						if (p.poweredHandOperated == 1)
11127						{
11128							v.style += 'valveType=gate;actuator=powered;';
11129
11130							var item1 = new mxCell('', new mxGeometry(w * 0.325, 0, w * 0.35, h * 0.35), 'part=1;strokeColor=none;fillColor=none;spacingTop=2;');
11131							item1.vertex = true;
11132							v.insert(item1);
11133							item1.value = convertText(p.PoweredText);
11134							item1.style += (isLastLblHTML? '' :
11135								getFontColor(p.PoweredText) +
11136								getFontStyle(p.PoweredText) +
11137								getTextAlignment(p.PoweredText) +
11138								getTextLeftSpacing(p.PoweredText) +
11139								getTextRightSpacing(p.PoweredText) +
11140								getTextBottomSpacing(p.PoweredText) +
11141								getTextGlobalSpacing(p.PoweredText)
11142								) +
11143								'fontSize=6;' +
11144								getTextVerticalAlignment(p.PoweredText);
11145							item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
11146						}
11147						else
11148						{
11149							v.style += 'valveType=gate;';
11150						}
11151				}
11152				else
11153				{
11154					v.style += 'verticalLabelPosition=bottom;verticalAlign=top;shape=mxgraph.pid2valves.valve;';
11155
11156					v.value = convertText(p.Text);
11157
11158					switch (obj.Class)
11159					{
11160						case 'PEGateValveBlock' :
11161								v.style += 'valveType=gate;';
11162							break;
11163
11164						case 'PEGlobeValveBlock' :
11165								v.style += 'valveType=globe;';
11166							break;
11167
11168						case 'PEAngleValveBlock' :
11169								v.style += 'valveType=angle;';
11170							break;
11171
11172						case 'PEAngleGlobeValveBlock' :
11173								v.style += 'valveType=angleGlobe;flipH=1;';
11174							break;
11175					}
11176
11177
11178					if (p.handOperated == 1)
11179					{
11180						v.style += 'actuator=man;';
11181					}
11182				}
11183
11184				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
11185
11186				break;
11187
11188			case 'UI2BrowserBlock' :
11189				v.style += 'shape=mxgraph.mockup.containers.browserWindow;mainText=;';
11190
11191				if (p.vScroll == 1)
11192				{
11193					if (p.hScroll == 1)
11194					{
11195						var item3 = new mxCell('', new mxGeometry(1, 0, 20, h - 130), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11196					}
11197					else
11198					{
11199						var item3 = new mxCell('', new mxGeometry(1, 0, 20, h - 110), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11200					}
11201
11202				   	item3.geometry.relative = true;
11203				   	item3.geometry.offset = new mxPoint(-20, 110);
11204					item3.vertex = true;
11205					v.insert(item3);
11206
11207					v.style += 'spacingRight=20;';
11208				}
11209
11210				if (p.hScroll == 1)
11211				{
11212					if (p.vScroll == 1)
11213					{
11214						var item4 = new mxCell('', new mxGeometry(0, 1, w - 20, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11215					}
11216					else
11217					{
11218						var item4 = new mxCell('', new mxGeometry(0, 1, w, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11219					}
11220
11221				   	item4.geometry.relative = true;
11222				   	item4.geometry.offset = new mxPoint(0, -20);
11223					item4.vertex = true;
11224					v.insert(item4);
11225				}
11226
11227				v.style += addAllStyles(v.style, p, a, v);
11228				break;
11229			case 'UI2WindowBlock' :
11230				v.value = convertText(p.Title);
11231				v.style += 'shape=mxgraph.mockup.containers.window;mainText=;align=center;verticalAlign=top;spacing=5;' +
11232					(isLastLblHTML? 'fontSize=' + defaultFontSize + ';' :
11233					getFontSize(p.Title) +
11234					getFontColor(p.Title) +
11235					getFontStyle(p.Title));
11236
11237				if (p.vScroll == 1)
11238				{
11239					if (p.hScroll == 1)
11240					{
11241						var item3 = new mxCell('', new mxGeometry(1, 0, 20, h - 50), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11242					}
11243					else
11244					{
11245						var item3 = new mxCell('', new mxGeometry(1, 0, 20, h - 30), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11246					}
11247
11248				   	item3.geometry.relative = true;
11249				   	item3.geometry.offset = new mxPoint(-20, 30);
11250					item3.vertex = true;
11251					v.insert(item3);
11252
11253					v.style += 'spacingRight=20;';
11254				}
11255
11256				if (p.hScroll == 1)
11257				{
11258					if (p.vScroll == 1)
11259					{
11260						var item4 = new mxCell('', new mxGeometry(0, 1, w - 20, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11261					}
11262					else
11263					{
11264						var item4 = new mxCell('', new mxGeometry(0, 1, w, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11265					}
11266
11267				   	item4.geometry.relative = true;
11268				   	item4.geometry.offset = new mxPoint(0, -20);
11269					item4.vertex = true;
11270					v.insert(item4);
11271				}
11272
11273				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
11274
11275				break;
11276			case 'UI2DialogBlock' :
11277				v.value = convertText(p.Text);
11278				v.style +=
11279					getLabelStyle(p.Text, isLastLblHTML);
11280
11281				var item1 = new mxCell('', new mxGeometry(0, 0, w, 30), 'part=1;resizeHeight=0;');
11282				item1.vertex = true;
11283				v.insert(item1);
11284				item1.value = convertText(p.Title);
11285				item1.style += getLabelStyle(p.Title, isLastLblHTML);
11286				item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
11287
11288				var item2 = new mxCell('', new mxGeometry(1, 0.5, 20, 20), 'ellipse;part=1;strokeColor=#008cff;resizable=0;fillColor=none;html=1;');
11289			   	item2.geometry.relative = true;
11290			   	item2.geometry.offset = new mxPoint(-25, -10);
11291				item2.vertex = true;
11292				item1.insert(item2);
11293
11294				if (p.vScroll == 1)
11295				{
11296					if (p.hScroll == 1)
11297					{
11298						var item3 = new mxCell('', new mxGeometry(1, 0, 20, h - 50), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11299					}
11300					else
11301					{
11302						var item3 = new mxCell('', new mxGeometry(1, 0, 20, h - 30), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11303					}
11304
11305				   	item3.geometry.relative = true;
11306				   	item3.geometry.offset = new mxPoint(-20, 30);
11307					item3.vertex = true;
11308					v.insert(item3);
11309
11310					v.style += 'spacingRight=20;';
11311				}
11312
11313				if (p.hScroll == 1)
11314				{
11315					if (p.vScroll == 1)
11316					{
11317						var item4 = new mxCell('', new mxGeometry(0, 1, w - 20, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11318					}
11319					else
11320					{
11321						var item4 = new mxCell('', new mxGeometry(0, 1, w, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11322					}
11323
11324				   	item4.geometry.relative = true;
11325				   	item4.geometry.offset = new mxPoint(0, -20);
11326					item4.vertex = true;
11327					v.insert(item4);
11328				}
11329
11330				v.style += addAllStyles(v.style, p, a, v);
11331				p.Text = null;
11332				break;
11333			case 'UI2AccordionBlock' :
11334
11335				var item1 = new Array();
11336				var itemH = 25;
11337
11338				for (var i = 0; i <= (p.Panels - 1); i++)
11339				{
11340					if (i < (p.Selected - 1))
11341					{
11342						item1[i] = new mxCell('', new mxGeometry(0, i * itemH, w, itemH), 'part=1;fillColor=#000000;fillOpacity=25;');
11343						item1[i].vertex = true;
11344						v.insert(item1[i]);
11345						item1[i].value = convertText(p['Panel_' + (i + 1)]);
11346						item1[i].style +=
11347							getLabelStyle(p['Panel_' + (i + 1)], isLastLblHTML);
11348					}
11349					else if (i == (p.Selected - 1))
11350					{
11351						item1[i] = new mxCell('', new mxGeometry(0, i * itemH, w, itemH), 'part=1;fillColor=none;');
11352						item1[i].vertex = true;
11353						v.insert(item1[i]);
11354						item1[i].value = convertText(p['Panel_' + (i + 1)]);
11355						item1[i].style +=
11356							getLabelStyle(p['Panel_' + (i + 1)], isLastLblHTML);
11357					}
11358					else
11359					{
11360						item1[i] = new mxCell('', new mxGeometry(0, h - (p.Panels - p.Selected) * itemH + (i - p.Selected) * itemH, w, itemH), 'part=1;fillColor=#000000;fillOpacity=25;');
11361						item1[i].vertex = true;
11362						v.insert(item1[i]);
11363						item1[i].value = convertText(p['Panel_' + (i + 1)]);
11364						item1[i].style +=
11365							getLabelStyle(p['Panel_' + (i + 1)], isLastLblHTML);
11366					}
11367
11368					if (item1[i].style.indexOf(';align=') < 0)
11369					{
11370						item1[i].style += 'align=left;spacingLeft=5;';
11371					}
11372				}
11373
11374				var fc2 = getStrokeColor(p, a);
11375				fc2 = fc2.replace('strokeColor', 'fillColor2');
11376
11377				if (fc2 == '')
11378				{
11379					fc2 = 'fillColor2=#000000;'
11380				}
11381
11382				if (p.vScroll == 1)
11383				{
11384					if (p.hScroll == 1)
11385					{
11386						var item2 = new mxCell('', new mxGeometry(1, 0, 20, h - p.Selected * itemH -20 - (p.Panels - p.Selected) * itemH), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11387					}
11388					else
11389					{
11390						var item2 = new mxCell('', new mxGeometry(1, 0, 20, h - p.Selected * itemH - (p.Panels - p.Selected) * itemH), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11391					}
11392
11393				   	item2.geometry.relative = true;
11394				   	item2.geometry.offset = new mxPoint(-20, p.Selected * itemH);
11395					item2.vertex = true;
11396					v.insert(item2);
11397
11398					v.style += 'spacingRight=20;';
11399
11400					item2.style += fc2;
11401					item2.style += addAllStyles(item2.style, p, a, item2);
11402				}
11403
11404				if (p.hScroll == 1)
11405				{
11406					if (p.vScroll == 1)
11407					{
11408						var item3 = new mxCell('', new mxGeometry(0, 1, w - 20, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11409					}
11410					else
11411					{
11412						var item3 = new mxCell('', new mxGeometry(0, 1, w, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11413					}
11414
11415				   	item3.geometry.relative = true;
11416				   	item3.geometry.offset = new mxPoint(0, -20 - (p.Panels - p.Selected) * itemH);
11417					item3.vertex = true;
11418					v.insert(item3);
11419
11420					item3.style += fc2;
11421					item3.style += addAllStyles(item3.style, p, a, item3);
11422				}
11423
11424				if (p.vScroll == 1)
11425				{
11426					item4 = new mxCell('', new mxGeometry(0, p.Selected * itemH, w - 20, h - p.Selected * itemH -20 - (p.Panels - p.Selected) * itemH), 'part=1;fillColor=none;strokeColor=none;');
11427				}
11428				else
11429				{
11430					item4 = new mxCell('', new mxGeometry(0, p.Selected * itemH, w - 20, h - p.Selected * itemH - (p.Panels - p.Selected) * itemH), 'part=1;fillColor=none;strokeColor=none;');
11431				}
11432				item4.vertex = true;
11433				v.insert(item4);
11434				item4.value = convertText(p['Content_1']);
11435				item4.style +=
11436					getLabelStyle(p['Content_1'], isLastLblHTML);
11437
11438				if (!isLastLblHTML && item4.style.indexOf(';align=') < 0)
11439				{
11440					item4.style += 'align=left;spacingLeft=5;';
11441				}
11442
11443				v.style += addAllStyles(v.style, p, a, v);
11444
11445				break;
11446			case 'UI2TabBarContainerBlock' :
11447				v.style += 'strokeColor=none;fillColor=none;';
11448
11449				var item1 = new Array();
11450				var item2 = new Array();
11451				var itemH = 25;
11452				var itemS = 3; // tab spacing
11453				var itemW = (w + itemS) / (p.Tabs + 1);
11454				var startW = 10;
11455
11456				var bg = new mxCell('', new mxGeometry(0, itemH, w, h - itemH), 'part=1;');
11457				bg.vertex = true;
11458				v.insert(bg);
11459				bg.style += addAllStyles(bg.style, p, a, bg);
11460
11461				for (var i = 0; i <= (p.Tabs - 1); i++)
11462				{
11463					if (i == (p.Selected - 1))
11464					{
11465						item2[i] = new mxCell('', new mxGeometry(startW + i * itemW, 0, itemW - itemS, itemH), '');
11466						item2[i].vertex = true;
11467						v.insert(item2[i]);
11468						item2[i].value = convertText(p['Tab_' + (i + 1)]);
11469						item2[i].style +=
11470							getLabelStyle(p['Tab_' + (i + 1)], isLastLblHTML);
11471					}
11472					else
11473					{
11474						item1[i] = new mxCell('', new mxGeometry(startW + i * itemW, 0, itemW - itemS, itemH), 'strokeColor=none;');
11475						item1[i].vertex = true;
11476						v.insert(item1[i]);
11477						item1[i].style +=
11478							item1[i].style += addAllStyles(item1[i].style, p, a, item1[i]);
11479
11480						item2[i] = new mxCell('', new mxGeometry(0, 0, itemW - itemS, itemH), 'fillColor=#000000;fillOpacity=25;');
11481						item2[i].vertex = true;
11482						item1[i].insert(item2[i]);
11483						item2[i].value = convertText(p['Tab_' + (i + 1)]);
11484						item2[i].style +=
11485							getLabelStyle(p['Tab_' + (i + 1)], isLastLblHTML);
11486					}
11487
11488					if (item2[i].style.indexOf(';align=') < 0)
11489					{
11490						item2[i].style += 'align=left;spacingLeft=2;';
11491					}
11492
11493					item2[i].style += addAllStyles(item2[i].style, p, a, item2[i]);
11494				}
11495
11496				var fc2 = getStrokeColor(p, a);
11497				fc2 = fc2.replace('strokeColor', 'fillColor2');
11498
11499				if (fc2 == '')
11500				{
11501					fc2 = 'fillColor2=#000000;'
11502				}
11503
11504				if (p.vScroll == 1)
11505				{
11506					if (p.hScroll == 1)
11507					{
11508						var item2 = new mxCell('', new mxGeometry(1, 0, 20, h -20 - itemH), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11509					}
11510					else
11511					{
11512						var item2 = new mxCell('', new mxGeometry(1, 0, 20, h - itemH), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11513					}
11514
11515				   	item2.geometry.relative = true;
11516				   	item2.geometry.offset = new mxPoint(-20, itemH);
11517					item2.vertex = true;
11518					v.insert(item2);
11519
11520					v.style += 'spacingRight=20;';
11521
11522					item2.style += fc2;
11523					item2.style += addAllStyles(item2.style, p, a, item2);
11524				}
11525
11526				if (p.hScroll == 1)
11527				{
11528					if (p.vScroll == 1)
11529					{
11530						var item3 = new mxCell('', new mxGeometry(0, 1, w - 20, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11531					}
11532					else
11533					{
11534						var item3 = new mxCell('', new mxGeometry(0, 1, w, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11535					}
11536
11537				   	item3.geometry.relative = true;
11538				   	item3.geometry.offset = new mxPoint(0, -20);
11539					item3.vertex = true;
11540					v.insert(item3);
11541
11542					item3.style += fc2;
11543					item3.style += addAllStyles(item3.style, p, a, item3);
11544				}
11545
11546				break;
11547
11548			case 'UI2TabBar2ContainerBlock' :
11549				v.style += 'strokeColor=none;fillColor=none;';
11550
11551				var item1 = new Array();
11552				var item2 = new Array();
11553				var itemH = 25; // tab height
11554				var itemS = 3; // tab spacing
11555				var itemW = (w + itemS) / p.Tabs; //tab width (including spacing)
11556
11557				var bg = new mxCell('', new mxGeometry(0, itemH, w, h - itemH), 'part=1;');
11558				bg.vertex = true;
11559				v.insert(bg);
11560				bg.style += addAllStyles(bg.style, p, a, bg);
11561
11562				for (var i = 0; i <= (p.Tabs - 1); i++)
11563				{
11564					if (i == (p.Selected - 1))
11565					{
11566						item2[i] = new mxCell('', new mxGeometry(i * itemW, 0, itemW - itemS, itemH), '');
11567						item2[i].vertex = true;
11568						v.insert(item2[i]);
11569						item2[i].value = convertText(p['Tab_' + (i + 1)]);
11570						item2[i].style +=
11571							getLabelStyle(p['Tab_' + (i + 1)], isLastLblHTML);
11572						item2[i].style += addAllStyles(item2[i].style, p, a, item2[i], isLastLblHTML);
11573					}
11574					else
11575					{
11576						item1[i] = new mxCell('', new mxGeometry(i * itemW, 0, itemW - itemS, itemH), 'strokeColor=none;');
11577						item1[i].vertex = true;
11578						v.insert(item1[i]);
11579						item1[i].style += addAllStyles(item1[i].style, p, a, item1[i]);
11580
11581						item2[i] = new mxCell('', new mxGeometry(0, 0, itemW - itemS, itemH), 'fillColor=#000000;fillOpacity=25;');
11582						item2[i].vertex = true;
11583						item1[i].insert(item2[i]);
11584						item2[i].value = convertText(p['Tab_' + (i + 1)]);
11585						item2[i].style +=
11586							getLabelStyle(p['Tab_' + (i + 1)], isLastLblHTML);
11587						item2[i].style += addAllStyles(item2[i].style, p, a, item2[i], isLastLblHTML);
11588					}
11589
11590					if (item2[i].style.indexOf(';align=') < 0)
11591					{
11592						item2[i].style += 'align=left;spacingLeft=2;';
11593					}
11594				}
11595
11596				var fc2 = getStrokeColor(p, a);
11597				fc2 = fc2.replace('strokeColor', 'fillColor2');
11598
11599				if (fc2 == '')
11600				{
11601					fc2 = 'fillColor2=#000000;'
11602				}
11603
11604				if (p.vScroll == 1)
11605				{
11606					if (p.hScroll == 1)
11607					{
11608						var item2 = new mxCell('', new mxGeometry(1, 0, 20, h -20 - itemH), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11609					}
11610					else
11611					{
11612						var item2 = new mxCell('', new mxGeometry(1, 0, 20, h - itemH), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11613					}
11614
11615				   	item2.geometry.relative = true;
11616				   	item2.geometry.offset = new mxPoint(-20, itemH);
11617					item2.vertex = true;
11618					v.insert(item2);
11619
11620					v.style += 'spacingRight=20;';
11621
11622					item2.style += fc2;
11623					item2.style += addAllStyles(item2.style, p, a, item2);
11624				}
11625
11626				if (p.hScroll == 1)
11627				{
11628					if (p.vScroll == 1)
11629					{
11630						var item3 = new mxCell('', new mxGeometry(0, 1, w - 20, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11631					}
11632					else
11633					{
11634						var item3 = new mxCell('', new mxGeometry(0, 1, w, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11635					}
11636
11637				   	item3.geometry.relative = true;
11638				   	item3.geometry.offset = new mxPoint(0, -20);
11639					item3.vertex = true;
11640					v.insert(item3);
11641
11642					item3.style += fc2;
11643					item3.style += addAllStyles(item3.style, p, a, item3);
11644				}
11645
11646				break;
11647
11648			case 'UI2VTabBarContainerBlock' :
11649				v.style += 'strokeColor=none;fillColor=none;';
11650
11651				var item1 = new Array();
11652				var item2 = new Array();
11653				var itemS = 3; // tab spacing
11654				var itemH = 25 + itemS; // tab height (including spacing)
11655				var itemW = 80; //tab width
11656				var startH = 10;
11657
11658				var bg = new mxCell('', new mxGeometry(itemW, 0, w - itemW, h), 'part=1;');
11659				bg.vertex = true;
11660				v.insert(bg);
11661				bg.style += addAllStyles(bg.style, p, a, bg);
11662
11663				for (var i = 0; i <= (p.Tabs - 1); i++)
11664				{
11665					if (i == (p.Selected - 1))
11666					{
11667						item2[i] = new mxCell('', new mxGeometry(0, startH + i * itemH, itemW, itemH - itemS), '');
11668						item2[i].vertex = true;
11669						v.insert(item2[i]);
11670						item2[i].value = convertText(p['Tab_' + (i + 1)]);
11671						item2[i].style +=
11672							getLabelStyle(p['Tab_' + (i + 1)], isLastLblHTML);
11673						item2[i].style += addAllStyles(item2[i].style, p, a, item2[i], isLastLblHTML);
11674					}
11675					else
11676					{
11677						item1[i] = new mxCell('', new mxGeometry(0, startH + i * itemH, itemW, itemH - itemS), 'strokeColor=none;');
11678						item1[i].vertex = true;
11679						v.insert(item1[i]);
11680						item1[i].style += addAllStyles(item1[i].style, p, a, item1[i]);
11681
11682						item2[i] = new mxCell('', new mxGeometry(0, 0, itemW, itemH - itemS), 'fillColor=#000000;fillOpacity=25;');
11683						item2[i].vertex = true;
11684						item1[i].insert(item2[i]);
11685						item2[i].value = convertText(p['Tab_' + (i + 1)]);
11686						item2[i].style +=
11687							getLabelStyle(p['Tab_' + (i + 1)], isLastLblHTML);
11688					}
11689
11690					if (item2[i].style.indexOf(';align=') < 0)
11691					{
11692						item2[i].style += 'align=left;spacingLeft=2;';
11693					}
11694
11695					item2[i].style += addAllStyles(item2[i].style, p, a, item2[i]);
11696				}
11697
11698				var fc2 = getStrokeColor(p, a);
11699				fc2 = fc2.replace('strokeColor', 'fillColor2');
11700
11701				if (fc2 == '')
11702				{
11703					fc2 = 'fillColor2=#000000;'
11704				}
11705
11706				if (p.vScroll == 1)
11707				{
11708					if (p.hScroll == 1)
11709					{
11710						var item2 = new mxCell('', new mxGeometry(1, 0, 20, h -20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11711					}
11712					else
11713					{
11714						var item2 = new mxCell('', new mxGeometry(1, 0, 20, h), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=95;direction=north;resizeHeight=1;');
11715					}
11716
11717				   	item2.geometry.relative = true;
11718				   	item2.geometry.offset = new mxPoint(-20, 0);
11719					item2.vertex = true;
11720					v.insert(item2);
11721
11722					v.style += 'spacingRight=20;';
11723
11724					item2.style += fc2;
11725					item2.style += addAllStyles(item2.style, p, a, item2);
11726				}
11727
11728				if (p.hScroll == 1)
11729				{
11730					if (p.vScroll == 1)
11731					{
11732						var item3 = new mxCell('', new mxGeometry(itemW, 1, w - 20 - itemW, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11733					}
11734					else
11735					{
11736						var item3 = new mxCell('', new mxGeometry(itemW, 1, w - itemW, 20), 'part=1;shape=mxgraph.mockup.navigation.scrollBar;barPos=5;resizeWidth=1;');
11737					}
11738
11739				   	item3.geometry.relative = true;
11740				   	item3.geometry.offset = new mxPoint(0, -20);
11741					item3.vertex = true;
11742					v.insert(item3);
11743
11744					item3.style += fc2;
11745					item3.style += addAllStyles(item3.style, p, a, item3);
11746				}
11747
11748				break;
11749			case 'UI2CheckBoxBlock' :
11750				v.style += 'strokeColor=none;fillColor=none;';
11751
11752				var itemH = h / p.Options;
11753				var item1 = new Array(); //checkbox
11754				var item2 = new Array(); //checkmark
11755
11756				for (var i = 0; i < p.Options; i++)
11757				{
11758					item1[i] = new mxCell('', new mxGeometry(0, i * itemH + itemH * 0.5 - 5, 10, 10), 'labelPosition=right;part=1;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=3;');
11759					item1[i].vertex = true;
11760					v.insert(item1[i]);
11761					item1[i].value = convertText(p['Option_' + (i + 1)]);
11762					item1[i].style +=
11763						getLabelStyle(p['Option_' + (i + 1)], isLastLblHTML);
11764					item1[i].style += addAllStyles(item1[i].style, p, a, item1[i], isLastLblHTML);
11765
11766					if (p.Selected[i + 1] != null)
11767					{
11768						if (p.Selected[i + 1] == 1)
11769						{
11770							var fc = getStrokeColor(p, a);
11771							fc = fc.replace('strokeColor', 'fillColor');
11772
11773							if (fc == '')
11774							{
11775								fc = 'fillColor=#000000;'
11776							}
11777
11778							item2[i] = new mxCell('', new mxGeometry(2, 2, 6, 6), 'shape=mxgraph.mscae.general.checkmark;part=1;');
11779							item2[i].vertex = true;
11780							item1[i].insert(item2[i]);
11781							item2[i].style += fc;
11782							item2[i].style += addAllStyles(item2[i].style, p, a, item2[i]);
11783						}
11784					}
11785
11786				}
11787
11788				break;
11789			case 'UI2HorizontalCheckBoxBlock' :
11790				v.style += 'strokeColor=none;fillColor=none;';
11791
11792				var itemW = w / p.Options;
11793				var item1 = new Array(); //checkbox
11794				var item2 = new Array(); //checkmark
11795
11796				for (var i = 0; i < p.Options; i++)
11797				{
11798					item1[i] = new mxCell('', new mxGeometry(i * itemW, h * 0.5 - 5, 10, 10), 'labelPosition=right;part=1;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=3;');
11799					item1[i].vertex = true;
11800					v.insert(item1[i]);
11801					item1[i].value = convertText(p['Option_' + (i + 1)]);
11802					item1[i].style +=
11803						getLabelStyle(p['Option_' + (i + 1)], isLastLblHTML);
11804					item1[i].style += addAllStyles(item1[i].style, p, a, item1[i], isLastLblHTML);
11805
11806					if (p.Selected[i + 1] != null)
11807					{
11808						if (p.Selected[i + 1] == 1)
11809						{
11810							var fc = getStrokeColor(p, a);
11811							fc = fc.replace('strokeColor', 'fillColor');
11812
11813							if (fc == '')
11814							{
11815								fc = 'fillColor=#000000;'
11816							}
11817
11818							item2[i] = new mxCell('', new mxGeometry(2, 2, 6, 6), 'shape=mxgraph.mscae.general.checkmark;part=1;');
11819							item2[i].vertex = true;
11820							item1[i].insert(item2[i]);
11821							item2[i].style += fc;
11822							item2[i].style += addAllStyles(item2[i].style, p, a, item2[i]);
11823						}
11824					}
11825
11826				}
11827
11828				break;
11829			case 'UI2RadioBlock' :
11830				v.style += 'strokeColor=none;fillColor=none;';
11831
11832				var itemH = h / p.Options;
11833				var item1 = new Array(); //checkbox
11834				var item2 = new Array(); //checkmark
11835
11836				for (var i = 0; i < p.Options; i++)
11837				{
11838					item1[i] = new mxCell('', new mxGeometry(0, i * itemH + itemH * 0.5 - 5, 10, 10), 'ellipse;labelPosition=right;part=1;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=3;');
11839					item1[i].vertex = true;
11840					v.insert(item1[i]);
11841					item1[i].value = convertText(p['Option_' + (i + 1)]);
11842					item1[i].style +=
11843						getLabelStyle(p['Option_' + (i + 1)], isLastLblHTML);
11844					item1[i].style += addAllStyles(item1[i].style, p, a, item1[i], isLastLblHTML);
11845
11846					if (p.Selected != null)
11847					{
11848						if (p.Selected == (i + 1))
11849						{
11850							var fc = getStrokeColor(p, a);
11851							fc = fc.replace('strokeColor', 'fillColor');
11852
11853							if (fc == '')
11854							{
11855								fc = 'fillColor=#000000;'
11856							}
11857
11858							item2[i] = new mxCell('', new mxGeometry(2.5, 2.5, 5, 5), 'ellipse;');
11859							item2[i].vertex = true;
11860							item1[i].insert(item2[i]);
11861							item2[i].style += fc;
11862							item2[i].style += addAllStyles(item2[i].style, p, a, item2[i]);
11863						}
11864					}
11865				}
11866
11867				break;
11868			case 'UI2HorizontalRadioBlock' :
11869				v.style += 'strokeColor=none;fillColor=none;';
11870
11871				var itemW = w / p.Options;
11872				var item1 = new Array(); //checkbox
11873				var item2 = new Array(); //checkmark
11874
11875				for (var i = 0; i < p.Options; i++)
11876				{
11877					item1[i] = new mxCell('', new mxGeometry(i * itemW, h * 0.5 - 5, 10, 10), 'ellipse;labelPosition=right;part=1;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacingLeft=3;');
11878					item1[i].vertex = true;
11879					v.insert(item1[i]);
11880					item1[i].value = convertText(p['Option_' + (i + 1)]);
11881					item1[i].style +=
11882						getLabelStyle(p['Option_' + (i + 1)], isLastLblHTML);
11883					item1[i].style += addAllStyles(item1[i].style, p, a, item1[i], isLastLblHTML);
11884
11885					if (p.Selected != null)
11886					{
11887						if (p.Selected == (i + 1))
11888						{
11889							var fc = getStrokeColor(p, a);
11890							fc = fc.replace('strokeColor', 'fillColor');
11891
11892							if (fc == '')
11893							{
11894								fc = 'fillColor=#000000;'
11895							}
11896
11897							item2[i] = new mxCell('', new mxGeometry(2, 2, 6, 6), 'ellipse;part=1;');
11898							item2[i].vertex = true;
11899							item1[i].insert(item2[i]);
11900							item2[i].style += fc;
11901							item2[i].style += addAllStyles(item2[i].style, p, a, item2[i]);
11902						}
11903					}
11904
11905				}
11906
11907				break;
11908			case 'UI2SelectBlock' :
11909				v.style += 'shape=mxgraph.mockup.forms.comboBox;strokeColor=#999999;fillColor=#ddeeff;align=left;fillColor2=#aaddff;mainText=;fontColor=#666666';
11910				v.value = convertText(p.Selected);
11911				break;
11912			case 'UI2HSliderBlock' :
11913			case 'UI2VSliderBlock' :
11914				v.style += 'shape=mxgraph.mockup.forms.horSlider;sliderStyle=basic;handleStyle=handle;';
11915
11916				if (obj.Class == 'UI2VSliderBlock')
11917				{
11918					v.style += 'direction=south;';
11919				}
11920
11921				v.style += 'sliderPos=' + (p.ScrollVal * 100) + ';';
11922				v.style += addAllStyles(v.style, p, a, v);
11923
11924				break;
11925
11926			case 'UI2DatePickerBlock' :
11927				v.style += 'strokeColor=none;fillColor=none;';
11928
11929				var item1 = new mxCell('', new mxGeometry(0, 0, w * 0.6, h), 'part=1;');
11930				item1.vertex = true;
11931				v.insert(item1);
11932				item1.value = convertText(p.Date);
11933				item1.style +=
11934					getLabelStyle(p.Date, isLastLblHTML);
11935				v.style += addAllStyles(v.style, p, a, v);
11936
11937				var fc = getStrokeColor(p, a);
11938				fc = fc.replace('strokeColor', 'fillColor');
11939
11940				if (fc == '')
11941				{
11942					fc = 'fillColor=#000000;'
11943				}
11944
11945				var item2 = new mxCell('', new mxGeometry(w * 0.75, 0, w * 0.25, h), 'part=1;shape=mxgraph.gmdl.calendar;');
11946				item2.vertex = true;
11947				v.insert(item2);
11948				item2.style += fc;
11949				item2.style += addAllStyles(item2.style, p, a, item2);
11950
11951				break;
11952
11953			case 'UI2SearchBlock' :
11954				v.value = convertText(p.Search);
11955				v.style += 'shape=mxgraph.mockup.forms.searchBox;mainText=;flipH=1;align=left;spacingLeft=26;' +
11956					getLabelStyle(p.Search, isLastLblHTML);
11957				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
11958
11959				break;
11960
11961			case 'UI2NumericStepperBlock' :
11962				var fc = getStrokeColor(p, a);
11963				fc = fc.replace('strokeColor', 'fillColor');
11964
11965				if (fc == '')
11966				{
11967					fc = 'fillColor=#000000;'
11968				}
11969
11970				v.value = convertText(p.Number);
11971				v.style += 'shape=mxgraph.mockup.forms.spinner;spinLayout=right;spinStyle=normal;adjStyle=triangle;mainText=;align=left;spacingLeft=8;' + fc +
11972					getLabelStyle(p.Number, isLastLblHTML);
11973				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
11974
11975				break;
11976
11977			case 'UI2TableBlock' :
11978				//Create table as HTML one
11979				try
11980				{
11981					var fillClr = getColor(p.FillColor), lineClr = getColor(p.LineColor), header, altRow, borderStyle = '', rowH = 20;
11982					v.style = 'html=1;overflow=fill;verticalAlign=top;spacing=0;';
11983					var htmlTable = '<table style="width:100%;height:100%;border-collapse: collapse;border: 1px solid ' + lineClr + ';">';
11984					var csvLines = p.Data.split('\n');
11985
11986					if (!p.AltRow || p.AltRow == 'default')
11987					{
11988						altRow = getDarkerClr(fillClr, 0.95);
11989					}
11990					else if (p.AltRow == 'none')
11991					{
11992						altRow = fillClr;
11993					}
11994					else
11995					{
11996						altRow = getColor(p.AltRow);
11997					}
11998
11999					if (!p.Header || p.Header == 'default')
12000					{
12001						header = getDarkerClr(fillClr, 0.8);
12002					}
12003					else if (p.Header == 'none')
12004					{
12005						header = altRow;
12006					}
12007					else
12008					{
12009						header = getColor(p.Header);
12010					}
12011
12012					if (p.GridLines == 'full')
12013					{
12014						borderStyle = 'border: 1px solid ' + lineClr;
12015						rowH = 19;
12016					}
12017					else if (p.GridLines == 'row')
12018					{
12019						borderStyle = 'border-bottom: 1px solid ' + lineClr;
12020						rowH = 19;
12021					}
12022					else if (p.GridLines == 'default' || p.GridLines == 'column')
12023					{
12024						borderStyle = 'border-right: 1px solid ' + lineClr;
12025					}
12026
12027					csvLines = csvLines.filter(function(l)
12028					{
12029						return l;
12030					});
12031
12032					if (/^\{[^}]*\}$/.test(csvLines[csvLines.length - 1]))
12033					{
12034						csvLines.pop();
12035					}
12036
12037					var cols = csvLines[0].split(',').length;
12038
12039					var emptyRow = '';
12040
12041					for (var j = 0; j < cols - 1; j++)
12042					{
12043						emptyRow += ' , ';
12044					}
12045
12046					for (var i = csvLines.length; i < Math.ceil(h / 20); i++)
12047					{
12048						csvLines.push(emptyRow)
12049					}
12050
12051					for (var i = 0; i < csvLines.length; i++)
12052					{
12053						htmlTable += '<tr style="height: ' + rowH + 'px;background:' + (i == 0? header :
12054								(i % 2? fillClr : altRow)) + '">';
12055						var els = csvLines[i].split(',');
12056
12057						for (var j = 0; j < els.length; j++)
12058						{
12059							var cellProp = p['Cell_' + i + '_' + j];
12060							var txtClr = cellProp && cellProp.m && cellProp.m[0] && cellProp.m[0].n == 'c'?  getColor(cellProp.m[0].v) : lineClr;
12061							htmlTable += '<td style="height: ' + rowH + 'px;color:' + txtClr + ';' + borderStyle + '">' + mxUtils.htmlEntities(els[j]) + '</td>';
12062						}
12063
12064						htmlTable += '</tr>';
12065					}
12066
12067					htmlTable += '</table>';
12068					v.value = htmlTable;
12069				}
12070				catch(e)
12071				{
12072					//Ignore
12073					console.log(e);
12074				}
12075				break;
12076			case 'UI2ButtonBarBlock' :
12077				v.style += addAllStyles(v.style, p, a, v);
12078
12079				var item1 = new Array();
12080				var item2 = new Array();
12081				var itemW = w / p.Buttons;
12082
12083				for (var i = 0; i <= (p.Buttons - 1); i++)
12084				{
12085					if (i == (p.Selected - 1))
12086					{
12087						item2[i] = new mxCell('', new mxGeometry(i * itemW, 0, itemW, h), '');
12088						item2[i].vertex = true;
12089						v.insert(item2[i]);
12090						item2[i].value = convertText(p['Button_' + (i + 1)]);
12091						item2[i].style +=
12092							getLabelStyle(p['Button_' + (i + 1)], isLastLblHTML);
12093						item2[i].style += addAllStyles(item2[i].style, p, a, item2[i], isLastLblHTML);
12094					}
12095					else
12096					{
12097						item1[i] = new mxCell('', new mxGeometry(i * itemW, 0, itemW, h), 'strokeColor=none;');
12098						item1[i].vertex = true;
12099						v.insert(item1[i]);
12100						item1[i].style +=
12101							item1[i].style += addAllStyles(item1[i].style, p, a, item1[i]);
12102
12103						item2[i] = new mxCell('', new mxGeometry(0, 0, itemW, h), 'fillColor=#000000;fillOpacity=25;');
12104						item2[i].vertex = true;
12105						item1[i].insert(item2[i]);
12106						item2[i].value = convertText(p['Button_' + (i + 1)]);
12107						item2[i].style +=
12108							getLabelStyle(p['Button_' + (i + 1)], isLastLblHTML);
12109						item2[i].style += addAllStyles(item2[i].style, p, a, item2[i], isLastLblHTML);
12110					}
12111				}
12112
12113				break;
12114
12115			case 'UI2VerticalButtonBarBlock' :
12116				v.style += addAllStyles(v.style, p, a, v);
12117
12118				var item1 = new Array();
12119				var item2 = new Array();
12120				var itemH = h / p.Buttons;
12121
12122				for (var i = 0; i <= (p.Buttons - 1); i++)
12123				{
12124					if (i == (p.Selected - 1))
12125					{
12126						item2[i] = new mxCell('', new mxGeometry(0, i * itemH, w, itemH), '');
12127						item2[i].vertex = true;
12128						v.insert(item2[i]);
12129						item2[i].value = convertText(p['Button_' + (i + 1)]);
12130						item2[i].style +=
12131							getLabelStyle(p['Button_' + (i + 1)], isLastLblHTML);
12132						item2[i].style += addAllStyles(item2[i].style, p, a, item2[i], isLastLblHTML);
12133					}
12134					else
12135					{
12136						item1[i] = new mxCell('', new mxGeometry(0, i * itemH, w, itemH), 'strokeColor=none;');
12137						item1[i].vertex = true;
12138						v.insert(item1[i]);
12139						item1[i].style += addAllStyles(item1[i].style, p, a, item1[i]);
12140
12141						item2[i] = new mxCell('', new mxGeometry(0, 0, w, itemH), 'fillColor=#000000;fillOpacity=25;');
12142						item2[i].vertex = true;
12143						item1[i].insert(item2[i]);
12144						item2[i].value = convertText(p['Button_' + (i + 1)]);
12145						item2[i].style +=
12146							getLabelStyle(p['Button_' + (i + 1)], isLastLblHTML);
12147						item2[i].style += addAllStyles(item2[i].style, p, a, item2[i], isLastLblHTML);
12148					}
12149				}
12150
12151				break;
12152			case 'UI2LinkBarBlock' :
12153				v.style += 'strokeColor=none;fillColor=none;';
12154				v.style += addAllStyles(v.style, p, a, v);
12155
12156				var item1 = new Array();
12157				var item2 = new Array();
12158				var itemW = w / p.Links;
12159
12160				for (var i = 0; i < (p.Links); i++)
12161				{
12162					if (i != 0)
12163					{
12164						item2[i] = new mxCell('', new mxGeometry(i * itemW, 0, itemW, h), 'shape=partialRectangle;top=0;bottom=0;right=0;fillColor=none;');
12165						item2[i].style += addAllStyles(item2[i].style, p, a, item2[i]);
12166					}
12167					else
12168					{
12169						item2[i] = new mxCell('', new mxGeometry(i * itemW, 0, itemW, h), 'fillColor=none;strokeColor=none;');
12170					}
12171
12172					item2[i].vertex = true;
12173					v.insert(item2[i]);
12174					item2[i].value = convertText(p['Link_' + (i + 1)]);
12175					item2[i].style +=
12176						getLabelStyle(p['Link_' + (i + 1)], isLastLblHTML);
12177				}
12178
12179				break;
12180
12181			case 'UI2BreadCrumbsBlock' :
12182				v.style += 'strokeColor=none;fillColor=none;';
12183				v.style += addAllStyles(v.style, p, a, v);
12184
12185				var item1 = new Array();
12186				var item2 = new Array();
12187				var itemW = w / p.Links;
12188
12189				for (var i = 0; i < (p.Links); i++)
12190				{
12191					item1[i] = new mxCell('', new mxGeometry(i * itemW, 0, itemW, h), 'fillColor=none;strokeColor=none;');
12192					item1[i].vertex = true;
12193					v.insert(item1[i]);
12194					item1[i].value = convertText(p['Link_' + (i + 1)]);
12195					item1[i].style +=
12196						getLabelStyle(p['Link_' + (i + 1)], isLastLblHTML);
12197				}
12198
12199				for (var i = 1; i < (p.Links); i++)
12200				{
12201					item2[i] = new mxCell('', new mxGeometry(i / p.Links, 0.5, 6, 10), 'shape=mxgraph.ios7.misc.right;');
12202					item2[i].geometry.relative = true;
12203					item2[i].geometry.offset = new mxPoint(-3, -5);
12204					item2[i].vertex = true;
12205					v.insert(item2[i]);
12206				}
12207
12208				break;
12209			case 'UI2MenuBarBlock' :
12210				v.style += 'strokeColor=none;';
12211				v.style += addAllStyles(v.style, p, a, v);
12212
12213				var item1 = new Array();
12214				var itemW = w / (p.Buttons + 1);
12215
12216				for (var i = 0; i <= (p.Buttons - 1); i++)
12217				{
12218					if (i != (p.Selected - 1))
12219					{
12220						item1[i] = new mxCell('', new mxGeometry(0, 0, itemW, h), 'strokeColor=none;fillColor=none;resizeHeight=1;');
12221					}
12222					else
12223					{
12224						item1[i] = new mxCell('', new mxGeometry(0, 0, itemW, h), 'fillColor=#000000;fillOpacity=25;strokeColor=none;resizeHeight=1;');
12225					}
12226
12227					item1[i].geometry.relative = true;
12228					item1[i].geometry.offset = new mxPoint(i * itemW, 0);
12229					item1[i].vertex = true;
12230					v.insert(item1[i]);
12231					item1[i].value = convertText(p['MenuItem_' + (i + 1)]);
12232					item1[i].style +=
12233						getLabelStyle(p['MenuItem_' + (i + 1)], isLastLblHTML);
12234				}
12235
12236				break;
12237			case 'UI2AtoZBlock' :
12238				v.style += 'fillColor=none;strokeColor=none;' +
12239					getLabelStyle(p['Text_0']);
12240
12241				v.value = '0-9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z';
12242
12243				break;
12244
12245			case 'UI2PaginationBlock' :
12246				v.style += 'fillColor=none;strokeColor=none;' +
12247					getLabelStyle(p.Text_prev);
12248
12249				v.value = convertText(p.Text_prev) + ' ';
12250
12251				for (var i = 0; i < p.Links; i++)
12252				{
12253					v.value += convertText(p['Link_' + (i + 1)]) + ' ';
12254				}
12255
12256				v.value += convertText(p.Text_next);
12257
12258				break;
12259
12260			case 'UI2ContextMenuBlock' :
12261				v.style += addAllStyles(v.style, p, a, v);
12262
12263				var item = new Array();
12264				var icon = new Array();
12265				var shortcut = new Array();
12266				var itemH = h / p.Lines;
12267				var st = null;
12268
12269				for (var i = 0; i < p.Lines; i++)
12270				{
12271					//add label
12272					if (p['Item_' + (i + 1)] != null)
12273					{
12274						if (st == null)
12275						{
12276							st = '' +
12277								getFontSize(p['Item_' + (i + 1)]) +
12278								getFontColor(p['Item_' + (i + 1)]) +
12279								getFontStyle(p['Item_' + (i + 1)]);
12280						}
12281
12282						item[i] = new mxCell('', new mxGeometry(0, i * h / p.Lines, w, itemH), 'strokeColor=none;fillColor=none;spacingLeft=20;align=left;html=1;');
12283						item[i].vertex = true;
12284						v.insert(item[i]);
12285						item[i].style += st;
12286
12287						item[i].value = convertText(p['Item_' + (i + 1)]);
12288					}
12289
12290					//add icon
12291					if (p.Icons[(i + 1)] != null && item[i] != null)
12292					{
12293						if (p.Icons[(i + 1)] == 'dot')
12294						{
12295							icon[i] = new mxCell('', new mxGeometry(0, 0.5, 8, 8), 'ellipse;strokeColor=none;');
12296							icon[i].geometry.offset = new mxPoint(6, -4);
12297						}
12298						else if (p.Icons[(i + 1)] == 'check')
12299						{
12300							icon[i] = new mxCell('', new mxGeometry(0, 0.5, 7, 8), 'shape=mxgraph.mscae.general.checkmark;strokeColor=none;');
12301							icon[i].geometry.offset = new mxPoint(6.5, -4);
12302						}
12303
12304						if (icon[i] != null)
12305						{
12306							icon[i].geometry.relative = true;
12307							icon[i].vertex = true;
12308							item[i].insert(icon[i]);
12309
12310							var fc = getStrokeColor(p, a);
12311							fc = fc.replace('strokeColor', 'fillColor');
12312
12313							if (fc == '')
12314							{
12315								fc = 'fillColor=#000000;'
12316							}
12317
12318							icon[i].style += fc;
12319						}
12320					}
12321
12322					//add shortcut
12323					if (p['Shortcut_' + (i + 1)] != null)
12324					{
12325						if (st == null)
12326						{
12327							st = '' +
12328								getFontSize(p['Shortcut_' + (i + 1)]) +
12329								getFontColor(p['Shortcut_' + (i + 1)]) +
12330								getFontStyle(p['Shortcut_' + (i + 1)]);
12331						}
12332
12333						shortcut[i] = new mxCell('', new mxGeometry(w * 0.6, i * h / p.Lines, w * 0.4, itemH), 'strokeColor=none;fillColor=none;spacingRight=3;align=right;html=1;');
12334						shortcut[i].vertex = true;
12335						v.insert(shortcut[i]);
12336						shortcut[i].style += st;
12337
12338						shortcut[i].value = convertText(p['Shortcut_' + (i + 1)]);
12339					}
12340
12341					//add line
12342					if (p.Dividers[(i + 1)] != null)
12343					{
12344						item[i] = new mxCell('', new mxGeometry(w * 0.05, i * h / p.Lines, w * 0.9, itemH), 'shape=line;strokeWidth=1;');
12345						item[i].vertex = true;
12346						v.insert(item[i]);
12347						item[i].style += getStrokeColor(p, a);
12348					}
12349				}
12350
12351				break;
12352			case 'UI2TreePaneBlock' :
12353				break;
12354
12355			case 'UI2ProgressBarBlock' :
12356				v.style += 'shape=mxgraph.mockup.misc.progressBar;fillColor2=#888888;barPos=' + (p.ScrollVal * 100) + ';';
12357
12358				break;
12359
12360			case 'CalloutSquareBlock':
12361			case 'UI2TooltipSquareBlock' :
12362				v.value = convertText(p.Tip || p.Text);
12363				v.style += 'html=1;shape=callout;flipV=1;base=13;size=7;position=0.5;position2=0.66;rounded=1;arcSize=' + (p.RoundCorners) + ';' +
12364					getLabelStyle(p.Tip || p.Text, isLastLblHTML);
12365				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
12366				v.geometry.height += 10;
12367				break;
12368			case 'UI2CalloutBlock' :
12369				v.value = convertText(p.Txt);
12370				v.style += 'shape=ellipse;perimeter=ellipsePerimeter;' +
12371					getLabelStyle(p.Txt, isLastLblHTML);
12372				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
12373
12374				break;
12375
12376			case 'UI2AlertBlock' :
12377				v.value = convertText(p.Txt);
12378				v.style +=
12379					getLabelStyle(p.Txt, isLastLblHTML);
12380				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
12381
12382				var item1 = new mxCell('', new mxGeometry(0, 0, w, 30), 'part=1;resizeHeight=0;');
12383				item1.vertex = true;
12384				v.insert(item1);
12385				item1.value = convertText(p.Title);
12386				item1.style +=
12387					getLabelStyle(p.Title, isLastLblHTML);
12388				item1.style += addAllStyles(item1.style, p, a, item1, isLastLblHTML);
12389
12390				var item2 = new mxCell('', new mxGeometry(1, 0.5, 20, 20), 'ellipse;part=1;strokeColor=#008cff;resizable=0;fillColor=none;html=1;');
12391			   	item2.geometry.relative = true;
12392			   	item2.geometry.offset = new mxPoint(-25, -10);
12393				item2.vertex = true;
12394				item1.insert(item2);
12395
12396				var bw = 45;
12397				var bh = 20;
12398				var bs = 10;
12399				var totalW = bw * p.Buttons + (bs * p.Buttons - 1)
12400
12401				item3 = new Array();
12402
12403				for (var i = 0; i < p.Buttons; i++)
12404				{
12405					item3[i] = new mxCell('', new mxGeometry(0.5, 1, bw, bh), 'part=1;html=1;');
12406				   	item3[i].geometry.relative = true;
12407				   	item3[i].geometry.offset = new mxPoint(-totalW * 0.5 + i * (bw + bs), -40);
12408					item3[i].vertex = true;
12409					v.insert(item3[i]);
12410					item3[i].value = convertText(p['Button_' + (i + 1)]);
12411					item3[i].style +=
12412						getLabelStyle(p['Button_' + (i + 1)], isLastLblHTML);
12413					item3[i].style += addAllStyles(item3[i].style, p, a, item3[i], isLastLblHTML);
12414				}
12415
12416				break;
12417
12418			case 'UMLClassBlock' :
12419				if (p.Simple == 0)
12420				{
12421					var st = getFillColor(p, a);
12422					var th = Math.round(p.TitleHeight * scale) || 25;
12423					st = st.replace('fillColor', 'swimlaneFillColor');
12424
12425					if (st == '')
12426					{
12427						st = 'swimlaneFillColor=#ffffff;'
12428					}
12429
12430					v.value = convertText(p.Title);
12431					v.style += 'swimlane;childLayout=stackLayout;horizontal=1;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;fontStyle=0;marginBottom=0;' + st +
12432						'startSize=' + th + ';' +
12433						getLabelStyle(p.Title, isLastLblHTML);
12434					v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
12435
12436					var item = new Array();
12437					var divider = new Array();
12438					var currH = th / h;
12439					var curY = th;
12440
12441					for (var i = 0; i <= p.Attributes; i++)
12442					{
12443						if (i > 0)
12444						{
12445							divider[i] = new mxCell('', new mxGeometry(0, curY, 40, 8), 'line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;');
12446							curY += 8;
12447							divider[i].vertex = true;
12448							v.insert(divider[i]);
12449						}
12450
12451						var itemH = 0;
12452
12453						//Text2 is used when p.Attributes is zero!
12454						if (p.Attributes == 0)
12455						{
12456							i = 1;
12457							itemH = 1;
12458						}
12459						else
12460						{
12461							if (i < p.Attributes)
12462							{
12463								itemH = p['Text' + (i + 1) + 'Percent'];
12464								currH += itemH;
12465							}
12466							else
12467							{
12468								itemH = 1 - currH;
12469							}
12470						}
12471
12472						var extH = p.ExtraHeightSet && i == 1? (p.ExtraHeight * scale) : 0;
12473
12474						var curH = Math.round((h - th) * itemH) + extH;
12475						item[i] = new mxCell('', new mxGeometry(0, curY, w, curH), 'part=1;html=1;whiteSpace=wrap;resizeHeight=0;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;');
12476						curY += curH;
12477						item[i].vertex = true;
12478						v.insert(item[i]);
12479						item[i].style += st +
12480							getOpacity(p, a, item[i]) +
12481							getLabelStyle(p['Text' + (i + 1)], isLastLblHTML);
12482
12483						item[i].value = convertText(p['Text' + (i + 1)]);
12484					}
12485				}
12486				else
12487				{
12488					v.value = convertText(p.Title);
12489					v.style += 'align=center;';
12490					v.style +=
12491						getLabelStyle(p.Title, isLastLblHTML);
12492					v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
12493				}
12494
12495				break;
12496
12497			case 'ERDEntityBlock' :
12498				var st = getFillColor(p, a);
12499				var th = p.Name_h * scale;
12500				st = st.replace('fillColor', 'swimlaneFillColor');
12501
12502				if (st == '')
12503				{
12504					st = 'swimlaneFillColor=#ffffff;'
12505				}
12506
12507				v.value = convertText(p.Name);
12508				v.style += 'swimlane;childLayout=stackLayout;horizontal=1;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;fontStyle=0;marginBottom=0;' + st +
12509					'startSize=' + th + ';' +
12510					getLabelStyle(p.Name, isLastLblHTML);
12511				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
12512
12513				if (p.ShadedHeader)
12514				{
12515					var st = getColor(p.FillColor);
12516					var darkerClr = getDarkerClr(st, 0.85);
12517					v.style += 'fillColor=' + darkerClr + ';';
12518				}
12519				else
12520				{
12521					v.style += getFillColor(p, a);
12522				}
12523
12524				var item = new Array();
12525				var currH = th / h;
12526				var curY = th;
12527
12528				for (var i = 0; i < p.Fields; i++)
12529				{
12530					var itemH = 0;
12531					var curH = p['Field' + (i + 1) + '_h'] * scale;
12532					item[i] = new mxCell('', new mxGeometry(0, curY, w, curH), 'part=1;resizeHeight=0;strokeColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;html=1;whiteSpace=wrap;');
12533					curY += curH;
12534					item[i].vertex = true;
12535					v.insert(item[i]);
12536					item[i].style += st +
12537						getLabelStyle(p['Field' + (i + 1)], isLastLblHTML);
12538
12539					if (p.AltRows == 1 && (i % 2 != 0))
12540					{
12541						item[i].style += 'fillColor=#000000;opacity=5;';
12542					}
12543					else
12544					{
12545						item[i].style += 'fillColor=none;' +
12546							getOpacity(p, a, item[i]);
12547					}
12548
12549					item[i].value = convertText(p['Field' + (i + 1)]);
12550				}
12551
12552				break;
12553
12554			case 'ERDEntityBlock2' :
12555				var st = getFillColor(p, a);
12556				var th = p.Name_h * scale;
12557				st = st.replace('fillColor', 'swimlaneFillColor');
12558
12559				if (st == '')
12560				{
12561					st = 'swimlaneFillColor=#ffffff;'
12562				}
12563
12564				v.value = convertText(p.Name);
12565				v.style += 'swimlane;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fontStyle=0;' + st +
12566					'startSize=' + th + ';' +
12567					getLabelStyle(p.Name, isLastLblHTML);
12568
12569				if (p.ShadedHeader)
12570				{
12571					v.style += 'fillColor=#e0e0e0;';
12572				}
12573				else
12574				{
12575					v.style += getFillColor(p, a);
12576				}
12577
12578				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
12579
12580				var item = new Array();
12581				var key = new Array();
12582				var currH = th;
12583				var keyW = 30;
12584
12585				if (p.Column1 != null)
12586				{
12587					keyW = p.Column1 * scale;
12588				}
12589
12590				for (var i = 0; i < p.Fields; i++)
12591				{
12592					var itemH = 0;
12593
12594					key[i] = new mxCell('', new mxGeometry(0, currH, keyW, p['Key' + (i + 1) + '_h'] * scale), 'strokeColor=none;part=1;resizeHeight=0;align=center;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;html=1;whiteSpace=wrap;');
12595					key[i].vertex = true;
12596					v.insert(key[i]);
12597					key[i].style += st +
12598						getLabelStyle(p['Key' + (i + 1)], isLastLblHTML);
12599
12600					if (p.AltRows == 1 && (i % 2 != 0))
12601					{
12602						key[i].style += 'fillColor=#000000;fillOpacity=5;';
12603					}
12604					else
12605					{
12606						key[i].style += 'fillColor=none;' +
12607							getOpacity(p, a, key[i]);
12608					}
12609
12610					key[i].value = convertText(p['Key' + (i + 1)]);
12611
12612					item[i] = new mxCell('', new mxGeometry(keyW, currH, w - keyW, p['Field' + (i + 1) + '_h'] * scale), 'shape=partialRectangle;top=0;right=0;bottom=0;part=1;resizeHeight=0;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;html=1;whiteSpace=wrap;');
12613					item[i].vertex = true;
12614					v.insert(item[i]);
12615					item[i].style += st +
12616						getLabelStyle(p['Field' + (i + 1)], isLastLblHTML);
12617					v.style += addAllStyles(v.style, p, a, v);
12618
12619					if (p.AltRows == 1 && (i % 2 != 0))
12620					{
12621						item[i].style += 'fillColor=#000000;fillOpacity=5;';
12622					}
12623					else
12624					{
12625						item[i].style += 'fillColor=none;' +
12626							getOpacity(p, a, item[i]);
12627					}
12628
12629					item[i].value = convertText(p['Field' + (i + 1)]);
12630
12631					currH += p['Key' + (i + 1) + '_h'] * scale;
12632				}
12633
12634				break;
12635
12636			case 'ERDEntityBlock3' :
12637				var st = getFillColor(p, a);
12638				var th = p.Name_h * scale;
12639				st = st.replace('fillColor', 'swimlaneFillColor');
12640
12641				if (st == '')
12642				{
12643					st = 'swimlaneFillColor=#ffffff;'
12644				}
12645
12646				v.style += 'swimlane;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fontStyle=0;' + st +
12647					'startSize=' + th + ';' +
12648					getLabelStyle(p.Name);
12649
12650				if (p.ShadedHeader)
12651				{
12652					v.style += 'fillColor=#e0e0e0;';
12653				}
12654				else
12655				{
12656					v.style += getFillColor(p, a);
12657				}
12658
12659				v.value = convertText(p.Name);
12660				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
12661
12662				var item = new Array();
12663				var key = new Array();
12664				var currH = th;
12665				var keyW = 30;
12666
12667				if (p.Column1 != null)
12668				{
12669					keyW = p.Column1 * scale;
12670				}
12671
12672				for (var i = 0; i < p.Fields; i++)
12673				{
12674					var itemH = 0;
12675
12676					key[i] = new mxCell('', new mxGeometry(0, currH, keyW, p['Field' + (i + 1) + '_h'] * scale), 'strokeColor=none;part=1;resizeHeight=0;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;');
12677					key[i].vertex = true;
12678					v.insert(key[i]);
12679					key[i].style += st +
12680						getLabelStyle(p['Field' + (i + 1)], isLastLblHTML);
12681
12682					if (p.AltRows == 1 && (i % 2 != 0))
12683					{
12684						key[i].style += 'fillColor=#000000;fillOpacity=5;';
12685					}
12686					else
12687					{
12688						key[i].style += 'fillColor=none;' +
12689							getOpacity(p, a, key[i]);
12690					}
12691
12692					key[i].value = convertText(p['Field' + (i + 1)]);
12693					key[i].style += addAllStyles(key[i].style, p, a, key[i], isLastLblHTML);
12694
12695					item[i] = new mxCell('', new mxGeometry(keyW, currH, w - keyW, p['Type' + (i + 1) + '_h'] * scale), 'shape=partialRectangle;top=0;right=0;bottom=0;part=1;resizeHeight=0;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;');
12696					item[i].vertex = true;
12697					v.insert(item[i]);
12698					item[i].style += st +
12699						getLabelStyle(p['Type' + (i + 1)], isLastLblHTML);
12700
12701					if (p.AltRows == 1 && (i % 2 != 0))
12702					{
12703						item[i].style += 'fillColor=#000000;fillOpacity=5;';
12704					}
12705					else
12706					{
12707						item[i].style += 'fillColor=none;' +
12708							getOpacity(p, a, item[i]);
12709					}
12710
12711					item[i].value = convertText(p['Type' + (i + 1)]);
12712					item[i].style += addAllStyles(item[i].style, p, a, item[i], isLastLblHTML);
12713
12714					currH += p['Field' + (i + 1) + '_h'] * scale;
12715				}
12716
12717				break;
12718			case 'ERDEntityBlock4' :
12719				var st = getFillColor(p, a);
12720				var th = p.Name_h * scale;
12721				st = st.replace('fillColor', 'swimlaneFillColor');
12722
12723				if (st == '')
12724				{
12725					st = 'swimlaneFillColor=#ffffff;'
12726				}
12727
12728				v.style += 'swimlane;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fontStyle=0;' + st +
12729					'startSize=' + th + ';' +
12730					getLabelStyle(p.Name);
12731
12732				if (p.ShadedHeader)
12733				{
12734					v.style += 'fillColor=#e0e0e0;';
12735				}
12736				else
12737				{
12738					v.style += getFillColor(p, a);
12739				}
12740
12741				v.value = convertText(p.Name);
12742				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
12743
12744				var item = new Array();
12745				var key = new Array();
12746				var type = new Array();
12747				var currH = th;
12748				var keyW = 30;
12749				var typeW = 40;
12750
12751				if (p.Column1 != null)
12752				{
12753					keyW = p.Column1 * scale;
12754				}
12755
12756				if (p.Column2 != null)
12757				{
12758					typeW = p.Column2 * scale;
12759				}
12760
12761				for (var i = 0; i < p.Fields; i++)
12762				{
12763					var itemH = 0;
12764
12765					key[i] = new mxCell('', new mxGeometry(0, currH, keyW, p['Key' + (i + 1) + '_h'] * scale), 'strokeColor=none;part=1;resizeHeight=0;align=center;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;');
12766					key[i].vertex = true;
12767					v.insert(key[i]);
12768					key[i].style += st +
12769						getLabelStyle(p['Key' + (i + 1)], isLastLblHTML);
12770
12771					if (p.AltRows == 1 && (i % 2 != 0))
12772					{
12773						key[i].style += 'fillColor=#000000;fillOpacity=5;';
12774					}
12775					else
12776					{
12777						key[i].style += 'fillColor=none;' +
12778							getOpacity(p, a, key[i]);
12779					}
12780
12781					key[i].value = convertText(p['Key' + (i + 1)]);
12782					key[i].style += addAllStyles(key[i].style, p, a, key[i], isLastLblHTML);
12783
12784					item[i] = new mxCell('', new mxGeometry(keyW, currH, w - keyW - typeW, p['Field' + (i + 1) + '_h'] * scale), 'shape=partialRectangle;top=0;right=0;bottom=0;part=1;resizeHeight=0;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;');
12785					item[i].vertex = true;
12786					v.insert(item[i]);
12787					item[i].style += st +
12788						getLabelStyle(p['Field' + (i + 1)], isLastLblHTML);
12789
12790					if (p.AltRows == 1 && (i % 2 != 0))
12791					{
12792						item[i].style += 'fillColor=#000000;fillOpacity=5;';
12793					}
12794					else
12795					{
12796						item[i].style += 'fillColor=none;' +
12797							getOpacity(p, a, item[i]);
12798					}
12799
12800					item[i].value = convertText(p['Field' + (i + 1)]);
12801					item[i].style += addAllStyles(item[i].style, p, a, item[i], isLastLblHTML);
12802
12803					type[i] = new mxCell('', new mxGeometry(w - typeW, currH, typeW, p['Type' + (i + 1) + '_h'] * scale), 'shape=partialRectangle;top=0;right=0;bottom=0;part=1;resizeHeight=0;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;whiteSpace=wrap;');
12804					type[i].vertex = true;
12805					v.insert(type[i]);
12806					type[i].style += st +
12807						getLabelStyle(p['Type' + (i + 1)], isLastLblHTML);
12808
12809					if (p.AltRows == 1 && (i % 2 != 0))
12810					{
12811						type[i].style += 'fillColor=#000000;fillOpacity=5;';
12812					}
12813					else
12814					{
12815						type[i].style += 'fillColor=none;' +
12816							getOpacity(p, a, type[i]);
12817					}
12818
12819					type[i].value = convertText(p['Type' + (i + 1)]);
12820					type[i].style += addAllStyles(type[i].style, p, a, type[i], isLastLblHTML);
12821
12822					currH += p['Key' + (i + 1) + '_h'] * scale;
12823				}
12824
12825				break;
12826			case 'GCPServiceCardApplicationSystemBlock' :
12827				addGCP2ServiceCard('application_system', w, h, v, p, a);
12828				break;
12829			case 'GCPServiceCardAuthorizationBlock' :
12830				addGCP2ServiceCard('internal_payment_authorization', w, h, v, p, a);
12831				break;
12832			case 'GCPServiceCardBlankBlock' :
12833				addGCP2ServiceCard('blank', w, h, v, p, a);
12834				break;
12835			case 'GCPServiceCardReallyBlankBlock' :
12836				addGCP2ServiceCard('blank', w, h, v, p, a);
12837				break;
12838			case 'GCPServiceCardBucketBlock' :
12839				addGCP2ServiceCard('bucket', w, h, v, p, a);
12840				break;
12841			case 'GCPServiceCardCDNInterconnectBlock' :
12842				addGCP2ServiceCard('google_network_edge_cache', w, h, v, p, a);
12843				break;
12844			case 'GCPServiceCardCloudDNSBlock' :
12845				addGCP2ServiceCard('blank', w, h, v, p, a);
12846				break;
12847			case 'GCPServiceCardClusterBlock' :
12848				addGCP2ServiceCard('cluster', w, h, v, p, a);
12849				break;
12850			case 'GCPServiceCardDiskSnapshotBlock' :
12851				addGCP2ServiceCard('persistent_disk_snapshot', w, h, v, p, a);
12852				break;
12853			case 'GCPServiceCardEdgePopBlock' :
12854				addGCP2ServiceCard('google_network_edge_cache', w, h, v, p, a);
12855				break;
12856			case 'GCPServiceCardFrontEndPlatformServicesBlock' :
12857				addGCP2ServiceCard('frontend_platform_services', w, h, v, p, a);
12858				break;
12859			case 'GCPServiceCardGatewayBlock' :
12860				addGCP2ServiceCard('gateway', w, h, v, p, a);
12861				break;
12862			case 'GCPServiceCardGoogleNetworkBlock' :
12863				addGCP2ServiceCard('google_network_edge_cache', w, h, v, p, a);
12864				break;
12865			case 'GCPServiceCardImageServicesBlock' :
12866				addGCP2ServiceCard('image_services', w, h, v, p, a);
12867				break;
12868			case 'GCPServiceCardLoadBalancerBlock' :
12869				addGCP2ServiceCard('network_load_balancer', w, h, v, p, a);
12870				break;
12871			case 'GCPServiceCardLocalComputeBlock' :
12872				addGCP2ServiceCard('dedicated_game_server', w, h, v, p, a);
12873				break;
12874			case 'GCPServiceCardLocalStorageBlock' :
12875				addGCP2ServiceCard('persistent_disk_snapshot', w, h, v, p, a);
12876				break;
12877			case 'GCPServiceCardLogsAPIBlock' :
12878				addGCP2ServiceCard('logs_api', w, h, v, p, a);
12879				break;
12880			case 'GCPServiceCardMemcacheBlock' :
12881				addGCP2ServiceCard('memcache', w, h, v, p, a);
12882				break;
12883			case 'GCPServiceCardNATBlock' :
12884				addGCP2ServiceCard('nat', w, h, v, p, a);
12885				break;
12886			case 'GCPServiceCardPaymentFormBlock' :
12887				addGCP2ServiceCard('external_payment_form', w, h, v, p, a);
12888				break;
12889			case 'GCPServiceCardPushNotificationsBlock' :
12890				addGCP2ServiceCard('push_notification_service', w, h, v, p, a);
12891				break;
12892			case 'GCPServiceCardScheduledTasksBlock' :
12893				addGCP2ServiceCard('scheduled_tasks', w, h, v, p, a);
12894				break;
12895			case 'GCPServiceCardServiceDiscoveryBlock' :
12896				addGCP2ServiceCard('service_discovery', w, h, v, p, a);
12897				break;
12898			case 'GCPServiceCardSquidProxyBlock' :
12899				addGCP2ServiceCard('squid_proxy', w, h, v, p, a);
12900				break;
12901			case 'GCPServiceCardTaskQueuesBlock' :
12902				addGCP2ServiceCard('task_queues', w, h, v, p, a);
12903				break;
12904			case 'GCPServiceCardVirtualFileSystemBlock' :
12905				addGCP2ServiceCard('virtual_file_system', w, h, v, p, a);
12906				break;
12907			case 'GCPServiceCardVPNGatewayBlock' :
12908				addGCP2ServiceCard('gateway', w, h, v, p, a);
12909				break;
12910
12911			case 'GCPInputDatabase' :
12912				addGCP2UserDeviceCard('database', 1, 0.9, w, h, v, p, a);
12913				break;
12914			case 'GCPInputRecord' :
12915				addGCP2UserDeviceCard('record', 1, 0.66, w, h, v, p, a);
12916				break;
12917			case 'GCPInputPayment' :
12918				addGCP2UserDeviceCard('payment', 1, 0.8, w, h, v, p, a);
12919				break;
12920			case 'GCPInputGateway' :
12921				addGCP2UserDeviceCard('gateway_icon', 1, 0.44, w, h, v, p, a);
12922				break;
12923			case 'GCPInputLocalCompute' :
12924				addGCP2UserDeviceCard('compute_engine_icon', 1, 0.89, w, h, v, p, a);
12925				break;
12926			case 'GCPInputBeacon' :
12927				addGCP2UserDeviceCard('beacon', 0.73, 1, w, h, v, p, a);
12928				break;
12929			case 'GCPInputStorage' :
12930				addGCP2UserDeviceCard('storage', 1, 0.8, w, h, v, p, a);
12931				break;
12932			case 'GCPInputList' :
12933				addGCP2UserDeviceCard('list', 0.89, 1, w, h, v, p, a);
12934				break;
12935			case 'GCPInputStream' :
12936				addGCP2UserDeviceCard('stream', 1, 0.82, w, h, v, p, a);
12937				break;
12938			case 'GCPInputMobileDevices' :
12939				addGCP2UserDeviceCard('mobile_devices', 1, 0.73, w, h, v, p, a);
12940				break;
12941			case 'GCPInputCircuitBoard' :
12942				addGCP2UserDeviceCard('circuit_board', 1, 0.9, w, h, v, p, a);
12943				break;
12944			case 'GCPInputLive' :
12945				addGCP2UserDeviceCard('live', 0.74, 1, w, h, v, p, a);
12946				break;
12947			case 'GCPInputUsers' :
12948				addGCP2UserDeviceCard('users', 1, 0.63, w, h, v, p, a);
12949				break;
12950			case 'GCPInputLaptop' :
12951				addGCP2UserDeviceCard('laptop', 1, 0.66, w, h, v, p, a);
12952				break;
12953			case 'GCPInputApplication' :
12954				addGCP2UserDeviceCard('application', 1, 0.8, w, h, v, p, a);
12955				break;
12956			case 'GCPInputLightbulb' :
12957				addGCP2UserDeviceCard('lightbulb', 0.7, 1, w, h, v, p, a);
12958				break;
12959			case 'GCPInputGame' :
12960				addGCP2UserDeviceCard('game', 1, 0.54, w, h, v, p, a);
12961				break;
12962			case 'GCPInputDesktop' :
12963				addGCP2UserDeviceCard('desktop', 1, 0.9, w, h, v, p, a);
12964				break;
12965			case 'GCPInputDesktopAndMobile' :
12966				addGCP2UserDeviceCard('desktop_and_mobile', 1, 0.66, w, h, v, p, a);
12967				break;
12968			case 'GCPInputWebcam' :
12969				addGCP2UserDeviceCard('webcam', 0.5, 1, w, h, v, p, a);
12970				break;
12971			case 'GCPInputSpeaker' :
12972				addGCP2UserDeviceCard('speaker', 0.7, 1, w, h, v, p, a);
12973				break;
12974			case 'GCPInputRetail' :
12975				addGCP2UserDeviceCard('retail', 1, 0.89, w, h, v, p, a);
12976				break;
12977			case 'GCPInputReport' :
12978				addGCP2UserDeviceCard('report', 1, 1, w, h, v, p, a);
12979				break;
12980			case 'GCPInputPhone' :
12981				addGCP2UserDeviceCard('phone', 0.64, 1, w, h, v, p, a);
12982				break;
12983			case 'GCPInputBlank' :
12984				addGCP2UserDeviceCard('transparent', 1, 1, w, h, v, p, a);
12985				break;
12986// no corresponding icons, only with shadows
12987//			case 'GCPAppEngineProductCard' :
12988//				addGCP2ExpandedProductCard('compute.app_engine', 1, 1, w, h, v, p, a);
12989//				break;
12990//			case 'GCPCloudDataflowProductCard' :
12991//				addGCP2ExpandedProductCard('cloud_dataflow', 1, 1, w, h, v, p, a);
12992//				break;
12993//			case 'GCPCloudDataprocProductCard' :
12994//				addGCP2ExpandedProductCard('cloud_dataproc', 1, 1, w, h, v, p, a);
12995//				break;
12996//			case 'GCPComputeEngineProductCard' :
12997//				addGCP2ExpandedProductCard('compute_engine', 1, 1, w, h, v, p, a);
12998//				break;
12999//			case 'GCPContainerEngineProductCard' :
13000//				addGCP2ExpandedProductCard('compute_engine', 1, 1, w, h, v, p, a);
13001//				break;
13002			case 'PresentationFrameBlock' :
13003				if (p.ZOrder == 0) //These are hidden
13004				{
13005					v.style += 'strokeColor=none;fillColor=none;';
13006				}
13007				else
13008				{
13009					v.style += getLabelStyle(p.Text);
13010					v.value = convertText(p.Text);
13011					v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
13012				}
13013				break;
13014			case 'SVGPathBlock2' :
13015				try
13016				{
13017					var strokeWidth = p.LineWidth;
13018					var strokeColor = p.LineColor;
13019					var fillColor = p.FillColor;
13020
13021					var drawData = p.DrawData.Data;
13022					var svg = '<svg viewBox="0 0 1 1" xmlns="http://www.w3.org/2000/svg">';
13023
13024					for (var i = 0; i < drawData.length; i++)
13025					{
13026						var dd = drawData[i];
13027						var path = dd.a;
13028						var sw = (dd.w == 'prop' || dd.w == null? strokeWidth : dd.w) / Math.min(w, h) * scale; //TODO Stroke width caclulationn needs review
13029						var sc = dd.s == 'prop' || dd.s == null? strokeColor : dd.s;
13030						var fc = dd.f == 'prop' || dd.f == null? fillColor : dd.f;
13031
13032						if (typeof fc == 'object')
13033						{
13034							fc = Array.isArray(fc.cs)? fc.cs[0].c : fillColor; //Approximation TODO Handle it
13035						}
13036
13037						svg += '<path d="' + path + '" fill="' + fc + '" stroke="' + sc + '" stroke-width="' + sw + '"/>';
13038					}
13039
13040					svg += '</svg>';
13041
13042					v.style = 'shape=image;verticalLabelPosition=bottom;labelBackgroundColor=#ffffff;' +
13043						'verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/svg+xml,' + ((window.btoa) ? btoa(svg) : Base64.encode(svg, true)) + ';';
13044				}
13045				catch(e){}
13046				break;
13047			case 'BraceBlock':
13048			case 'BraceBlockRotated':
13049			case 'BracketBlock':
13050			case 'BracketBlockRotated':
13051				var bracketStyle = cls.indexOf('Bracket') == 0? 'size=0;arcSize=50;' : '';
13052				var sideStyle = addAllStyles(v.style, p, a, v, isLastLblHTML);
13053				var rotation = getRotation(p, a, v);
13054				v.style = 'group;' + rotation;
13055				var sideWidth = Math.min((rotation? w : h) * 0.14, 100);
13056				var left = new mxCell('', new mxGeometry(0, 0, sideWidth, h), 'shape=curlyBracket;rounded=1;' + bracketStyle + sideStyle);
13057				left.vertex = true;
13058				left.geometry.relative = true;
13059				var right = new mxCell('', new mxGeometry(1 - sideWidth / w, 0, sideWidth, h), 'shape=curlyBracket;rounded=1;flipH=1;' + bracketStyle + sideStyle);
13060				right.vertex = true;
13061				right.geometry.relative = true;
13062
13063				v.insert(left);
13064				v.insert(right);
13065				break;
13066			case 'BPMNTextAnnotation':
13067			case 'NoteBlock':
13068				p.InsetMargin = null;
13069				v.value = convertText(p.Text);
13070				v.style = 'group;spacingLeft=8;align=left;spacing=0;strokeColor=none;';
13071				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
13072
13073				if (v.style.indexOf('verticalAlign') < 0)
13074				{
13075					v.style += 'verticalAlign=middle;';
13076				}
13077
13078				var side = new mxCell('', new mxGeometry(0, 0, 8, h), 'shape=partialRectangle;right=0;fillColor=none;');
13079				side.geometry.relative = true;
13080				side.vertex = true;
13081				side.style += addAllStyles(side.style, p, a, v, isLastLblHTML);
13082
13083				v.insert(side);
13084				break;
13085			case 'VSMTimelineBlock':
13086			case 'TimelineBlock':
13087			//TODO Timeline shapes are postponed, this code is a work-in-progress
13088			/*	try
13089				{
13090					var daysMap = {
13091						'Sunday': 0,
13092						'Monday': 1,
13093						'Tuesday': 2,
13094						'Wednesday': 3,
13095						'Thursday': 4,
13096						'Friday': 5,
13097						'Saturday': 6
13098					};
13099					var isLine = p.TimelineType == 'lineTimeline';
13100					var startDate = new Date(p.StartDate);
13101					var endDate = new Date(p.FinishDate);
13102					var startOfWeek = daysMap[p.StartOfWeek];
13103					var startOfFiscY = new Date(p.StartOfFiscalYear);
13104					var timeUnit = p.TimeUnit;
13105					var showStartEnd = p.DisplayStartFinishDates;
13106					var showTickLbl = p.DisplayInterimDates;
13107					var startTick, inc;
13108
13109					switch (timeUnit)
13110					{
13111						case 'second':
13112							startTick = inc = 1000;
13113						break;
13114						case 'minute':
13115							startTick = inc = 1000 * 60;
13116						break;
13117						case 'hour':
13118							startTick = inc = 1000 * 60 * 60;
13119						break;
13120						case 'day':
13121							startTick = inc = 1000 * 60 * 60 * 24;
13122						break;
13123						case 'week':
13124							var dayTillNextWeek = (7 - startDate.getDay() + startOfWeek) % 7;
13125							var nextWeek = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate() + dayTillNextWeek);
13126							startTick = nextWeek.getTime() - startDate.getTime();
13127							inc = 1000 * 60 * 60 * 24 * 7;
13128						break;
13129						case 'month':
13130							var nextMonth = new Date(startDate.getFullYear(), startDate.getMonth() + 1, 1);
13131							startTick = nextMonth.getTime() - startDate.getTime();
13132							inc = 1000 * 60 * 60 * 24 * 30;
13133						break;
13134						case 'quarter':
13135							var monthToNextQtr = (12 - startDate.getMonth() + startOfFiscY.getMonth()) % 3;
13136							var nextQrt = new Date(startDate.getFullYear(),
13137								startDate.getMonth() + (monthToNextQtr == 0 && startDate.getDate() >= startOfFiscY.getDate()? 3 : monthToNextQtr), startOfFiscY.getDate());
13138							startTick = nextQrt.getTime() - startDate.getTime();
13139							inc = 1000 * 60 * 60 * 24 * 90;
13140						break;
13141						case 'year':
13142							var nextYear = new Date(startDate.getFullYear() + 1, 0, 1);
13143							startTick = nextYear.getTime() - startDate.getTime();
13144							inc = 1000 * 60 * 60 * 24 * 365;
13145						break;
13146					}
13147
13148					var diff = endDate.getTime() - startDate.getTime();
13149					var afterFirst = diff - startTick;
13150					var ticksCount = Math.round(afterFirst / inc);
13151
13152					var startX = startTick/diff * w;
13153					var ldx = inc/diff * w;
13154					console.log(startX, ldx, ticksCount)
13155				}
13156				catch(e)
13157				{
13158					console.log(e); //Ignore
13159				}
13160				break;*/
13161			case 'TimelineMilestoneBlock':
13162			//	break;
13163			case 'TimelineIntervalBlock':
13164				LucidImporter.hasTimeLine = true;
13165				LucidImporter.hasUnknownShapes = true;
13166				break;
13167			case 'FreehandBlock':
13168				try
13169				{
13170					var rotation = getRotation(p, a, v);
13171					v.style = 'group;' + rotation;
13172
13173					if (p.Stencil != null)
13174					{
13175						if (p.Stencil.id == null)
13176						{
13177							//Add a temporary stencil for embedded ones
13178							p.Stencil.id = '$$tmpId$$';
13179							addStencil(p.Stencil.id, p.Stencil);
13180						}
13181
13182						var stencil = LucidImporter.stencilsMap[p.Stencil.id];
13183						var cx = -stencil.x / stencil.w, cy = -stencil.y / stencil.h;
13184
13185						for (var i = 0; i < stencil.stencils.length; i++)
13186						{
13187							var shape = stencil.stencils[i];
13188							var cell = new mxCell('', new mxGeometry(cx, cy, w, h), 'shape=' + shape.shapeStencil + ';');
13189							var sfc = shape.FillColor, slc = shape.LineColor, slw = shape.LineWidth;
13190
13191							if (shape.FillColor == 'prop')
13192							{
13193								shape.FillColor = p.FillColor;
13194							}
13195
13196							if (shape.FillColor == null)
13197							{
13198								shape.FillColor = '#ffffff00'; //Transparent fillColor
13199							}
13200
13201							if (shape.LineColor == 'prop')
13202							{
13203								shape.LineColor = p.LineColor;
13204							}
13205
13206							if (shape.LineColor == null)
13207							{
13208								shape.LineColor = '#ffffff00'; //Transparent strokeColor
13209							}
13210
13211							if (shape.LineWidth == 'prop')
13212							{
13213								shape.LineWidth = p.LineWidth;
13214							}
13215							//Add stencil styles
13216							cell.style += addAllStyles(cell.style, shape, a, cell, isLastLblHTML);
13217							// Restore shape properties
13218							shape.FillColor = sfc; shape.LineColor = slc; shape.LineWidth = slw;
13219							//Add other styles from parent
13220							var fc = p.FillColor, lc = p.LineColor, lw = p.LineWidth;
13221							p.FillColor = null; p.LineColor = null; p.LineWidth = null;
13222							cell.style += addAllStyles(cell.style, p, a, cell, isLastLblHTML);
13223							p.FillColor = fc; p.LineColor = lc; p.LineWidth = lw;
13224							cell.vertex = true;
13225							cell.geometry.relative = true;
13226							v.insert(cell);
13227						}
13228
13229						var index = 0;
13230						var rotation = p.Rotation;
13231
13232						while (p['t' + index])
13233						{
13234							var lblObj = p['t' + index];
13235							var txt = convertText(lblObj);
13236
13237							if (txt)
13238							{
13239								var lbl = new mxCell(txt, new mxGeometry(0, 0, w, h), 'strokeColor=none;fillColor=none;overflow=visible;');
13240								p.Rotation = 0; //Disable rotation of the parent since it is captured in the srencil below
13241								lbl.style += addAllStyles(lbl.style, lblObj, a, lbl, isLastLblHTML);
13242								lbl.style += addAllStyles(lbl.style, p, a, lbl, isLastLblHTML);
13243								p.Rotation = rotation;
13244
13245								if (stencil.text != null && stencil.text['t' + index] != null)
13246								{
13247									var gTxtObj = stencil.text['t' + index];
13248									gTxtObj.Rotation = rotation + (gTxtObj.rotation? gTxtObj.rotation : 0)
13249										+ (p['t' + index + '_TRotation']? p['t' + index + '_TRotation'] : 0)
13250										+ (p['t' + index + '_TAngle']? p['t' + index + '_TAngle'] : 0);
13251									lbl.style += addAllStyles(lbl.style, gTxtObj, a, lbl, isLastLblHTML);
13252									var lblGeo = lbl.geometry;
13253
13254									if (gTxtObj.w)
13255									{
13256										lblGeo.width *= (gTxtObj.w / stencil.w);
13257									}
13258									if (gTxtObj.h)
13259									{
13260										lblGeo.height *= (gTxtObj.h / stencil.h);
13261									}
13262									if (gTxtObj.x)
13263									{
13264										lblGeo.x = gTxtObj.x / stencil.w;
13265									}
13266									if (gTxtObj.y)
13267									{
13268										lblGeo.y = gTxtObj.y / stencil.h;
13269									}
13270
13271									if (gTxtObj.fw)
13272									{
13273										lblGeo.width *= gTxtObj.fw * scale / w;
13274									}
13275									if (gTxtObj.fh)
13276									{
13277										lblGeo.height *= gTxtObj.fh * scale / h;
13278									}
13279									if (gTxtObj.fx)
13280									{
13281										lblGeo.x = (gTxtObj.fx > 0? 1 : 0) + gTxtObj.fx * scale / w;
13282									}
13283									if (gTxtObj.fy)
13284									{
13285										lblGeo.y = (gTxtObj.fy > 0? 1 : 0) + gTxtObj.fy * scale / h;
13286									}
13287								}
13288
13289								lbl.vertex = true;
13290								lbl.geometry.relative = true;
13291								v.insert(lbl);
13292							}
13293
13294							index++;
13295						}
13296					}
13297
13298					if (p.FillColor && p.FillColor.url)
13299					{
13300						var img = new mxCell('', new mxGeometry(0, 0, w, h), 'shape=image;html=1;');
13301						img.style += getImage({}, {}, p.FillColor.url);
13302						img.vertex = true;
13303						img.geometry.relative = true;
13304						v.insert(img);
13305					}
13306				}
13307				catch(e)
13308				{
13309					console.log('Freehand error', e);
13310				}
13311			break;
13312			case 'RightArrowBlock':
13313				var arrowSize = p.Head * h / w;
13314				v.style = 'shape=singleArrow;arrowWidth=' + (1 - p.Notch * 2) + ';arrowSize=' + arrowSize;
13315				v.value = convertText(p);
13316				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
13317			break;
13318			case 'DoubleArrowBlock':
13319				var arrowSize = p.Head * h / w;
13320				v.style = 'shape=doubleArrow;arrowWidth=' + (1 - p.Notch * 2) + ';arrowSize=' + arrowSize;
13321				v.value = convertText(p);
13322				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
13323			break;
13324			case 'VPCSubnet2017':
13325			case 'VirtualPrivateCloudContainer2017':
13326			case 'ElasticBeanStalkContainer2017':
13327			case 'EC2InstanceContents2017':
13328			case 'AWSCloudContainer2017':
13329			case 'CorporateDataCenterContainer2017':
13330				//all use the same code, just icon is different
13331				var iconStyle, iconW, iconH;
13332
13333				switch(cls)
13334				{
13335					case 'VPCSubnet2017':
13336						iconStyle = 'shape=mxgraph.aws3.permissions;fillColor=#D9A741;';
13337						iconW = 30;
13338						iconH = 35;
13339					break;
13340					case 'VirtualPrivateCloudContainer2017':
13341						iconStyle = 'shape=mxgraph.aws3.virtual_private_cloud;fillColor=#F58536;';
13342						iconW = 52;
13343						iconH = 36;
13344					break;
13345					case 'ElasticBeanStalkContainer2017':
13346						iconStyle = 'shape=mxgraph.aws3.elastic_beanstalk;fillColor=#F58536;';
13347						iconW = 30;
13348						iconH = 41;
13349					break;
13350					case 'EC2InstanceContents2017':
13351						iconStyle = 'shape=mxgraph.aws3.instance;fillColor=#F58536;';
13352						iconW = 40;
13353						iconH = 41;
13354					break;
13355					case 'AWSCloudContainer2017':
13356						iconStyle = 'shape=mxgraph.aws3.cloud;fillColor=#F58536;';
13357						iconW = 52;
13358						iconH = 36;
13359					break;
13360					case 'CorporateDataCenterContainer2017':
13361						iconStyle = 'shape=mxgraph.aws3.corporate_data_center;fillColor=#7D7C7C;';
13362						iconW = 30;
13363						iconH = 42;
13364					break;
13365				}
13366				v.style = 'rounded=1;arcSize=10;dashed=0;verticalAlign=bottom;';
13367				v.value = convertText(p);
13368				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
13369				v.geometry.y += 20;
13370				v.geometry.height -= 20;
13371				var icon = new mxCell('', new mxGeometry(20, -20, iconW, iconH), iconStyle);
13372				icon.vertex = true;
13373				v.insert(icon);
13374			break;
13375			case 'FlexiblePolygonBlock':
13376				var parts = ["<shape strokewidth=\"inherit\"><foreground>"];
13377				parts.push("<path>");
13378
13379				for (var j = 0; j < p.Vertices.length; j++)
13380				{
13381					var line = p.Vertices[j];
13382
13383					if (j == 0)
13384					{
13385						parts.push("<move x=\"" + (line.x * 100) + "\" y=\"" + (line.y * 100) + "\"/>");
13386					}
13387					else
13388					{
13389						parts.push("<line x=\"" + (line.x * 100) + "\" y=\"" + (line.y * 100) + "\"/>");
13390					}
13391				}
13392
13393				parts.push("</path>");
13394				parts.push("<fillstroke/>");
13395				parts.push("</foreground></shape>");
13396				v.style = 'shape=stencil(' + Graph.compress(parts.join('')) + ');';
13397				v.value = convertText(p);
13398				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
13399			break;
13400			case 'InfographicsBlock':
13401				var min = p.ShapeData_1.Value;
13402				var max = p.ShapeData_2.Value - min;
13403				var val = p.ShapeData_3.Value - min;
13404				var thickness = p.ShapeData_4.Value * w / 200; //Percentage of half of width
13405				var index = p.InternalStencilId == 'ProgressBar'? 4 : 5;
13406				var fillClr = p['ShapeData_' + index].Value;
13407				fillClr = fillClr == '=fillColor()'? p.FillColor : fillClr;
13408				var bkgClr = p['ShapeData_' + (index + 1)].Value;
13409
13410				switch(p.InternalStencilId)
13411				{
13412					case 'ProgressDonut':
13413						v.style = 'shape=mxgraph.basic.donut;dx=' + thickness + ';strokeColor=none;fillColor=' + getColor(bkgClr) + ';' + getOpacity2(bkgClr, 'fillOpacity');
13414						v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
13415						var inner = new mxCell('', new mxGeometry(0, 0, w, h), 'shape=mxgraph.basic.partConcEllipse;startAngle=0;endAngle=' + (val / max) + ';arcWidth=' + (thickness / w * 2) +
13416										';strokeColor=none;fillColor=' + getColor(fillClr) + ';' + getOpacity2(fillClr, 'fillOpacity'));
13417						inner.style += addAllStyles(inner.style, p, a, inner, isLastLblHTML);
13418						inner.vertex = true;
13419						inner.geometry.relative = 1;
13420						v.insert(inner);
13421					break;
13422					case 'ProgressHalfDonut':
13423						//as a workaround do it as a circle
13424						v.geometry.height *= 2;
13425						v.geometry.rotate90(); //TODO fix shape rotation
13426						var angle = val / max / 2;
13427						v.style = 'shape=mxgraph.basic.partConcEllipse;startAngle=0;endAngle=' + angle + ';arcWidth=' + (thickness * 2 / w) +
13428										';strokeColor=none;fillColor=' + getColor(fillClr) + ';' + getOpacity2(fillClr, 'fillOpacity')
13429
13430						p.Rotation -= Math.PI / 2;
13431						v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
13432						var inner = new mxCell('', new mxGeometry(0, 0, v.geometry.width, v.geometry.height), 'shape=mxgraph.basic.partConcEllipse;startAngle=0;endAngle=' + (0.5 - angle) + ';arcWidth=' + (thickness * 2 / w) +
13433										';strokeColor=none;flipH=1;fillColor=' + getColor(bkgClr) + ';' + getOpacity2(bkgClr, 'fillOpacity'));
13434						p.Rotation += Math.PI;
13435						inner.style += addAllStyles(inner.style, p, a, inner, isLastLblHTML);
13436						inner.vertex = true;
13437						inner.geometry.relative = 1;
13438						v.insert(inner);
13439					break;
13440					case 'ProgressBar':
13441						v.style = 'strokeColor=none;fillColor=' + getColor(bkgClr) + ';' + getOpacity2(bkgClr, 'fillOpacity');
13442						v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
13443						var inner = new mxCell('', new mxGeometry(0, 0, w * val / max, h), 'strokeColor=none;fillColor=' + getColor(fillClr) + ';' + getOpacity2(fillClr, 'fillOpacity'));
13444						inner.style += addAllStyles(inner.style, p, a, inner, isLastLblHTML);
13445						inner.vertex = true;
13446						inner.geometry.relative = 1;
13447						v.insert(inner);
13448					break;
13449				}
13450			break;
13451			case 'InternalStorageBlock':
13452				v.style += 'shape=internalStorage;dx=10;dy=10';
13453
13454				//Adjust left and top spacing to handle the shape
13455				if (p.Text && p.Text.m)
13456				{
13457					var m = p.Text.m, isMT = false, isIL = false;
13458
13459					for (var i = 0; i < m.length; i++)
13460					{
13461						var currM = m[i];
13462
13463						if (!isMT && currM.n == 'mt')
13464						{
13465							currM.v = 17 + (currM.v || 0);
13466							isMT = true;
13467						}
13468						else if (!isIL && currM.n == 'il')
13469						{
13470							currM.v = 17 + (currM.v || 0);
13471							isIL = true;
13472						}
13473					}
13474
13475					if (!isMT)
13476					{
13477						m.push({
13478							"s": 0,
13479                            "n": "mt",
13480                            "v": 17
13481						});
13482					}
13483
13484					if (!isIL)
13485					{
13486						m.push({
13487							"s": 0,
13488                            "n": "il",
13489                            "v": 17
13490						});
13491					}
13492				}
13493
13494				v.value = convertText(p);
13495				v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
13496			break;
13497			case 'PersonRoleBlock' :
13498				try
13499				{
13500					var st = getFillColor(p, a);
13501					var th = h/2;
13502					st = st.replace('fillColor', 'swimlaneFillColor');
13503
13504					if (st == '')
13505					{
13506						st = 'swimlaneFillColor=#ffffff;'
13507					}
13508
13509					v.value = convertText(p.Role);
13510					v.style += 'swimlane;childLayout=stackLayout;horizontal=1;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;' + st +
13511						'startSize=' + th + ';spacingLeft=3;spacingRight=3;fontStyle=0;' +
13512						getLabelStyle(p.Role, isLastLblHTML);
13513					v.style += addAllStyles(v.style, p, a, v, isLastLblHTML);
13514
13515					var name = new mxCell('', new mxGeometry(0, h/2, w, h/2), 'part=1;html=1;resizeHeight=0;spacingTop=-1;spacingLeft=3;spacingRight=3;');
13516					name.value = convertText(p.Name);
13517					name.vertex = true;
13518					v.insert(name);
13519					name.style += getLabelStyle(p.Name, isLastLblHTML);
13520					name.style += addAllStyles(name.style, p, a, name, isLastLblHTML);
13521				}
13522				catch(e)
13523				{
13524					//Ignore
13525					console.log(e);
13526				}
13527			break;
13528		}
13529
13530		if (v.style && v.style.indexOf('html') < 0)
13531		{
13532			v.style += 'html=1;';
13533		}
13534
13535		if (p.Title && p.Title.t && p.Text && p.Text.t)
13536		{
13537			try
13538			{
13539				var geo = v.geometry;
13540				var title = new mxCell(convertText(p.Title), new mxGeometry(0, geo.height + 4,geo.width, 10),
13541								'strokeColor=none;fillColor=none;whiteSpace=wrap;verticalAlign=top;labelPosition=center;verticalLabelPosition=top;align=center;');
13542				title.vertex = true;
13543				v.insert(title);
13544				v.style += getLabelStyle(p.Title, isLastLblHTML);
13545			}
13546			catch(e)
13547			{
13548				console.log(e);
13549			}
13550		}
13551
13552		handleTextRotation(v, p);
13553		addCustomData(v, p, graph);
13554
13555		if (p.Hidden)
13556		{
13557			v.visible = false;
13558		}
13559
13560	    return v;
13561	};
13562
13563	function handleTextRotation(v, p)
13564	{
13565		if (p.Text_TRotation || p.TextRotation)
13566		{
13567			try
13568			{
13569				var deg = mxUtils.toDegree(p.Text_TRotation || 0) +  mxUtils.toDegree(p.TextRotation || 0);
13570
13571				if (!isNaN(deg) && deg != 0 && v.value)
13572				{
13573					var w = v.geometry.width, h = v.geometry.height;
13574					var lblW = w, lblH = h, x = 0, y = 0;
13575
13576					if (deg == -90 || deg == -270)
13577					{
13578						lblW = h;
13579						lblH = w;
13580						var diff = (h - w) / 2;
13581						x = -diff / w;
13582						y = diff/ h;
13583					}
13584
13585					deg += mxUtils.toDegree(p.Rotation);
13586
13587					//Remove fill and stroke colors + rotation from vertex style
13588					var style = v.style.split(';').filter(function(s)
13589					{
13590						return s.indexOf('fillColor=') < 0 && s.indexOf('strokeColor=') < 0 && s.indexOf('rotation=') < 0;
13591					}).join(';');
13592
13593					var lbl = new mxCell(v.value, new mxGeometry(x, y, lblW, lblH), style + 'fillColor=none;strokeColor=none;rotation=' + deg + ';');
13594					v.value = null;
13595					lbl.geometry.relative = true;
13596					lbl.vertex = true;
13597					v.insert(lbl);
13598				}
13599			}
13600			catch(e)
13601			{
13602				console.log(e); //Ignore
13603			}
13604		}
13605	};
13606
13607	function createOrgChart(objId, props, data, graph, lookup)
13608	{
13609		function getLineTxtStyle(cellDefaultStyle, fieldName)
13610		{
13611			var style = '';
13612
13613			try
13614			{
13615				for (var i = 0; i < cellDefaultStyle.text.length; i++)
13616				{
13617					var item = cellDefaultStyle.text[i];
13618
13619					if (item[0] == 't_' + fieldName)
13620					{
13621						for (var key in item[1])
13622						{
13623							var val = item[1][key];
13624
13625							if (!val) continue;
13626
13627							switch(key)
13628							{
13629								case 'font':
13630									style += mapFontFamily(val);
13631								break;
13632								case 'bold':
13633									style += 'font-weight: bold;';
13634								break;
13635								case 'italic':
13636									style += 'font-style: italic;';
13637								break;
13638								case 'underline':
13639									style += 'text-decoration: underline;';
13640								break;
13641								case 'size':
13642									style += 'font-size:' + fix1Digit(val * scale) + 'px;';
13643								break;
13644								case 'color':
13645									style += 'color:' + rgbToHex(val).substring(0, 7) + ';';
13646								break;
13647								case 'fill':
13648									style += 'background-color:' + rgbToHex(val).substring(0, 7) + ';';
13649								break;
13650								case 'align':
13651									style += 'text-align:' + val + ';';
13652								break;
13653							}
13654						}
13655
13656						break;
13657					}
13658				}
13659			}
13660			catch(e){}
13661
13662			return style;
13663		};
13664
13665		try
13666		{
13667			//TODO Cell specific styles and chartType defaults
13668			var defImg = 'https://cdn4.iconfinder.com/data/icons/basic-user-interface-elements/700/user-account-profile-human-avatar-face-head--128.png';
13669			var chartType = props.OrgChartBlockType;
13670			var pos = props.Location;
13671			var x = pos.x * scale, y = pos.y * scale;
13672			var chartGroup = new mxCell('', new mxGeometry(x, y, 200, 100), 'group');
13673			chartGroup.vertex = true;
13674			graph.addCell(chartGroup);
13675			var fields = props.FieldNames;
13676			var layoutSettings = props.LayoutSettings;
13677			var cellDefaultStyle = props.BlockItemDefaultStyle || {props: {}};
13678			var edgeDefaultStyle = props.EdgeItemDefaultStyle;
13679			var parents = {};
13680			var idPrefix = (objId || Date.now()) + '_';
13681
13682			if (chartType == 4)
13683			{
13684				cellDefaultStyle.props.LineWidth = 0;
13685			}
13686
13687			var txtStyles = [], marginW = 25, marginH = 40, imgSize = 54, hasImage = true, cellStyle = addAllStyles('', cellDefaultStyle.props, {}, chartGroup, true);
13688
13689			if (chartType == 0) //Image top-center
13690			{
13691				cellStyle += 'spacingTop=' + imgSize + ';imageWidth=' + imgSize + ';imageHeight=' + imgSize + ';imageAlign=center;imageVerticalAlign=top;image=';
13692				marginH += imgSize;
13693			}
13694			else if (chartType == 1 || chartType == 2) //Image to top-left (or outsize top-left which we don't support)
13695			{
13696				cellStyle += 'spacingLeft=' + imgSize + ';imageWidth=' + (imgSize - 4) + ';imageHeight=' + (imgSize - 4) + ';imageAlign=left;imageVerticalAlign=top;image=';
13697				marginW += imgSize;
13698			}
13699			else if (chartType >= 3)
13700			{
13701				hasImage = false;
13702			}
13703
13704			for (var j = 0; j < fields.length; j++)
13705			{
13706				txtStyles.push(getLineTxtStyle(cellDefaultStyle, fields[j]));
13707			}
13708
13709
13710			function createNode(pk, pId, dObj)
13711			{
13712				var id = idPrefix + pk;
13713				parents[id] = pId;
13714				var lbl = '';
13715
13716				for (var j = 0; j < fields.length; j++)
13717				{
13718					lbl += '<div style="' + txtStyles[j] + '">' +
13719							 (dObj[fields[j]] || '&nbsp;') + '</div>';
13720				}
13721
13722				var size = mxUtils.getSizeForString(lbl);
13723				//TODO Is image always in Image/018__ImageUrl__?
13724				var imgUrl = mapImgUrl(dObj['Image'] || dObj['018__ImageUrl__']) || defImg;
13725
13726				var cell = new mxCell(lbl, new mxGeometry(0, 0, size.width + marginW, size.height + marginH),
13727									cellStyle + (hasImage? imgUrl : ''));
13728			    cell.vertex = true;
13729				lookup[id] = cell;
13730				graph.addCell(cell, chartGroup);
13731			};
13732
13733			if (data.Items)
13734			{
13735				var chartDataSrc = data.Items.n;
13736
13737				for (var i = 0; i < chartDataSrc.length; i++)
13738				{
13739					var d = chartDataSrc[i];
13740					createNode(d.pk, d.ie[0]? d.ie[0].nf : null, d.f);
13741				}
13742			}
13743			else
13744			{
13745				var dataId, derivative = props.ContractMap.derivative;
13746
13747	 			if (derivative == null)
13748				{
13749					//We don't have enough samples of this format, TODO improve this
13750					var people = props.ContractMap.c.People;
13751					dataId = people.id;
13752					dataId = dataId.substr(0, dataId.lastIndexOf('_'));
13753
13754					for (var j = 0; j < fields.length; j++)
13755					{
13756						fields[j] = people.f[fields[j]] || fields[j];
13757					}
13758				}
13759				else
13760				{
13761					for (var i = 0; i < derivative.length; i++)
13762					{
13763						if (derivative[i].type == 'ForeignKeyGraph')
13764						{
13765							dataId = derivative[i].c[0].id;
13766							dataId = dataId.substr(0, dataId.lastIndexOf('_'));
13767						}
13768						else if (derivative[i].type == 'MappedGraph')
13769						{
13770							for (var j = 0; j < fields.length; j++)
13771							{
13772								fields[j] = derivative[i].nfs[fields[j]] || fields[j];
13773							}
13774						}
13775					}
13776				}
13777
13778				var chartDataSrc, foreignKey, primaryKey;
13779
13780				for (var key in data)
13781				{
13782					var d = data[key].Collections;
13783
13784					for (var key2 in d)
13785					{
13786						if (key2 == dataId)
13787						{
13788							chartDataSrc = d[key2].Items;
13789						}
13790						else if (d[key2].Properties.ForeignKeys && d[key2].Properties.ForeignKeys[0])
13791						{
13792							foreignKey = d[key2].Properties.ForeignKeys[0].SourceFields[0];
13793							primaryKey = d[key2].Properties.Schema.PrimaryKey[0];
13794						}
13795					}
13796
13797					if (chartDataSrc)
13798					{
13799						break;
13800					}
13801				}
13802
13803				var dupMap = {};
13804
13805				for (var id in chartDataSrc)
13806				{
13807					var d = chartDataSrc[id];
13808					var pk = d[primaryKey], fk = d[foreignKey];
13809
13810					//Special case where these nodes has duplicate id and should be connected somehow!
13811					if (pk == fk)
13812					{
13813						dupMap[pk] = pk + Date.now();
13814						pk = dupMap[pk];
13815						d[primaryKey] = pk;
13816						createNode(pk, fk, d);
13817					}
13818					else
13819					{
13820						createNode(pk, dupMap[fk] || fk, d);
13821					}
13822				}
13823			}
13824
13825			for (var key in parents)
13826			{
13827				var p = parents[key];
13828
13829				if (p != null)
13830				{
13831					var src = lookup[idPrefix + p];
13832					var trg = lookup[key];
13833
13834					if (src != null && trg != null)
13835					{
13836						var e = new mxCell('', new mxGeometry(0, 0, 100, 100), '');
13837						e.geometry.relative = true;
13838						e.edge = true;
13839
13840						if (edgeDefaultStyle != null && edgeDefaultStyle.props != null)
13841						{
13842							updateCell(e, edgeDefaultStyle.props, graph, null, null, true);
13843						}
13844
13845						graph.addCell(e, chartGroup, null, src, trg);
13846					}
13847				}
13848			}
13849
13850			//TODO Support other layout options like LayoutType
13851			var levelSps = layoutSettings.NodeSpacing.LevelSeparation * scale;
13852			var orgChartLayout = new mxOrgChartLayout(graph, 0, levelSps, layoutSettings.NodeSpacing.NeighborSeparation * scale);
13853			orgChartLayout.execute(chartGroup);
13854
13855			//Find out the group size and
13856			var maxX = 0, maxY = 0;
13857
13858			for (var i = 0; chartGroup.children && i < chartGroup.children.length; i++)
13859			{
13860				var geo = chartGroup.children[i].geometry;
13861				maxX = Math.max(maxX, geo.x + geo.width);
13862				maxY = Math.max(maxY, geo.y + geo.height);
13863			}
13864
13865			var gGeo = chartGroup.geometry;
13866			gGeo.y -= levelSps; //Our org chart layout leave a space on top
13867			gGeo.width = maxX;
13868			gGeo.height = maxY;
13869		}
13870		catch(e)
13871		{
13872			LucidImporter.hasUnknownShapes = true;
13873			LucidImporter.hasOrgChart = true;
13874			console.log(e);
13875		}
13876	};
13877})();
13878