From c338840e4d5ea706bb01ed7301fbef8019491d28 Mon Sep 17 00:00:00 2001 From: lordwelch Date: Mon, 11 Mar 2019 11:41:26 -0700 Subject: [PATCH] Initial commit --- main.go | 229 ++++++++++++++++++++++++++ testFiles/timmy.narnian.us/00000.mpls | Bin 0 -> 168 bytes testFiles/timmy.narnian.us/00002.mpls | Bin 0 -> 184 bytes testFiles/timmy.narnian.us/00003.mpls | Bin 0 -> 168 bytes testFiles/timmy.narnian.us/00005.mpls | Bin 0 -> 168 bytes testFiles/timmy.narnian.us/00008.mpls | Bin 0 -> 196 bytes testFiles/timmy.narnian.us/00020.mpls | Bin 0 -> 168 bytes testFiles/timmy.narnian.us/00021.mpls | Bin 0 -> 168 bytes testFiles/timmy.narnian.us/00050.mpls | Bin 0 -> 168 bytes testFiles/timmy.narnian.us/00051.mpls | Bin 0 -> 184 bytes testFiles/timmy.narnian.us/00100.mpls | Bin 0 -> 6852 bytes testFiles/timmy.narnian.us/00101.mpls | Bin 0 -> 4824 bytes testFiles/timmy.narnian.us/00110.mpls | Bin 0 -> 280 bytes testFiles/timmy.narnian.us/00120.mpls | Bin 0 -> 280 bytes testFiles/timmy.narnian.us/00201.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00202.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00203.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00204.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00205.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00206.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00207.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00208.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00209.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00210.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00211.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00212.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00213.mpls | Bin 0 -> 248 bytes testFiles/timmy.narnian.us/00214.mpls | Bin 0 -> 408 bytes testFiles/timmy.narnian.us/00215.mpls | Bin 0 -> 2488 bytes testFiles/timmy.narnian.us/00900.mpls | Bin 0 -> 154 bytes testFiles/timmy.narnian.us/00901.mpls | Bin 0 -> 154 bytes 31 files changed, 229 insertions(+) create mode 100644 main.go create mode 100644 testFiles/timmy.narnian.us/00000.mpls create mode 100644 testFiles/timmy.narnian.us/00002.mpls create mode 100644 testFiles/timmy.narnian.us/00003.mpls create mode 100644 testFiles/timmy.narnian.us/00005.mpls create mode 100644 testFiles/timmy.narnian.us/00008.mpls create mode 100644 testFiles/timmy.narnian.us/00020.mpls create mode 100644 testFiles/timmy.narnian.us/00021.mpls create mode 100644 testFiles/timmy.narnian.us/00050.mpls create mode 100644 testFiles/timmy.narnian.us/00051.mpls create mode 100644 testFiles/timmy.narnian.us/00100.mpls create mode 100644 testFiles/timmy.narnian.us/00101.mpls create mode 100644 testFiles/timmy.narnian.us/00110.mpls create mode 100644 testFiles/timmy.narnian.us/00120.mpls create mode 100644 testFiles/timmy.narnian.us/00201.mpls create mode 100644 testFiles/timmy.narnian.us/00202.mpls create mode 100644 testFiles/timmy.narnian.us/00203.mpls create mode 100644 testFiles/timmy.narnian.us/00204.mpls create mode 100644 testFiles/timmy.narnian.us/00205.mpls create mode 100644 testFiles/timmy.narnian.us/00206.mpls create mode 100644 testFiles/timmy.narnian.us/00207.mpls create mode 100644 testFiles/timmy.narnian.us/00208.mpls create mode 100644 testFiles/timmy.narnian.us/00209.mpls create mode 100644 testFiles/timmy.narnian.us/00210.mpls create mode 100644 testFiles/timmy.narnian.us/00211.mpls create mode 100644 testFiles/timmy.narnian.us/00212.mpls create mode 100644 testFiles/timmy.narnian.us/00213.mpls create mode 100644 testFiles/timmy.narnian.us/00214.mpls create mode 100644 testFiles/timmy.narnian.us/00215.mpls create mode 100644 testFiles/timmy.narnian.us/00900.mpls create mode 100644 testFiles/timmy.narnian.us/00901.mpls diff --git a/main.go b/main.go new file mode 100644 index 0000000..b265322 --- /dev/null +++ b/main.go @@ -0,0 +1,229 @@ +package main + +import ( + "bytes" + "encoding/binary" + "fmt" + "io" + "io/ioutil" + "os" +) + +const ( + ChapterSearchMask = 1 << iota + TimeSearchMask + SkipToNextPointMask + SkipBackToPreviousPointMask + ForwardPlayMask + BackwardPlayMask + PlayMask + StopMask + PauseOnMask + PauseOffMask + StillOffMask + ResumeMask + MoveUpSelectedButtonMask + MoveDownSelectedButtonMask + MoveLeftSelectedButtonMask + MoveRightSelectedButtonMask + SelectButtonMask + ActivateAndActivateMask + SelectAndActivateMask + AudioChangeMask + PgTextstChangeMask + AngleChangeMask + PopupOnMask + PopupOffMask + SelectMenuLanguageMask +) + +const ( + PlaylistRandomAccess = 1 << iota + AudioMixApp + LosslessMayBypassMixer + // reserved +) + +type MPLS struct { + Header string + playlistStart int + playlistMarkStart int + extensionDataStart int + AppInfoPlaylist AppInfoPlaylist + Playlist Playlist +} + +type AppInfoPlaylist struct { + Len int + PlaybackType int + PlaybackCount int + UOMask uint64 + AppInfoPlaylistFlags uint16 +} +type Playlist struct { + len int + NumberOfPlayItems uint16 + numberOfSubpaths uint16 + PlayItems PlayItem +} + +// reserved = 1 << (iota + 7) +const ( + IsDifferentAudios = 1 << (iota + 7) + IsSeamlessAngleChange +) + +type PlayItem struct { + len uint16 + + ClipFile string + ClipID string // M2TS + + // Reserved 11 bits + IsMultiAngle bool // (1 bit) + ConnectionCondition byte // (4 bits) + + STCID byte + InTime uint16 + OutTime uint16 + + UOMask uint64 + + RandomAccessFlag byte // 1 bit - 7 reserved + + StillMode byte + + stillTime uint16 + angleCount byte + AngleFlag byte +} + +type CLPI struct { + ClipFile string + ClipID string // M2TS + STCID byte +} + +func main() { + parse(os.Args[1]) +} +func parse(filename string) error { + var ( + buf [10]byte + n int + n64 int64 + Mpls MPLS + ) + f, err := ioutil.ReadFile(filename) + if err != nil { + return err + } + file := bytes.NewReader(f) + + n, err = file.Read(buf[:8]) + if err != nil || n != 8 { + return err + } + str := string(buf[:8]) + if str[:4] != "MPLS" { + return fmt.Errorf("%s is not an mpls file it must start with 'MPLS' it started with '%s'", filename, str[:4]) + } + if str[4:8] != "0200" { + fmt.Fprintf(os.Stderr, "warning: mpls may not work it is version %s\n", str[4:8]) + } + + Mpls.Header = str + + Mpls.playlistStart, err = readInt32(file, buf[:4]) + if err != nil { + return err + } + fmt.Println("uint:", Mpls.playlistStart, "binary:", buf[:4]) + Mpls.playlistMarkStart, err = readInt32(file, buf[:4]) + if err != nil { + return err + } + fmt.Println("uint:", Mpls.playlistMarkStart, "binary:", buf[:4]) + Mpls.extensionDataStart, err = readInt32(file, buf[:4]) + if err != nil { + return err + } + fmt.Println("uint:", Mpls.extensionDataStart, "binary:", buf[:4]) + n64, err = file.Seek(20, io.SeekCurrent) + if err != nil || n64 != 20 { + return err + } + Mpls.AppInfoPlaylist.Len, err = readInt32(file, buf[:4]) + if err != nil { + return err + } + fmt.Println("uint:", Mpls.AppInfoPlaylist.Len, "binary:", buf[:4]) + + n, err = file.Read(buf[:4]) + if err != nil || n != 1 { + return err + } + Mpls.AppInfoPlaylist.PlaybackType = int(buf[1]) + switch Mpls.AppInfoPlaylist.PlaybackType { + case 2, 3: + Mpls.AppInfoPlaylist.PlaybackCount = int(binary.BigEndian.Uint16(buf[3:4])) + fmt.Println("uint:", Mpls.AppInfoPlaylist.PlaybackCount, "binary:", buf[3:4]) + } + Mpls.AppInfoPlaylist.UOMask, err = readUInt64(file, buf[:8]) + if err != nil || n != 1 { + return err + } + Mpls.AppInfoPlaylist.AppInfoPlaylistFlags, err = readUInt16(file, buf[:2]) + if err != nil || n != 1 { + return err + } + err = Mpls.Playlist.parsePlaylist(file, int64(Mpls.playlistStart)) + if err != nil { + return err + } + return nil +} + +func (p Playlist) parsePlaylist(file io.ReadSeeker, PlaylistStart int64) error { + var ( + n64 int64 + err error + buf [10]byte + ) + n64, err = file.Seek(PlaylistStart, io.SeekStart) + if err != nil || n64 != 20 { + return err + } + fmt.Println("uint:", PlaylistStart, "binary:", buf[:4]) + p.len, err = readInt32(file, buf[:4]) + if err != nil { + return err + } + + file.Read(buf[:5]) + return nil +} + +func readUInt16(file io.Reader, buf []byte) (uint16, error) { + n, err := file.Read(buf[:2]) + if err != nil || n != 2 { + return 0, err + } + return binary.BigEndian.Uint16(buf[:2]), nil +} + +func readInt32(file io.Reader, buf []byte) (int, error) { + n, err := file.Read(buf[:4]) + if err != nil || n != 4 { + return 0, err + } + return int(binary.BigEndian.Uint32(buf[:4])), nil +} + +func readUInt64(file io.Reader, buf []byte) (uint64, error) { + n, err := file.Read(buf[:8]) + if err != nil || n != 8 { + return 0, err + } + return binary.BigEndian.Uint64(buf[:8]), nil +} diff --git a/testFiles/timmy.narnian.us/00000.mpls b/testFiles/timmy.narnian.us/00000.mpls new file mode 100644 index 0000000000000000000000000000000000000000..c13df538ea300c3ff56f165d06c93eee16d9ed82 GIT binary patch literal 168 zcmeYb@Ci0BGB99ZV6Xz>HXz0Y_!t<`q&$FpkeGu35E%Iyg#-h+jI;k7U|eGI97U}h lL?KL!lTknr!e)Jy2w})EFoDbh>Hhy8ECk{$;dlw*0RYIl6D|M% literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00002.mpls b/testFiles/timmy.narnian.us/00002.mpls new file mode 100644 index 0000000000000000000000000000000000000000..41a86e415b68d026ba4184de7c044b71c9f2b45d GIT binary patch literal 184 zcmeYb@Ci0BGB99ZV6Xz>X+Vq%@G&p~rI`QzcYvvg05U*g0R})|>}wPf4CFG-{&RqF ziS8trA~3B7R0vWD1)Pimf)FO_t3)7!lM%{gU~NoH%}WOg$uTg2%m$hE|36qQh_{4s HDuf3B^&l5C literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00003.mpls b/testFiles/timmy.narnian.us/00003.mpls new file mode 100644 index 0000000000000000000000000000000000000000..99753a48da551fac3d43c02306972b68aca5e9be GIT binary patch literal 168 zcmeYb@Ci0BGB99ZV6Xz>HXz0Y_!t<`q&$FpkeGu35SaNIg#-h+jI;k7U|gVl2}P|O lL?KL!lTknr!e)Jy2w})EFoDbh>Hhy8ECk}s|9%z10|3L~6W#y- literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00005.mpls b/testFiles/timmy.narnian.us/00005.mpls new file mode 100644 index 0000000000000000000000000000000000000000..cd72d10131354d468a047af506522cf6e3508ccf GIT binary patch literal 168 zcmeYb@Ci0BGB99ZV6Xz>HXz0Y_!t<`q&$FpkeGvkfq|isuTe-akjpsx&jH5O-w&Xu mm4hgRiE%Ot2twGbuM!~)IR++>Ss>m2|AU1HXz0Y_!t<`q&$FpkeGvkfq|ikuTe-akjpsx&jH2_v&&G_ w%0U#u#5frR1R-qJSBVgY6$1;%ERgR1|G`2a-l97}NW7K1pCIuzHXz0Y_!t<`q&$FpkeGvkfq|*HuTe-akjpsx&jH5yIh`nK mHXz0Y_!t<`q&$FpkeGvkfq|)ouTe-akjpsx&jH5yIh`nK mHXz0Y_!t<`q&$FpkeGu35SaTKg#-h+jI;k7V4R=RiK12x kq7Wv=$tWNQVY9wUgfQe7m_TNMbpQVk76S3+J9I;M0K9q<-2eap literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00051.mpls b/testFiles/timmy.narnian.us/00051.mpls new file mode 100644 index 0000000000000000000000000000000000000000..7ca5f993a8d6961798d2bfa39c83295eef7b7c5d GIT binary patch literal 184 zcmeYb@Ci0BGB99ZV6Xz>X+Vq%@G&r=NkstpAh7@g0|QeNU!#yzAPA9XeU%7ga56%<46Kcbsd?!@Avp#nkl7&9{{IK71@SJf;D_)4?V%Nz literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00100.mpls b/testFiles/timmy.narnian.us/00100.mpls new file mode 100644 index 0000000000000000000000000000000000000000..30445d2da850443a8a9b8eebc5e7139e5f7f7198 GIT binary patch literal 6852 zcmeYb@Ci0BGB99ZV6b9fkh}+^aRELCMz9n=h;#sA$pt_{7Kk4h0D+;eQAjXQ3Aa<{ z2JW>n;XrW&*vG)Y$ifEab217DLO86i5`hd(MktqowJk90jM2lo)Ap`1fX^hAEti-P&I9mHpWng^3- zh4Df15FeU=eaOndz1ES9`>_2osFe_ESoqKq=EK8QY&;Kz)Q6o94Go|^_t-_NNSem*pX`S5;fo#2jjlZKxU&7eLM z++o@wc;R=z@bjTL%!e1g{1!d8^w{w8p#{{3qGuP>i2h{*wIL8-IMj!Ru=-H+&o4nS zan7R%?*UoE!G}h$`cO=qSz1hIqv-JSA*?kvGNn*F!oJU%H7c2zh}K)PV>O*l_PRx7m=&J&Z{ c^rHyDQ_w%}3+G8GzS>j_=gBAwr$YSz0M_l5KL7v# literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00101.mpls b/testFiles/timmy.narnian.us/00101.mpls new file mode 100644 index 0000000000000000000000000000000000000000..e892cb8d23373c07050daa576e8738b6cf754679 GIT binary patch literal 4824 zcmeYb@Ci0BGB99ZV6b9f5c~wBaRELCMz9n=h;#sA!7V^S9*8Fx7#J8^_!@--1C?+) zzjWXZ=I{fGBS0Pl10y2~oX^Q9APC{GzDfi#I2oZ_2G+L3)Vy>~Mj@zL)(Jo^P+kaP zHv{X0w4y{1p9!jeLU93@&kW-iceaB?%#mB$j}rTYy9_9>jZbKn>64qGBJX>h*#;x8s3>Mvj*HnhUQQg310Z} zTlC!0V*~CY6JuByO$oorXKVRoz+GerE009~{1Oxs=R7*#E;2EJh7q4^#TCBAm2v~_ zA|qJt7t>kYCAsYI(*bvp2`u;X&38M`FQAe=;4U(PrEJOF&tFLU{L>n67nztr(-FVO z>^%N&^S=+ci;Q5gCY|_CT82Tocfeg_0xKc;-*MLoR6m(N;4U(PxkyH2qpnPu_<;d; zkqM-o&B`E9#-Jx~O2uKoU1S6+vt@d_*2-QpE*o$cnZR5maLBDkFiSFdz+GevE3;+a z^tUK<+=O*+APyUdzKAKToh_JF@JjHajm^M^5v?1$QV|O zC@~}iC<{-N9#9uCFg#)q0FC8vPi)JW++?zu-Jxu^F6o2%bdE{@ZXKzZ3_%Dx4=MU9k5ioF^))mD&mCiOX&J bQH07eI^)@G&qlFxc#2{qF!%u?omw0^$Gz5b!k$2?i=*oc-qj z<920Um?AK($H2e{)C~iii~@oXHtVZIAcK=p5Gu>sXqcLp4l&Ub*~HTa55shWX;MvO bV9;S;2KfNwzW@KhW&j7eI^)@G&qlFxc#2{qF!%u?omw0^$Gz5b!k$2?i=*oc-qj z<920Um?AK($H2e{)C~iii~@oXHtVZIAcK<;%4J|}G)&D)hnQ%JY~tyIhhe(GG^r*s bFz7HagM0vT-~az$Gk}go<87b60U`$gq(~Ye0+(@G&r=NzDNAL1GgO3=E7deT_nbfn4rr#|zxgHcOzW z%>ycAWPuBDG71PnIIOP{fecPYD3^h?EipAOos&@rs+M&EkPDO-g4)eGA+0D8#Akx) jpHN%?<}<_i1^GoFrW^wk$Za6k{QnP@1Mwbi5QgvoTk{;_ literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00202.mpls b/testFiles/timmy.narnian.us/00202.mpls new file mode 100644 index 0000000000000000000000000000000000000000..9c3b0e5203a2272114f61f158c2871c5f730ffbc GIT binary patch literal 248 zcmeYb@Ci0BGB99ZV6Xz>Ye0+(@G&r=NzDNAL1GgO3=B*Re2qeafn4qnug>x`eF{TS zn+H_L$O0GQWE2pDa9Cd@0vVi)P%Z;&TViTnIwzwLR4wZSAQvbv1ht!WLRwKGh|dJo lKcTn)%x8x23-XIVOgRQ7klR46`Trj*2jub8&wmKv0RT<&AIAUy literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00203.mpls b/testFiles/timmy.narnian.us/00203.mpls new file mode 100644 index 0000000000000000000000000000000000000000..ce2de61d6fb85c9dda36f124076cdea3b8de3199 GIT binary patch literal 248 zcmeYb@Ci0BGB99ZV6Xz>Ye0+(@G&r=NzDNAL1GgO3=B*ReT_nbfn1(xM}2rD<~5_J z%>ycAWPuBDG71PnIIOP{fecPYD3^h?EipAOos&@rs+M&EkPDO-g4)eGA+0D8#Akx) kpHN%?<}<_i1^GoFrW^wk$Za6k{QnP@1M+yqd{#hs05dxrMgRZ+ literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00204.mpls b/testFiles/timmy.narnian.us/00204.mpls new file mode 100644 index 0000000000000000000000000000000000000000..ce065cac8da0d6da5b691ecb6b9ffdc202fe9c20 GIT binary patch literal 248 zcmeYb@Ci0BGB99ZV6Xz>Ye0+(@G&r=NzDNAL1GgO3=B++e2qeafm~jt8*6yG#2%rj z%>ycAWPuBDG71PnIIOP{fecPYD3^h?EipAOos&@rs+M&EkPDO-g4)eGA+0D8#Akx) jpHN%?<}<_i1^GoFrW^wk$Za6k{QnP@1MwO*DMNSwV?P|* literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00205.mpls b/testFiles/timmy.narnian.us/00205.mpls new file mode 100644 index 0000000000000000000000000000000000000000..9b8b8a5a749a32397797dd15e9075ecba83916b2 GIT binary patch literal 248 zcmeYb@Ci0BGB99ZV6Xz>Ye0+(@G&r=NzDNAL1GgO3=B++eT_nbfn44x;Wzn&ZC|0N z%>ycAWPuBDG71PnIIOP{fecPYD3^h?EipAOos&@rs+M&EkPDO-g4)eGA+0D8#Akx) kpHN%?<}<_i1^GoFrW^wk$Za6k{QnP@1M>LzdsHDj07z9FJpcdz literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00206.mpls b/testFiles/timmy.narnian.us/00206.mpls new file mode 100644 index 0000000000000000000000000000000000000000..bf388a2bc73d69b99932d850027c2b5157cd3357 GIT binary patch literal 248 zcmeYb@Ci0BGB99ZV6Xz>Ye0+(@G&r=NzDNAL1GgO3=B+6e2qeafm}Y>iYt6mxmZ!u z<^dHlvcQEn83hC(9M)HfKn5oxl*_={mYABC&dDeQRm(a7$OXy^LG5OpkXDok;xj?@ jPbe+`^O<4%g8U*7Q;vZNYe0+(@G&r=NzDNAL1GgO3=B+6eT_nbfn2`%Zs+;_M!iK* zn+H_L$O0GQWE2pDa9Cd@0vVi)P%Z;&TViTnIwzwLR4wZSAQvbv1ht!WLRwKGh|dJo kKcTn)%x8x23-XIVOgRQ7klR46`Trj*2jcx^+za6W0PZ{Ye0+(@G&r=NzDNAL1GgO3=B-ne2qeafn0u(*?Ihr@18?Z zn+H_L$O0GQWE2pDa9Cd@0vVi)P%Z;&TViTnIwzwLR4wZSAQvbv1ht!WLRwKGh|dJo jKcTn)%x8x23-XIVOgRQ7klR46`Trj*2jV?c^@s2Pt-~DQ literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00209.mpls b/testFiles/timmy.narnian.us/00209.mpls new file mode 100644 index 0000000000000000000000000000000000000000..77ceed228cb393bc0c8102251e1e57cf85914887 GIT binary patch literal 248 zcmeYb@Ci0BGB99ZV6Xz>Ye0+(@G&r=NzDNAL1GgO3=B-neT_nbfn5G~+;sxkdl#Xo z%>ycAWPuBDG71PnIIOP{fecPYD3^h?EipAOos&@rs+M&EkPDO-g4)eGA+0D8#Akx) kpHN%?<}<_i1^GoFrW^wk$Za6k{QnP@1M&pY*YrVn0C?~nAOHXW literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00210.mpls b/testFiles/timmy.narnian.us/00210.mpls new file mode 100644 index 0000000000000000000000000000000000000000..1421428df8865a03093f0335042796ecebdcf2d2 GIT binary patch literal 248 zcmeYb@Ci0BGB99ZV6Xz>Ye0+(@G&r=NzDNAL1GgO3=B*xe2qeafn0$y20el8Uv{FX z%>ycAWPuBDG71PnIIOP{fecPYD3^h?EipAOos&@rs+M&EkPDO-g4)eGA+0D8#Akx) kpHN%?<}<_i1^GoFrW^wk$Za6k{QnP@1MxOr`3>O#07x1f_y7O^ literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00211.mpls b/testFiles/timmy.narnian.us/00211.mpls new file mode 100644 index 0000000000000000000000000000000000000000..9aac2fee381df40e08d6013c9489c8575ab04ab8 GIT binary patch literal 248 zcmeYb@Ci0BGB99ZV6Xz>Ye0+(@G&r=NzDNAL1GgO3=B*xeT_nbfn0$@ZasoArqfZ> z<^dHlvcQEn83hC(9M)HfKn5oxl*_={mYABC&dDeQRm(a7$OXy^LG5OpkXDok;xj?@ kPbe+`^O<4%g8U*7Q;vZNYe0+(@G&r=NzDNAL1GgO3=B*Se2qeafn33~f>(lj51m9& zn+H_L$O0GQWE2pDa9Cd@0vVi)P%Z;&TViTnIwzwLR4wZSAQvbv1ht!WLRwKGh|dJo kKcTn)%x8x23-XIVOgRQ7klR46`Trj*2jcB+dkf(K0R3+sy#N3J literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00213.mpls b/testFiles/timmy.narnian.us/00213.mpls new file mode 100644 index 0000000000000000000000000000000000000000..8e191a2e49e3232bfc23d91d9dd9155afc872c87 GIT binary patch literal 248 zcmeYb@Ci0BGB99ZV6Xz>Ye0+(@G&r=NzDNAL1GgO3=B*SeT_nbfn328{Axl4FW;i5 z%>ycAWPuBDG71PnIIOP{fecPYD3^h?EipAOos&@rs+M&EkPDO-g4)eGA+0D8#Akx) kpHN%?<}<_i1^GoFrW^wk$Za6k{QnP@1M-A&v#TIH0BZXjTmS$7 literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00214.mpls b/testFiles/timmy.narnian.us/00214.mpls new file mode 100644 index 0000000000000000000000000000000000000000..900f85e00004808240e2eec9373eb5268d24b67c GIT binary patch literal 408 zcmeYb@Ci0BGB99ZV6b9fV9Ws0xBwpmBdQdm7Ld;b#1jmFz{1xkBp9efs9G^!=);cv zC~EV7W;3$Dg*X`n1R)&OSBXFdCnJ>0z}l9WnwQSWC;(eW3B?6qJ~ND8kY5CGk*P7*MXU@$@47>Ug_;jQR6t33yNH27hk+Rsf}rsE{~zoM RMg~TZ+Ymfqq3}Zx9so5SF^d2I literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00215.mpls b/testFiles/timmy.narnian.us/00215.mpls new file mode 100644 index 0000000000000000000000000000000000000000..5f9a93259fbdc516ac923ebaa68c51518798586d GIT binary patch literal 2488 zcmeYb@Ci0BGB99ZV6b9f;J5^&aRELCMpP+|DL_6y5Kk~LFfg|CH3|s^D&dZHyukfz zvjmFTJO&0vMi#gbC!>HMgv0tO5y;?VgmM{J+Y(dr(m5H0plVqs0J%VUA*kJ~6Vi$j zL3}2t{t3keU_LX9Uyxq}agm7u%taqwo#koz6b3aCLJf$E452RKnRe8NS7KiCz`Mu@ z>LOmH8*6yG#2yX2i;Q6|ni77KPuTX=z`Mu<>LNbbiYt6mxmX9@MW!$p&38M`_c!Y8 zz`Mu{>LPxT*?Ihr@17fY7n#Fc^p3kuAbankfp?Jw)I|bi40;0Fzw8`%7s1MGfkSRR zf-$Dk2i!%burgaPt>Bg5-a{t`-bJu7Tkr(Gnoz;ZfzN9OuyiC;t(Y(LVaNV~4HXz0Y_!t-wQVt-d2M~kA91ILB4GesZLV|%@#@T-kFfQ|v j1}T68Ifz0SpOaBQ5W;4Cl?Y)7fV2Wt0d@cX4-x_Z!;KFg literal 0 HcmV?d00001 diff --git a/testFiles/timmy.narnian.us/00901.mpls b/testFiles/timmy.narnian.us/00901.mpls new file mode 100644 index 0000000000000000000000000000000000000000..41aa12efb0c3f6d9253ecdd4f071e5cfcc4f4a5e GIT binary patch literal 154 zcmeYb@Ci0BGB99ZV6Xz>HXz0Y_!t-wQVt-d2M~kA91ILB4GevaLV|%@#@T-kFfQ|v j1}T68Ifz0SpOaBQ5W;4Cl?Y)7fV2Wt0d@cX4-x_Z!`%-c literal 0 HcmV?d00001