<?xml version="1.0" encoding="UTF-8"?>
<!--

  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.

-->
<!-- Parsing swf file:/C:/Work/Royale/royale-compiler/compiler/target/junit-temp/ASDateTests4582668311951197930.swf -->
<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
  <!-- framecount=1 length=836 -->
  <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
  <Metadata>
        <![CDATA[<?xml version="1.0" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
        <dc:format>application/x-shockwave-flash</dc:format>
        <asc:compiler name="Apache Royale Compiler" version="${release.version}" build="${build.number}"/>
    </rdf:Description>
</rdf:RDF>
]]>
  </Metadata>
  <SetBackgroundColor color="#FFFFFF"/>
  <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
  <DoABC>
// script 0

// class_id=0 slot_id=0
public class %0 extends Object
{

  // method_id=3
  public function %0():*
  {
    //  derivedName  %0  
    //  method_info  3                               
    //  max_stack    1                               
    //  max_regs     1                               
    //  scope_depth  0                               
    //  max_scope    1                               
    //  code_length  6                               
    bb0
      succs=[]
      0      getlocal0            
      1      pushscope            
      2      getlocal0            
      3      constructsuper    0  
      4      returnvoid           
  }

  private function initHandler(Object):void
  {
    //  derivedName  initHandler  
    //  method_info  1            
    //  max_stack    4            
    //  max_regs     3            
    //  scope_depth  0            
    //  max_scope    1            
    //  code_length  35           
    bb0
      succs=[]
      0       getlocal0                                               
      1       pushscope                                               
      2       findpropstrict  Date                                    
      3       pushstring      "Sat Jun 30 23:59:59 GMT-0800 2018"     
      4       constructprop                                           
      5       coerce          Date                                    
      6       setlocal2                                               
      7       getlocal2                                               
      8       getproperty     hoursUTC                                
      9       pushbyte                                             1  
      10      add                                                     
      11      getlocal2                                               
      12      swap                                                    
      13      setproperty     hoursUTC                                
      14      findpropstrict  assertEqual                             
      15      pushstring      "date.hoursUTC"                         
      16      getlocal2                                               
      17      getproperty     hoursUTC                                
      18      pushbyte                                             8  
      19      callpropvoid                                            
      20      returnvoid                                              
  }

  private function assertEqual(String,*,*):void
  {
    //  derivedName  assertEqual  
    //  method_info  2            
    //  max_stack    1            
    //  max_regs     4            
    //  scope_depth  0            
    //  max_scope    1            
    //  code_length  1            
    bb0
      succs=[]
      0      returnvoid      
  }

  public static function %0$():*
  {
    //  derivedName  null  
    //  method_info  4     
    //  max_stack    0     
    //  max_regs     1     
    //  scope_depth  0     
    //  max_scope    0     
    //  code_length  1     
    bb0
      succs=[]
      0      returnvoid      
  }
}

function script0$init():*
{
  //  derivedName  null  
  //  method_info  0     
  //  max_stack    3     
  //  max_regs     1     
  //  scope_depth  0     
  //  max_scope    2     
  //  code_length  14    
  bb0
    succs=[]
    0      getlocal0                                          
    1      pushscope                                          
    2      getscopeobject                                  0  
    3      getlex          Object                             
    4      dup                                                
    5      pushscope                                          
    6      newclass                                           
    7      popscope                                           
    8      initproperty    %0     
    9      returnvoid                                         
}

  </DoABC>
  <SymbolClass>
    <Symbol idref="0" className="%0" />
  </SymbolClass>
  <ShowFrame/>
</swf>
