How to use addStep method in fMBT

Best Python code snippet using fMBT_python

walkthrough-event-bindings.js

Source:walkthrough-event-bindings.js Github

copy

Full Screen

2// Portal Walkthrough event bindings3//--------------------------------------------------------------------------------------4gisportal.events.bind("date.selected", function(event, data) {5 if(gisportal.walkthrough.is_recording){6 gisportal.walkthrough.addStep(data);7 }8});9gisportal.events.bind("date.zoom", function(event, data) {10 if(gisportal.walkthrough.is_recording){11 gisportal.walkthrough.addStep(data);12 }13});14gisportal.events.bind("ddslick.open", function(event, data) {15 if(gisportal.walkthrough.is_recording){16 gisportal.walkthrough.addStep(data);17 }18});19gisportal.events.bind("ddslick.selectValue", function(event, data) {20 if(gisportal.walkthrough.is_recording){21 gisportal.walkthrough.addStep(data);22 }23});24gisportal.events.bind("view.loaded", function(event, data) {25 if(gisportal.walkthrough.is_recording){26 gisportal.walkthrough.addStep(data);27 }28});29gisportal.events.bind("view.removed", function(event, data) {30 if(gisportal.walkthrough.is_recording){31 gisportal.walkthrough.addStep(data);32 }33});34// hide the panel35gisportal.events.bind("panel.hide", function(event, data) {36 if(gisportal.walkthrough.is_recording){37 gisportal.walkthrough.addStep(data);38 }39});40// show the panel41gisportal.events.bind("panel.show", function(event, data) {42 if(gisportal.walkthrough.is_recording){43 gisportal.walkthrough.addStep(data);44 }45});46// hide a layer47gisportal.events.bind("layer.hide", function(event, data) {48 if(gisportal.walkthrough.is_recording){49 gisportal.walkthrough.addStep(data);50 }51});52// layer removed from panel53gisportal.events.bind("layer.remove", function(event, data) {54 if(gisportal.walkthrough.is_recording){55 gisportal.walkthrough.addStep(data);56 }57});58// layer order changed59gisportal.events.bind("layer.reorder", function(event, data) {60 if(gisportal.walkthrough.is_recording){61 gisportal.walkthrough.addStep(data);62 }63});64// show a layer65gisportal.events.bind("layer.show", function(event, data) {66 if(gisportal.walkthrough.is_recording){67 gisportal.walkthrough.addStep(data);68 }69});70// user moves the map, or zooms in/out71gisportal.events.bind("map.move", function(event, data) {72 if(gisportal.walkthrough.is_recording){73 gisportal.walkthrough.addStep(data);74 }75});76// show a panel77gisportal.events.bind("panels.showpanel", function(event, data) {78 if(gisportal.walkthrough.is_recording){79 gisportal.walkthrough.addStep(data);80 }81});82gisportal.events.bind("refinePanel.cancel", function(event, data) {83 if(gisportal.walkthrough.is_recording){84 gisportal.walkthrough.addStep(data);85 }86});87gisportal.events.bind("refinePanel.removeCat", function(event, data) {88 if(gisportal.walkthrough.is_recording){89 gisportal.walkthrough.addStep(data);90 }91});92// auto scale a layer93gisportal.events.bind("scalebar.autoscale", function(event, data) {94 if(gisportal.walkthrough.is_recording){95 gisportal.walkthrough.addStep(data);96 }97});98// auto scale a layer99gisportal.events.bind("scalebar.autoscale-checkbox", function(event, data) {100 if(gisportal.walkthrough.is_recording){101 gisportal.walkthrough.addStep(data);102 }103});104// indicator has logarithmic scale105gisportal.events.bind("scalebar.log-set", function(event, data) {106 if(gisportal.walkthrough.is_recording){107 gisportal.walkthrough.addStep(data);108 }109});110// scalebar maximum value set111gisportal.events.bind("scalebar.max-set", function(event, data) {112 if(gisportal.walkthrough.is_recording){113 gisportal.walkthrough.addStep(data);114 }115});116// scalebar minimum value set117gisportal.events.bind("scalebar.min-set", function(event, data) {118 if(gisportal.walkthrough.is_recording){119 gisportal.walkthrough.addStep(data);120 }121});122// layer opacity changed123gisportal.events.bind("scalebar.opacity", function(event, data) {124 if(gisportal.walkthrough.is_recording){125 gisportal.walkthrough.addStep(data);126 }127});128// layer custom above max colour changed129gisportal.events.bind("scalebar.custom-aboveMaxColor", function(event, data) {130 if(gisportal.walkthrough.is_recording){131 gisportal.walkthrough.addStep(data);132 }133});134// layer custom below min colour changed135gisportal.events.bind("scalebar.custom-belowMinColor", function(event, data) {136 if(gisportal.walkthrough.is_recording){137 gisportal.walkthrough.addStep(data);138 }139});140// layer colorbands changed141gisportal.events.bind("scalebar.colorbands", function(event, data) {142 if(gisportal.walkthrough.is_recording){143 gisportal.walkthrough.addStep(data);144 }145});146// reset layer settings147gisportal.events.bind("scalebar.reset", function(event, data) {148 if(gisportal.walkthrough.is_recording){149 gisportal.walkthrough.addStep(data);150 }151});152// apply setting changes153gisportal.events.bind("scalebar.apply-changes", function(event, data) {154 if(gisportal.walkthrough.is_recording){155 gisportal.walkthrough.addStep(data);156 }157});158// search string changes159gisportal.events.bind("search.typing", function(event, data) {160 if(gisportal.walkthrough.is_recording){161 gisportal.walkthrough.addStep(data);162 }163});164// wms string changes165gisportal.events.bind("wms.typing", function(event, data) {166 if(gisportal.walkthrough.is_recording){167 gisportal.walkthrough.addStep(data);168 }169});170// geocoder search string changes171gisportal.events.bind("geocoderInput.typing", function(event, data) {172 if(gisportal.walkthrough.is_recording){173 gisportal.walkthrough.addStep(data);174 }175});176// refresh cache box changed177gisportal.events.bind("refreshCacheBox.clicked", function(event, data) {178 if(gisportal.walkthrough.is_recording){179 gisportal.walkthrough.addStep(data);180 }181});182// wms submitted183gisportal.events.bind("wms.submitted", function(event, data) {184 if(gisportal.walkthrough.is_recording){185 gisportal.walkthrough.addStep(data);186 }187});188// more info clicked189gisportal.events.bind("moreInfo.clicked", function(event, data) {190 if(gisportal.walkthrough.is_recording){191 gisportal.walkthrough.addStep(data);192 }193});194// show geocoder clicked195gisportal.events.bind("showGeocoder.clicked", function(event, data) {196 if(gisportal.walkthrough.is_recording){197 gisportal.walkthrough.addStep(data);198 }199});200// reset list clicked201gisportal.events.bind("resetList.clicked", function(event, data) {202 if(gisportal.walkthrough.is_recording){203 gisportal.walkthrough.addStep(data);204 }205});206// add layers form clicked207gisportal.events.bind("addLayersForm.clicked", function(event, data) {208 if(gisportal.walkthrough.is_recording){209 gisportal.walkthrough.addStep(data);210 }211});212// search string changes213gisportal.events.bind("search.resultselected", function(event, data) {214 if(gisportal.walkthrough.is_recording){215 gisportal.walkthrough.addStep(data);216 }217});218// Layer tab selected219gisportal.events.bind("tab.select", function(event, data) {220 if(gisportal.walkthrough.is_recording){221 gisportal.walkthrough.addStep(data);222 }223});224// Layer tab closed225gisportal.events.bind("layerTab.close", function(event, data) {226 if(gisportal.walkthrough.is_recording){227 gisportal.walkthrough.addStep(data);228 }229});230gisportal.events.bind('configurepanel.scroll', function(event, data) {231 if(gisportal.walkthrough.is_recording){232 gisportal.walkthrough.addStep(data);233 }234});235gisportal.events.bind('mapsettingspanel.scroll', function(event, data) {236 if(gisportal.walkthrough.is_recording){237 gisportal.walkthrough.addStep(data);238 }239});240gisportal.events.bind('indicatorspanel.scroll', function(event, data) {241 if(gisportal.walkthrough.is_recording){242 gisportal.walkthrough.addStep(data);243 }244});245gisportal.events.bind('addLayersForm.scroll', function(event, data) {246 if(gisportal.walkthrough.is_recording){247 gisportal.walkthrough.addStep(data);248 }249});250gisportal.events.bind('slideout.scroll', function(event, data) {251 if(gisportal.walkthrough.is_recording){252 gisportal.walkthrough.addStep(data);253 }254});255gisportal.events.bind('refinePanel.scroll', function(event, data) {256 if(gisportal.walkthrough.is_recording){257 gisportal.walkthrough.addStep(data);258 }259});260gisportal.events.bind('addLayerServer.clicked', function(event, data) {261 if(gisportal.walkthrough.is_recording){262 gisportal.walkthrough.addStep(data);263 }264});265gisportal.events.bind('addLayersForm.input', function(event, data) {266 if(gisportal.walkthrough.is_recording){267 gisportal.walkthrough.addStep(data);268 }269});270gisportal.events.bind('addLayersForm.autoScale-changed', function(event, data) {271 if(gisportal.walkthrough.is_recording){272 gisportal.walkthrough.addStep(data);273 }274});275gisportal.events.bind('addLayersForm.aboveMaxColor-changed', function(event, data) {276 if(gisportal.walkthrough.is_recording){277 gisportal.walkthrough.addStep(data);278 }279});280gisportal.events.bind('addLayersForm.belowMinColor-changed', function(event, data) {281 if(gisportal.walkthrough.is_recording){282 gisportal.walkthrough.addStep(data);283 }284});285gisportal.events.bind('addLayersForm.defaultStyle-changed', function(event, data) {286 if(gisportal.walkthrough.is_recording){287 gisportal.walkthrough.addStep(data);288 }289});290gisportal.events.bind('addLayersForm.close', function(event, data) {291 if(gisportal.walkthrough.is_recording){292 gisportal.walkthrough.addStep(data);293 }294});295gisportal.events.bind('body.keydown', function(event, data) {296 if(gisportal.walkthrough.is_recording){297 gisportal.walkthrough.addStep(data);298 }299});300gisportal.events.bind('paginator.selected', function(event, data) {301 if(gisportal.walkthrough.is_recording){302 gisportal.walkthrough.addStep(data);303 }304});305gisportal.events.bind('zoomToData.clicked', function(event, data) {306 if(gisportal.walkthrough.is_recording){307 gisportal.walkthrough.addStep(data);308 }309});310gisportal.events.bind('submitLayers.clicked', function(event, data) {311 if(gisportal.walkthrough.is_recording){312 gisportal.walkthrough.addStep(data);313 }314});315gisportal.events.bind('cancelChanges.clicked', function(event, data) {316 if(gisportal.walkthrough.is_recording){317 gisportal.walkthrough.addStep(data);318 }319});320gisportal.events.bind('toggleAllLayers.clicked', function(event, data) {321 if(gisportal.walkthrough.is_recording){322 gisportal.walkthrough.addStep(data);323 }324});325gisportal.events.bind('logToAllLayers.clicked', function(event, data) {326 if(gisportal.walkthrough.is_recording){327 gisportal.walkthrough.addStep(data);328 }329});330gisportal.events.bind('addToAll.clicked', function(event, data) {331 if(gisportal.walkthrough.is_recording){332 gisportal.walkthrough.addStep(data);333 }334});335gisportal.events.bind('addScalePointsToAll.clicked', function(event, data) {336 if(gisportal.walkthrough.is_recording){337 gisportal.walkthrough.addStep(data);338 }339});340gisportal.events.bind('addTagInput.clicked', function(event, data) {341 if(gisportal.walkthrough.is_recording){342 gisportal.walkthrough.addStep(data);343 }344});345gisportal.events.bind('userFeedback.close', function(event, data) {346 if(gisportal.walkthrough.is_recording){347 gisportal.walkthrough.addStep(data);348 }349});350gisportal.events.bind('userFeedback.submit', function(event, data) {351 if(gisportal.walkthrough.is_recording){352 gisportal.walkthrough.addStep(data);353 }354});355gisportal.events.bind('userFeedback.input', function(event, data) {356 if(gisportal.walkthrough.is_recording){357 gisportal.walkthrough.addStep(data);358 }359});360gisportal.events.bind('drawBox.clicked', function(event, data) {361 if(gisportal.walkthrough.is_recording){362 gisportal.walkthrough.addStep(data);363 }364});365gisportal.events.bind('drawPolygon.clicked', function(event, data) {366 if(gisportal.walkthrough.is_recording){367 gisportal.walkthrough.addStep(data);368 }369});370gisportal.events.bind('indicatorsPanel.geoJSONSelected', function(event, data) {371 if(gisportal.walkthrough.is_recording){372 gisportal.walkthrough.addStep(data);373 }374});375gisportal.events.bind('placeSearchFilter.clicked', function(event, data) {376 if(gisportal.walkthrough.is_recording){377 gisportal.walkthrough.addStep(data);378 }379});380gisportal.events.bind('drawFilterBox.clicked', function(event, data) {381 if(gisportal.walkthrough.is_recording){382 gisportal.walkthrough.addStep(data);383 }384});385gisportal.events.bind('drawFilterPolygon.clicked', function(event, data) {386 if(gisportal.walkthrough.is_recording){387 gisportal.walkthrough.addStep(data);388 }389});390gisportal.events.bind('geocoderRadius.changed', function(event, data) {391 if(gisportal.walkthrough.is_recording){392 gisportal.walkthrough.addStep(data);393 }394});395gisportal.events.bind('selectPolygon.clicked', function(event, data) {396 if(gisportal.walkthrough.is_recording){397 gisportal.walkthrough.addStep(data);398 }399});400gisportal.events.bind('removeGeoJSON.clicked', function(event, data) {401 if(gisportal.walkthrough.is_recording){402 gisportal.walkthrough.addStep(data);403 }404});405gisportal.events.bind('jsCoordinate.edit', function(event, data) {406 if(gisportal.walkthrough.is_recording){407 gisportal.walkthrough.addStep(data);408 }409});410gisportal.events.bind('clearSelection.clicked', function(event, data) {411 if(gisportal.walkthrough.is_recording){412 gisportal.walkthrough.addStep(data);413 }414});415gisportal.events.bind('olDraw.click', function(event, data) {416 if(gisportal.walkthrough.is_recording){417 gisportal.walkthrough.addStep(data);418 }419});420gisportal.events.bind('olDraw.drawstart', function(event, data) {421 if(gisportal.walkthrough.is_recording){422 gisportal.walkthrough.addStep(data);423 }424});425gisportal.events.bind('olDraw.drawend', function(event, data) {426 if(gisportal.walkthrough.is_recording){427 gisportal.walkthrough.addStep(data);428 }429});430gisportal.events.bind('filterDraw.drawend', function(event, data) {431 if(gisportal.walkthrough.is_recording){432 gisportal.walkthrough.addStep(data);433 }434});435gisportal.events.bind('geolocationFilter.filterByPlace', function(event, data) {436 if(gisportal.walkthrough.is_recording){437 gisportal.walkthrough.addStep(data);438 }439});440gisportal.events.bind('selectPolygon.hover', function(event, data) {441 if(gisportal.walkthrough.is_recording){442 gisportal.walkthrough.addStep(data);443 }444});445gisportal.events.bind('selectPolygon.select', function(event, data) {446 if(gisportal.walkthrough.is_recording){447 gisportal.walkthrough.addStep(data);448 }449});450gisportal.events.bind('coordinates.save', function(event, data) {451 if(gisportal.walkthrough.is_recording){452 gisportal.walkthrough.addStep(data);453 }454});455gisportal.events.bind('featureOverlay.removeType', function(event, data) {456 if(gisportal.walkthrough.is_recording){457 gisportal.walkthrough.addStep(data);458 }459});460gisportal.events.bind('dataPopup.display', function(event, data) {461 if(gisportal.walkthrough.is_recording){462 gisportal.walkthrough.addStep(data);463 }464});465gisportal.events.bind('dataPopup.close', function(event, data) {466 if(gisportal.walkthrough.is_recording){467 gisportal.walkthrough.addStep(data);468 }469});470gisportal.events.bind('newPlot.clicked', function(event, data) {471 if(gisportal.walkthrough.is_recording){472 gisportal.walkthrough.addStep(data);473 }474});475gisportal.events.bind('addToPlot.clicked', function(event, data) {476 if(gisportal.walkthrough.is_recording){477 gisportal.walkthrough.addStep(data);478 }479});480gisportal.events.bind('graphs.deleteActive', function(event, data) {481 if(gisportal.walkthrough.is_recording){482 gisportal.walkthrough.addStep(data);483 }484});485gisportal.events.bind('slideout.togglePeak', function(event, data) {486 if(gisportal.walkthrough.is_recording){487 gisportal.walkthrough.addStep(data);488 }489});490gisportal.events.bind('slideout.close', function(event, data) {491 if(gisportal.walkthrough.is_recording){492 gisportal.walkthrough.addStep(data);493 }494});495gisportal.events.bind('more-info.clicked', function(event, data) {496 if(gisportal.walkthrough.is_recording){497 gisportal.walkthrough.addStep(data);498 }499});500gisportal.events.bind('graphTitle.edit', function(event, data) {501 if(gisportal.walkthrough.is_recording){502 gisportal.walkthrough.addStep(data);503 }504});505gisportal.events.bind('graphType.edit', function(event, data) {506 if(gisportal.walkthrough.is_recording){507 gisportal.walkthrough.addStep(data);508 }509});510gisportal.events.bind('graphStyle.edit', function(event, data) {511 if(gisportal.walkthrough.is_recording){512 gisportal.walkthrough.addStep(data);513 }514});515gisportal.events.bind('layerDepth.change', function(event, data) {516 if(gisportal.walkthrough.is_recording){517 gisportal.walkthrough.addStep(data);518 }519});520gisportal.events.bind('graphRange.change', function(event, data) {521 if(gisportal.walkthrough.is_recording){522 gisportal.walkthrough.addStep(data);523 }524});525gisportal.events.bind('graphStartDate.change', function(event, data) {526 if(gisportal.walkthrough.is_recording){527 gisportal.walkthrough.addStep(data);528 }529});530gisportal.events.bind('graphEndDate.change', function(event, data) {531 if(gisportal.walkthrough.is_recording){532 gisportal.walkthrough.addStep(data);533 }534});535gisportal.events.bind('graph.submitted', function(event, data) {536 if(gisportal.walkthrough.is_recording){537 gisportal.walkthrough.addStep(data);538 }539});540gisportal.events.bind('graphComponent.remove', function(event, data) {541 if(gisportal.walkthrough.is_recording){542 gisportal.walkthrough.addStep(data);543 }544});545gisportal.events.bind('graphComponent.axisChange', function(event, data) {546 if(gisportal.walkthrough.is_recording){547 gisportal.walkthrough.addStep(data);548 }549});550gisportal.events.bind('graphComponent.axisLabelChange', function(event, data) {551 if(gisportal.walkthrough.is_recording){552 gisportal.walkthrough.addStep(data);553 }554});555gisportal.events.bind('graph.open', function(event, data) {556 if(gisportal.walkthrough.is_recording){557 gisportal.walkthrough.addStep(data);558 }559});560gisportal.events.bind('graph.copy', function(event, data) {561 if(gisportal.walkthrough.is_recording){562 gisportal.walkthrough.addStep(data);563 }564});565gisportal.events.bind('graph.delete', function(event, data) {566 if(gisportal.walkthrough.is_recording){567 gisportal.walkthrough.addStep(data);568 }569});570gisportal.events.bind('graphPopup.close', function(event, data) {571 if(gisportal.walkthrough.is_recording){572 gisportal.walkthrough.addStep(data);573 }574});575gisportal.events.bind('configureInternalLayers.clicked', function(event, data) {576 if(gisportal.walkthrough.is_recording){577 gisportal.walkthrough.addStep(data);578 }579});580gisportal.events.bind('configureInternalLayers.closed', function(event, data) {581 if(gisportal.walkthrough.is_recording){582 gisportal.walkthrough.addStep(data);583 }...

Full Screen

Full Screen

heightmap-generator.js

Source:heightmap-generator.js Github

copy

Full Screen

...37 }38 console.timeEnd('generateHeightmap');39 }40 // parse template step41 function addStep(a1, a2, a3, a4, a5) {42 if (a1 === "Hill") addHill(a2, a3, a4, a5); else43 if (a1 === "Pit") addPit(a2, a3, a4, a5); else44 if (a1 === "Range") addRange(a2, a3, a4, a5); else45 if (a1 === "Trough") addTrough(a2, a3, a4, a5); else46 if (a1 === "Strait") addStrait(a2, a3); else47 if (a1 === "Add") modify(a3, a2, 1); else48 if (a1 === "Multiply") modify(a3, 0, a2); else49 if (a1 === "Smooth") smooth(a2);50 }51 // Heighmap Template: Volcano52 function templateVolcano() {53 addStep("Hill", "1", "90-100", "44-56", "40-60");54 addStep("Multiply", .8, "50-100");55 addStep("Range", "1.5", "30-55", "45-55", "40-60");56 addStep("Smooth", 2);57 addStep("Hill", "1.5", "25-35", "25-30", "20-75");58 addStep("Hill", "1", "25-35", "75-80", "25-75");59 addStep("Hill", "0.5", "20-25", "10-15", "20-25");60 }61 // Heighmap Template: High Island62 function templateHighIsland() {63 addStep("Hill", "1", "90-100", "65-75", "47-53");64 addStep("Add", 5, "all");65 addStep("Hill", "6", "20-23", "25-55", "45-55");66 addStep("Range", "1", "40-50", "45-55", "45-55");67 addStep("Smooth", 2);68 addStep("Trough", "2-3", "20-30", "20-30", "20-30");69 addStep("Trough", "2-3", "20-30", "60-80", "70-80");70 addStep("Hill", "1", "10-15", "60-60", "50-50");71 addStep("Hill", "1.5", "13-16", "15-20", "20-75");72 addStep("Multiply", .8, "20-100");73 addStep("Range", "1.5", "30-40", "15-85", "30-40");74 addStep("Range", "1.5", "30-40", "15-85", "60-70");75 addStep("Pit", "2-3", "10-15", "15-85", "20-80");76 }77 // Heighmap Template: Low Island78 function templateLowIsland() {79 addStep("Hill", "1", "90-99", "60-80", "45-55");80 addStep("Hill", "4-5", "25-35", "20-65", "40-60");81 addStep("Range", "1", "40-50", "45-55", "45-55");82 addStep("Smooth", 3);83 addStep("Trough", "1.5", "20-30", "15-85", "20-30");84 addStep("Trough", "1.5", "20-30", "15-85", "70-80");85 addStep("Hill", "1.5", "10-15", "5-15", "20-80");86 addStep("Hill", "1", "10-15", "85-95", "70-80");87 addStep("Pit", "3-5", "10-15", "15-85", "20-80");88 addStep("Multiply", .4, "20-100");89 }90 // Heighmap Template: Continents91 function templateContinents() {92 addStep("Hill", "1", "80-85", "75-80", "40-60");93 addStep("Hill", "1", "80-85", "20-25", "40-60");94 addStep("Multiply", .22, "20-100");95 addStep("Hill", "5-6", "15-20", "25-75", "20-82");96 addStep("Range", ".8", "30-60", "5-15", "20-45");97 addStep("Range", ".8", "30-60", "5-15", "55-80");98 addStep("Range", "0-3", "30-60", "80-90", "20-80");99 addStep("Trough", "3-4", "15-20", "15-85", "20-80");100 addStep("Strait", "2", "vertical");101 addStep("Smooth", 2);102 addStep("Trough", "1-2", "5-10", "45-55", "45-55");103 addStep("Pit", "3-4", "10-15", "15-85", "20-80");104 addStep("Hill", "1", "5-10", "40-60", "40-60");105 }106 // Heighmap Template: Archipelago107 function templateArchipelago() {108 addStep("Add", 11, "all");109 addStep("Range", "2-3", "40-60", "20-80", "20-80");110 addStep("Hill", "5", "15-20", "10-90", "30-70");111 addStep("Hill", "2", "10-15", "10-30", "20-80");112 addStep("Hill", "2", "10-15", "60-90", "20-80");113 addStep("Smooth", 3);114 addStep("Trough", "10", "20-30", "5-95", "5-95");115 addStep("Strait", "2", "vertical");116 addStep("Strait", "2", "horizontal");117 }118 // Heighmap Template: Atoll119 function templateAtoll() {120 addStep("Hill", "1", "75-80", "50-60", "45-55");121 addStep("Hill", "1.5", "30-50", "25-75", "30-70");122 addStep("Hill", ".5", "30-50", "25-35", "30-70");123 addStep("Smooth", 1);124 addStep("Multiply", .2, "25-100");125 addStep("Hill", ".5", "10-20", "50-55", "48-52");126 }127 // Heighmap Template: Mediterranean128 function templateMediterranean() {129 addStep("Range", "3-4", "30-50", "0-100", "0-10");130 addStep("Range", "3-4", "30-50", "0-100", "90-100");131 addStep("Hill", "5-6", "30-70", "0-100", "0-5");132 addStep("Hill", "5-6", "30-70", "0-100", "95-100");133 addStep("Smooth", 1);134 addStep("Hill", "2-3", "30-70", "0-5", "20-80");135 addStep("Hill", "2-3", "30-70", "95-100", "20-80");136 addStep("Multiply", .8, "land");137 addStep("Trough", "3-5", "40-50", "0-100", "0-10");138 addStep("Trough", "3-5", "40-50", "0-100", "90-100");139 }140 // Heighmap Template: Peninsula141 function templatePeninsula() {142 addStep("Range", "2-3", "20-35", "40-50", "0-15");143 addStep("Add", 5, "all");144 addStep("Hill", "1", "90-100", "10-90", "0-5");145 addStep("Add", 13, "all");146 addStep("Hill", "3-4", "3-5", "5-95", "80-100");147 addStep("Hill", "1-2", "3-5", "5-95", "40-60");148 addStep("Trough", "5-6", "10-25", "5-95", "5-95");149 addStep("Smooth", 3);150 }151 // Heighmap Template: Pangea152 function templatePangea() {153 addStep("Hill", "1-2", "25-40", "15-50", "0-10");154 addStep("Hill", "1-2", "5-40", "50-85", "0-10");155 addStep("Hill", "1-2", "25-40", "50-85", "90-100");156 addStep("Hill", "1-2", "5-40", "15-50", "90-100");157 addStep("Hill", "8-12", "20-40", "20-80", "48-52");158 addStep("Smooth", 2);159 addStep("Multiply", .7, "land");160 addStep("Trough", "3-4", "25-35", "5-95", "10-20");161 addStep("Trough", "3-4", "25-35", "5-95", "80-90");162 addStep("Range", "5-6", "30-40", "10-90", "35-65");163 }164 // Heighmap Template: Isthmus165 function templateIsthmus() {166 addStep("Hill", "5-10", "15-30", "0-30", "0-20");167 addStep("Hill", "5-10", "15-30", "10-50", "20-40");168 addStep("Hill", "5-10", "15-30", "30-70", "40-60");169 addStep("Hill", "5-10", "15-30", "50-90", "60-80");170 addStep("Hill", "5-10", "15-30", "70-100", "80-100");171 addStep("Smooth", 2);172 addStep("Trough", "4-8", "15-30", "0-30", "0-20");173 addStep("Trough", "4-8", "15-30", "10-50", "20-40");174 addStep("Trough", "4-8", "15-30", "30-70", "40-60");175 addStep("Trough", "4-8", "15-30", "50-90", "60-80");176 addStep("Trough", "4-8", "15-30", "70-100", "80-100");177 }178 function getBlobPower() {179 switch (+densityInput.value) {180 case 1: return .98;181 case 2: return .985;182 case 3: return .987;183 case 4: return .9892;184 case 5: return .9911;185 case 6: return .9921;186 case 7: return .9934;187 case 8: return .9942;188 case 9: return .9946;189 case 10: return .995;190 }...

Full Screen

Full Screen

master.cfg

Source:master.cfg Github

copy

Full Screen

...87# launched from the slave there).88# Language tests, documentation generation and source (tar.gz and zip)89# need only be run on one platform; this would be Ubuntu 10.90def addCommonStartSteps(f, skipUnitTests=False, skipIntegrationTests=False, **kwargs):91 f.addStep(tcbuild.Revert(**kwargs))92 f.addStep(tcbuild.Cleanup(**kwargs))93 f.addStep(tcbuild.Revision(**kwargs))94 if not skipUnitTests:95 f.addStep(tcbuild.UnitTests(**kwargs))96 if not skipIntegrationTests:97 f.addStep(tcbuild.IntegrationTests(**kwargs))98def addCommonEndSteps(f, **kwargs):99 f.addStep(tcbuild.DistributionTests(**kwargs))100# Main release builder101f = factory.BuildFactory()102f.addStep(tcbuild.CleanupReleaseStep())103f.addStep(Trigger(schedulerNames=['Release'], waitForFinish=True, set_properties=dict(release=True)))104f.addStep(tcbuild.ZipReleaseStep())105c['builders'].append(dict(name='Release', slavename='Release',106 builddir='release', factory=f))107for branchName, longName, shortName in BRANCHES:108 svnargs=dict(svnurl=BASEURL + 'trunk') if branchName == 'trunk' else dict(baseURL=BASEURL)109 svnargs['retry'] = (30, 5)110 workdir = 'build/taskcoach'111 # Win32112 f = factory.BuildFactory()113 f.addStep(SVN(**svnargs))114 addCommonStartSteps(f, workdir=workdir, skipUnitTests=True)115 f.addStep(tcbuild.BuildSourceZip(workdir=workdir))116 f.addStep(tcbuild.UploadSourceZip(workdir=workdir))117 f.addStep(tcbuild.BuildEXE(workdir=workdir))118 f.addStep(tcbuild.UploadEXE(workdir=workdir))119 f.addStep(tcbuild.BuildWinPenPack(workdir=workdir))120 f.addStep(tcbuild.UploadWinPenPack(workdir=workdir))121 f.addStep(tcbuild.BuildPortableApps(workdir=workdir))122 f.addStep(tcbuild.UploadPortableApps(workdir=workdir))123 addCommonEndSteps(f, workdir=workdir)124 f.addStep(tcbuild.KillEXE(workdir=workdir))125 c['builders'].append(dict(name='win32-%s' % shortName,126 slavename='WinXPSP3',127 builddir='%s-win32' % shortName,128 factory=f))129 # Ubuntu 10130 f = factory.BuildFactory()131 f.addStep(SVN(**svnargs))132 addCommonStartSteps(f, workdir=workdir)133 if shortName == 'rel':134 f.addStep(tcbuild.LanguageTests(workdir=workdir))135 f.addStep(tcbuild.Epydoc(workdir=workdir))136 f.addStep(tcbuild.UploadDoc(workdir=workdir))137 f.addStep(tcbuild.Cleanup(workdir=workdir))138 f.addStep(tcbuild.Revision(workdir=workdir))139 f.addStep(tcbuild.BuildSourceTar(workdir=workdir))140 f.addStep(tcbuild.UploadSourceTar(workdir=workdir))141 f.addStep(tcbuild.BuildSourceRaw(workdir=workdir))142 f.addStep(tcbuild.UploadSourceRaw(workdir=workdir))143 f.addStep(tcbuild.BuildDEB(workdir=workdir))144 f.addStep(tcbuild.UploadDEB(workdir=workdir))145 f.addStep(tcbuild.UploadChangelog(workdir=workdir))146 if shortName == 'rel':147 f.addStep(tcbuild.PPA(name='rel', workdir=workdir))148 elif branchName == 'trunk':149 f.addStep(tcbuild.PPA(name='relnext', workdir=workdir))150 f.addStep(tcbuild.PylintStep(workdir=workdir))151 f.addStep(tcbuild.PylintUploadStep(workdir=workdir))152 f.addStep(tcbuild.Coverage(workdir=workdir))153 f.addStep(tcbuild.UploadCoverage(workdir=workdir))154 addCommonEndSteps(f, workdir=workdir)155 c['builders'].append(dict(name='ubuntu10-%s' % shortName,156 slavename='Ubuntu10',157 builddir='%s-ubuntu10' % shortName,158 factory=f))159 # Fedora 14160 f = factory.BuildFactory()161 f.addStep(SVN(**svnargs))162 addCommonStartSteps(f, workdir=workdir)163 f.addStep(tcbuild.BuildRPM(workdir=workdir))164 f.addStep(tcbuild.UploadRPM(workdir=workdir))165 f.addStep(tcbuild.Cleanup(workdir=workdir))166 f.addStep(tcbuild.Revision(workdir=workdir))167 f.addStep(tcbuild.BuildSRPM(workdir=workdir))168 f.addStep(tcbuild.UploadSRPM(workdir=workdir))169 f.addStep(tcbuild.Cleanup(workdir=workdir))170 f.addStep(tcbuild.Revision(workdir=workdir))171 f.addStep(tcbuild.BuildFedora14(workdir=workdir))172 f.addStep(tcbuild.UploadFedora14(workdir=workdir))173 addCommonEndSteps(f, workdir=workdir)174 c['builders'].append(dict(name='fedora14-%s' % shortName,175 slavename='Fedora14',176 builddir='%s-fedora14' % shortName,177 factory=f))178 # OpenSuse179 f = factory.BuildFactory()180 f.addStep(SVN(**svnargs))181 addCommonStartSteps(f, skipUnitTests=True, skipIntegrationTests=True, workdir=workdir)182 f.addStep(tcbuild.BuildOpenSuse(workdir=workdir))183 f.addStep(tcbuild.UploadOpenSuse(workdir=workdir))184 c['builders'].append(dict(name='opensuse-%s' % shortName,185 slavename='OpenSuse',186 builddir='%s-opensuse' % shortName,187 factory=f))188 # MacOS189 f = factory.BuildFactory()190 f.addStep(SVN(**svnargs))191 addCommonStartSteps(f, skipUnitTests=True, skipIntegrationTests=True, workdir=workdir)192 f.addStep(tcbuild.BuildDMG(workdir=workdir))193 f.addStep(tcbuild.UploadDMG(workdir=workdir))194 addCommonEndSteps(f, workdir=workdir)195 c['builders'].append(dict(name='macos-%s' % shortName,196 slavename='MacOS',197 builddir='%s-macos' % shortName,198 factory=f))199####### Release200f = factory.BuildFactory()201f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))202f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))203f.addStep(tcbuild.BuildDMG(workdir='build/taskcoach'))204f.addStep(tcbuild.UploadDMG(workdir='build/taskcoach'))205c['builders'].append(dict(name='macos-release', slavename='MacOS',206 builddir='release-macos', factory=f))207f = factory.BuildFactory()208f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))209f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))210f.addStep(tcbuild.BuildEXE(workdir='build/taskcoach'))211f.addStep(tcbuild.UploadEXE(workdir='build/taskcoach'))212f.addStep(tcbuild.BuildSourceZip(workdir='build/taskcoach'))213f.addStep(tcbuild.UploadSourceZip(workdir='build/taskcoach'))214f.addStep(tcbuild.BuildWinPenPack(workdir='build/taskcoach'))215f.addStep(tcbuild.UploadWinPenPack(workdir='build/taskcoach'))216f.addStep(tcbuild.BuildPortableApps(workdir='build/taskcoach'))217f.addStep(tcbuild.UploadPortableApps(workdir='build/taskcoach'))218c['builders'].append(dict(name='windows-release', slavename='WinXPSP3',219 builddir='release-windows', factory=f))220f = factory.BuildFactory()221f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))222f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))223f.addStep(tcbuild.BuildDEB(workdir='build/taskcoach'))224f.addStep(tcbuild.UploadDEB(workdir='build/taskcoach'))225f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))226f.addStep(tcbuild.BuildSourceTar(workdir='build/taskcoach'))227f.addStep(tcbuild.UploadSourceTar(workdir='build/taskcoach'))228f.addStep(tcbuild.BuildSourceRaw(workdir=workdir))229f.addStep(tcbuild.UploadSourceRaw(workdir='build/taskcoach'))230f.addStep(tcbuild.ReleaseTests(workdir=workdir))231f.addStep(Trigger(schedulerNames=['PPARelease'], waitForFinish=False))232c['builders'].append(dict(name='ubuntu10-release', slavename='Ubuntu10',233 builddir='release-ubuntu10', factory=f))234f = factory.BuildFactory()235f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))236f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))237f.addStep(tcbuild.BuildRPM(workdir='build/taskcoach'))238f.addStep(tcbuild.UploadRPM(workdir='build/taskcoach'))239f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))240f.addStep(tcbuild.BuildSRPM(workdir='build/taskcoach'))241f.addStep(tcbuild.UploadSRPM(workdir='build/taskcoach'))242f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))243f.addStep(tcbuild.BuildFedora14(workdir='build/taskcoach'))244f.addStep(tcbuild.UploadFedora14(workdir='build/taskcoach'))245c['builders'].append(dict(name='fedora14-release', slavename='Fedora14',246 builddir='release-fedora14', factory=f))247f = factory.BuildFactory()248f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))249f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))250f.addStep(tcbuild.BuildOpenSuse(workdir='build/taskcoach'))251f.addStep(tcbuild.UploadOpenSuse(workdir='build/taskcoach'))252c['builders'].append(dict(name='opensuse-release', slavename='OpenSuse',253 builddir='release-opensuse', factory=f))254f = factory.BuildFactory()255f.addStep(SVN(baseURL=BASEURL, defaultBranch='branches/%s' % BRANCHES[0][0], retry=(30, 5)))256f.addStep(tcbuild.Cleanup(workdir='build/taskcoach'))257f.addStep(tcbuild.PPA(workdir='build/taskcoach', name='release'))258c['builders'].append(dict(name='ubuntu10-pparelease', slavename='Ubuntu10',259 builddir='ubuntu10-pparelease', factory=f))260####### STATUS TARGETS261c['status'] = []262from buildbot.status import html263from buildbot.status.web.authz import Authz264from buildbot.status.web.auth import BasicAuth265c['status'].append(html.WebStatus(http_port=8010,266 authz=Authz(auth=BasicAuth([('fraca7', USERPASSWORD), ('frank', USERPASSWORD), ('aaron', USERPASSWORD)]), forceBuild='auth', cancelPendingBuild='auth')))267from buildbot.status import mail268c['status'].append(mail.MailNotifier(fromaddr="fraca7@free.fr",269 sendToInterestedUsers=True,270 mode='failing',271 relayhost='smtp.free.fr',...

Full Screen

Full Screen

factories.py

Source:factories.py Github

copy

Full Screen

...24from steps import *25class Factory(factory.BuildFactory):26 def __init__(self, platform, configuration, architectures, buildOnly, additionalArguments, device_model):27 factory.BuildFactory.__init__(self)28 self.addStep(ConfigureBuild(platform=platform, configuration=configuration, architecture=" ".join(architectures), buildOnly=buildOnly, additionalArguments=additionalArguments, device_model=device_model))29 self.addStep(CheckOutSource())30 self.addStep(ShowIdentifier())31 if not (platform == "jsc-only"):32 self.addStep(KillOldProcesses())33 self.addStep(CleanBuildIfScheduled())34 self.addStep(DeleteStaleBuildFiles())35 if platform == "win":36 self.addStep(InstallWin32Dependencies())37 if platform == "gtk" and "--no-experimental-features" not in (additionalArguments or []):38 self.addStep(InstallGtkDependencies())39 if platform == "wpe":40 self.addStep(InstallWpeDependencies())41class BuildFactory(Factory):42 ShouldRunJSCBundleStep = False43 ShouldRunMiniBrowserBundleStep = False44 def __init__(self, platform, configuration, architectures, triggers=None, additionalArguments=None, device_model=None):45 Factory.__init__(self, platform, configuration, architectures, True, additionalArguments, device_model)46 if platform == "win" or platform.startswith("playstation"):47 self.addStep(CompileWebKit(timeout=2 * 60 * 60))48 else:49 self.addStep(CompileWebKit())50 if self.ShouldRunJSCBundleStep:51 self.addStep(GenerateJSCBundle())52 if self.ShouldRunMiniBrowserBundleStep:53 self.addStep(GenerateMiniBrowserBundle())54 if triggers:55 self.addStep(ArchiveBuiltProduct())56 self.addStep(UploadBuiltProduct())57 if platform.startswith('mac') or platform.startswith('ios-simulator') or platform.startswith('tvos-simulator') or platform.startswith('watchos-simulator'):58 self.addStep(ArchiveMinifiedBuiltProduct())59 self.addStep(UploadMinifiedBuiltProduct())60 self.addStep(TransferToS3())61 self.addStep(trigger.Trigger(schedulerNames=triggers))62class TestFactory(Factory):63 JSCTestClass = RunJavaScriptCoreTests64 LayoutTestClass = RunWebKitTests65 def getProduct(self):66 self.addStep(DownloadBuiltProduct())67 self.addStep(ExtractBuiltProduct())68 def __init__(self, platform, configuration, architectures, additionalArguments=None, device_model=None, **kwargs):69 Factory.__init__(self, platform, configuration, architectures, False, additionalArguments, device_model, **kwargs)70 self.getProduct()71 if platform == 'wincairo':72 self.addStep(InstallWinCairoDependencies())73 if platform.startswith('mac') or platform.startswith('ios-simulator'):74 self.addStep(WaitForCrashCollection())75 if self.JSCTestClass:76 self.addStep(self.JSCTestClass())77 if self.LayoutTestClass:78 self.addStep(self.LayoutTestClass())79 if platform.startswith('win') or platform.startswith('mac') or platform.startswith('ios-simulator'):80 self.addStep(RunAPITests())81 if platform.startswith('mac'):82 self.addStep(RunLLDBWebKitTests())83 self.addStep(RunWebKitPyTests())84 self.addStep(RunPerlTests())85 self.addStep(RunBindingsTests())86 self.addStep(RunBuiltinsTests())87 if not platform.startswith('win'):88 self.addStep(RunDashboardTests())89 if platform.startswith('mac') or platform.startswith('ios-simulator'):90 self.addStep(TriggerCrashLogSubmission())91 if self.LayoutTestClass:92 self.addStep(ArchiveTestResults())93 self.addStep(UploadTestResults())94 self.addStep(ExtractTestResults())95 self.addStep(SetPermissions())96 if platform == "gtk":97 self.addStep(RunGtkAPITests())98 if additionalArguments and "--display-server=wayland" in additionalArguments:99 self.addStep(RunWebDriverTests())100 if platform == "wpe":101 self.addStep(RunWPEAPITests())102 self.addStep(RunWebDriverTests())103class BuildAndTestFactory(TestFactory):104 def getProduct(self):105 self.addStep(CompileWebKit())106 def __init__(self, platform, configuration, architectures, triggers=None, additionalArguments=None, device_model=None, **kwargs):107 TestFactory.__init__(self, platform, configuration, architectures, additionalArguments, device_model, **kwargs)108 if triggers:109 self.addStep(ArchiveBuiltProduct())110 self.addStep(UploadBuiltProduct())111 self.addStep(trigger.Trigger(schedulerNames=triggers))112class BuildAndTestLLINTCLoopFactory(Factory):113 def __init__(self, platform, configuration, architectures, triggers=None, additionalArguments=None, device_model=None, **kwargs):114 Factory.__init__(self, platform, configuration, architectures, False, additionalArguments, device_model, **kwargs)115 self.addStep(CompileLLINTCLoop())116 self.addStep(RunLLINTCLoopTests())117class BuildAndTest32bitJSCFactory(Factory):118 def __init__(self, platform, configuration, architectures, triggers=None, additionalArguments=None, device_model=None, **kwargs):119 Factory.__init__(self, platform, configuration, architectures, False, additionalArguments, device_model, **kwargs)120 self.addStep(Compile32bitJSC())121 self.addStep(Run32bitJSCTests())122class BuildAndNonLayoutTestFactory(BuildAndTestFactory):123 LayoutTestClass = None124class BuildAndJSCTestsFactory(Factory):125 def __init__(self, platform, configuration, architectures, triggers=None, additionalArguments=None, device_model=None):126 Factory.__init__(self, platform, configuration, architectures, False, additionalArguments, device_model)127 self.addStep(CompileJSCOnly(timeout=60 * 60))128 self.addStep(RunJavaScriptCoreTests(timeout=60 * 60))129class TestAllButJSCFactory(TestFactory):130 JSCTestClass = None131class BuildAndTestAllButJSCFactory(BuildAndTestFactory):132 JSCTestClass = None133 def __init__(self, platform, configuration, architectures, triggers=None, additionalArguments=None, device_model=None, **kwargs):134 BuildAndTestFactory.__init__(self, platform, configuration, architectures, additionalArguments, device_model, **kwargs)135 self.addStep(RunWebDriverTests())136class BuildAndGenerateJSCBundleFactory(BuildFactory):137 ShouldRunJSCBundleStep = True138class BuildAndGenerateMiniBrowserBundleFactory(BuildFactory):139 ShouldRunMiniBrowserBundleStep = True140class BuildAndGenerateMiniBrowserJSCBundleFactory(BuildFactory):141 ShouldRunJSCBundleStep = True142 ShouldRunMiniBrowserBundleStep = True143class TestJSCFactory(Factory):144 def __init__(self, platform, configuration, architectures, additionalArguments=None, device_model=None):145 Factory.__init__(self, platform, configuration, architectures, False, additionalArguments, device_model)146 self.addStep(DownloadBuiltProduct())147 self.addStep(ExtractBuiltProduct())148 self.addStep(RunJavaScriptCoreTests())149class Test262Factory(Factory):150 def __init__(self, platform, configuration, architectures, additionalArguments=None, device_model=None):151 Factory.__init__(self, platform, configuration, architectures, False, additionalArguments, device_model)152 self.addStep(DownloadBuiltProduct())153 self.addStep(ExtractBuiltProduct())154 self.addStep(RunTest262Tests())155class TestJSFactory(Factory):156 def __init__(self, platform, configuration, architectures, additionalArguments=None, device_model=None):157 Factory.__init__(self, platform, configuration, architectures, False, additionalArguments, device_model)158 self.addStep(DownloadBuiltProduct())159 self.addStep(ExtractBuiltProduct())160 self.addStep(RunJavaScriptCoreTests())161 self.addStep(RunTest262Tests())162class TestWebDriverFactory(Factory):163 def __init__(self, platform, configuration, architectures, additionalArguments=None, device_model=None):164 Factory.__init__(self, platform, configuration, architectures, False, additionalArguments, device_model)165 self.addStep(DownloadBuiltProduct())166 self.addStep(ExtractBuiltProduct())167 self.addStep(RunWebDriverTests())168class TestWebKit1Factory(TestFactory):169 LayoutTestClass = RunWebKit1Tests170class TestWebKit1AllButJSCFactory(TestWebKit1Factory):171 JSCTestClass = None172class BuildAndPerfTestFactory(Factory):173 def __init__(self, platform, configuration, architectures, additionalArguments=None, device_model=None, **kwargs):174 Factory.__init__(self, platform, configuration, architectures, False, additionalArguments, device_model, **kwargs)175 self.addStep(CompileWebKit())176 self.addStep(RunAndUploadPerfTests())177 if platform == "gtk":178 self.addStep(RunBenchmarkTests(timeout=2000))179class DownloadAndPerfTestFactory(Factory):180 def __init__(self, platform, configuration, architectures, additionalArguments=None, device_model=None, **kwargs):181 Factory.__init__(self, platform, configuration, architectures, False, additionalArguments, device_model, **kwargs)182 self.addStep(DownloadBuiltProduct())183 self.addStep(ExtractBuiltProduct())184 self.addStep(RunAndUploadPerfTests())185 if platform == "gtk":...

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run fMBT automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful