From 583327ff6255913bdc48ae93fb78d58016c8f763 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Sun, 24 Dec 2023 16:11:53 -0500 Subject: [PATCH] avm2: Properly set LoaderInfo.contentType from sniffed type --- .../avm2/globals/flash/display/loader_info.rs | 19 ++++++------ core/src/avm2/object/loaderinfo_object.rs | 21 +++++++++++++ core/src/display_object/movie_clip.rs | 12 +++++--- core/src/loader.rs | 4 +++ tests/tests/swfs/avm2/loader_events/Test.as | 4 ++- .../tests/swfs/avm2/loader_events/output.txt | 28 ++++++++++-------- tests/tests/swfs/avm2/loader_events/test.swf | Bin 1906 -> 1942 bytes tests/tests/swfs/avm2/loader_image/output.txt | 4 +++ tests/tests/swfs/avm2/loader_image/test.fla | Bin 4832 -> 4853 bytes tests/tests/swfs/avm2/loader_image/test.swf | Bin 723 -> 798 bytes 10 files changed, 65 insertions(+), 27 deletions(-) mode change 100644 => 100755 tests/tests/swfs/avm2/loader_image/test.fla diff --git a/core/src/avm2/globals/flash/display/loader_info.rs b/core/src/avm2/globals/flash/display/loader_info.rs index 91840b391..7e2d8ce8a 100644 --- a/core/src/avm2/globals/flash/display/loader_info.rs +++ b/core/src/avm2/globals/flash/display/loader_info.rs @@ -8,6 +8,7 @@ use crate::avm2::value::Value; use crate::avm2::{AvmString, Error}; use crate::avm2_stub_getter; use crate::display_object::TDisplayObject; +use crate::loader::ContentType; use swf::{write_swf, Compression}; pub use crate::avm2::object::loader_info_allocator; @@ -175,16 +176,14 @@ pub fn get_content_type<'gc>( this: Object<'gc>, _args: &[Value<'gc>], ) -> Result, Error<'gc>> { - if let Some(loader_stream) = this - .as_loader_info_object() - .and_then(|o| o.as_loader_stream()) - { - match &*loader_stream { - LoaderStream::NotYetLoaded(_, _, _) => return Ok(Value::Null), - LoaderStream::Swf(_, _) => { - return Ok("application/x-shockwave-flash".into()); - } - } + if let Some(loader_info) = this.as_loader_info_object() { + return match loader_info.content_type_hide_before_init() { + ContentType::Swf => Ok("application/x-shockwave-flash".into()), + ContentType::Jpeg => Ok("image/jpeg".into()), + ContentType::Png => Ok("image/png".into()), + ContentType::Gif => Ok("image/gif".into()), + ContentType::Unknown => Ok(Value::Null), + }; } Ok(Value::Undefined) diff --git a/core/src/avm2/object/loaderinfo_object.rs b/core/src/avm2/object/loaderinfo_object.rs index 38fa87e81..448a5da11 100644 --- a/core/src/avm2/object/loaderinfo_object.rs +++ b/core/src/avm2/object/loaderinfo_object.rs @@ -10,6 +10,7 @@ use crate::avm2::Error; use crate::avm2::EventObject; use crate::context::UpdateContext; use crate::display_object::{DisplayObject, TDisplayObject}; +use crate::loader::ContentType; use crate::tag_utils::SwfMovie; use core::fmt; use gc_arena::{Collect, GcCell, GcWeakCell, Mutation}; @@ -99,6 +100,9 @@ pub struct LoaderInfoObjectData<'gc> { uncaught_error_events: Object<'gc>, cached_avm1movie: Option>, + + #[collect(require_static)] + content_type: ContentType, } impl<'gc> LoaderInfoObject<'gc> { @@ -134,6 +138,7 @@ impl<'gc> LoaderInfoObject<'gc> { .uncaughterrorevents .construct(activation, &[])?, cached_avm1movie: None, + content_type: ContentType::Swf, }, )) .into(); @@ -179,6 +184,7 @@ impl<'gc> LoaderInfoObject<'gc> { .uncaughterrorevents .construct(activation, &[])?, cached_avm1movie: None, + content_type: ContentType::Unknown, }, )) .into(); @@ -201,6 +207,17 @@ impl<'gc> LoaderInfoObject<'gc> { return self.0.read().uncaught_error_events; } + /// Gets the `ContentType`, 'hiding' it by returning `ContentType::Unknown` + /// if we haven't yet fired the 'init' event. The real ContentType first becomes + /// visible to ActionScript in the 'init' event. + pub fn content_type_hide_before_init(&self) -> ContentType { + if self.0.read().init_event_fired { + self.0.read().content_type + } else { + ContentType::Unknown + } + } + pub fn fire_init_and_complete_events( &self, context: &mut UpdateContext<'_, 'gc>, @@ -269,6 +286,10 @@ impl<'gc> LoaderInfoObject<'gc> { self.0.write(mc).loaded_stream = Some(stream); } + pub fn set_content_type(&self, content_type: ContentType, mc: &Mutation<'gc>) { + self.0.write(mc).content_type = content_type; + } + /// Returns the AVM1Movie corresponding to the loaded movie- if /// it doesn't exist yet, creates it. pub fn get_or_init_avm1movie( diff --git a/core/src/display_object/movie_clip.rs b/core/src/display_object/movie_clip.rs index 8931d97b1..a36c32e11 100644 --- a/core/src/display_object/movie_clip.rs +++ b/core/src/display_object/movie_clip.rs @@ -32,8 +32,8 @@ use crate::drawing::Drawing; use crate::events::{ButtonKeyCode, ClipEvent, ClipEventResult}; use crate::font::{Font, FontType}; use crate::limits::ExecutionLimit; -use crate::loader; use crate::loader::Loader; +use crate::loader::{self, ContentType}; use crate::prelude::*; use crate::streams::NetStream; use crate::string::{AvmString, SwfStrExt as _, WStr, WString}; @@ -332,10 +332,14 @@ impl<'gc> MovieClip<'gc> { let loader_info = if movie.is_action_script_3() { // The root movie doesn't have a `Loader` // We will replace this with a `LoaderStream::Swf` later in this function - Some( + let loader_info = LoaderInfoObject::not_yet_loaded(activation, movie.clone(), None, None, false) - .expect("Failed to construct LoaderInfoObject"), - ) + .expect("Failed to construct LoaderInfoObject"); + loader_info + .as_loader_info_object() + .unwrap() + .set_content_type(ContentType::Swf, activation.context.gc_context); + Some(loader_info) } else { None }; diff --git a/core/src/loader.rs b/core/src/loader.rs index 6dab6934f..69ecdf721 100644 --- a/core/src/loader.rs +++ b/core/src/loader.rs @@ -1668,6 +1668,10 @@ impl<'gc> Loader<'gc> { }; if let MovieLoaderVMData::Avm2 { loader_info, .. } = vm_data { + loader_info + .as_loader_info_object() + .unwrap() + .set_content_type(sniffed_type, activation.context.gc_context); let fake_movie = Arc::new(SwfMovie::empty_fake_compressed_len( activation.context.swf.version(), length, diff --git a/tests/tests/swfs/avm2/loader_events/Test.as b/tests/tests/swfs/avm2/loader_events/Test.as index 401f0b723..8777887fb 100644 --- a/tests/tests/swfs/avm2/loader_events/Test.as +++ b/tests/tests/swfs/avm2/loader_events/Test.as @@ -43,6 +43,7 @@ trace("loader.contentLoaderInfo.bytes = " + loader.contentLoaderInfo.bytes); trace("loader.contentLoaderInfo.url = " + loader.contentLoaderInfo.url); trace("loader.contentLoaderInfo.parameters = " + loader.contentLoaderInfo.parameters); + trace("loader.contentLoaderInfo.contentType = " + loader.contentLoaderInfo.contentType); dumpParams(loader.contentLoaderInfo.parameters); } @@ -64,7 +65,8 @@ + ", loader.contentLoaderInfo.bytesLoaded = " + loader.contentLoaderInfo.bytesLoaded + ", loader.contentLoaderInfo.bytesTotal = " + loader.contentLoaderInfo.bytesTotal + ", loader.contentLoaderInfo.bytes.length = " + loader.contentLoaderInfo.bytes.length - + ", loader.contentLoaderInfo.url = " + url); + + ", loader.contentLoaderInfo.url = " + url + + ", loader.contentLoaderInfo.contentType = " + loader.contentLoaderInfo.contentType); dumpParams(loader.contentLoaderInfo.parameters); } diff --git a/tests/tests/swfs/avm2/loader_events/output.txt b/tests/tests/swfs/avm2/loader_events/output.txt index 6a3f13741..2d82823b6 100644 --- a/tests/tests/swfs/avm2/loader_events/output.txt +++ b/tests/tests/swfs/avm2/loader_events/output.txt @@ -5,6 +5,7 @@ loader.contentLoaderInfo.bytesTotal = 0 loader.contentLoaderInfo.bytes = null loader.contentLoaderInfo.url = null loader.contentLoaderInfo.parameters = [object Object] +loader.contentLoaderInfo.contentType = null Parameters: (len=0) Directly after load: @@ -15,15 +16,16 @@ loader.contentLoaderInfo.bytesTotal = 0 loader.contentLoaderInfo.bytes = loader.contentLoaderInfo.url = null loader.contentLoaderInfo.parameters = [object Object] +loader.contentLoaderInfo.contentType = null Parameters: (len=0) -Event [Event type="open" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 0, loader.contentLoaderInfo.bytes.length = 0, loader.contentLoaderInfo.url = null +Event [Event type="open" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 0, loader.contentLoaderInfo.bytes.length = 0, loader.contentLoaderInfo.url = null, loader.contentLoaderInfo.contentType = null Parameters: (len=0) -Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=0 bytesTotal=893]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 0, loader.contentLoaderInfo.url = null +Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=0 bytesTotal=893]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 0, loader.contentLoaderInfo.url = null, loader.contentLoaderInfo.contentType = null Parameters: (len=0) -Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=893 bytesTotal=893]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = null +Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=893 bytesTotal=893]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = null, loader.contentLoaderInfo.contentType = null Parameters: (len=2) paramOne = ValOne,paramTwo = ValTwo Hello from loaded SWF main timeline: this.stage=null this.parent=null @@ -33,13 +35,13 @@ Added circle Event.ADDED_TO_STAGE: circle.parent =[object LoadableMainTimeline] circle.stage=[object Stage] main.parent=[object Loader] main.stage=[object Stage] loader.contentLoaderInfo === loader.content.loaderInfo : true loader.contentLoaderInfo.content === loader.content : true -Event [Event type="init" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:/// +Event [Event type="init" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:///, loader.contentLoaderInfo.contentType = application/x-shockwave-flash Parameters: (len=2) paramOne = ValOne,paramTwo = ValTwo -Event [HTTPStatusEvent type="httpStatus" bubbles=false cancelable=false eventPhase=2 status=0 redirected=false responseURL=null]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:/// +Event [HTTPStatusEvent type="httpStatus" bubbles=false cancelable=false eventPhase=2 status=0 redirected=false responseURL=null]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:///, loader.contentLoaderInfo.contentType = application/x-shockwave-flash Parameters: (len=2) paramOne = ValOne,paramTwo = ValTwo -Event [Event type="complete" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:/// +Event [Event type="complete" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:///, loader.contentLoaderInfo.contentType = application/x-shockwave-flash Parameters: (len=2) paramOne = ValOne,paramTwo = ValTwo Starting orphan Loader @@ -50,6 +52,7 @@ loader.contentLoaderInfo.bytesTotal = 0 loader.contentLoaderInfo.bytes = null loader.contentLoaderInfo.url = null loader.contentLoaderInfo.parameters = [object Object] +loader.contentLoaderInfo.contentType = null Parameters: (len=0) Directly after load: @@ -60,15 +63,16 @@ loader.contentLoaderInfo.bytesTotal = 0 loader.contentLoaderInfo.bytes = loader.contentLoaderInfo.url = null loader.contentLoaderInfo.parameters = [object Object] +loader.contentLoaderInfo.contentType = null Parameters: (len=0) -Event [Event type="open" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 0, loader.contentLoaderInfo.bytes.length = 0, loader.contentLoaderInfo.url = null +Event [Event type="open" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 0, loader.contentLoaderInfo.bytes.length = 0, loader.contentLoaderInfo.url = null, loader.contentLoaderInfo.contentType = null Parameters: (len=0) -Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=0 bytesTotal=893]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 0, loader.contentLoaderInfo.url = null +Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=0 bytesTotal=893]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 0, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 0, loader.contentLoaderInfo.url = null, loader.contentLoaderInfo.contentType = null Parameters: (len=0) -Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=893 bytesTotal=893]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = null +Event [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=893 bytesTotal=893]: loader.numChildren = 0, loader.content = null, loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = null, loader.contentLoaderInfo.contentType = null Parameters: (len=2) paramOne = ValOne,paramTwo = ValTwo Hello from loaded SWF main timeline: this.stage=null this.parent=null @@ -77,12 +81,12 @@ Event.ADDED: circle.parent =[object LoadableMainTimeline] circle.stage=null main Added circle loader.contentLoaderInfo === loader.content.loaderInfo : true loader.contentLoaderInfo.content === loader.content : true -Event [Event type="init" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:/// +Event [Event type="init" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:///, loader.contentLoaderInfo.contentType = application/x-shockwave-flash Parameters: (len=2) paramOne = ValOne,paramTwo = ValTwo -Event [HTTPStatusEvent type="httpStatus" bubbles=false cancelable=false eventPhase=2 status=0 redirected=false responseURL=null]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:/// +Event [HTTPStatusEvent type="httpStatus" bubbles=false cancelable=false eventPhase=2 status=0 redirected=false responseURL=null]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:///, loader.contentLoaderInfo.contentType = application/x-shockwave-flash Parameters: (len=2) paramOne = ValOne,paramTwo = ValTwo -Event [Event type="complete" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:/// +Event [Event type="complete" bubbles=false cancelable=false eventPhase=2]: loader.numChildren = 1, loader.content = [object LoadableMainTimeline], loader.contentLoaderInfo.bytesLoaded = 893, loader.contentLoaderInfo.bytesTotal = 893, loader.contentLoaderInfo.bytes.length = 1490, loader.contentLoaderInfo.url = file:///, loader.contentLoaderInfo.contentType = application/x-shockwave-flash Parameters: (len=2) paramOne = ValOne,paramTwo = ValTwo diff --git a/tests/tests/swfs/avm2/loader_events/test.swf b/tests/tests/swfs/avm2/loader_events/test.swf index 852492d4a115c51c8eaa2b93c650ad8cb9e35bac..a763b1d4a098c40c639c85d727ae293200dd9ff6 100644 GIT binary patch literal 1942 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 diff --git a/tests/tests/swfs/avm2/loader_image/output.txt b/tests/tests/swfs/avm2/loader_image/output.txt index d3fbf6860..77d944ba1 100644 --- a/tests/tests/swfs/avm2/loader_image/output.txt +++ b/tests/tests/swfs/avm2/loader_image/output.txt @@ -1,4 +1,8 @@ Progress event: [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=0 bytesTotal=334] +loader.contentLoaderInfo.contentType: null Progress event: [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=334 bytesTotal=334] +loader.contentLoaderInfo.contentType: null Init event: [Event type="init" bubbles=false cancelable=false eventPhase=2] +loader.contentLoaderInfo.contentType: image/png Complete event: [Event type="complete" bubbles=false cancelable=false eventPhase=2] +loader.contentLoaderInfo.contentType: image/png diff --git a/tests/tests/swfs/avm2/loader_image/test.fla b/tests/tests/swfs/avm2/loader_image/test.fla old mode 100644 new mode 100755 index ac38dd4b3c9fccb0b289a3f6d2bfe41cb16d6139..f3539e8c6e599c47699bab9c7e645ab3d51d90a7 GIT binary patch delta 1005 zcmVcj56Y31DI*{8xbYt%)_SD z(*Y$&B)OQflzZ4$I>=`~0Oc6Y2e`?(1Tz+4!iyFW!Sa*W3xL5O}pz` zy6pz0@0>ef!)frLuTOjn?3WYAGVFnGo6cZjJA?kEHGdhqKE60TLFzY>?Ix5vOJjys z*liDDkRFs&RR9_I0j>eV8lZxQj=j`O0a~5r9(FwD8HYmtY=>cJhx@MZuoM*(fR+oA zkyw(XwH(oJf~2a3$5MEhOkHjS{XjMzhCcg?Y_E6%nGMcO_t7Z#blUBT1uf*$C=IV= zj9z`31b_au|LHaoDC1E=#Bf$$kO%#?M$JR#?9J)P=}7~CQ^X_`sBx)2htri@-YOF< z!2@_)2)+`eEb(iUR;*64L(b5*)03a1h+@*g^A>@KVh#~TzaXOG>;OljwU%q>%7*q7 zq*DI-?3t^ejLPFHn1c8JoIOmt0uC=ZzJf`M_VOl5)?T-1Q zGediHXw)M0u=>u#)4ntEYQk=4?&qs^FkssmaJP=pTu|66u^>`Xwz}sis%1vYn|IJ! zTw`n>Mw>UjsU$gSaSQqt#+c)}cxO@Rz+235t%2qA`}W=ukY%-M2dnl}VMjkAY*{Z7 z?%RVS!n*My;elZs3hVGbG!6F$i0J1(Ld1Nzi0)c4C0O$#m_Yh42>I0MU z0~eEB5h?+^lZX*O0q>K^5hWWld-miU0000S0000J00000000000000003VYH5{tn=K^+007$v000jF002Z!O+;^Fb!}yCbS`*pY^_$`Z`w!@ zer}}v58Lev(G~m?$50%};P?)STu^CyCslng_L}USz3Z;m0b2Ec@2qV|B1+mQcaoz9D(k zrL2?@iwSO6dj>0eQNov`7xP@(q?zKm8b)y?1jKkpbCOX;JZu0n%{~xOQqDYVnmyeF zm>`klV#-qPVP6R$pV2&$5U9u^nR1bP_#es=zAiDkZRibr5#5pmEw?)cYGFueqh&?2 z1ewM;MtSrf7k~F6Z zNe+DTXhq6n&QL@-@#Fe_k4b4pU%ANu;lx4?cmaV*0g__pZ`Cbl!^Us{u~>wn{m(-WjVBiWupxwAB8=!M<+ zAO`6{NmT`qfgj)+FgycP@X)cBnkhi5(_F)m$2{Xu$X9k4hIY7b3lB?CK>=vFAQ_1z zNm|Ph{U%7NYIrP#hso6CM$ivr<6#}6|H<}>Cy?3T+;ks}a!;o{u2|4Q{u-s>wT#ir zkCVWE=YM~^jReYgln^nT)j!CCep{pFrgQe@^yKuU0l*kB2?c6gs?TA(lFM6Vq9u3$ zj|;(9f|MnGjnazMNp{E?`g(fuLW(FR9XxLlh$!X|Ve|(gD$cjFC&r?T%HwgS;C+4! zSRDln0y!RM(jtz;QU$I=Hhlkf_Lh9ENGaP2-+vi8Si*O&U@NS6ZFcIX159Otye2oW z7CMdZ?9Hc77bEQ{r$5r3-Z3NSf3=KD?dN^1?Hc>hDbXGslUk%6&mYXV_Jbj>3A;71 z-zeI_N@=_P?m0$tLE-Ghf=Ef(>Yk&hmKiN?{(=VJV*4=KyzxyX$x(}2&@V8!j_cx` zMM|XuZxqM12A0$B+j~bqmes0VCEBkFJNgk}%X*e@-yR$h){SQg4-Df_Scf-&X}G^Z zL_hx>BIff&bl18Q8EFS?Q@7^s-^|5#v+4sw3j`=NRIQUS4}8z?nYtsDRV02}}S022TJ z00000000000000AlO7U40aue>5Xc0Bvb)WpsIPWl&261^@s601E&M O0L=mb05cE(0002{`?`Ao diff --git a/tests/tests/swfs/avm2/loader_image/test.swf b/tests/tests/swfs/avm2/loader_image/test.swf index 9f4a1f7f93bae54cfff2ddf6027016e8de483bfb..77ddca2fb1c0b941572ec73e7d194ca2c98d6421 100644 GIT binary patch literal 798 zcmV+(1L6EbS5prF1pokeoQ0F!a??f>$Iq@-TKU^fViPCY$g)F@nVksC7OG)zLM zJ2*^wAx|vqRjgK)R7r8j9Tz+ZZ^A2xi#`X+6QoDpIFs-(Xf)EE|M~4XXV31w0re1| z@*ZHBz*bEMfDS!BKfhZ&zS&xDZBJWIp8s*M*Rc*xpTFwu?@pr=@#Nt3Blu7+AWNV( z6rO0V1AJI|$1(w*DzvlT16Ykk6d&5IweiAoynSaPT*niSE>%0UCSv{Jcc`nXK39uZ z)e;KPxIJ>Bz_m_uFZ`(^I<6DczZyexeQP8_ZEyBdjzc#m=X)Z~zk0d%Qv7?2^E6o< z5i9d3?W<8XE~;1K&>D*BpP_#giYRJ|sqo^B=6#u@J@ma81(|Edv;DcUe;SC5X6*}q z;flYw<2ms>VzuK>0$0RhF6gp=mZ1k1$*b0A^n2#qb0Ul(LgruqeRwf(*1UG$9kHx9 z9pTQ{aYtnwY-gc*!_W!hd*4{@wH9_?|1E}bQTAT$9bJ5*6C0W7*S-Lh0w}Y)0fbOp z0aZbhfeN4jCy?C|jSxnFBaq80iSZ02g%%2{pGXCivueuv`r5+B_g$T&Dh?M1ik-9b zGh0KLUcx%UIV2hq&VL3M5LPbX62fI9Zb-QD8C*q}Azb<=F%BO5XM7^d062vteYVSB ztfWd}BffTXlXMFdJ-W1i*rd`fN&EJuBJG8wudS`@YGkaYi|9*iwOb_VQa=N`C6d-L zrK*s8p^+HL4)n`sKc=JwiOsuZno{&?6npeAF$4@M#-M5pYQ|u}7%UotC1XJG{R>v) cGbU%hrpq|x>EbQfe)#H1hE4SR59k7Fk6^)v*8l(j literal 723 zcmV;^0xbPQS5psd1ONbdoQ0DAP7^^8$7lEUZm+*+3$zpzsZ!7gsaK+Z$UkCQH8qeD zkf4Nyp6#|hZLj6-sQ90c!kh34=N~=?*C)Vf7YHO6H<#U=?`LLqc5Y8WJpzcI0b~f2 zk~#ns>E-3+LgHjLSI8Y4=T7!s)mz(pr@LR=(#yiz;{I!UtzUriR0Mqq?AC=XvIT(i z>7g6l$nSox3FZB@Tkqqo%<3T`{! zu-tyf{2AKn4J=XYSpC$!IkZmCYzRl&952d=(+SCVTX^BUoy{F_e1dVBtd5BJ>n!=( zS=O(rS3Sq9i^R6mYdOMovtl4@Z#^3=+m?52B#OOmzauP{VKy4?M(&%Ii!Q=p7N*qeSETTh~O0u`oHCe`@@!Fm>5K>9s;YGX@9)LaG?K_qy zmJiksM}@dov-_jz9-4#h+M)avM^@Kti91ylu1 z1}cCCoZt?KMhGLo(IFI8eB%R33XMck7bFhKFcGk-zB>8)tfG@ZMM!TTN2nv5k}!l& zxq%UcQH0YH#t<@uvG2aI|NM_}K~ezdLi{TG$e^tRir-Y4q1BlUQVCNeT-vi6RN4_~ z&uu8uj{8+@^}$DtwACPi%x|id2nmwaC>oV02`2GKRUzR>+Bf_%RAa-1faJh$@=A;b z6sbn>&MUqlpf+LD;zliD)RIPR(x^=tHHzP7n3tnXhEIbGhP;`YlkJ3iUm9#6`3qRz FIL?SCX2$>k