From f8de73fc6db182a560eb8731c0647807c1fd4207 Mon Sep 17 00:00:00 2001 From: David Welch Date: Thu, 28 Jun 2012 22:45:27 -0400 Subject: [PATCH] adding MIT License. Providing all compiled output makes it easier on me to maintain. Some folks have reported problems trying to use this source, so I am providing binaries and disassembly files to help close the gap between failure and success. --- blinker03/blinker03.c | 13 +++++ blinker03/blinker03.clang.bc | Bin 0 -> 972 bytes blinker03/blinker03.clang.bin | Bin 0 -> 232 bytes blinker03/blinker03.clang.hex | 17 ++++++ blinker03/blinker03.clang.opt.bc | Bin 0 -> 860 bytes blinker03/blinker03.clang.opt.elf | Bin 0 -> 33600 bytes blinker03/blinker03.clang.opt.list | 89 ++++++++++++++++++++++++++++ blinker03/blinker03.clang.opt.o | Bin 0 -> 1012 bytes blinker03/blinker03.clang.opt.s | 91 +++++++++++++++++++++++++++++ blinker03/blinker03.hex | 16 +++++ blinker03/blinker03.o | Bin 0 -> 1108 bytes blinker03/memmap | 18 +++++- blinker03/vectors.o | Bin 0 -> 800 bytes blinker03/vectors.s | 18 ++++++ 14 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 blinker03/blinker03.clang.bc create mode 100755 blinker03/blinker03.clang.bin create mode 100644 blinker03/blinker03.clang.hex create mode 100644 blinker03/blinker03.clang.opt.bc create mode 100755 blinker03/blinker03.clang.opt.elf create mode 100644 blinker03/blinker03.clang.opt.list create mode 100644 blinker03/blinker03.clang.opt.o create mode 100644 blinker03/blinker03.clang.opt.s create mode 100644 blinker03/blinker03.hex create mode 100644 blinker03/blinker03.o create mode 100644 blinker03/vectors.o diff --git a/blinker03/blinker03.c b/blinker03/blinker03.c index 39bac88..31ce556 100644 --- a/blinker03/blinker03.c +++ b/blinker03/blinker03.c @@ -68,3 +68,16 @@ int notmain ( void ) } //------------------------------------------------------------------------- //------------------------------------------------------------------------- + + +//------------------------------------------------------------------------- +// +// Copyright (c) 2012 David Welch dwelch@dwelch.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//------------------------------------------------------------------------- diff --git a/blinker03/blinker03.clang.bc b/blinker03/blinker03.clang.bc new file mode 100644 index 0000000000000000000000000000000000000000..03791da2a051393ebc830e26a38a1596e4439e21 GIT binary patch literal 972 zcmZ8fZD74VV=9+x9O*2WmI;=rT+>m?AlNtB z8bSVPt|ZeiIvJ%O_Tk)y?UBy8+UVOqw@Ha3tUvJbNPznkLApXZ+6 z@44sqyxfb{WBuGJ06YW$Mg*v*h;qTt;_F;5FGk)u%NRn38wZ-XGif63XSK5)%@89} z49mT>kwkm4cA+)6IzWU#>qI+R$NqHLEURk|8QP~;25?dI82{1JVo?g8C;(oHkv3eT zd^FEBw0&(*_lt3EL8|X7mOO^hCx#|DJ;j=xEZo6rpq7;MTK!W68ZJyNx%OPjcbC!3 zVKg&aI5}46)(cZ(g{)QRj-i=y!5i%NWuPt_MiVBQRFF+7{O=;l65BEhzF8C5=G>e% z(YTJXBATY*Yb83G`o9Au6@Kg0?AEK<$4)q{qO2o+ETRcI?j@fQePbq~Ml~7THw(^U zPXEjUdnJ1fI-RU~ANbJy6E5WEZHW{Qd%7oVg^alLNdgFBO{ ziYj)q)8`*)ja55BKjlKk!LFXneJdyZJ0;#}YENz+MAaX^iDSR+*Q6sP-L$U#lZ)yF zqRdm}(Ux3J+E*3c)9~#dKD?!b@9mKNJNx^GgGR#rq{eC35_3&&+yWs#F4VvA#me&z z*M}tbQs~NFsy}3<1M?8_oC0^X&p#r$Dgr-%t;>Io48YCQ{kP(jABj7Ki6~w6*?9^g CmmS#v literal 0 HcmV?d00001 diff --git a/blinker03/blinker03.clang.bin b/blinker03/blinker03.clang.bin new file mode 100755 index 0000000000000000000000000000000000000000..902131405d7fff759cd425d805d447c4fef2e397 GIT binary patch literal 232 zcmZR&x!^G?1H4f`_&d zt&giR+8#47FuY=OXn7C-RKo}~;~r3*1CR}(Sr{B1urdTZ{Pq98l?hb-8cU mcpw3!uK@WB4DE1ruYrDGVNg)u*a9SgSO!RG05QY&L;nFmbb4_B literal 0 HcmV?d00001 diff --git a/blinker03/blinker03.clang.hex b/blinker03/blinker03.clang.hex new file mode 100644 index 0000000..387c7ab --- /dev/null +++ b/blinker03/blinker03.clang.hex @@ -0,0 +1,17 @@ +:1080000002D9A0E3050000EBFEFFFFEA001080E5C7 +:108010001EFF2FE1000090E51EFF2FE11EFF2FE164 +:10802000F0402DE9A4409FE50400A0E1F8FFFFEB3C +:108030000707C0E3011780E30400A0E1F2FFFFEBB4 +:108040008C409FE5F918A0E30400A0E1EEFFFFEBF0 +:10805000021CA0E3F91881E30400A0E1EAFFFFEBB2 +:1080600070009FE5EAFFFFEB095CA0E3126CA0E360 +:108070000040A0E13D5885E37A6886E3000000EA0D +:10808000064084E050009FE50118A0E3DEFFFFEB0F +:1080900040009FE5DEFFFFEB040040E0050050E1FB +:1080A000FAFFFF3A34009FE50118A0E3D6FFFFEB8B +:1080B0002C009FE5047040E018009FE5D4FFFFEB23 +:1080C000000087E0050050E1FAFFFF3AEBFFFFEA0E +:1080D0000400202008B4002020B400201C00202030 +:0880E0002800202000F7C2FF78 +:040000030000800079 +:00000001FF diff --git a/blinker03/blinker03.clang.opt.bc b/blinker03/blinker03.clang.opt.bc new file mode 100644 index 0000000000000000000000000000000000000000..113b4e56b017095707f41bb3b96f8b79a286109d GIT binary patch literal 860 zcmZ8fT}V?=96xuvcju~i^QhOD`O&Vk@L>;g6PwV-cDIRw)s&E+ulZ5*&|sT3Z4#Wh zE4!A3Ne@CVGbDWI!5C=J%hV;KRE)$Ip_EW63M4{$5bE4(L3a4x|Ht|N{=f6%o+G-` z?*$HkRR92m04O98#>@|0S-MGwZ1tm*#2sbWk_!4>2S#3vIGQI)$i_QZV^glpQ`ML| zBA7F+m@5&&RWQpIbWA2EoeMh@;b}4gz>t_H{UYl~)*stZ5-r&VLnZ+9B-$$398=dI zT~s+C5%*CVAK?p|<>5R@YDU%FwBM&mR%^f#>nzE|H*@_D$XwC0o-yr-sd(Ka?7aYc z`x5=ZM4dm;6HG+Yi8=@DolNM>ErtNdk6K|k3A;^DNmg{95sYHR0wadLBvee@j3i;m z52FZ1NcrE0ANK4skYq)-eXzTIu)C|45hskQ;9Ug6lbF<~k<7EJZO#63o$cL}=uj_)f%Nfwvsquc9p3%3HUJKzY zq8lvaDFEf88SXOM=#w!XpqU&c#hBeXefN|vjyEWVWm_@M<} z%gEdv0L(fG(H@uF_UNnZ5@?NZ-^hz5{d!A0B9+qJUcw!}kuWaW_)OcXHbuJ}NFaKT368hLmbI8g zI#=rsT*V#bS@CDg?w@wCi||h3l#6Md&fe2+PXS(jn_&313 z=i)tg$;No|Dtref&-`Yd>})=HFmv^?F-DT% z$e1)!ATp(!=hsCXk<66jb$?8HB-J?=?Xh!5i=7#r%{^Ng2q1s}0tg_000IagfB*sr zAb|~7*Pq>!A78i|+i3|K-{W|%xA#?KhJ(oFubQ9f*?ul;=1-cPkuciNtvB{)V*V^VygBp>ssbm`?fjI-WkNw|OP6SQay^%N{3d z`b@twWDc3(RL+bWDXgqje6Oh0uea)Avhqv!d?`#{zgF;kzg{k``lXeB|C0}EtFd?5 zuLP~RW7qAGZddz?DUn*TzY~ZYOM+JW3_A|$)V|K>Ul%#uNq_omztgop{!nC7v;NNF?mL2Z`#l5vS0DaRk^d`dv#ytS1Xk@`3-l6y: + 8000: e3a0d902 mov sp, #32768 ; 0x8000 + 8004: eb000005 bl 8020 + +00008008 : + 8008: eafffffe b 8008 + +0000800c : + 800c: e5801000 str r1, [r0] + 8010: e12fff1e bx lr + +00008014 : + 8014: e5900000 ldr r0, [r0] + 8018: e12fff1e bx lr + +0000801c : + 801c: e12fff1e bx lr + +00008020 : + 8020: e92d40f0 push {r4, r5, r6, r7, lr} + 8024: e59f40a4 ldr r4, [pc, #164] ; 80d0 + 8028: e1a00004 mov r0, r4 + 802c: ebfffff8 bl 8014 + 8030: e3c00707 bic r0, r0, #1835008 ; 0x1c0000 + 8034: e3801701 orr r1, r0, #262144 ; 0x40000 + 8038: e1a00004 mov r0, r4 + 803c: ebfffff2 bl 800c + 8040: e59f408c ldr r4, [pc, #140] ; 80d4 + 8044: e3a018f9 mov r1, #16318464 ; 0xf90000 + 8048: e1a00004 mov r0, r4 + 804c: ebffffee bl 800c + 8050: e3a01c02 mov r1, #512 ; 0x200 + 8054: e38118f9 orr r1, r1, #16318464 ; 0xf90000 + 8058: e1a00004 mov r0, r4 + 805c: ebffffea bl 800c + 8060: e59f0070 ldr r0, [pc, #112] ; 80d8 + 8064: ebffffea bl 8014 + 8068: e3a05c09 mov r5, #2304 ; 0x900 + 806c: e3a06c12 mov r6, #4608 ; 0x1200 + 8070: e1a04000 mov r4, r0 + 8074: e385583d orr r5, r5, #3997696 ; 0x3d0000 + 8078: e386687a orr r6, r6, #7995392 ; 0x7a0000 + 807c: ea000000 b 8084 + 8080: e0844006 add r4, r4, r6 + 8084: e59f0050 ldr r0, [pc, #80] ; 80dc + 8088: e3a01801 mov r1, #65536 ; 0x10000 + 808c: ebffffde bl 800c + 8090: e59f0040 ldr r0, [pc, #64] ; 80d8 + 8094: ebffffde bl 8014 + 8098: e0400004 sub r0, r0, r4 + 809c: e1500005 cmp r0, r5 + 80a0: 3afffffa bcc 8090 + 80a4: e59f0034 ldr r0, [pc, #52] ; 80e0 + 80a8: e3a01801 mov r1, #65536 ; 0x10000 + 80ac: ebffffd6 bl 800c + 80b0: e59f002c ldr r0, [pc, #44] ; 80e4 + 80b4: e0407004 sub r7, r0, r4 + 80b8: e59f0018 ldr r0, [pc, #24] ; 80d8 + 80bc: ebffffd4 bl 8014 + 80c0: e0870000 add r0, r7, r0 + 80c4: e1500005 cmp r0, r5 + 80c8: 3afffffa bcc 80b8 + 80cc: eaffffeb b 8080 + 80d0: 20200004 eorcs r0, r0, r4 + 80d4: 2000b408 andcs fp, r0, r8, lsl #8 + 80d8: 2000b420 andcs fp, r0, r0, lsr #8 + 80dc: 2020001c eorcs r0, r0, ip, lsl r0 + 80e0: 20200028 eorcs r0, r0, r8, lsr #32 + 80e4: ffc2f700 ; instruction: 0xffc2f700 + +Disassembly of section .ARM.attributes: + +00000000 <.ARM.attributes>: + 0: 00002141 andeq r2, r0, r1, asr #2 + 4: 61656100 cmnvs r5, r0, lsl #2 + 8: 01006962 tsteq r0, r2, ror #18 + c: 00000017 andeq r0, r0, r7, lsl r0 + 10: 01080206 tsteq r8, r6, lsl #4 + 14: 020a0109 andeq r0, sl, #1073741826 ; 0x40000002 + 18: 01150114 tsteq r5, r4, lsl r1 + 1c: 01180317 tsteq r8, r7, lsl r3 + 20: Address 0x00000020 is out of bounds. + diff --git a/blinker03/blinker03.clang.opt.o b/blinker03/blinker03.clang.opt.o new file mode 100644 index 0000000000000000000000000000000000000000..d6c9d89428789f9286753e706507a5bc0d69b113 GIT binary patch literal 1012 zcma)2O=}ZT6g@AQd=(d3luR+yDpdl;M`^nf3sbP_LLrEP3m3j=hc-A(L-K^`Mg?0p z{Ru*6;nIZ*e}K5k&qx@$u-)iND&lx==Dj$&(F^yTbM8IwzK`cCw{Hj`U_+pe-wJq? zio)W^P)7wteDSV)e(UWYIEaQnljNvW`WTDqi`eQt>K(h$Sm$a{eC)m)>kjr0cwgmV z6iJnw?x40hfr;&v9-r>WsF zF=2g-Ia?&`lXy?acj4rBoTTKpX6J2_n5UWzJI`v1*}8+TiLEo{$G1(Z`9DtJz5_SA zf&BdMe7`iZ)7f9ZwCVH-C&_=wXa;^q<1Y@tV=sO+PeR8@*@r8>4>#B{ZeQ literal 0 HcmV?d00001 diff --git a/blinker03/blinker03.clang.opt.s b/blinker03/blinker03.clang.opt.s new file mode 100644 index 0000000..41c6f0a --- /dev/null +++ b/blinker03/blinker03.clang.opt.s @@ -0,0 +1,91 @@ + .syntax unified + .eabi_attribute 10, 2 + .fpu vfpv2 + .eabi_attribute 20, 1 + .eabi_attribute 21, 1 + .eabi_attribute 23, 3 + .eabi_attribute 24, 1 + .eabi_attribute 25, 1 + .file "blinker03.clang.opt.bc" + .text + .globl notmain + .align 2 + .type notmain,%function +notmain: @ @notmain +@ BB#0: @ %entry + push {r4, r5, r6, r7, lr} + ldr r4, .LCPI0_0 + mov r0, r4 + bl GET32 + bic r0, r0, #1835008 + orr r1, r0, #262144 + mov r0, r4 + bl PUT32 + ldr r4, .LCPI0_1 + mov r1, #16318464 + mov r0, r4 + bl PUT32 + mov r1, #512 + orr r1, r1, #16318464 + mov r0, r4 + bl PUT32 + ldr r0, .LCPI0_2 + bl GET32 + mov r5, #2304 + mov r6, #4608 + mov r4, r0 + orr r5, r5, #3997696 + orr r6, r6, #7995392 + b .LBB0_2 +.LBB0_1: @ %while.end12 + @ in Loop: Header=BB0_2 Depth=1 + add r4, r4, r6 +.LBB0_2: @ %while.body + @ =>This Loop Header: Depth=1 + @ Child Loop BB0_5 Depth 2 + @ Child Loop BB0_3 Depth 2 + ldr r0, .LCPI0_3 + mov r1, #65536 + bl PUT32 +.LBB0_3: @ %while.body3 + @ Parent Loop BB0_2 Depth=1 + @ => This Inner Loop Header: Depth=2 + ldr r0, .LCPI0_2 + bl GET32 + sub r0, r0, r4 + cmp r0, r5 + blo .LBB0_3 +@ BB#4: @ %while.end + @ in Loop: Header=BB0_2 Depth=1 + ldr r0, .LCPI0_4 + mov r1, #65536 + bl PUT32 + ldr r0, .LCPI0_5 + sub r7, r0, r4 +.LBB0_5: @ %while.body6 + @ Parent Loop BB0_2 Depth=1 + @ => This Inner Loop Header: Depth=2 + ldr r0, .LCPI0_2 + bl GET32 + add r0, r7, r0 + cmp r0, r5 + blo .LBB0_5 + b .LBB0_1 + .align 2 +@ BB#6: +.LCPI0_0: + .long 538968068 @ 0x20200004 +.LCPI0_1: + .long 536917000 @ 0x2000b408 +.LCPI0_2: + .long 536917024 @ 0x2000b420 +.LCPI0_3: + .long 538968092 @ 0x2020001c +.LCPI0_4: + .long 538968104 @ 0x20200028 +.LCPI0_5: + .long 4290967296 @ 0xffc2f700 +.Ltmp0: + .size notmain, .Ltmp0-notmain + + diff --git a/blinker03/blinker03.hex b/blinker03/blinker03.hex new file mode 100644 index 0000000..b0d5153 --- /dev/null +++ b/blinker03/blinker03.hex @@ -0,0 +1,16 @@ +:1080000002D9A0E3050000EBFEFFFFEA001080E5C7 +:108010001EFF2FE1000090E51EFF2FE11EFF2FE164 +:1080200070402DE98C009FE5F9FFFFEB0717C0E3D7 +:10803000011781E37C009FE5F3FFFFEB78009FE5EC +:10804000F918A0E3F0FFFFEB6C009FE56C109FE5D3 +:10805000EDFFFFEB68009FE5EDFFFFEB64409FE560 +:108060000050A0E160009FE50118A0E3E6FFFFEBF0 +:108070004C009FE5E6FFFFEB000065E0040050E1E7 +:10808000FAFFFF9A3D6885E240009FE50118A0E3F2 +:10809000096C86E2DCFFFFEB24009FE5DCFFFFEBD1 +:1080A000002066E0040052E1FAFFFF9A7A5885E268 +:1080B000125C85E2EAFFFFEA0400202008B40020F9 +:1080C0000002F90020B40020FF083D001C00202021 +:0480D0002800202044 +:040000030000800079 +:00000001FF diff --git a/blinker03/blinker03.o b/blinker03/blinker03.o new file mode 100644 index 0000000000000000000000000000000000000000..7c19eb9e812e24e34b344b6416f2117c254b8d31 GIT binary patch literal 1108 zcma)3L2DCH5T2Lav`JN{QAw&nSBMzVE}OJeBNS3&t;G~Vjo`t9yUCL*ZZ>7}3au2x zLp*u(AYR%Z(I3#CViOBmPaf;Rbtd~>8c#Yf@0)Mto7uN--Y!=kF~&d{gFKuvfR7Q0 z&kqH8n1V^zD9?WX0J}%O!|=ys`e4A)?*==PZy}y!_6Ah*F!rV+T}#%R<=rEw?H#^E z&ZMp?YXJO<4zcKGeN=-s`7c^!mqPc&vkAB=*68 z*a;YjVPX-on9HNXN~Ln&$Up6D1`Qr;8)fbHy6wT zEEVvNZEia*u$vghm)6(r)*r5|!bB{=k}RcPWS3Z4%di=CnO%+DVPJN*+roAbMG#?2 zMFICr!M6mMOlF6WewERz>xv)}2gh^$ z*F3Q1%m(Ca$Th+5h_>zeu(DjAD?;rVox`1GrvNh8l0Ad(Cef03j}Yrs$?K8}$#*3G E1IWLtJOBUy literal 0 HcmV?d00001 diff --git a/blinker03/memmap b/blinker03/memmap index 42d3af4..7cf049f 100644 --- a/blinker03/memmap +++ b/blinker03/memmap @@ -1,12 +1,28 @@ +/*-----------------------------------------------------------------------*/ +/*-----------------------------------------------------------------------*/ MEMORY { ram : ORIGIN = 0x8000, LENGTH = 0x1000 } - +/*-----------------------------------------------------------------------*/ SECTIONS { .text : { *(.text*) } > ram .bss : { *(.bss*) } > ram } +/*-----------------------------------------------------------------------*/ +/*-----------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ + +/* Copyright (c) 2012 David Welch dwelch@dwelch.com */ + +/* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: */ + +/* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ + +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*-----------------------------------------------------------------------*/ diff --git a/blinker03/vectors.o b/blinker03/vectors.o new file mode 100644 index 0000000000000000000000000000000000000000..360bc05ac98654d7db5ac627b694c2e4761040ad GIT binary patch literal 800 zcma)3K}rKb5bVh&F$)S20t$xcAwp0YMSXxdL@x>=@hr1sF@bE9-3gdee1cE#0Y1V< zc=0IWMgQR1wKEeF5wxMVs;8@ax@X6&<3k|?ITO^N?}+HZBntZ(Hpr(U<(}_fKhyMs z{hi9UZ?$y$h3GCr@a7VWRj7g_jT9<6bb-VPYov$9I)A*r8~(n0?K1K;H5dM&I%bJfoZA0QJz7*w<~$>CD;| z9Y71)WQYDQ-Hy>*Gh~K-%a#LNzeVP*7tZ_a2O!p*4w!R?j1>+Z88HiX!5(FH>^j}= ziFF%%=FIhT@o(r&rZZV@rX%|2e<;M{9ZkjTEgltS{y~|mF{?9hyv@8lK)%MjG8NaE zSEpjCE9$DjC0!(1#hM0JI#Rs>ou0S%cIl{vZ)X@qBd)>QRQaKBPlFwI0nrcm1*=m+ ARsaA1 literal 0 HcmV?d00001 diff --git a/blinker03/vectors.s b/blinker03/vectors.s index beb9cf5..55bb8b9 100644 --- a/blinker03/vectors.s +++ b/blinker03/vectors.s @@ -1,4 +1,7 @@ +;@------------------------------------------------------------------------- +;@------------------------------------------------------------------------- + .globl _start _start: mov sp,#0x8000 @@ -18,3 +21,18 @@ GET32: .globl dummy dummy: bx lr + +;@------------------------------------------------------------------------- +;@------------------------------------------------------------------------- + +;@------------------------------------------------------------------------- +;@ +;@ Copyright (c) 2012 David Welch dwelch@dwelch.com +;@ +;@ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +;@ +;@ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +;@ +;@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +;@ +;@-------------------------------------------------------------------------