Search

Drop Down Menues In Flash

5 min read
0 views

Why Flash Still Powers Rich Navigation Menus

When the web first opened up to visual interactivity, Flash became the go‑to platform for designers who wanted to push beyond static text and basic links. Even today, when HTML, CSS, and JavaScript can produce elegant menus, Flash remains the preferred tool for certain projects that demand smooth vector animation, deep custom branding, or the ability to embed multimedia elements directly inside navigation items. Flash’s strength comes from its native support for high‑frame‑rate vector rendering and its rich set of built‑in animation classes. These features give developers precise control over how a menu appears, behaves, and responds to user input, a level of polish that many developers find hard to match with purely CSS‑based solutions.

In a typical Flash navigation menu, each top‑level item acts as a trigger that can reveal a submenu with its own set of links. Because Flash runs inside the Flash Player plugin, it can access a wealth of multimedia assets - audio clips, animated icons, or even short video loops - without loading extra files from the server. That means you can have a menu where hovering over a category brings up a dynamic background that changes color, plays a sound, or shows an animated logo, all while keeping the page load times fast. For corporate sites, e‑commerce portals, and multimedia blogs, that kind of visual consistency helps reinforce brand identity and keeps users engaged.

Another advantage is the ability to maintain a clean layout. Rather than crowding a navigation bar with dozens of links, a drop‑down menu keeps the interface minimal while still offering access to every page. When a submenu fades in, it does not take up space on the page itself; the rest of the content stays in place. This is especially useful on smaller screens or in situations where a responsive design is not possible, because the Flash menu can be designed to adapt its size and position on the fly.

Despite the decline in Flash usage on the web, many legacy sites still rely on it. For those sites, learning how to build efficient, accessible, and visually appealing drop‑down menus in Flash is a valuable skill. In the following sections, we’ll walk through every step - from planning the hierarchy to writing clean ActionScript, to testing across browsers - and give you practical tips that you can use right away.

Planning the Menu Hierarchy

The first step in building a Flash drop‑down menu is to sketch out the menu structure. Think of the navigation as a tree, where each top‑level node has a number of child nodes. A two‑level structure - main bar and submenu - is the most common, but you can add a third level for sub‑categories if needed. The key is to keep the tree shallow enough that users can find what they’re looking for without having to dig through too many layers. A menu with more than three levels often feels clunky and can cause frustration.

Start by listing all the major sections of your website. Group related links under logical categories such as Products, Services, Support, About, and Contact. For each category, write a brief description of the pages that belong there. If you have a large product line, break it down by product type or market segment. For example, a hardware company might have separate categories for Laptops, Desktops, Accessories, and Services. Each of these categories can become a top‑level menu item.

Next, assign a short, descriptive label to each top‑level item. Avoid jargon or overly long names; the label should give users a clear idea of what’s inside. For instance, “Products” is more helpful than “Our Products” if the submenu will already be visible. Consistency is also essential: if you use uppercase letters for one menu item, use uppercase for all items. Likewise, keep the order of items logical - often alphabetical or by importance.

Once you have the structure in place, create a simple diagram on paper or a whiteboard. Draw the main bar as a horizontal line and add boxes underneath for each submenu. Shade the submenus so you can see where each top‑level item points. This visual representation will make it easier to translate the structure into Flash symbols later on.

Another important consideration is the placement of the menu in the overall site architecture. If your site has a sidebar layout, the menu might be vertical instead of horizontal. Decide on the orientation early so you can design the symbols accordingly. In addition, think about the flow of content on the page. If the main content area starts below the navigation bar, you might want to reserve space for the submenu when it expands so it doesn’t cover important information.

Accessibility is a good practice from the start. Make sure that every menu item can be reached with a keyboard or a screen reader. In your diagram, mark which items are interactive and plan how the focus will move between them. This early planning stage will save you time later when you start coding the interaction logic.

Finally, before you begin working in Flash, confirm that your site’s navigation meets WCAG 2.1 AA standards for color contrast, keyboard navigation, and screen reader support. Having a solid foundation means the rest of your work will be smoother, and you’ll avoid having to re‑implement basic functionality later.

Building MovieClip Structures

With the menu hierarchy defined, the next step is to translate that structure into Flash symbols. The core of any Flash navigation system is the MovieClip. A MovieClip can contain other MovieClips, text fields, or buttons, making it ideal for representing menu items and their submenus.

Create a new Flash document and set the stage size to match the design specifications. If the site will be displayed on high‑resolution displays, consider using a larger canvas and scaling the content with the StageScalingMode property to ensure crisp vector graphics at any size.

For each top‑level item, draw a MovieClip that will act as the button. Use the Shape tool to create the background rectangle and the Text tool to add the label. Convert the entire drawing to a symbol (Ctrl+F8) and choose “MovieClip” as the type. Name the symbol something like “mcMainItem_Products.” Inside the MovieClip, set the pivot point to the top left corner so that the submenu can expand downward without shifting the entire bar.

Next, create a child MovieClip for the submenu. This symbol will be hidden by default and will contain the list of links. Add a text field for each submenu item and assign each a unique instance name (e.g., “tfLink1,” “tfLink2,” etc.). Group the text fields inside a container MovieClip named “mcSubMenu.” Set the visibility of this container to false and the alpha to 0. This setup prepares the submenu for animation without displaying it prematurely.

Once the structure is in place, duplicate the top‑level MovieClip for each menu item, replacing the label and adding a unique child submenu. Keep the design consistent - use the same font, color, and padding for every item. You can use the Linkage property to assign a public class name to each MovieClip so that you can reference them in ActionScript. For instance, “Products” might be linked to the class “ProductsMenu,” and “Services” to “ServicesMenu.”

To avoid clutter on the stage, consider using the “Layer” feature. Keep all top‑level items on the same layer and place submenus on a separate layer that sits behind the main bar. That way, when a submenu becomes visible, it appears in front of the main content without interfering with other elements.

After setting up all MovieClips, test the layout by pressing Ctrl+Enter. Ensure that each top‑level item is clickable and that the submenus do not appear until you program the interaction. If the submenus overlay other elements incorrectly, adjust the depth or reorder the layers. A solid symbol structure saves a lot of time later when you add the ActionScript logic.

In this stage, also check that the text fields are set to dynamic text, not static, so that you can change the label or color in code if needed. Add the “Use TextField for Accessibility” property to each dynamic text field, which will help screen readers interpret the labels correctly. If you need to embed images or icons in the submenu, convert them to Bitmap symbols for faster rendering.

With the MovieClip hierarchy ready, the next step is to wire up the interaction logic using ActionScript 3.0. This code will manage visibility, animation, and state, turning a static design into a responsive navigation menu.

Implementing ActionScript Interactions

Now that the visual elements are ready, we can add the logic that will make the menu interactive. In Flash CS6 or later, ActionScript 3.0 is the standard, and it offers a robust event system that works well with MovieClips.

Start by creating a new ActionScript file or adding a script to the main timeline. Import the necessary classes: Event, MouseEvent, and the TweenLite library if you prefer a lightweight animation tool. For example:

Prompt
import flash.events.MouseEvent;</p> <p>import com.greensock.TweenLite;</p>

Next, create a helper function that toggles a submenu. The function should accept a MovieClip representing the submenu and a Boolean indicating whether to show or hide it. Inside the function, use TweenLite to animate the alpha property from 0 to 1 for a fade‑in, and from 1 to 0 for a fade‑out. Set the duration to 0.4 seconds for a smooth effect. Here’s a simple example:

Prompt
function toggleSubMenu(mc:MovieClip, show:Boolean):void {</p> <p> if (show) {</p> <p> mc.visible = true;</p> <p> TweenLite.to(mc, 0.4, {alpha:1});</p> <p> } else {</p> <p> TweenLite.to(mc, 0.4, {alpha:0, onComplete:function():void {mc.visible = false;}});</p> <p> }</p> <p>}</p>

Attach event listeners to each top‑level item. You’ll want to handle three types of events: CLICK to open a submenu, MOUSE_OVER to pre‑highlight or open on hover, and MOUSE_OUT to close when the cursor leaves. Assign a unique instance name to each top‑level MovieClip and register listeners in a loop:

Prompt
var mainItems:Array = [mcProducts, mcServices, mcSupport];</p> <p>for each (var item:MovieClip in mainItems) {</p> <p> item.addEventListener(MouseEvent.CLICK, onItemClick);</p> <p> item.addEventListener(MouseEvent.MOUSE_OVER, onItemHover);</p> <p> item.addEventListener(MouseEvent.MOUSE_OUT, onItemOut);</p> <p>}</p>

The handler functions look like this:

Prompt
function onItemClick(e:MouseEvent):void {</p> <p> var target:MovieClip = e.currentTarget as MovieClip;</p> <p> closeAllSubmenus();</p> <p> toggleSubMenu(target.mcSubMenu, true);</p> <p>}</p> <p>function onItemHover(e:MouseEvent):void {</p> <p> // Optionally add a hover effect or open the submenu after a delay</p> <p>}</p> <p>function onItemOut(e:MouseEvent):void {</p> <p> // Keep the submenu open if the mouse is over it</p> <p>}</p>

The closeAllSubmenus function iterates over all submenus and hides them. This prevents multiple submenus from staying open simultaneously, which can clutter the interface. Use an array of submenu references to keep track of open menus.

Keyboard accessibility is a must. Add a keyDown listener on each top‑level item that listens for the ENTER or SPACE key. When triggered, it should open the submenu and set focus to the first link inside. Here’s a snippet:

Prompt
item.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);</p> <p>function onKeyDown(e:KeyboardEvent):void {</p> <p> if (e.keyCode == Keyboard.ENTER || e.keyCode == Keyboard.SPACE) {</p> <p> e.stopImmediatePropagation();</p> <p> var target:MovieClip = e.currentTarget as MovieClip;</p> <p> closeAllSubmenus();</p> <p> toggleSubMenu(target.mcSubMenu, true);</p> <p> // Set focus to first link</p> <p> target.mcSubMenu.tfLink1.tabEnabled = true;</p> <p> target.mcSubMenu.tfLink1.stage.focus = target.mcSubMenu.tfLink1;</p> <p> }</p> <p>}</p>

Make sure the text fields inside the submenu have the tabEnabled property set to true so that the user can tab through them. You can also add event listeners to the text fields to handle clicks and open the linked pages.

Once the scripts are in place, test the menu by pressing F5. Hover over each top‑level item and click to see if the submenu appears. Use the browser’s console to catch any errors, and adjust the code as necessary. Remember that Flash Player may have different event firing orders in different browsers, so test on Chrome, Firefox, Safari, and Edge.

When the interaction logic works, the menu feels alive. Users can click or hover, the submenu fades in, and the navigation feels intuitive. The next step is to fine‑tune the visual presentation and ensure that the menu behaves correctly on various devices.

Managing Visibility, Animations, and Z‑Index

While the basic interaction code is functional, a polished navigation menu requires careful handling of visibility, depth, and animation nuances. Properly managing the visible property and alpha transitions ensures that the menu looks clean and that submenus do not interfere with other on‑stage elements.

The first thing to verify is that the submenu clips have a depth higher than the main content layer. In Flash, depth is controlled by the depth property or by the order of layers. You can set the depth programmatically:

Prompt
mcSubMenu.setDepth(10);</p>

Setting a higher depth guarantees that the submenu will appear on top of any other symbols. If you find that the submenu hides behind a logo or a banner, adjust the depth accordingly.

Visibility toggling can be optimized by using the visible property combined with alpha. When the submenu opens, set visible = true and start an alpha tween from 0 to 1. When closing, reverse the process and set visible = false in the tween’s onComplete callback. This technique ensures that the submenu is removed from the render tree after it fades out, which can improve performance.

Animations are a powerful way to communicate state changes. A subtle fade‑in gives a smooth, professional feel, while a slight slide‑down can add depth. If you want a slide, animate the y property along with alpha:

Prompt
TweenLite.to(mcSubMenu, 0.4, {y:mcSubMenu.y + 10, alpha:1});</p>

For the slide effect, start the submenu 10 pixels above its final position and animate it downward. The same idea applies when closing, but in reverse.

Hover behavior needs careful timing. A delay timer can prevent accidental openings. Create a Timer instance that starts on MOUSE_OVER and triggers the submenu open after 200 milliseconds. If the mouse moves away before the timer fires, stop the timer. This small buffer improves usability, especially on dense menu bars.

Prompt
var hoverTimer:Timer = new Timer(200,1);</p> <p> hoverTimer.addEventListener(TimerEvent.TIMER_COMPLETE, openSubMenu);</p> <p> hoverTimer.start();</p> <p>}</p> <p> hoverTimer.stop();</p> <p>}</p>

When designing multi‑level menus, ensure that only one submenu at each level is visible at any time. Use a global array that tracks open submenus. When opening a new submenu, iterate through the array and close any that belong to the same level. This logic keeps the interface tidy and prevents overlapping content.

Accessibility can be enhanced by updating the tabIndex of submenu items as they open and close. When a submenu becomes visible, set tabIndex = 0 for its links; when it hides, set tabIndex = -1 so that the keyboard can skip them.

Finally, test the menu on different screen sizes. If the site uses responsive design, the Flash canvas might resize. Ensure that the menu scales proportionally and that the submenus stay anchored to the correct top‑level item. If the canvas shrinks, the submenus might still appear in the same absolute position, so consider adding listeners for stage resize events and repositioning the submenus accordingly.

When visibility, depth, and animations are fine‑tuned, the navigation feels natural. Users notice the subtle cues - submenus fade in, hover delays prevent accidental clicks, and menus stay on top of content - leading to a smoother experience.

Accessibility for Flash Menus

Flash is notorious for accessibility challenges, but with the right approach, you can build menus that are usable by screen readers and keyboard‑only users. The core of accessibility in Flash lies in proper tab ordering, role annotations, and descriptive labels.

Start by assigning tabEnabled = true to every interactive object that should receive focus. This includes top‑level menu items and every link inside a submenu. For dynamic text fields, enable tabEnabled as soon as the submenu becomes visible. When the submenu hides, set tabEnabled = false to keep the focus out of the hidden elements.

Keyboard navigation relies on event listeners for the ENTER and SPACE keys. In the earlier section, we added a KEY_DOWN listener to each top‑level item. Repeat that logic for submenu links so that pressing ENTER activates the link. Also, handle the arrow keys: RIGHT and LEFT should move focus between top‑level items, and UP and DOWN should navigate within a submenu.

Screen readers read Flash objects based on the role and label properties. When you convert a text field to a button, set the role to “button.” For example:

Prompt
tfLink1.role = "button";</p> <p>tfLink1.label = "Product Overview";</p>

Providing a clear label helps the reader understand the purpose of the link. Avoid generic labels like “Click Here.” Instead, use descriptive phrases that convey the destination.

WCAG 2.1 AA guidelines emphasize color contrast. Even if you use animated backgrounds, ensure that the text color remains legible against any backdrop. Flash offers the ColorTransform class, which you can use to adjust the color of a text field programmatically if the background changes.

In addition to visual cues, consider adding ARIA (Accessible Rich Internet Applications) attributes if the Flash Player supports them. While Flash doesn’t support ARIA natively, you can expose the navigation structure to the surrounding HTML using the ExternalInterface class. This method creates a bridge where the HTML page can query the Flash menu for its current state and announce changes to screen readers.

When testing accessibility, use real screen readers such as NVDA, JAWS, or VoiceOver. Navigate through the menu using only the keyboard and confirm that each item announces itself correctly. Also test on mobile devices using TalkBack or VoiceOver to ensure the menu behaves consistently across platforms.

Lastly, consider providing a text‑only fallback navigation for browsers that disable Flash. An unordered list of links placed directly in the HTML markup will allow users who cannot view Flash to still navigate the site. The Flash menu can then serve as a visual enhancement rather than a replacement.

By following these guidelines, you’ll build a navigation menu that welcomes every user, regardless of the devices or assistive technologies they use.

Performance Tips for Smooth Navigation

Flash projects can suffer from performance issues if not optimized carefully. In the context of a navigation menu, even a minor lag can ruin the user experience. The key to a snappy menu lies in limiting on‑stage objects, caching graphics, and reducing the complexity of animations.

First, count the number of objects on the stage. Every vector shape, text field, or button consumes memory. Keep the count as low as possible by using symbols for repeated elements. For instance, if you have multiple menu items that share the same icon, convert the icon to a Bitmap symbol and reference it from each item. Bitmaps render faster than vector shapes, especially on older hardware.

Next, use the BitmapCache property. Enabling caching for a complex MovieClip will store its rendered output in a bitmap, reducing the rendering load during playback. In the Properties panel, check “Cache as Bitmap” for each submenu that contains many elements or complex filters.

Filter effects like glow or bevel can be visually appealing but are expensive to render. Use them sparingly. If you need a subtle glow for a hover state, consider using a simple color change or a small scale transform instead. For any unavoidable filters, enable BlendMode that is less taxing, such as BlendMode.NORMAL

Animation performance is heavily influenced by the number of tweens running simultaneously. Limit the duration of your animations to 300–500 milliseconds. Avoid chaining multiple tweens on the same property without a clear purpose. If you use a third‑party tweening library, profile the application to confirm that it does not introduce memory leaks.

Use the Flash profiler (available in the “Commands” menu) to monitor memory usage and frame rate. Look for objects that are not being garbage collected. If you notice a memory spike after opening a submenu, it could mean that the submenu remains referenced after it should be removed. Call removeChild and nullify references when a submenu closes.

Another common performance pitfall is loading assets over the network during interaction. Preload all icons, background images, and fonts at the start of the application. Use the Loader class to fetch external assets and store them in an in‑memory cache. This way, the menu can display instantly without waiting for network latency.

For mobile devices, reduce the stage’s frame rate if your menu doesn’t require high frame counts. Setting the frame rate to 24 frames per second or even 15 can lower CPU usage. Flash also supports hardware acceleration; ensure the “Enable GPU acceleration” setting is turned on in the Publish Settings for the best performance on supported devices.

Finally, always test the menu on the lowest spec devices you expect your audience to use. A menu that runs at 60 fps on a high‑end desktop may drop to 30 fps on an older phone. Use the performance profiling tools in your browser’s developer console to simulate low‑bandwidth conditions. Adjust your assets and tweens until the menu feels responsive across the board.

By keeping the number of objects low, caching complex elements, and simplifying animations, you can deliver a Flash navigation menu that performs well on desktops, laptops, tablets, and phones alike.

Testing Across Browsers and Devices

Even though Flash Player is a plugin that runs in a sandbox, browser differences still influence how events fire and how rendering is handled. Comprehensive testing ensures that your menu behaves consistently, regardless of whether the user is on Chrome, Firefox, Safari, or Edge.

Begin by opening the Flash movie in each major browser with the Flash Player plugin enabled. Verify that the menu displays correctly, the submenus open on click or hover, and that animations play smoothly. Pay particular attention to the following areas:

Event timing: Some browsers trigger MOUSE_OVER events before MOUSE_MOVE, which can affect hover logic. If you notice lag, add a small debounce timer to ensure events fire in the intended sequence.

Depth ordering: Flash renders MovieClips based on the depth order defined in the timeline or set programmatically. Certain browsers may handle depth stacking differently when resizing the window. Test how the menu behaves when the window is maximized, minimized, or resized to non‑standard aspect ratios.

Touch support: Mobile browsers translate touch events into mouse events, but the timing and propagation can differ. Test tapping on each menu item to confirm that the submenu opens and closes as expected. Use the TouchEvent API in Flash to differentiate between a tap and a drag.

Memory usage: On low‑end devices, the Flash Player might swap out frames or throttle frame rate. Monitor the memory consumption while interacting with the menu and look for leaks that could lead to sluggishness over time.

In addition to desktop browsers, test on Android and iOS devices using their native Flash Player versions. Many mobile browsers now disable Flash by default, so enabling it for testing can be cumbersome. If you have access to a lab or a set of virtual machines, use them to automate the testing process.

Automated testing tools like Selenium can drive a Flash-based UI by simulating mouse events, but they often require specialized plugins. For manual testing, create a checklist that covers click, hover, keyboard navigation, and accessibility. Use screen readers on mobile to verify that the menu’s ARIA labels are announced correctly.

Once you confirm consistent behavior across browsers, document any browser‑specific workarounds you implemented. For example, if you needed to adjust the z-index for Edge, note the code change so future developers can quickly reference it.

Testing is an ongoing process. Whenever you update the menu or the surrounding site, run a regression test to ensure no new issues appear. A reliable Flash navigation menu is built not only on solid code but also on continuous quality assurance.

Integrating the Menu into Existing Sites

Adding a Flash menu to a pre‑existing website is a common scenario, especially for corporate portals that have legacy navigation. The integration process is straightforward if you keep the HTML and Flash components loosely coupled.

Start by placing the SWF file inside a container div that matches the dimensions of the original navigation bar. Use the object tag to embed the Flash file, and set the width and height attributes to the same values. For example:

Prompt
<object type="application/x-shockwave-flash" data="menu.swf" width="1024" height="50"></p> <p> <param name="movie" value="menu.swf" /></p> <p> <param name="wmode" value="transparent" /></p> <p> <param name="allowScriptAccess" value="always" /></p> <p></object></p>

Adding wmode="transparent" allows the menu to overlay other elements and prevents the Flash object from blocking interactions with underlying content.

To allow Flash to communicate with the surrounding HTML, expose functions using the ExternalInterface class. For instance, you can create a JavaScript function that updates the page title when a submenu link is clicked:

Prompt
import flash.external.ExternalInterface;</p> <p>ExternalInterface.call("updateTitle", "New Page");</p>

On the HTML side, define the updateTitle function:

Prompt
<script></p> <p>function updateTitle(page) {</p> <p> document.title = page;</p> <p>}</p> <p></script></p>

Similarly, you can send data from JavaScript to Flash using ExternalInterface.addCallback. This bidirectional communication lets you synchronize state, such as highlighting the current page in the menu.

When initializing the menu, run a simple onLoad routine inside Flash:

Prompt
stage.addEventListener(Event.ENTER_FRAME, init);</p> <p>function init(e:Event):void {</p> <p> stage.removeEventListener(Event.ENTER_FRAME, init);</p> <p> // Set up event listeners, preload assets, etc.</p> <p>}</p>

This approach ensures that all variables and event listeners are set up only after the stage is ready, reducing the chance of race conditions.

If the surrounding website uses CSS to style the navigation bar, you might need to adjust the Flash canvas to match the same font, color, and padding. Because Flash uses its own rendering engine, you can replicate the CSS styles in the Flash document by setting the same font families and sizes.

Finally, test the integration in a staging environment before pushing to production. Verify that clicking on a menu item loads the correct page, that the Flash menu does not interfere with other JavaScript components, and that the navigation remains accessible.

By embedding the SWF in a well‑structured container, using ExternalInterface for communication, and aligning the visual style with the rest of the site, you can integrate a Flash drop‑down menu seamlessly into an existing website.

Future‑Proofing Flash Navigation

Flash Player has been officially discontinued by Adobe and most browsers no longer support it. Nevertheless, many organizations maintain legacy sites that rely on Flash navigation. To keep these menus functional, you can adopt several best practices that mitigate the risks of a technology that may no longer be widely supported.

First, follow clean coding conventions. Keep the ActionScript code modular, separate logic from presentation, and use descriptive naming. Well‑structured code is easier to maintain or port to another platform if necessary. Avoid hard‑coding URLs or using inline event handlers; instead, centralize all navigation logic in a single file.

Second, implement graceful degradation. Wrap the Flash embed in a fallback noscript block that displays a plain HTML menu. This approach ensures that users who have disabled plugins or use browsers that block Flash can still navigate the site. For example:

Prompt
<noscript></p> <p> <ul></p> <p> <li><a href="products.html">Products</a></li></p> <p> <li><a href="services.html">Services</a></li></p> <p> <li><a href="support.html">Support</a></li></p> <p> </ul></p> <p></noscript></p>

When the user’s browser supports Flash, the script block will load the SWF; otherwise, the noscript list will appear.

Third, monitor browser updates. Some browsers may still provide experimental Flash support for a while. Keep an eye on their release notes and test the menu on any new versions. If a browser drops support entirely, you can transition to HTML/CSS or JavaScript alternatives without having to rebuild the entire navigation from scratch.

Fourth, document the menu’s structure and code. Create a design document that includes the hierarchy, event flow, and any custom animations. When new developers join the team, they can refer to this documentation to understand how the menu works and where to make changes.

Finally, keep the menu’s file size small. A lightweight SWF is easier to cache and less likely to be blocked by corporate security policies. Compress the assets, use symbol linking, and remove unused symbols before publishing. A small, well‑optimized menu also improves load times, which is critical for both desktop and mobile users.

By applying these future‑proofing strategies, you can keep a Flash drop‑down menu functional and maintainable, even as the technology landscape shifts away from Flash.

Suggest a Correction

Found an error or have a suggestion? Let us know and we'll review it.

Share this article

Comments (0)

Please sign in to leave a comment.

No comments yet. Be the first to comment!

Related Articles