ActionScript Spray init()

ActionScript Spray init()

error: pathspec 'AS-Spray.as' did not match any file(s) known to git

--- AS-Spray.as
+++ AS-Spray.as
@@ -0,0 +1,40 @@
+package
+{
+	import flash.display.*;
+	import flash.text.*;
+	import flash.system.*;
+	import flash.geom.*;
+	import flash.external.*;
+	import flash.events.*;
+
+	public class Main extends Sprite
+  {
+		private var spray:Array
+    public function AsSpray():void
+    {
+			var block:Vector.<Object> = null;
+			var size:uint = 100000;
+			var alignment:uint = 0x1000;
+			var index:uint = 0;
+			spray = new Array();
+			for(index = 0; index < size; index++)
+			{
+				spray[index] = new Vector.<uint>((alignment-0x8)/0x4);
+				spray[index][0]=0xAAAAAAAA;
+				spray[index][1]=0xBBBBBBBB;
+				spray[index][2]=0xCCCCCCCC;
+				spray[index][3]=0xDDDDDDDD;
+			}
+		}
+		public function Leak():void
+		{
+			//perform ASLR bypass with 1 object's length modified
+		}
+		public function Main():void
+		{
+			AsSpray();
+			ExternalInterface.call("check","Vector Spray done");
+			ExternalInterface.addCallback("Corruption",Leak);
+		}
+  }
+}


Bugfix for ticket:55 and ticket:61

Bugfix for ticket:55 and ticket:61

fatal: unable to access 'https://github.com/dss-web/reiseregningen.git/': The requested URL returned error: 403


Add OSMF NetStreamCodes to com.castlabs.dash.utils package

error: pathspec 'src/main/actionscript/com/castlabs/dash/utils/NetStreamCodes.as' did not match any file(s) known to git

--- src/main/actionscript/com/castlabs/dash/utils/NetStreamCodes.as
+++ src/main/actionscript/com/castlabs/dash/utils/NetStreamCodes.as
@@ -0,0 +1,376 @@
+/*****************************************************
+*
+*  Copyright 2009 Adobe Systems Incorporated.  All Rights Reserved.
+*
+*****************************************************
+*  The contents of this file are subject to the Mozilla Public License
+*  Version 1.1 (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.mozilla.org/MPL/
+*
+*  Software distributed under the License is distributed on an "AS IS"
+*  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+*  License for the specific language governing rights and limitations
+*  under the License.
+*
+*
+*  The Initial Developer of the Original Code is Adobe Systems Incorporated.
+*  Portions created by Adobe Systems Incorporated are Copyright (C) 2009 Adobe Systems
+*  Incorporated. All Rights Reserved.
+*
+*****************************************************/
+package com.castlabs.dash.utils
+{
+	//[ExcludeClass]
+
+	/**
+	 * @private
+	 *
+	 * The NetStreamCodes class provides static constants for event types
+	 * that a NetStream dispatches as NetStatusEvents.
+	 *
A NetClient uses some of these codes to register handlers for
+	 * callbacks.

+	 * @see flash.events.NetStatusEvent
+	 * @see flash.net.NetStream
+	 *
+	 *  @langversion 3.0
+	 *  @playerversion Flash 10
+	 *  @playerversion AIR 1.5
+	 *  @productversion OSMF 1.0
+	 */
+	public final class NetStreamCodes
+	{
+		/**
+		 * "status"
+		 * Data is not being received quickly enough to fill the buffer.
+		 * Data flow will be interrupted until the buffer refills,
+		 * at which time a NetStream.Buffer.Full message will be sent and the stream will begin playing again.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_BUFFER_EMPTY:String	  		= "NetStream.Buffer.Empty";
+
+		/**
+		 * "status"
+		 * The buffer is full and the stream will begin playing.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_BUFFER_FULL:String 			= "NetStream.Buffer.Full";
+
+		/**
+		 * "status"
+		 * Data has finished streaming, and the remaining buffer will be emptied.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_BUFFER_FLUSH:String 			= "NetStream.Buffer.Flush";
+
+		CONFIG::FLASH_10_1
+		{
+		/**
+		 * This code is sent by the NetStream when the DRM subsystem needs to be
+		 * updated.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_DRM_UPDATE:String 			= "DRM.UpdateNeeded";
+		}
+
+		/**
+		 * "error"
+		 * Flash Media Server only. An error has occurred for a reason other
+		 *  than those listed in other event codes.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_FAILED:String 				= "NetStream.Failed";
+
+		/**
+		 * "status"
+		 * 	Playback has started.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_START:String				= "NetStream.Play.Start";
+
+		/**
+		 * "status"
+		 * 	Playback has stopped.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_STOP:String				= "NetStream.Play.Stop";
+
+		/** "error"	An error has occurred in playback for a reason
+		 * other than those listed elsewhere in this table, such as the subscriber not having read access.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_FAILED:String			= "NetStream.Play.Failed";
+
+		/**
+		 * "error"
+		 * The FLV passed to the play() method can't be found.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_STREAMNOTFOUND:String	= "NetStream.Play.StreamNotFound";
+
+		/**
+		 * "status"
+		 * Caused by a play list reset.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_RESET:String				= "NetStream.Play.Reset";
+
+		/**
+		 * "warning"
+		 * Flash Media Server only. The client does not have sufficient bandwidth to play the data at normal speed.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_INSUFFICIENTBW:String	= "NetStream.Play.InsufficientBW";
+
+		/** "error"
+		 * The application detects an invalid file structure and will not try to play this type of file.
+		 *  For AIR and for Flash Player 9.0.115.0 and later.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_FILESTRUCTUREINVALID:String= "NetStream.Play.FileStructureInvalid";
+
+		 /** "error"
+		 * The application does not detect any supported tracks (video, audio or data) and
+		 * will not try to play the file. For AIR and for Flash Player 9.0.115.0 and later.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_NOSUPPORTEDTRACKFOUND:String= "NetStream.Play.NoSupportedTrackFound";
+
+		/**
+		 * "status"
+		 * Flash Media Server 3.5 and later only. The server received the command to transition to another stream
+		 * as a result of bitrate stream switching. This code indicates a success status event for the NETSTREAM_play2()
+		 * call to initiate a stream switch. If the switch does not succeed, the server sends a NETSTREAM_PLAY.Failed event instead.
+		 * When the stream switch occurs, an onPlayStatus event with a code of "NetStream.Play.TransitionComplete" is dispatched.
+		 * For Flash Player 10 and later.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_TRANSITION:String		= "NetStream.Play.Transition";
+
+		/**
+		 * "status"
+		 * The stream is paused.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PAUSE_NOTIFY:String			= "NetStream.Pause.Notify";
+
+		/**
+		 * "status"
+		 * The initial publish to a stream is sent to all subscribers.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_PUBLISH_NOTIFY:String	= "NetStream.Play.PublishNotify";
+
+		/**
+		 * "status"
+		 * An unpublish from a stream is sent to all subscribers.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_UNPUBLISH_NOTIFY:String	= "NetStream.Play.UnpublishNotify";
+
+		/**
+		 * "status"
+		 * The stream is resumed.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_UNPAUSE_NOTIFY:String			= "NetStream.Unpause.Notify";
+
+		/**
+		 * "error"
+		 * The seek fails, which happens if the stream is not seekable.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_SEEK_FAILED:String			= "NetStream.Seek.Failed";
+
+		/**
+		 * "error"
+		 * For video downloaded with progressive download,
+		 * the user has tried to seek or play past the end of the video data that has downloaded thus far,
+		 *  or past the end of the video once the entire file has downloaded.
+		 * The message.details property contains a time code that indicates the last valid position to which the user can seek.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_SEEK_INVALIDTIME:String		= "NetStream.Seek.InvalidTime";
+
+		/**
+		 * "status"
+		 * The seek operation is complete.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_SEEK_NOTIFY:String			= "NetStream.Seek.Notify";
+
+		//onPlayStatus
+
+		/**
+		 * "status"
+		 * Playback has completed. Fires only for streaming connections.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_COMPLETE:String			= "NetStream.Play.Complete";
+
+		/**
+		 * "status"
+		 * The subscriber is switching to a new stream as a result of stream bit-rate switching. Fires only for streaming connections.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_TRANSITION_COMPLETE:String = "NetStream.Play.TransitionComplete";
+
+		/**
+		 * "status"
+		 * The seek operation is started.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 2.0
+		 */
+		public static const NETSTREAM_SEEK_START:String = "NetStream.Seek.Start";
+
+		/**
+		 * "status"
+		 * Playback reached the end of live content, but the stream is not done. Fires only for streaming connections.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_LIVE_STALL:String			= "NetStream.Play.LiveStall";
+
+		/**
+		 * "status"
+		 * Playback was previously stalled and has now unstalled. Fires only for streaming connections.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const NETSTREAM_PLAY_LIVE_RESUME:String			= "NetStream.Play.LiveResume";
+
+		// NetStream events
+
+		/**
+		 * Dispatched when the application receives descriptive information embedded in the video being played.
+		 * For information about video file formats supported by Flash Media Server, see the Flash Media Server documentation.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const ON_META_DATA:String						= "onMetaData";
+
+		/**
+		 * 	Establishes a listener to respond when an embedded cue point is reached while playing a video file.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const ON_CUE_POINT:String						= "onCuePoint";
+
+		/**
+		 *  * Establishes a listener to respond when a NetStream object has completely played a stream.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10
+		 *  @playerversion AIR 1.5
+		 *  @productversion OSMF 1.0
+		 */
+		public static const ON_PLAY_STATUS:String					= "onPlayStatus";
+	}
+}


git-svn-id: http://svn.rails2u.com/as3rails2u/trunk@34 96db6a20-122f-0410-8d9f-89437bbe4005

error: pathspec 'src/com/rails2u/swflayer/SWFLayer.as' did not match any file(s) known to git

--- src/com/rails2u/swflayer/SWFLayer.as
+++ src/com/rails2u/swflayer/SWFLayer.as
@@ -0,0 +1,86 @@
+package com.rails2u.swflayer {
+    import flash.external.ExternalInterface;
+    public class SWFLayer {
+        public static const AUTO:String = 'auto';
+        public static function get objectID():String {
+            return ExternalInterface.objectID;
+        }
+
+        public static function initialize(position:String = 'absolute'):void {
+            var x:String = getProperty('offsetTop');
+            var y:String = getProperty('offsetLeft');
+            setStyle('x', x);
+            setStyle('y', y);
+            setStyle('height', AUTO);
+            setStyle('width', AUTO);
+            setStyle('position', position);
+        }
+
+        public static function set width(value:Number):void {
+            if (isNaN(value)) {
+                setStyle('width', AUTO);
+            } else {
+                setStyle('width', value.toString());
+            }
+        }
+
+        public static function get width():Number {
+            return Number(getStyle('width'));
+        }
+
+        public static function set height(value:Number):void {
+            if (isNaN(value)) {
+                setStyle('height', AUTO);
+            } else {
+                setStyle('height', value.toString());
+            }
+        }
+
+        public static function get height():Number {
+            return Number(getStyle('height'));
+        }
+
+        public static function set x(value:Number):void {
+            setStyle('left', value.toString());
+        }
+
+        public static function get x():Number {
+            return Number(getStyle('left'));
+        }
+
+        public static function set y(value:Number):void {
+            setStyle('top', value.toString());
+        }
+
+        public static function get y():Number {
+            return Number(getStyle('top'));
+        }
+
+        public static function layerExec(str:String):* {
+            var cmd:String = "return document.getElementById('" + objectID + "')." + str;
+            return exec(cmd);
+        }
+
+        public static function setProperty(name:String, value:String):void {
+            layerExec(name + ' = "' + value + '"');
+        }
+
+        public static function getProperty(name:String):* {
+            return layerExec(name);
+        }
+
+        public static function setStyle(style:String, value:String):void {
+            layerExec('style.' + style + ' = "' + value + '"');
+        }
+
+        public static function getStyle(style:String):* {
+            return layerExec('style.' + style);
+        }
+
+        public static function exec(cmd:String):* {
+            var cmd:String = "(function() {" + cmd + ";})()";
+            log(cmd);
+            return ExternalInterface.call(cmd);
+        }
+    }
+}


Execute unmapped Commands with arbitrary payloads inspired by @darscan #fork.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/eric-stanley/robotlegs-framework.git/'


Added the Enemy class.

Added the Enemy class.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/c0d3m0nk3y/Konata.git/'


HLSNetStream.as: add useful / commented debug code

--- src/org/mangui/hls/stream/HLSNetStream.as
+++ src/org/mangui/hls/stream/HLSNetStream.as
@@ -211,14 +211,14 @@
                 this is to avoid black screen during seek command */
                 super.close();
                 _skippedDuration = 0;
-
+
 				// useHardwareDecoder was added in FP11.1, but this allows us to include the option in all builds
                 try {
                     super['useHardwareDecoder'] = HLSSettings.useHardwareVideoDecoder;
-                } catch(e : Error) {
-					// Ignore errors, we're running in FP < 11.1
-				}
-
+                } catch(e : Error) {
+	               // Ignore errors, we're running in FP < 11.1
+                }
+
                 super.play(null);
                 super.appendBytesAction(NetStreamAppendBytesAction.RESET_SEEK);
                 // immediatly pause NetStream, it will be resumed when enough data will be buffered in the NetStream
@@ -245,7 +245,26 @@
                 // }
             }
             // append all tags
+            //var otherCounter : int = 0;
             for each (var tagBuffer : FLVTag in tags) {
+                // switch(tagBuffer.type) {
+                //     case FLVTag.AAC_HEADER:
+                //     case FLVTag.AVC_HEADER:
+                //     case FLVTag.DISCONTINUITY:
+                //     case FLVTag.METADATA:
+                //         otherCounter = 0;
+                //         CONFIG::LOGGING {
+                //             Log.info('inject type/dts/pts:' + tagBuffer.typeString + '/' + tagBuffer.dts + '/' + tagBuffer.pts);
+                //         }
+                //         break;
+                //     default:
+                //         CONFIG::LOGGING {
+                //             if(otherCounter++< 5) {
+                //                 Log.info('inject type/dts/pts:' + tagBuffer.typeString + '/' + tagBuffer.dts + '/' + tagBuffer.pts);
+                //             }
+                //         }
+                //     break;
+                // }
                 // CONFIG::LOGGING {
                 //     Log.debug2('inject type/dts/pts:' + tagBuffer.typeString + '/' + tagBuffer.dts + '/' + tagBuffer.pts);
                 // }


Added xiff_internal namespace.

Added xiff_internal namespace.

error: pathspec 'src/org/igniterealtime/xiff/namespaces/xiff_internal.as' did not match any file(s) known to git

--- src/org/igniterealtime/xiff/namespaces/xiff_internal.as
+++ src/org/igniterealtime/xiff/namespaces/xiff_internal.as
@@ -0,0 +1,4 @@
+package org.igniterealtime.xiff.namespaces
+{
+	public namespace xiff_internal = "http://www.igniterealtime.org/namespace/xiff/internal";
+}


Fixing problems.

Fixing problems.

error: pathspec 'Textbox.as' did not match any file(s) known to git

--- Textbox.as
+++ Textbox.as
@@ -0,0 +1,20 @@
+package
+{
+	public class Textbox
+	{
+		public var contents:String;
+
+		public function Textbox()
+		{
+			contents="";
+		}
+		public function Textbox(text)
+		{
+			contents=text;
+		}
+		public setContents(text)
+		{
+			contents=text;
+		}
+	}
+}


Missing file from ListsTest.

Missing file from ListsTest.

error: pathspec 'examples/ListsTest/src/products/Product.as' did not match any file(s) known to git

--- examples/ListsTest/src/products/Product.as
+++ examples/ListsTest/src/products/Product.as
@@ -0,0 +1,43 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+package products
+{
+	public class Product
+	{
+		public function Product(id:String,title:String,detail:String,sales:Number,image:String)
+		{
+			this.id = id;
+			this.title = title;
+			this.detail = detail;
+			this.sales = sales;
+			this.image = image;
+		}
+
+		public var id:String;
+		public var title:String;
+		public var detail:String;
+		public var image:String;
+		public var sales:Number;
+
+		public function toString():String
+		{
+			return title;
+		}
+	}
+}


cap live playlist level loading timer

cap live playlist level loading timer

if position is more than one average frag duration from edge of live playlist,reload every average frag duration
otherwise,reload every half average duration
related to https://github.com/mangui/flashls/issues/412

--- src/org/mangui/hls/loader/LevelLoader.as
+++ src/org/mangui/hls/loader/LevelLoader.as
@@ -217,12 +217,15 @@
                 setType(HLSTypes.LIVE);
                 /* in order to determine playlist reload timer,
                     check playback position against playlist duration.
-                    if we are near the edge of a live playlist, reload playlist quickly
-                    to discover quicker new fragments and avoid buffer starvation.
+                    if we are less than one frag from the edge of a live playlist, reload playlist
+                    twice quicker to discover new fragments quicker and avoid potential buffer starvation.
                 */
-                var _reloadInterval : Number = 1000*Math.min((_levels[level].duration - _hls.position)/2,_levels[level].averageduration);
-                // avoid spamming the server if we are at the edge ... wait 500ms between 2 reload at least
-                var timeout : int = Math.max(500, _reloadPlaylistTimer + _reloadInterval - getTimer());
+                var _reloadInterval : Number = _levels[level].averageduration;
+                if((_levels[level].duration - _hls.position) < _reloadInterval) {
+                    _reloadInterval /= 2;
+                }
+                // keep at least 1s between requests, in case last one was really slow
+                var timeout : int = Math.max(1000,_reloadPlaylistTimer + 1000*_reloadInterval - getTimer());
                 CONFIG::LOGGING {
                     Log.debug("Level " + level + " Live Playlist parsing finished: reload in " + timeout + " ms");
                 }


AngelScript version of Typography sample program

error: pathspec 'bin/Data/Scripts/47_Typography.as' did not match any file(s) known to git

--- bin/Data/Scripts/47_Typography.as
+++ bin/Data/Scripts/47_Typography.as
@@ -0,0 +1,137 @@
+// Text rendering example.
+// Displays text at various sizes, with checkboxes to change the rendering parameters.
+
+#include "Scripts/Utilities/Sample.as"
+
+// Tag used to find all Text elements
+String TEXT_TAG = "Typography_text_tag";
+
+// Top-level container for this sample's UI
+UIElement@ uielement;
+
+void Start()
+{
+    // Execute the common startup for samples
+    SampleStart();
+
+    // Enable OS cursor
+    input.mouseVisible = true;
+
+    // Load XML file containing default UI style sheet
+    XMLFile@ style = cache.GetResource("XMLFile", "UI/DefaultStyle.xml");
+
+    // Set the loaded style as default style
+    ui.root.defaultStyle = style;
+
+    // Create a UIElement to hold all our content
+    // (Don't modify the root directly, as the base Sample class uses it)
+    uielement = UIElement();
+    uielement.SetAlignment(HA_CENTER, VA_CENTER);
+    uielement.SetLayout(LM_VERTICAL, 20, IntRect(20, 40, 20, 40));
+    ui.root.AddChild(uielement);
+
+    // Add some sample text
+    CreateText();
+
+    // Add a checkbox to toggle the background color.
+    CreateCheckbox("White background", "HandleWhiteBackground");
+
+    // Add a checkbox for the global ForceAutoHint setting. This affects character spacing.
+    CreateCheckbox("UI::SetForceAutoHint", "HandleForceAutoHint");
+
+    // Add a checkbox to toggle SRGB output conversion (if available).
+    // This will give more correct text output for FreeType fonts, as the FreeType rasterizer
+    // outputs linear coverage values rather than SRGB values. However, this feature isn't
+    // available on all platforms.
+    CreateCheckbox("Graphics::SetSRGB", "HandleSRGB");
+
+    // Set the mouse mode to use in the sample
+    SampleInitMouseMode(MM_FREE);
+}
+
+void CreateText()
+{
+    UIElement@ container = UIElement();
+    container.SetAlignment(HA_LEFT, VA_TOP);
+    container.SetLayout(LM_VERTICAL);
+    uielement.AddChild(container);
+
+    Font@ font = cache.GetResource("Font", "Fonts/BlueHighway.ttf");
+
+    for (int size = 1; size <= 24; ++size)
+    {
+        Text@ text = Text();
+        text.text = "The quick brown fox jumps over the lazy dog (" + size + "pt)";
+        text.SetFont(font, size);
+        text.AddTag(TEXT_TAG);
+        container.AddChild(text);
+    }
+}
+
+void CreateCheckbox(String label, String handler)
+{
+    UIElement@ container = UIElement();
+    container.SetAlignment(HA_LEFT, VA_TOP);
+    container.SetLayout(LM_HORIZONTAL, 8);
+    uielement.AddChild(container);
+
+    CheckBox@ box = CheckBox();
+    container.AddChild(box);
+    box.SetStyleAuto();
+
+    Text@ text = Text();
+    container.AddChild(text);
+    text.text = label;
+    text.SetStyleAuto();
+    text.AddTag(TEXT_TAG);
+
+    SubscribeToEvent(box, "Toggled", handler);
+}
+
+void HandleWhiteBackground(StringHash eventType, VariantMap& eventData)
+{
+    CheckBox@ box = eventData["Element"].GetPtr();
+    bool checked = box.checked;
+
+    Color fg = checked ? BLACK : WHITE;
+    Color bg = checked ? WHITE : BLACK;
+
+    renderer.defaultZone.fogColor = bg;
+
+    Array<UIElement@>@ elements = uielement.GetChildrenWithTag(TEXT_TAG, true);
+    for (int i = 0; i < elements.length; ++i)
+    {
+        elements[i].color = fg;
+    }
+}
+
+void HandleForceAutoHint(StringHash eventType, VariantMap& eventData)
+{
+    CheckBox@ box = eventData["Element"].GetPtr();
+    bool checked = box.checked;
+
+    ui.forceAutoHint = checked;
+}
+
+void HandleSRGB(StringHash eventType, VariantMap& eventData)
+{
+    CheckBox@ box = eventData["Element"].GetPtr();
+    bool checked = box.checked;
+
+    if (graphics.sRGBWriteSupport)
+    {
+        graphics.sRGB = checked;
+    }
+    else
+    {
+        log.Warning("graphics.sRGBWriteSupport is false");
+    }
+}
+
+// Create XML patch instructions for screen joystick layout specific to this sample app
+String patchInstructions =
+        "<patch>" +
+        "    <add sel=\"/element/element[./attribute[@name='Name' and @value='Hat0']]\">" +
+        "        <attribute name=\"Is Visible\" value=\"false\" />" +
+        "    </add>" +
+        "</patch>";


speech language fix

speech language fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/dseeker/lietro.git/'


New Class for storing constants

New Class for storing constants

SVN-Revision: 8558

error: pathspec 'flexclient/dag/Components/DAGConstants.as' did not match any file(s) known to git

--- flexclient/dag/Components/DAGConstants.as
+++ flexclient/dag/Components/DAGConstants.as
@@ -0,0 +1,18 @@
+package Components
+{
+	public class DAGConstants
+	{
+		public static  var VIEW_ONLY_NODE:String ="ViewOnlyNode";
+		public static  var CONSTRAINT_VIEW_NODE:String="ConstraintViewNode";
+		public static  var CONSTRAINT_ONLY_NODE:String="ConstraintOnlyNode";
+		public static  var EDIT:String="Edit";
+		public static  var DELETE:String="Delete";
+		public static  var ADD_TO_VIEW:String="AddToView";
+		public static  var DELETE_FROM_VIEW:String="DeleteFromView";
+		public static  var ADD_LIMIT_VIEW:String="AddLimit";
+		public static  var RESULT_VIEW:String="Result";
+
+
+
+	}
+}


Extracted symbol parsing logic from RendererParser.

* Change how default symbols are set by providing default symbols instead of overriding the symbol creation functions.

* Expose individual symbol XML parsing functions.

error: pathspec 'src/com/esri/viewer/utils/SymbolParser.as' did not match any file(s) known to git

--- src/com/esri/viewer/utils/SymbolParser.as
+++ src/com/esri/viewer/utils/SymbolParser.as
@@ -0,0 +1,266 @@
+///////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2011 Esri. All Rights Reserved.
+//
+// Licensed 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.
+///////////////////////////////////////////////////////////////////////////
+package com.esri.viewer.utils
+{
+
+import com.esri.ags.symbols.PictureMarkerSymbol;
+import com.esri.ags.symbols.SimpleFillSymbol;
+import com.esri.ags.symbols.SimpleLineSymbol;
+import com.esri.ags.symbols.SimpleMarkerSymbol;
+import com.esri.ags.symbols.Symbol;
+
+public class SymbolParser
+{
+    public function parseSymbol(symbolXML:XML):Symbol
+    {
+        var symbol:Symbol;
+
+        if (symbolXML)
+        {
+            if (symbolXML.simplemarkersymbol[0])
+            {
+                symbol = parseSimpleMarkerSymbol(symbolXML.simplemarkersymbol[0]);
+            }
+            else if (symbolXML.picturemarkersymbol[0])
+            {
+                symbol = parsePictureMarkerSymbol(symbolXML.picturemarkersymbol[0]);
+            }
+            else if (symbolXML.simplelinesymbol[0])
+            {
+                symbol = parseSimpleLineSymbol(symbolXML.simplelinesymbol[0]);
+            }
+            else if (symbolXML.simplefillsymbol[0])
+            {
+                symbol = parseSimpleFillSymbol(symbolXML.simplefillsymbol[0]);
+            }
+        }
+
+        return symbol;
+    }
+
+    public function parseSimpleMarkerSymbol(smsXML:XML):SimpleMarkerSymbol
+    {
+        const simpleMarkerSymbol:SimpleMarkerSymbol = createDefaultPointSymbol();
+
+        const parsedColor:Number = parseInt(smsXML.@color[0]);
+        const parsedAlpha:Number = parseFloat(smsXML.@alpha[0]);
+        const parsedSize:Number = parseFloat(smsXML.@size[0]);
+
+        if (smsXML.@style[0])
+        {
+            simpleMarkerSymbol.style = smsXML.@style;
+        }
+        if (!isNaN(parsedAlpha))
+        {
+            simpleMarkerSymbol.alpha = parsedAlpha;
+        }
+        if (!isNaN(parsedColor))
+        {
+            simpleMarkerSymbol.color = parsedColor;
+        }
+        if (!isNaN(parsedSize))
+        {
+            simpleMarkerSymbol.size = parsedSize;
+        }
+
+        if (!simpleMarkerSymbol.outline)
+        {
+            simpleMarkerSymbol.outline = createDefaultOutlineSymbol();
+        }
+
+        const outlineSymbol:SimpleLineSymbol = simpleMarkerSymbol.outline;
+
+        const parsedOutlineColor:uint = parseInt(smsXML.outline.@color[0]);
+        const parsedOutlineWidth:Number = parseFloat(smsXML.outline.@width[0]);
+
+        if (smsXML.outline.@style[0])
+        {
+            outlineSymbol.style = smsXML.outline.@style
+        }
+        if (!isNaN(parsedOutlineColor))
+        {
+            outlineSymbol.color = parsedOutlineColor;
+        }
+        if (!isNaN(parsedOutlineWidth))
+        {
+            outlineSymbol.width = parsedOutlineWidth;
+        }
+
+        return simpleMarkerSymbol;
+    }
+
+    private var _defaultPointSymbol:SimpleMarkerSymbol;
+
+    public function get defaultPointSymbol():SimpleMarkerSymbol
+    {
+        return _defaultPointSymbol ||= new SimpleMarkerSymbol();
+    }
+
+    public function set defaultPointSymbol(value:SimpleMarkerSymbol):void
+    {
+        _defaultPointSymbol = value;
+    }
+
+    protected function createDefaultPointSymbol():SimpleMarkerSymbol
+    {
+        return defaultPointSymbol.clone() as SimpleMarkerSymbol;
+    }
+
+    private var _defaultOutlineSymbol:SimpleLineSymbol;
+
+    public function get defaultOutlineSymbol():SimpleLineSymbol
+    {
+        return _defaultOutlineSymbol ||= new SimpleLineSymbol();
+    }
+
+    public function set defaultOutlineSymbol(value:SimpleLineSymbol):void
+    {
+        _defaultOutlineSymbol = value;
+    }
+
+    protected function createDefaultOutlineSymbol():SimpleLineSymbol
+    {
+        return defaultOutlineSymbol.clone() as SimpleLineSymbol;
+    }
+
+    public function parsePictureMarkerSymbol(pmsXML:XML):PictureMarkerSymbol
+    {
+        const url:String = pmsXML.@url;
+
+        const parsedHeight:Number = parseFloat(pmsXML.@height[0]);
+        const parsedWidth:Number = parseFloat(pmsXML.@width[0]);
+        const parsedXOffset:Number = parseFloat(pmsXML.@xoffset[0]);
+        const parsedYOffset:Number = parseFloat(pmsXML.@yoffset[0]);
+        const parsedAngle:Number = parseFloat(pmsXML.@angle[0]);
+
+        const height:Number = !isNaN(parsedHeight) ? parsedHeight : 0;
+        const width:Number = !isNaN(parsedWidth) ? parsedWidth : 0;
+        const xOffset:Number = !isNaN(parsedXOffset) ? parsedXOffset : 0;
+        const yOffset:Number = !isNaN(parsedYOffset) ? parsedYOffset : 0;
+        const angle:Number = !isNaN(parsedAngle) ? parsedAngle : 0;
+
+        return new PictureMarkerSymbol(url, width, height, xOffset, yOffset, angle);
+    }
+
+    public function parseSimpleLineSymbol(slsXML:XML):SimpleLineSymbol
+    {
+        const simpleLineSymbol:SimpleLineSymbol = createDefaultPolylineSymbol();
+
+        const parsedAlpha:Number = parseFloat(slsXML.@alpha[0]);
+        const parsedOutlineColor:uint = parseInt(slsXML.@color[0]);
+        const parsedOutlineWidth:Number = parseFloat(slsXML.@width[0]);
+
+        if (slsXML.@style[0])
+        {
+            simpleLineSymbol.style = slsXML.@style;
+        }
+        if (!isNaN(parsedAlpha))
+        {
+            simpleLineSymbol.alpha = parsedAlpha;
+        }
+        if (!isNaN(parsedOutlineColor))
+        {
+            simpleLineSymbol.color = parsedOutlineColor;
+        }
+        if (!isNaN(parsedOutlineWidth))
+        {
+            simpleLineSymbol.width = parsedOutlineWidth;
+        }
+
+        return simpleLineSymbol;
+    }
+
+    private var _defaultPolylineSymbol:SimpleLineSymbol;
+
+    public function get defaultPolylineSymbol():SimpleLineSymbol
+    {
+        return _defaultPolylineSymbol ||= new SimpleLineSymbol();
+    }
+
+    public function set defaultPolylineSymbol(value:SimpleLineSymbol):void
+    {
+        _defaultPolylineSymbol = value;
+    }
+
+    protected function createDefaultPolylineSymbol():SimpleLineSymbol
+    {
+        return defaultPolylineSymbol.clone() as SimpleLineSymbol;
+    }
+
+    public function parseSimpleFillSymbol(sfsXML:XML):SimpleFillSymbol
+    {
+        const simpleFillSymbol:SimpleFillSymbol = createDefaultPolygonSymbol();
+
+        const parsedColor:Number = parseInt(sfsXML.@color[0]);
+        const parsedAlpha:Number = parseFloat(sfsXML.@alpha[0]);
+
+        if (sfsXML.@style[0])
+        {
+            simpleFillSymbol.style = sfsXML.@style;
+        }
+        if (!isNaN(parsedAlpha))
+        {
+            simpleFillSymbol.alpha = parsedAlpha;
+        }
+        if (!isNaN(parsedColor))
+        {
+            simpleFillSymbol.color = parsedColor;
+        }
+
+        if (!simpleFillSymbol.outline)
+        {
+            simpleFillSymbol.outline = createDefaultOutlineSymbol();
+        }
+
+        const outlineSymbol:SimpleLineSymbol = simpleFillSymbol.outline;
+
+        const parsedOutlineColor:uint = parseInt(sfsXML.outline.@color[0]);
+        const parsedOutlineWidth:Number = parseFloat(sfsXML.outline.@width[0]);
+
+        if (sfsXML.outline.@style[0])
+        {
+            outlineSymbol.style = sfsXML.outline.@style;
+        }
+        if (!isNaN(parsedOutlineColor))
+        {
+            outlineSymbol.color = parsedOutlineColor;
+        }
+        if (!isNaN(parsedOutlineWidth))
+        {
+            outlineSymbol.width = parsedOutlineWidth;
+        }
+
+        return simpleFillSymbol;
+    }
+
+    private var _defaultPolygonSymbol:SimpleFillSymbol;
+
+    public function get defaultPolygonSymbol():SimpleFillSymbol
+    {
+        return _defaultPolygonSymbol ||= new SimpleFillSymbol();
+    }
+
+    public function set defaultPolygonSymbol(value:SimpleFillSymbol):void
+    {
+        _defaultPolygonSymbol = value;
+    }
+
+    protected function createDefaultPolygonSymbol():SimpleFillSymbol
+    {
+        return defaultPolygonSymbol.clone() as SimpleFillSymbol;
+    }
+}
+}


10854

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/7thsky/openvv.git/'


Added a helpful Animation for smooth alpha transitions.

git-svn-id: b675b909355d5cf946977f44a8ec5a6ceb3782e4@317 ed5b42cb-e716-0410-a449-f6a68f950b19

error: pathspec 'src/as/com/threerings/flash/AlphaFade.as' did not match any file(s) known to git

--- src/as/com/threerings/flash/AlphaFade.as
+++ src/as/com/threerings/flash/AlphaFade.as
@@ -0,0 +1,68 @@
+//
+// $Id: AnimationImpl.as 263 2007-06-14 18:20:16Z dhoover $
+//
+// Nenya library - tools for developing networked games
+// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/nenya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.flash {
+
+import flash.display.DisplayObject;
+
+/**
+ * An Animation that linearly transitions the alpha attribute of a given display object from
+ * one value to another and optionally executes a callback function when the transition is
+ * complete.
+ */
+public class AlphaFade extends AnimationImpl
+{
+    /**
+     * Constructs a new AlphaFade instance. The alpha values should lie in [0, 1] and the
+     * duration is measured in milliseconds.
+     */
+    public function AlphaFade (disp :DisplayObject, from :Number = 0, to :Number = 1,
+                               duration :Number = 1, done :Function = null)
+    {
+        _disp = disp;
+        _from = from;
+        _to = to;
+        _duration = duration;
+        _done = done;
+    }
+
+    override public function updateAnimation (elapsed :Number) :void
+    {
+        if (elapsed < _duration) {
+            _disp.alpha = _from + ((_to - _from) * elapsed) / _duration;
+            return;
+        }
+
+        _disp.alpha = _to;
+        stopAnimation();
+        if (_done != null) {
+            _done();
+        }
+    }
+
+    protected var _disp :DisplayObject;
+    protected var _from :Number;
+    protected var _to :Number;
+    protected var _duration :Number;
+    protected var _done :Function;
+
+}
+}


add doc comments

add doc comments

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/MerlinDS/utils.git/'


StageSync ignores secondary contextView and logs a warning


fixing layout path

fixing layout path

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/rafaelcordoba/cocktail-demo.git/'


fwr: set FlexClient timeout to 120 secs, add error codes to timeout errors

git-svn-id: 8a2ccb88241e16c78017770bc38d91d6d5396a5a@86267 6b8eccd3-e8c5-4e7d-8186-e12b5326b719

--- generator/sources/as3/com/kaltura/delegates/WebDelegateBase.as
+++ generator/sources/as3/com/kaltura/delegates/WebDelegateBase.as
@@ -53,7 +53,7 @@
 	public class WebDelegateBase extends EventDispatcher implements IKalturaCallDelegate {

 		public static var CONNECT_TIME:int = 60000; //60 secs
-		public static var LOAD_TIME:int = 60000; //60 secs
+		public static var LOAD_TIME:int = 120000; //120 secs

 		protected var connectTimer:Timer;
 		protected var loadTimer:Timer;
@@ -118,7 +118,7 @@

 		protected function onConnectTimeout(event:TimerEvent):void {
 			var kError:KalturaError = new KalturaError();
-			//kError.errorCode =
+			kError.errorCode = "KMC_CONNECTION_TIMEOUT";
 			kError.errorMsg = "Connection Timeout: " + CONNECT_TIME / 1000 + " sec with no post command from kaltura client.";
 			_call.handleError(kError);
 			dispatchEvent(new KalturaEvent(KalturaEvent.FAILED, false, false, false, null, kError));
@@ -134,6 +134,7 @@
 			close();

 			var kError:KalturaError = new KalturaError();
+			kError.errorCode = "KMC_POST_TIMEOUT";
 			kError.errorMsg = "Post Timeout: " + LOAD_TIME / 1000 + " sec with no post result.";
 			_call.handleError(kError);
 			dispatchEvent(new KalturaEvent(KalturaEvent.FAILED, false, false, false, null, kError));


Added DEBUG

Added DEBUG

error: pathspec 'src/DEBUG.as' did not match any file(s) known to git

--- src/DEBUG.as
+++ src/DEBUG.as
@@ -0,0 +1,32 @@
+package  {
+	import Components.Wire;
+	import flash.geom.Point;
+	import flash.utils.ByteArray;
+	import Modules.*;
+	import org.flixel.FlxG;
+	/**
+	 * ...
+	 * @author Nicholas "PleasingFungus" Feinberg
+	 */
+	public class DEBUG {
+
+		public static const RENDER_COLLIDE:Boolean = FlxG.debug && false;
+		public static const RENDER_CURRENT:Boolean = FlxG.debug && false;
+		public static const RENDER_BLOC_CONNECTIONS:Boolean = FlxG.debug && true;
+		public static const PRINT_TESTS:Boolean = FlxG.debug && false;
+		public static const PRINT_CONNECTIONS:Boolean = FlxG.debug && false;
+		public static const SKIP_TUT:Boolean = FlxG.debug && true;
+		public static const UNLOCK_ALL:Boolean = FlxG.debug && true;
+		public static const FORCE_LOAD_LEVEL:Boolean = FlxG.debug && false;
+		public static const FORCE_LEVEL:String = '20';
+		public static const FORCE_CODE:String = "81362d9946b3bffc12ea538b26e1bd5b"
+		public static const PRESERVE_WIRES:Boolean = FlxG.debug && false;
+
+		public static function runDebugStuff():void {
+			if (!FlxG.debug)
+				return;
+		}
+
+	}
+
+}


updating infoBarController

updating infoBarController

adding functionality when accepting NotificationMessages.Win

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/jkanchelov/VideoPoker.git/'


adding setter to internal var params

adding setter to internal var params


Adding a date formatter

Adding a date formatter

error: pathspec 'driver/src/main/flex/org/postgresql/util/DateFormatter.as' did not match any file(s) known to git

--- driver/src/main/flex/org/postgresql/util/DateFormatter.as
+++ driver/src/main/flex/org/postgresql/util/DateFormatter.as
@@ -0,0 +1,137 @@
+package org.postgresql.util
+{
+	import flash.utils.Dictionary;
+
+	/**
+	 * Attempts to closely mirror the API of the Flex DateFormatter, though also supports
+	 * escaping the pattern letters (precede with a backslash). The Flex DateFormatter API
+	 * is rather loosely defined, but:
+	 *
+	 * Y{2,4}:	Year, two or four digits (technically allows three as well)
+	 * M{1,4}:	Month (single number / padded to two digits / three-letter abbreviation / full name)
+	 * D{1,2}:	Day of month (padded to specified length if necessary)
+	 * E{1,4}:	Day of week (single number / padded to two digits / three-letter abbreviation / full name)
+	 * A:		AM / PM indicator
+	 * J{1,2}:	Hour in day (0-23), padded to two digits if necessary
+ 	 * H{1,2}:	Hour in day (1-24), padded to two digits if necessary
+   	 * K{1,2}:	Hour in day (0-11), padded to two digits if necessary
+ 	 * L{1,2}:	Hour in day (1-12), padded to two digits if necessary
+ 	 * N{1,2}:	Minute in hour, padded to two digits if necessary
+ 	 * S{1,2}:	Second in hour, padded to two digits if necessary
+	 *
+	 * Note that, unlike internally, months are one-indexed. Date formatting is not currently localizable.
+	 */
+	public class DateFormatter
+	{
+		public var months:Array = [
+			'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
+		];
+
+		public var fullMonths:Array = [
+			'January', 'February', 'March', 'April', 'May', 'June', 'July',
+			'August', 'September', 'October', 'November', 'December'
+		];
+
+		public var daysOfWeek:Array = [
+			'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'
+		];
+
+		public var fullDaysOfWeek:Array = [
+			'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
+		];
+
+		public var am:String = 'a.m.';
+		public var pm:String = 'p.m.';
+
+		public var formatString:String;
+		public function format(value:Date):String {
+			// This function ain't pretty...
+
+			// 2 to 4 Y or 1 to 4 of [ME] or 1 to 2 of [DJHKLNS] or A, *not* preceeded by a backslash
+			return formatString.replace(/(?<!\\)(?:YY+|[ME]{1,4}|[DJHKLNS]{1,2}|A)/g, function():String {
+				var match:String = arguments[0];
+				if (/Y+/.test(match)) {
+					// Let's assume we're logging between 1000 AD and 9999 AD; they will curse us on y10k
+					return value.fullYear.toString().slice(4 - match.length);
+				} else if (/M+/.test(match)) {
+					// N.B.: months are zero-indexed
+					var monthIndex:int = value.month;
+					var monthVal:String = (monthIndex + 1).toString();
+					if (match.length == 1 || (match.length == 2 && monthVal.length == 2)) {
+						return monthVal;
+					} else if (match.length == 2) {
+						return '0' + monthVal;
+					} else if (match.length == 3) {
+						return months[monthIndex];
+					} else if (match.length == 4) {
+						return fullMonths[monthIndex];
+					} else {
+						assert("Unexpected month format match: " + match, false);
+						return '???';
+					}
+				} else if (/D+/.test(match)) {
+					var dayVal:String = value.date.toString();
+					if (match.length == 1 || (match.length == 2 && dayVal.length == 2)) {
+						return dayVal;
+					} else if (match.length == 2) {
+						return '0' + dayVal;
+					} else {
+						assert("Unexpected day format match: " + match, false);
+						return '??';
+					}
+				} else if (/E+/.test(match)) {
+					var dayOfWeekIdx:int = value.day;
+					if (match.length == 1) {
+						return dayOfWeekIdx.toString();
+					} else if (match.length == 2) {
+						// There are only seven days of the week, so we always pad
+						return '0' + dayOfWeekIdx;
+					} else if (match.length == 3) {
+						return daysOfWeek[dayOfWeekIdx];
+					} else if (match.length == 4) {
+						return fullDaysOfWeek[dayOfWeekIdx];
+					} else {
+						assert("Unexpected day of week format match: " + match, false);
+						return '??';
+					}
+				} else if (/[JHKL]+/.test(match)) {
+					// KL are on the twelve-hour clock, and HL are one-indexed
+					var hours:int = value.hours;
+					var adjustedHours:int = hours;
+					if (/[KL]+/.test(match)) {
+						adjustedHours = hours % 12;
+					}
+					if (/[HL]+/.test(match) && adjustedHours == 0) {
+						adjustedHours = 12;
+					}
+					var hoursVal:String = adjustedHours.toString();
+
+					if (match.length == 1 || (match.length == 2 && hoursVal.length == 2)) {
+						return hoursVal;
+					} else {
+						return '0' + hoursVal;
+					}
+				} else if (/N/.test(match)) {
+					var minutesVal:String = value.minutes.toString();
+					if (match.length == 1 || (match.length == 2 && minutesVal.length == 2)) {
+						return minutesVal;
+					} else {
+						return '0' + minutesVal;
+					}
+				} else if (/S/.test(match)) {
+					var secondsVal:String = value.seconds.toString();
+					if (match.length == 1 || (match.length == 2 && secondsVal.length == 2)) {
+						return secondsVal;
+					} else {
+						return '0' + secondsVal;
+					}
+				} else if (/A/.test(match)) {
+					return value.hours < 12 ? am : pm;
+				}else {
+					assert("Unexpected format match: " + match, false);
+					return '??';
+				}
+			}).replace(/\\([YMEDJHKLNSA])/g, '$1');
+		}
+	}
+}


Refactoring subscribeToSavedOrExisting (phase 1)

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/pubnub/flash.git/'


Fix problem with svg width parameter.

Fix problem with svg width parameter.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/leymannx/svgweb.git/'


Tests for cloning of NotCloneableSubclass.

error: pathspec 'dolly-framework/src/test/actionscript/dolly/CloningNotCloneableSubclass.as' did not match any file(s) known to git

--- dolly-framework/src/test/actionscript/dolly/CloningNotCloneableSubclass.as
+++ dolly-framework/src/test/actionscript/dolly/CloningNotCloneableSubclass.as
@@ -0,0 +1,46 @@
+package dolly {
+
+import dolly.core.dolly_internal;
+import dolly.data.NotCloneableSubclass;
+
+import org.as3commons.reflect.Type;
+
+use namespace dolly_internal;
+
+public class CloningNotCloneableSubclass {
+
+	public var notCloneableSubclass:NotCloneableSubclass;
+	public var notCloneableSubclassType:Type;
+
+	[Before]
+	public function before():void {
+		notCloneableSubclass = new NotCloneableSubclass();
+		notCloneableSubclass.property1 = "property1 value";
+		notCloneableSubclass.property2 = "property2 value";
+		notCloneableSubclass.writableField1 = "writableField1 value";
+		notCloneableSubclass.writableField2 = "writableField2 value";
+		notCloneableSubclassType = Type.forInstance(notCloneableSubclass);
+	}
+
+	[After]
+	public function after():void {
+		notCloneableSubclass = null;
+		notCloneableSubclassType = null;
+	}
+
+	[Test(expects="dolly.core.errors.CloningError")]
+	public function findingAllWritableFieldsForType():void {
+		Cloner.findAllWritableFieldsForType(notCloneableSubclassType);
+	}
+
+	[Test(expects="dolly.core.errors.CloningError")]
+	public function cloningByCloner():void {
+		Cloner.clone(notCloneableSubclass);
+	}
+
+	[Test(expects="dolly.core.errors.CloningError")]
+	public function cloningByCloneFunction():void {
+		clone(notCloneableSubclass);
+	}
+}
+}


57 DataProviderUtil, like ArrayUtil but for DataProviders, surprisingly

error: pathspec 'raw/src/org/yellcorp/array/DataProviderUtil.as' did not match any file(s) known to git

--- raw/src/org/yellcorp/array/DataProviderUtil.as
+++ raw/src/org/yellcorp/array/DataProviderUtil.as
@@ -0,0 +1,49 @@
+package org.yellcorp.array
+{
+import fl.data.DataProvider;
+
+
+public class DataProviderUtil
+{
+    public static function findFirst(dp:DataProvider, boolFunction:Function):int
+    {
+        var i:int;
+        if (!dp) return -1;
+        if (boolFunction === null)
+        {
+            for (i = 0; i < dp.length; i++)
+            {
+                if (dp.getItemAt(i)) return i;
+            }
+        }
+        else
+        {
+            for (i = 0; i < dp.length; i++)
+            {
+                if (boolFunction(dp.getItemAt(i))) return i;
+            }
+        }
+        return -1;
+    }
+    public static function findLast(dp:DataProvider, boolFunction:Function):int
+    {
+        var i:int;
+        if (!dp) return -1;
+        if (boolFunction === null)
+        {
+            for (i = dp.length - 1; i >= 0; i--)
+            {
+                if (dp.getItemAt(i)) return i;
+            }
+        }
+        else
+        {
+            for (i = dp.length - 1; i >= 0; i--)
+            {
+                if (boolFunction(dp.getItemAt(i))) return i;
+            }
+        }
+        return -1;
+    }
+}
+}


updating gun's listening based on the new Guns for scheme_loaded etc and adding log calls to all methods


Refactored how the Injector looks up mappings internally

--- src/org/swiftsuspenders/Injector.as
+++ src/org/swiftsuspenders/Injector.as
@@ -11,6 +11,8 @@
 	import flash.utils.Dictionary;
 	import flash.utils.getQualifiedClassName;

+	import org.swiftsuspenders.dependencyproviders.DependencyProvider;
+
 	import org.swiftsuspenders.injectionpoints.ConstructorInjectionPoint;
 	import org.swiftsuspenders.injectionpoints.InjectionPoint;
 	import org.swiftsuspenders.utils.ClassDescriptor;
@@ -69,8 +71,7 @@
 		 */
 		public function satisfies(type : Class, name : String = '') : Boolean
 		{
-			const  rule : InjectionRule = getMapping(getQualifiedClassName(type) + '|' + name);
-			return rule && rule.hasProvider();
+			return getProvider(getQualifiedClassName(type) + '|' + name) != null;
 		}

 		/**
@@ -85,8 +86,7 @@
 		 */
 		public function satisfiesDirectly(type : Class, name : String = '') : Boolean
 		{
-			const rule : InjectionRule = _mappings[getQualifiedClassName(type) + '|' + name];
-			return rule && rule.hasProvider();
+			return providerMappings[getQualifiedClassName(type) + '|' + name] != null;
 		}

 		/**
@@ -125,10 +125,10 @@
 		public function getInstance(type : Class, name : String = '') : *
 		{
 			const mappingId : String = getQualifiedClassName(type) + '|' + name;
-			var mapping : InjectionRule = getMapping(mappingId);
-			if (mapping && mapping.hasProvider())
-			{
-				return mapping.apply(type, this);
+			const provider : DependencyProvider = getProvider(mappingId);
+			if (provider)
+			{
+				return provider.apply(type, this);
 			}
 			if (name)
 			{
@@ -171,16 +171,6 @@
 			INJECTION_POINTS_CACHE = new Dictionary(true);
 		}

-		SsInternal function getAncestorMapping(mappingId : String) : InjectionRule
-		{
-			return _parentInjector ? _parentInjector.getMapping(mappingId) : null;
-		}
-
-		SsInternal function getMapping(mappingId : String) : InjectionRule
-		{
-			return _mappings[mappingId] || getAncestorMapping(mappingId);
-		}
-
 		SsInternal function instantiateUnmapped(type : Class) : Object
 		{
 			var ctorInjectionPoint : ConstructorInjectionPoint =
@@ -212,5 +202,19 @@
 				injectionPoint = injectionPoint.next;
 			}
 		}
+
+		private function getProvider(mappingId : String) : DependencyProvider
+		{
+			var injector : Injector = this;
+			while (injector)
+			{
+				if (injector.providerMappings[mappingId])
+				{
+					return injector.providerMappings[mappingId];
+				}
+				injector = injector.parentInjector;
+			}
+			return null;
+		}
 	}
 }


Changed namespace from SsInternal to private for some methods only used in Injector

--- src/org/swiftsuspenders/Injector.as
+++ src/org/swiftsuspenders/Injector.as
@@ -167,30 +167,11 @@
 			INJECTION_POINTS_CACHE = new Dictionary(true);
 		}

-		SsInternal function getMapping(requestType : Class) : InjectionRule
-		{
-			return _mappings[requestType] || getAncestorMapping(requestType);
-		}
-
-		SsInternal function getMappingByName(requestTypeName : String) : InjectionRule
-		{
-			return _mappings[requestTypeName] || getAncestorMappingByName(requestTypeName);
-		}
-
 		SsInternal function getAncestorMapping(requestType : Class) : InjectionRule
 		{
 			if (_parentInjector)
 			{
 				return _parentInjector.getMapping(requestType);
-			}
-			return null;
-		}
-
-		SsInternal function getAncestorMappingByName(requestTypeName : String) : InjectionRule
-		{
-			if (_parentInjector)
-			{
-				return _parentInjector.getMappingByName(requestTypeName);
 			}
 			return null;
 		}
@@ -206,7 +187,7 @@
 			return getMappingByName(config.typeName);
 		}

-		SsInternal function instantiateUnmapped(type : Class) : *
+		SsInternal function instantiateUnmapped(type : Class) : Object
 		{
 			var ctorInjectionPoint : ConstructorInjectionPoint =
 					_classDescriptor.getDescription(type);
@@ -229,6 +210,25 @@
 			return rule;
 		}

+		private function getMapping(requestType : Class) : InjectionRule
+		{
+			return _mappings[requestType] || getAncestorMapping(requestType);
+		}
+
+		private function getMappingByName(requestTypeName : String) : InjectionRule
+		{
+			return _mappings[requestTypeName] || getAncestorMappingByName(requestTypeName);
+		}
+
+		private function getAncestorMappingByName(requestTypeName : String) : InjectionRule
+		{
+			if (_parentInjector)
+			{
+				return _parentInjector.getMappingByName(requestTypeName);
+			}
+			return null;
+		}
+
 		private function applyInjectionPoints(target : Object, targetType : Class,
 				injectionPoint : InjectionPoint) : void
 		{


Added class for Flash explorer.

Added class for Flash explorer.

error: pathspec 'flash/org/windmill/WMExplorer.as' did not match any file(s) known to git

--- flash/org/windmill/WMExplorer.as
+++ flash/org/windmill/WMExplorer.as
@@ -0,0 +1,74 @@
+/*
+Copyright 2009, Matthew Eernisse (mde@fleegix.org) and Slide, Inc.
+
+ Licensed 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.
+*/
+
+package org.windmill {
+  import org.windmill.Windmill;
+  import org.windmill.WMLocator;
+  import flash.display.Stage;
+  import flash.display.Sprite;
+  import flash.events.MouseEvent;
+  import flash.geom.Point;
+  import flash.external.ExternalInterface;
+
+  public class WMExplorer {
+    // Sprite which gets superimposed on the moused-over element
+    // and provides the border effect
+    private static var borderSprite:Sprite = new Sprite();
+
+    public function WMExplorer():void {}
+
+    public static function start():void {
+      var context:Stage = Windmill.context;
+      var spr:Sprite = WMExplorer.borderSprite;
+      if (!context || !context is Stage) {
+        throw new Error('Windmill.context must be a reference to the Stage.' +
+            ' Perhaps Windmill.init has not run yet.');
+      }
+      // Add the border-sprite to the stage
+      spr.name = 'borderSprite';
+      context.addChild(spr);
+      // Highlight every element on mouseover
+      context.addEventListener(MouseEvent.MOUSE_OVER, WMExplorer.highlight, true);
+      // Clicks should pass the lookup expression to JS
+      context.addEventListener(MouseEvent.MOUSE_DOWN, WMExplorer.select, true);
+    }
+
+    public static function highlight(e:MouseEvent):void {
+      var targ:* = e.target;
+      var spr:Sprite = WMExplorer.borderSprite;
+      var p:Point = new Point(0, 0);
+      // Get the global coords of the moused-over elem
+      p = targ.localToGlobal(p);
+      spr.x = p.x;
+      spr.y = p.y;
+      // Clear any previous border, and draw a new border
+      // the same size as the moused-over elem
+      spr.graphics.clear()
+      spr.graphics.lineStyle(0, 0xff0000, 0.5);
+      spr.graphics.drawRect(0, 0, targ.width, targ.height);
+    }
+
+    public static function select(e:MouseEvent):void {
+    }
+
+    public static function stop():void {
+      var context:Stage = Windmill.context;
+      context.removeChild(WMExplorer.borderSprite);
+      context.removeEventListener(MouseEvent.MOUSE_OVER, WMExplorer.highlight);
+      context.removeEventListener(MouseEvent.MOUSE_DOWN, WMExplorer.select);
+    }
+  }
+}


OPEN - issue FLEXMOJOS-86: Unit tests has not been properly executed in case of nested project sturcture  https://issues.sonatype.org/browse/FLEXMOJOS-86

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/edward-yakop/flexmojos.git/'


Updated Actor ASDoc

Updated Actor ASDoc

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/eric-stanley/robotlegs-framework.git/'


A psudo random number generator that can be seeded.  Use at your own
risk.

git-svn-id: a1a4b28b82a3276cc491891159dd9963a0a72fae@4415 542714f4-19e9-0310-aa3c-eee0fc999fb1

error: pathspec 'src/as/com/threerings/util/Random.as' did not match any file(s) known to git

--- src/as/com/threerings/util/Random.as
+++ src/as/com/threerings/util/Random.as
@@ -0,0 +1,77 @@
+package com.threerings.util {
+
+// A simple psuedo random number generator that allows seeding.
+public class Random
+{
+    /**
+     * Creates a pseudo random number generation.
+     *
+     * @param seed a seed of 0 will randomly seed the generator, anything
+     * other than 0 will create a generator with the specified seed.
+     */
+    public function Random (seed :uint = 0)
+    {
+        if (seed == 0) {
+            seed = uint(seedUniquifier++ + uint(Math.random() * 4294967295));
+        }
+        setSeed(seed);
+    }
+
+    /**
+     * Sets the seed of the generator.  This will result in the same generator
+     * sequence of values as a new generator created with the specified seed.
+     */
+    public function setSeed (seed :uint) :void
+    {
+        seed = uint(seed ^ multiplier);
+    }
+
+    /**
+     * Returns the an int value n where 0 <= value < n.
+     *
+     * @param n the range to return.  If this is set to 0 it will return a
+     * random integer value.  Anything less than 0 will thrown an error.
+     */
+    public function nextInt (n :int=0) :int
+    {
+        if (n < 0)
+            throw new Error("n must be positive");
+
+        if (n == 0) return int(next(32));
+
+        var bits :int, val :int;
+        do {
+            bits = int(next(31));
+            val = bits % n;
+        } while (bits - val + (n - 1) < 0);
+        return val;
+    }
+
+    /**
+     * Returns a random Boolean value.
+     */
+    public function nextBoolean () :Boolean
+    {
+        return next(1) != 0;
+    }
+
+    /**
+     * Returns a random Number where 0.0 <= value < 1.0.
+     */
+    public function nextNumber () :Number
+    {
+        return Number(next(32) / (1 << 32));
+    }
+
+    protected function next (bits :int) :uint
+    {
+        seed = uint(seed * multiplier + addend)
+        return uint(seed >>> (32 - bits));
+    }
+
+    protected var seed :uint;
+    protected static var seedUniquifier :uint = 2812526361;
+    protected static const multiplier :uint = 452871439;
+    protected static const addend :uint = 11;
+}
+}


adding "asset" getter to factory

adding "asset" getter to factory


Issue 36; Add missing finish call for metadata node.


ObjectMarshaller, formerly EZObjectMarshaller in vilya + some value validation code
that was actually in GameControlBackend.

git-svn-id: a1a4b28b82a3276cc491891159dd9963a0a72fae@4748 542714f4-19e9-0310-aa3c-eee0fc999fb1

error: pathspec 'src/as/com/threerings/util/ObjectMarshaller.as' did not match any file(s) known to git

--- src/as/com/threerings/util/ObjectMarshaller.as
+++ src/as/com/threerings/util/ObjectMarshaller.as
@@ -0,0 +1,174 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.util {
+
+import flash.net.ObjectEncoding;
+
+import flash.system.ApplicationDomain;
+
+import flash.utils.ByteArray;
+import flash.utils.Endian;
+import flash.utils.IExternalizable;
+import flash.utils.getQualifiedSuperclassName; // function import
+
+import com.threerings.io.TypedArray;
+
+/**
+ * Utility methods for transforming flash objects into byte[].
+ */
+public class ObjectMarshaller
+{
+    /**
+     * Encode the specified object as either a byte[] or a byte[][] (see below).
+     * The specific mechanism of encoding is not important,
+     * as long as decode returns a clone of the original object.
+     *
+     * No validation is done to verify that the object can be serialized.
+     *
+     * Currently, cycles in the object graph are preserved on the other end.
+     *
+     * @param encodeArrayElements if true and the obj is an Array, each element is
+     * encoded separately, returning a byte[][] instead of a byte[].
+     */
+    public static function encode (
+        obj :Object, encodeArrayElements :Boolean = false) :Object
+    {
+        if (obj == null) {
+            return null;
+        }
+        if (encodeArrayElements && obj is Array) {
+            var src :Array = (obj as Array);
+            var dest :TypedArray = TypedArray.create(ByteArray);
+            for each (var o :Object in src) {
+                dest.push(encode(o, false));
+            }
+            return dest;
+        }
+
+        // TODO: Our own encoding, that takes into account
+        // the ApplicationDomain.. ACK
+        var bytes :ByteArray = new ByteArray();
+        bytes.endian = Endian.BIG_ENDIAN;
+        bytes.objectEncoding = ObjectEncoding.AMF3;
+        bytes.writeObject(obj);
+        return bytes;
+    }
+
+    /**
+     * Validate the value and encode it. Arrays are not broken-up.
+     */
+    public static function validateAndEncode (obj :Object) :ByteArray
+    {
+        validateValue(obj);
+        return encode(obj, false) as ByteArray;
+    }
+
+    /**
+     * Decode the specified byte[] or byte[][] back into a flash Object.
+     */
+    public static function decode (encoded :Object) :Object
+    {
+        if (encoded == null) {
+            return null;
+        }
+        if (encoded is TypedArray) {
+            var src :TypedArray = (encoded as TypedArray);
+            var dest :Array = [];
+            for each (var b :ByteArray in src) {
+                dest.push(decode(b));
+            }
+            return dest;
+        }
+        var bytes :ByteArray = (encoded as ByteArray);
+        // re-set the position in case we're decoding the actual same byte
+        // array used to encode (and not a network reconstruction)
+        bytes.position = 0;
+
+        // TODO: Our own decoding, that takes into account
+        // the ApplicationDomain.. ACK
+        bytes.endian = Endian.BIG_ENDIAN;
+        bytes.objectEncoding = ObjectEncoding.AMF3;
+        return bytes.readObject();
+    }
+
+    /**
+     * Validate that the value is kosher for encoding, or throw an ArgumentError if it's not.
+     */
+    public static function validateValue (value :Object) :void
+        // throws ArgumentError
+    {
+        var s :String = getValidationError(value);
+        if (s != null) {
+            throw new ArgumentError(s);
+        }
+    }
+
+    /**
+     * Get the String reason why this value is not encodable, or null if no error.
+     */
+    public static function getValidationError (value :Object) :String
+    {
+        if (value == null) {
+            return null;
+
+        } else if (value is IExternalizable) {
+            return "IExternalizable is not yet supported";
+
+        } else if (value is Array) {
+            if (ClassUtil.getClassName(value) != "Array") {
+                // We can't allow arrays to be serialized as IExternalizables
+                // because we need to know element values (opaquely) on the
+                // server. Also, we don't allow other types because we wouldn't
+                // create the right class on the other side.
+                return "Custom array subclasses are not supported";
+            }
+            // then, continue on with the sub-properties check (below)
+
+        } else {
+            var type :String = typeof(value);
+            if (type == "number" || type == "string" || type == "boolean" ) {
+                return null; // kosher!
+            }
+            if (value is ByteArray) {
+                return null; // kosher
+            }
+            var clazz :Class = ClassUtil.getClass(value);
+            var clazzparentname :String = getQualifiedSuperclassName(clazz);
+            var rootclass :Boolean = (clazzparentname == null);
+            if (! rootclass) {
+                return "Non-simple properties may not be set.";
+            }
+            // fall through and verify the object's sub-properties
+        }
+
+        // check sub-properties (of arrays and objects)
+        for each (var arrValue :Object in (value as Array)) {
+            var s :String = getValidationError(arrValue);
+            if (s != null) {
+                return s;
+            }
+        }
+
+        return null; // it all checks out!
+    }
+}
+}


Add a simple terminal-like output.

Add a simple terminal-like output.

error: pathspec 'swfcat.as' did not match any file(s) known to git

--- swfcat.as
+++ swfcat.as
@@ -0,0 +1,27 @@
+package
+{
+    import flash.display.Sprite;
+    import flash.text.TextField;
+    import flash.net.XMLSocket;
+
+    public class swfcat extends Sprite
+    {
+        private var output_text:TextField;
+
+        private function puts(s:String):void
+        {
+            output_text.appendText(s + "\n");
+        }
+
+        public function swfcat()
+        {
+            output_text = new TextField();
+            output_text.width = 400;
+            output_text.height = 300;
+            output_text.background = true;
+            output_text.backgroundColor = 0x001f0f;
+            output_text.textColor = 0x44CC44;
+            addChild(output_text);
+        }
+    }
+}


added a ScriptController to make it easier to script scene objects

error: pathspec 'src/aerys/minko/scene/controller/ScriptController.as' did not match any file(s) known to git

--- src/aerys/minko/scene/controller/ScriptController.as
+++ src/aerys/minko/scene/controller/ScriptController.as
@@ -0,0 +1,59 @@
+package aerys.minko.scene.controller
+{
+	import aerys.minko.render.Viewport;
+	import aerys.minko.scene.node.ISceneNode;
+	import aerys.minko.scene.node.Scene;
+
+	import flash.display.BitmapData;
+
+	public class ScriptController extends EnterFrameController
+	{
+		private var _lastTime		: Number		= 0.0;
+		private var _deltaTime		: Number		= 0.0;
+		private var _currentTarget	: ISceneNode	= null;
+
+		protected function get deltaTime() : Number
+		{
+			return _deltaTime;
+		}
+
+		public function ScriptController()
+		{
+			super();
+
+			initialize();
+		}
+
+		private function initialize() : void
+		{
+			var numTargets : uint = numTargets;
+
+			for (var i : uint = 0; i < numTargets; ++i)
+				start(getTarget(i));
+		}
+
+		override protected function sceneEnterFrameHandler(scene		: Scene,
+														   viewport		: Viewport,
+														   destination	: BitmapData,
+														   time			: Number) : void
+		{
+			_deltaTime = _lastTime - time;
+			_lastTime = time;
+
+			var numTargets : uint = numTargets;
+
+			for (var i : uint = 0; i < numTargets; ++i)
+				update(getTarget(i));
+		}
+
+		protected function start(target : ISceneNode) : void
+		{
+			// nothing
+		}
+
+		protected function update(target : ISceneNode) : void
+		{
+			// nothing
+		}
+	}
+}


adding log getter, plugging cocktail log level and detail into logger, renaming "class_path" and "class_name" methods -- just removing the underscores


VideoSlave load() fix

VideoSlave load() fix


context builder tag

context builder tag


Add AS3 example.

Add AS3 example.

error: pathspec 'tests/examplefiles/as3_test.as' did not match any file(s) known to git

--- tests/examplefiles/as3_test.as
+++ tests/examplefiles/as3_test.as
@@ -0,0 +1,143 @@
+			import flash.events.MouseEvent;
+			import com.example.programmingas3.playlist.PlayList;
+			import com.example.programmingas3.playlist.Song;
+			import com.example.programmingas3.playlist.SortProperty;
+
+			// constants for the different "states" of the song form
+			private static const ADD_SONG:uint = 1;
+			private static const SONG_DETAIL:uint = 2;
+
+			private var playList:PlayList = new PlayList();
+
+			private function initApp():void
+			{
+				// set the initial state of the song form, for adding a new song
+				setFormState(ADD_SONG);
+
+				// prepopulate the list with a few songs
+				playList.addSong(new Song("Nessun Dorma", "Luciano Pavarotti", 1990, "nessundorma.mp3", ["90's", "Opera"]));
+				playList.addSong(new Song("Come Undone", "Duran Duran", 1993, "comeundone.mp3", ["90's", "Pop"]));
+				playList.addSong(new Song("Think of Me", "Sarah Brightman", 1987, "thinkofme.mp3", ["Showtunes"]));
+				playList.addSong(new Song("Unbelievable", "EMF", 1991, "unbelievable.mp3", ["90's", "Pop"]));
+
+				songList.dataProvider = playList.songList;
+			}
+
+
+			private function sortList(sortField:SortProperty):void
+			{
+				// Make all the sort type buttons enabled.
+				// The active one will be grayed-out below
+				sortByTitle.selected = false;
+				sortByArtist.selected = false;
+				sortByYear.selected = false;
+
+				switch (sortField)
+				{
+					case SortProperty.TITLE:
+						sortByTitle.selected = true;
+						break;
+					case SortProperty.ARTIST:
+						sortByArtist.selected = true;
+						break;
+					case SortProperty.YEAR:
+						sortByYear.selected = true;
+						break;
+				}
+
+				playList.sortList(sortField);
+
+				refreshList();
+			}
+
+
+			private function refreshList():void
+			{
+				// remember which song was selected
+				var selectedSong:Song = Song(songList.selectedItem);
+
+				// re-assign the song list as the dataprovider to get the newly sorted list
+				// and force the List control to refresh itself
+				songList.dataProvider = playList.songList;
+
+				// reset the song selection
+				if (selectedSong != null)
+				{
+					songList.selectedItem = selectedSong;
+				}
+			}
+
+
+			private function songSelectionChange():void
+			{
+				if (songList.selectedIndex != -1)
+				{
+					setFormState(SONG_DETAIL);
+				}
+				else
+				{
+					setFormState(ADD_SONG);
+				}
+			}
+
+
+			private function addNewSong():void
+			{
+				// gather the values from the form and add the new song
+				var title:String = newSongTitle.text;
+				var artist:String = newSongArtist.text;
+				var year:uint = newSongYear.value;
+				var filename:String = newSongFilename.text;
+				var genres:Array = newSongGenres.selectedItems;
+
+				playList.addSong(new Song(title, artist, year, filename, genres));
+
+				refreshList();
+
+				// clear out the "add song" form fields
+				setFormState(ADD_SONG);
+			}
+
+
+			private function songListLabel(item:Object):String
+			{
+				return item.toString();
+			}
+
+
+			private function setFormState(state:uint):void
+			{
+				// set the form title and control state
+				switch (state)
+				{
+					case ADD_SONG:
+						formTitle.text = "Add New Song";
+						// show the submit button
+						submitSongData.visible = true;
+						showAddControlsBtn.visible = false;
+						// clear the form fields
+						newSongTitle.text = "";
+						newSongArtist.text = "";
+						newSongYear.value = (new Date()).fullYear;
+						newSongFilename.text = "";
+						newSongGenres.selectedIndex = -1;
+						// deselect the currently selected song (if any)
+						songList.selectedIndex = -1;
+						break;
+
+					case SONG_DETAIL:
+						formTitle.text = "Song Details";
+						// populate the form with the selected item's data
+						var selectedSong:Song = Song(songList.selectedItem);
+						newSongTitle.text = selectedSong.title;
+						newSongArtist.text = selectedSong.artist;
+						newSongYear.value = selectedSong.year;
+						newSongFilename.text = selectedSong.filename;
+						newSongGenres.selectedItems = selectedSong.genres;
+						// hide the submit button
+						submitSongData.visible = false;
+						showAddControlsBtn.visible = true;
+						break;
+				}
+			}
+


Bug 523445: adding testcase for Regex with multiple branches not working right if some of the branches are not anchored (r=cpeyer)

error: pathspec 'test/acceptance/ecma3/RegExp/eregress_523445.as' did not match any file(s) known to git

--- test/acceptance/ecma3/RegExp/eregress_523445.as
+++ test/acceptance/ecma3/RegExp/eregress_523445.as
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is [Open Source Virtual Machine].
+ *
+ * The Initial Developer of the Original Code is
+ * Adobe System Incorporated.
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK *****
+*
+*
+* Date:    21 Oct. 2009
+* SUMMARY: RegExp conformance test
+* See http://bugzilla.mozilla.org/show_bug.cgi?id=523445
+*
+*/
+//-----------------------------------------------------------------------------
+
+var SECTION = "eregress_523445";
+var VERSION = "";
+var TITLE   = "RegExp conformance test";
+var bug = "523445";
+
+startTest();
+writeHeaderToLog(SECTION + " " + TITLE);
+var testcases = getTestCases();
+test();
+
+function getTestCases() {
+    var array = new Array();
+    var item = 0;
+
+    var status = '';
+    var actual = '';
+    var expect= '';
+
+    status = inSection(1);
+    var s : String = "String";
+    var r : RegExp = new RegExp("(^)|(<\/a>$)|(^$)", "g");
+
+    // This should produce 'String', not 'String'
+    s = s.replace(r, "");
+    trace(s);
+
+    actual = s.replace(r, "");
+    expect = 'String';
+    array[item++] = new TestCase(SECTION, status, expect, actual);
+
+    return array;
+}
+


Add gsolo SHA1 algorithm.

Add gsolo SHA1 algorithm.

From:
http://gsolofp.blogspot.com/2006/01/actionscript-3-md5-and-sha1.html

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/zhangxingits/web-socket-js.git/'


adding betMultiplyer

adding betMultiplyer


RTMP "NetStream finishes too early" fix - http://getsatisfaction.com/schillmania/topics/netstream_onfinish_too_early

--- src/SoundManager2_AS3.as
+++ src/SoundManager2_AS3.as
@@ -640,7 +640,7 @@

     public function doNetStatus(oSound: SoundManager2_SMSound_AS3, e: NetStatusEvent) : void {
       // this will eventually let us know what is going on.. is the stream loading, empty, full, stopped?
-      oSound.lastNetStatus = e.info.code;
+      // oSound.lastNetStatus = e.info.code;

       if (e.info.code != "NetStream.Buffer.Full" && e.info.code != "NetStream.Buffer.Empty" && e.info.code != "NetStream.Seek.Notify") {
         writeDebug('netStatusEvent: ' + e.info.code);
@@ -649,7 +649,8 @@
       // When streaming, Stop is called when buffering stops, not when the stream is actually finished.
       // @see http://www.actionscript.org/forums/archive/index.php3/t-159194.html

-      if (e.info.code == "NetStream.Play.Stop") { // && !oSound.didFinish && oSound.loaded == true && nD == nP
+      if (!oSound.serverUrl && e.info.code == "NetStream.Play.Stop") { // && !oSound.didFinish && oSound.loaded == true && nD == nP
+
         writeDebug('NetStream.Play.Stop');
         // if (!oSound.useNetstream) {
         // finished playing
@@ -661,9 +662,12 @@
         ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onfinish");
         // and exit full-screen mode, too?
         stage.displayState = StageDisplayState.NORMAL;
+
       } else if (e.info.code == "NetStream.Play.FileStructureInvalid" || e.info.code == "NetStream.Play.FileStructureInvalid" || e.info.code == "NetStream.Play.StreamNotFound") {
+
         writeDebug('NetStream load error: '+e.info.code);
         this.onLoadError(oSound);
+
       } else if (e.info.code == "NetStream.Play.Start" || e.info.code == "NetStream.Buffer.Empty" || e.info.code == "NetStream.Buffer.Full") {

         // RTMP case..
@@ -725,6 +729,7 @@
           ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onfailure");
         }
       }
+
       oSound.lastNetStatus = e.info.code;

     }


Create empty Cloner class.

Create empty Cloner class.

error: pathspec 'dolly-framework/src/main/actionscript/dolly/Cloner.as' did not match any file(s) known to git

--- dolly-framework/src/main/actionscript/dolly/Cloner.as
+++ dolly-framework/src/main/actionscript/dolly/Cloner.as
@@ -0,0 +1,6 @@
+package dolly {
+public class Cloner {
+	public function Cloner() {
+	}
+}
+}


adding "once" to handler

adding "once" to handler

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/rafaelcordoba/cocktail-demo.git/'


innit commit

innit commit

error: pathspec 'as/main/frame1.as' did not match any file(s) known to git

--- as/main/frame1.as
+++ as/main/frame1.as
@@ -0,0 +1,122 @@
+import mx.events.EventDispatcher;
+import flash.filters.*;
+import mx.transitions.easing.*;
+import com.mosesSupposes.fuse.*;
+//Thanks Moses...and respect ;-)
+import com.segonquart.*;
+//-------------------------------
+ZigoEngine.simpleSetup (Shortcuts, PennerEasing);
+ZigoEngine.register (PennerEasing, Shortcuts, FuseFMP, FuseItem);
+
+
+var click_mc:MovieClip;
+var entrar_mc:MovieClip;
+var ok_mc:MovieClip;
+var v1, v2, v3, b1, b2:MovieClip;
+var m01:MovieClip;
+var m02:MovieClip;
+var botiga_mc:MovieClip;
+var marcMenu_mc:MovieClip;
+this.softsk_mc:MovieClip;
+
+
+
+function initUI ():Void
+{
+	this.ok_mc._visible = false;
+	this.texte07_txt._visible = false;
+	this.entrar_mc._alpha = 0;
+	this.marcMenu_mc._alpha = 0;
+	this.m02._alpha = this.m01._alpha = this.softsk_mc._alpha = 0;
+	this.v3._visible = false;
+	this.softsk_mc.scale = 0;
+	this.m01.o1.oo1.tintTo ("#000000", 100, "easeOutSine", .3);
+	this.m02.o2.oo2.tintTo ("#AA1C16", 100, "easeOutSine", .3);
+	this.m01.fadeIn ();
+	this.m02.fadeIn ();
+	//Fuse.openGroup ();
+	this.titol_mc.Blur_blur = 0;
+	this.titol_mc.Blur_blurXTo ('100', .25, 'easeOutSine', .75, {cycles:2});
+	this.titol_mc.slideTo (160, 75, 0.6, 'easeInOutQuint', .5);
+	this.softsk_mc.alphaTo (100, 1.7, 'easeInOutQuint', 1.5);
+	this.softsk_mc.scaleTo (190, 2, 'easeOutSine', 1.6);
+	//Fuse.closeGroup ();
+	this.titol_mc.Blur_blur = 0;
+	this.softsk_mc._alpha = 100;
+	this.sound_mc.loadMovie ("so.swf", 55);
+	//Fuse.closeAndStart ();
+	this.botiga_mc.tintTo ("#4A8618", 100, 2, "easeOutSine");
+	this.marcMenu_mc.tintTo ('#508F1E', 1, 'linear', .2);
+	this.top_mc.tintTo ('#DCEECA', 1, 'easeOutBack', .2);
+	this.v1.tintTo ('#508F1E', 1, 'easeInBack', .2);
+	this.titol_mc.tintTo ('#508F1E', 1.4, 'easeOutBack', .2);
+	this.b2.slideTo ('0', '0', 1, "linear");
+	this.b2.tintTo ('#E7F3DB', 100, "easeOutSine");
+	enterShopButton ();
+}
+
+function enterShopButton ():Void
+{
+	this.entrar_mc.alphaTo (100, 2, "easeOutQuad", 2.3);
+	this.entrar_mc._brightOffset = 100;
+	this.entrar_mc._scale = 50;
+	this.entrar_mc.brightOffsetTo (0, 4);
+	this.entrar_mc.scaleTo (100, 3, 'easeOutElastic', 2.5);
+	this.entrar_mc.DropShadow_alpha = 0.6;
+	//m01
+	this.m01.alphaTo (100, 2, "easeOutCirc", 2.3);
+	this.m01.slideTo (649, 306, .7, 'easeInOutQuint', 1.2);
+	//m02
+	this.m02.alphaTo (100, 1.6, "easeOutQuad", .5);
+	this.m02._brightOffset = 100;
+	this.m02._scale = 50;
+	this.m02.brightOffsetTo (0, 3);
+	this.m02.slideTo (707, 293, .7, 'easeInOutQuint', 1.2);
+	this.m02.scaleTo (113, .6, 'easeOutQuad', .5);
+}
+
+var enterEshopListener = new Object ();
+enterEshopListener.click = function (e)
+{
+	var entrar = getTimer () + 1500;
+	this.entrar_mc = target;
+	target.onRollOver = function ():Void
+	{
+		addEventListener (this, "onPress");
+		this.click_mc.tintTo ("#4A8618", 100, "easeOutSine");
+		this.scaleTo (110, 2, 'easeOutBounce');
+		this.DropShadow_distanceTo (3, .9, "easeOutBounce");
+	};
+	target.onRollOut = function ():Void
+	{
+		_parent.click_mc.tintTo ("#FF0000", 100, "easeOutElastic");
+		this.scaleTo (100, 1, 'easeInBack');
+		this.DropShadow_distanceTo (0, 2, "easeOutBounce");
+	};
+	target.onPress = function ():Void
+	{
+		this.Blur_blur = 0;
+		this.Blur_blurXTo ('100', .25, 'easeOutSine', {cycles:1});
+		this.alphaTo (0, 0.3, 'easeInOutQuint', .5);
+		_parent.down.tintTo ("#DCEECA", 100, "easeOutSine", .3);
+		_parent.v2.tintTo ("#95C60D", 100, "easeOutSine");
+		_parent.marcMenu_mc.fadeIn ();
+		_parent.titol_mcM.fadeOut () + 10000;
+		if (getTimer () > entrar)
+		{
+			nextFrame ();
+		}
+		else
+		{
+			delete this.entrar;
+		}
+		this.removeEventListener ();
+	};
+};
+function initFrame1 ():Void
+{
+	onEnterFrame = initUI;
+	this.addEventListener ("click", enterShopListener);
+	EventDispatcher.initialize (this);
+}
+initFrame1 ();


Just let winner tests

Just let winner tests


add missing AmbientShader

add missing AmbientShader

error: pathspec 'src/aerys/minko/render/material/phong/AmbientShader.as' did not match any file(s) known to git

--- src/aerys/minko/render/material/phong/AmbientShader.as
+++ src/aerys/minko/render/material/phong/AmbientShader.as
@@ -0,0 +1,36 @@
+package aerys.minko.render.material.phong
+{
+    import aerys.minko.render.RenderTarget;
+    import aerys.minko.render.material.basic.BasicShader;
+    import aerys.minko.render.shader.SFloat;
+    import aerys.minko.render.shader.ShaderSettings;
+    import aerys.minko.render.shader.part.phong.PhongShaderPart;
+    import aerys.minko.type.enum.Blending;
+
+    public class AmbientShader extends BasicShader
+    {
+        private var _phong : PhongShaderPart;
+
+        public function AmbientShader(renderTarget  : RenderTarget  = null,
+                                      priority      : Number        = 0.0)
+        {
+            super(renderTarget, priority);
+
+            _phong = new PhongShaderPart(this);
+        }
+
+        override protected function initializeSettings(settings:ShaderSettings):void
+        {
+            super.initializeSettings(settings);
+
+            settings.blending = Blending.OPAQUE;
+        }
+
+        override protected function getPixelColor() : SFloat
+        {
+            var diffuse : SFloat    = super.getPixelColor();
+
+            return float4(multiply(diffuse.rgb, _phong.getAmbientLighting()), diffuse.a);
+        }
+    }
+}


fixed BallView inheretance

fixed BallView inheretance


Minimal test case for super-super property access issue

error: pathspec 'src/avm2/tests/regress/correctness/callsuper6.as' did not match any file(s) known to git

--- src/avm2/tests/regress/correctness/callsuper6.as
+++ src/avm2/tests/regress/correctness/callsuper6.as
@@ -0,0 +1,24 @@
+class A {
+	public function get x(): int {
+	  return 5;
+	}
+}
+class B extends A {
+	public override function get x(): int {
+	  return super.x + 1;
+	}
+}
+class C extends B {
+	public override function get x(): int {
+	  return super.x + 2;
+	}
+}
+
+var a : A = new A();
+trace(a.x);
+
+var b : B = new B();
+trace(b.x);
+
+var c : C = new C();
+trace(c.x);


Added a CommandMenu, which is a pop-up menu that submits configured
CommandEvents for selected items.

git-svn-id: a1a4b28b82a3276cc491891159dd9963a0a72fae@4282 542714f4-19e9-0310-aa3c-eee0fc999fb1

error: pathspec 'src/as/com/threerings/mx/controls/CommandMenu.as' did not match any file(s) known to git

--- src/as/com/threerings/mx/controls/CommandMenu.as
+++ src/as/com/threerings/mx/controls/CommandMenu.as
@@ -0,0 +1,66 @@
+package com.threerings.mx.controls {
+
+import flash.display.DisplayObjectContainer;
+
+import mx.controls.Menu;
+import mx.core.mx_internal;
+import mx.events.MenuEvent;
+
+import com.threerings.mx.events.CommandEvent;
+
+public class CommandMenu extends Menu
+{
+    public function CommandMenu ()
+    {
+        super();
+
+        iconFunction = getIconFor;
+        labelFunction = getLabelFor;
+
+        addEventListener(MenuEvent.ITEM_CLICK, itemClicked);
+    }
+
+    /**
+     * Factory method to create a command menu.
+     *
+     * @param parent The parent of this menu.
+     * @param items an array of menu items, where each item is another array
+     *  with the following format: [ text, iconClass, command, arg ]. Arg is
+     *  optional.
+     */
+    public static function createMenu (
+            parent :DisplayObjectContainer, items :Array) :CommandMenu
+    {
+        var menu :CommandMenu = new CommandMenu();
+        menu.tabEnabled = false;
+        menu.showRoot = true;
+        Menu.popUpMenu(menu, parent, items);
+        return menu;
+    }
+
+    /**
+     * Callback for MenuEvent.ITEM_CLICK.
+     */
+    protected function itemClicked (event :MenuEvent) :void
+    {
+        event.stopImmediatePropagation();
+        var element :Array = (event.item as Array);
+        mx_internal::parentDisplayObject.dispatchEvent(
+            new CommandEvent(String(element[2]), element[3]));
+    }
+
+    // our function for retrieving a label for a menu entry
+    protected function getLabelFor (obj :Object) :String
+    {
+        var element :Array = (obj as Array);
+        return String(element[0]);
+    }
+
+    // our function for retrieving an icon for a menu entry
+    protected function getIconFor (obj :Object) :Class
+    {
+        var element :Array = (obj as Array);
+        return Class(element[1]);
+    }
+}
+}


adding basic BootTail class

adding basic BootTail class


81 ViewDebugUtil - just one function to easily make index colours for debug drawing

error: pathspec 'raw/src/org/yellcorp/display/ViewDebugUtil.as' did not match any file(s) known to git

--- raw/src/org/yellcorp/display/ViewDebugUtil.as
+++ raw/src/org/yellcorp/display/ViewDebugUtil.as
@@ -0,0 +1,21 @@
+package org.yellcorp.display
+{
+public class ViewDebugUtil
+{
+    public static function makeIndexColor(index:int, base:Number = 2):uint
+    {
+        var scale8bit:Number = 0xFF / (base - 1);
+        var result:uint;
+
+        result = int((index % base) * scale8bit) << 16;
+        index = int(index / base);
+
+        result |= int((index % base) * scale8bit) << 8;
+        index = int(index / base);
+
+        result |= int((index % base) * scale8bit);
+
+        return result;
+    }
+}
+}


Exposed a bunch of VPAID events to JS.

Exposed a bunch of VPAID events to JS.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/OnCircle/vpaid-wrapper.git/'


GuardsProcessor.verifyGuardClasses() was repeating verification for non-Guard classes unnecessarily.


improving amf dynamic query parser

improving amf dynamic query parser


Adding NumericLimits

Adding NumericLimits

error: pathspec 'raw/src/org/yellcorp/lib/number/NumericLimits.as' did not match any file(s) known to git

--- raw/src/org/yellcorp/lib/number/NumericLimits.as
+++ raw/src/org/yellcorp/lib/number/NumericLimits.as
@@ -0,0 +1,17 @@
+package org.yellcorp.lib.number
+{
+public class NumericLimits
+{
+    /**
+     * The value above which a Number lacks the precision to represent every
+     * integer. Equal to 2^53.
+     */
+    public static const MAX_INTEGRAL_PRECISION:Number = 9007199254740992.0;
+
+    /**
+     * The value below which a Number lacks the precision to represent every
+     * integer. Equal to -(2^53).
+     */
+    public static const MIN_INTEGRAL_PRECISION:Number = -9007199254740992.0;
+}
+}


Added Inlined stub for AS3.

Added Inlined stub for AS3.

error: pathspec 'as3/Apparat.Library.AS3/src/apparat/inline/Inlined.as' did not match any file(s) known to git

--- as3/Apparat.Library.AS3/src/apparat/inline/Inlined.as
+++ as3/Apparat.Library.AS3/src/apparat/inline/Inlined.as
@@ -0,0 +1,24 @@
+/*
+ * This file is part of Apparat.
+ *
+ * Apparat is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Apparat is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Apparat. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright (C) 2010 Joa Ebert
+ * http://www.joa-ebert.com/
+ *
+ */
+
+package apparat.inline {
+	public class Inlined {}
+}


evolving model a little more

evolving model a little more