<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<html>
<head>
    <title>ActionScript 3.0 Language and Components Reference</title>
    <script language="javascript" type="text/javascript">
    	<!--
        window.onload=function(){
            "use strict";
            var d2=decodeURIComponent(document.location.search).toLowerCase();
            if(
                    d2.indexOf('javascript:') > -1 ||
                    d2.indexOf('//') > -1 ||
                    d2.indexOf('..') > -1 ||
                    d2.indexOf(':') > -1
            ){
                    return;
            }

            var d=document.location.search;
			var args=d.substring(d.lastIndexOf('?')+1,d.length);
			var classFrameContent=args;
			var classListFrameContent='';
			if (args.indexOf('&') != -1) {
				classFrameContent = args.substring(0,args.indexOf('&'));
				classListFrameContent = args.substring(args.indexOf('&')+1,args.length);
			}
            if(classFrameContent!='')
            	top.frames['classFrame'].document.location.href=classFrameContent;
			if(classListFrameContent!='')
				top.frames['packageFrame'].frames['classListFrame'].document.location.href=classListFrameContent;
        }
        -->
    </script>
</head>
<frameset cols="175,*" border="2" bordercolor="#AAAAAA" framespacing="1">
       <frame src="package-frame.html" name="packageFrame" scrolling="no" />
       <frameset rows="80,*" border="0" bordercolor="#AAAAAA">
       		<frame src="title-bar.html" name="titlebar" scrolling="no" frameborder="0" />
       		<frame src="package-summary.html" name="classFrame" frameborder="0" />
    	</frameset>
    <noframes>
	<body>
        <h2>Frame Alert</h2>
        <p>
        This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
        <br />
        Link to <a href="package-summary.html">Non-frame version.</a>
        </p>
        </body>
    </noframes>
</frameset>
</html>
