WashNGo (empty) → 2.12
raw patch · 89 files changed
+29568/−0 lines, 89 filesdep +basedep +containersdep +directorysetup-changed
Dependencies added: base, containers, directory, ghc-paths, haskell98, parsec, process, regex-compat
Files
- LICENSE +30/−0
- Setup.lhs +5/−0
- WASH/CGI/AbstractSelector.hs +227/−0
- WASH/CGI/BaseCombinators.hs +548/−0
- WASH/CGI/CGI.hs +125/−0
- WASH/CGI/CGIConfig.hs +33/−0
- WASH/CGI/CGIGraphics.hs +194/−0
- WASH/CGI/CGIHistory.hs +104/−0
- WASH/CGI/CGIInternals.hs +882/−0
- WASH/CGI/CGIMonad.hs +209/−0
- WASH/CGI/CGIOutput.hs +132/−0
- WASH/CGI/CGITypes.hs +64/−0
- WASH/CGI/CGIXX.hs +102/−0
- WASH/CGI/ContentType.hs +20/−0
- WASH/CGI/Cookie.hs +202/−0
- WASH/CGI/CookieIO.hs +52/−0
- WASH/CGI/Debug.hs +116/−0
- WASH/CGI/EventHandlers.hs +130/−0
- WASH/CGI/Fields.hs +282/−0
- WASH/CGI/Frames.hs +90/−0
- WASH/CGI/GuaranteedCGI.hs +189/−0
- WASH/CGI/HTMLMail.hs +10/−0
- WASH/CGI/HTMLWrapper.hs +44/−0
- WASH/CGI/HTTP.hs +42/−0
- WASH/CGI/Images.hs +20/−0
- WASH/CGI/InputHandle.hs +20/−0
- WASH/CGI/LogEntry.hs +53/−0
- WASH/CGI/MakeTypedName.hs +17/−0
- WASH/CGI/PPM.hs +285/−0
- WASH/CGI/Persistent2.hs +170/−0
- WASH/CGI/RawCGI.hs +10/−0
- WASH/CGI/RawCGIInternal.hs +385/−0
- WASH/CGI/RawCGITypes.hs +61/−0
- WASH/CGI/StateItem.hs +19/−0
- WASH/CGI/Style.hs +46/−0
- WASH/CGI/Submit98.hs +322/−0
- WASH/CGI/SubmitXX.hs +191/−0
- WASH/CGI/TCGI.hs +31/−0
- WASH/CGI/Transaction.hs +393/−0
- WASH/CGI/TransactionUtil.hs +353/−0
- WASH/CGI/Types.hs +184/−0
- WASH/HTML/HTMLBase.hs +180/−0
- WASH/HTML/HTMLMonad.hs +372/−0
- WASH/HTML/HTMLMonad98.hs +5852/−0
- WASH/HTML/HTMLMonadAttrs.hs +250/−0
- WASH/HTML/HTMLMonadBase.hs +92/−0
- WASH/HTML/HTMLPrelude.hs +5209/−0
- WASH/HTML/HTMLPrelude98.hs +6195/−0
- WASH/HTML/HTMLTemplates.hs +516/−0
- WASH/HTML/HTMLTypedBase.hs +109/−0
- WASH/HTML/HTMLTypedBase98.hs +110/−0
- WASH/Mail/ContentDisposition.hs +38/−0
- WASH/Mail/Email.hs +110/−0
- WASH/Mail/EmailConfig.hs +13/−0
- WASH/Mail/HeaderField.hs +53/−0
- WASH/Mail/MIME.hs +192/−0
- WASH/Mail/MailParser.hs +217/−0
- WASH/Mail/Message.hs +78/−0
- WASH/Mail/RFC2822.hs +196/−0
- WASH/Utility/Auxiliary.hs +49/−0
- WASH/Utility/Base32.hs +96/−0
- WASH/Utility/Base64.hs +124/−0
- WASH/Utility/BulkIO.hs +33/−0
- WASH/Utility/FileNames.hs +49/−0
- WASH/Utility/Hex.hs +49/−0
- WASH/Utility/ISO8601.hs +758/−0
- WASH/Utility/IntToString.hs +10/−0
- WASH/Utility/JavaScript.hs +27/−0
- WASH/Utility/Locking.hs +41/−0
- WASH/Utility/QuotedPrintable.hs +50/−0
- WASH/Utility/RFC2047.hs +72/−0
- WASH/Utility/RFC2279.hs +110/−0
- WASH/Utility/RFC2397.hs +65/−0
- WASH/Utility/SHA1.hs +119/−0
- WASH/Utility/Shell.hs +20/−0
- WASH/Utility/SimpleParser.hs +60/−0
- WASH/Utility/URLCoding.hs +38/−0
- WASH/Utility/Unique.hs +67/−0
- WashNGo.cabal +124/−0
- washc/hs/WASHC.hs +40/−0
- washparser/hs/WASHClean.hs +58/−0
- washparser/hs/WASHData.hs +74/−0
- washparser/hs/WASHExpression.hs +418/−0
- washparser/hs/WASHFlags.hs +7/−0
- washparser/hs/WASHGenerator.hs +57/−0
- washparser/hs/WASHMain.hs +43/−0
- washparser/hs/WASHOut.hs +30/−0
- washparser/hs/WASHParser.hs +624/−0
- washparser/hs/WASHUtil.hs +82/−0
+ LICENSE view
@@ -0,0 +1,30 @@+The WASH License++Copyright 2001-2003, Peter Thiemann.+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are+met: ++ 1. Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution. + 3. The name of the author may not be used to endorse or promote+ products derived from this software without specific prior+ written permission. ++THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE+DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE+POSSIBILITY OF SUCH DAMAGE.
+ Setup.lhs view
@@ -0,0 +1,5 @@+#!/usr/bin/env runhaskell+arch-tag: Main setup script++> import Distribution.Simple+> main = defaultMain
+ WASH/CGI/AbstractSelector.hs view
@@ -0,0 +1,227 @@+module WASH.CGI.AbstractSelector + -- the public interface+ -- ( as_rows, as_cols, table_io, getText, selectionGroup, selectionButton, selectionDisplay)+where++import WASH.CGI.BaseCombinators (unsafe_io, once)+import WASH.CGI.CGIInternals (HTMLField, INVALID, ValidationError (..))+import WASH.CGI.CGIMonad hiding (lift)+import WASH.CGI.HTMLWrapper+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..))+import WASH.Utility.JavaScript++import Char+import List ((\\))+import Maybe+++-- |abstract table (twodimensional)+data AT =+ AT { as_raw :: [[String]]+ , as_rows :: Int+ , as_cols :: Int+ }++instance Show AT where+ showsPrec i as = showsPrec i (as_rows as, as_cols as)++instance Read AT where+ readsPrec i inp =+ [ (AT { as_raw = [], as_rows = r, as_cols = c }, str')+ | ((r,c), str') <- readsPrec i inp+ ]++-- |abstract row+data AR = AR [String]+ deriving (Eq, Show)++instance Read AR where+ readsPrec i inp =+ case dropWhile isSpace inp of+ 'A':'R':xs ->+ [(AR xss, rest) | (xss, rest) <- reads xs]+ _ -> []+ readList inp =+ case dropWhile isSpace inp of+ '+':xs ->+ [ (ar:ars, xs2)| (ar, xs1) <- reads xs, (ars, xs2) <- readList xs1 ]+ '-':xs ->+ [ (ars\\[ar], xs2)| (ar, xs1) <- reads xs, (ars, xs2) <- readList xs1 ]+ "" -> + [([],[])]+ _ -> []++getAR :: AT -> Int -> AR+getAR at r =+ AR (getRow (as_raw at) r)++unAR :: AR -> [String]+unAR (AR x) = x++-- |Transform an IO action that produces a table in list form into a CGI action+-- that returns an abstract table. +table_io :: IO [[String]] -> CGI AT+table_io io =+ once $+ do raw <- unsafe_io io+ let r = length raw+ c = length (Prelude.head raw)+ return (AT { as_raw = raw+ , as_rows = r+ , as_cols = c+ })++-- |Access abstract table by row and column. Produces a test node in the+-- document monad.+getText :: Monad m => AT -> Int -> Int -> WithHTML x m ()+getText as r c =+ text (getEntry (as_raw as) r c)++getRow xss r + | 0 <= r && r < length xss = xss !! r+ | otherwise = []++getCol xs c+ | 0 <= c && c < length xs = xs !! c+ | otherwise = ""++getEntry xss r c =+ getCol (getRow xss r) c+ +-- |a selection group is a virtual field that never appears on the screen, but+-- gives rise to a hidden input field!+data SelectionGroup a x =+ SelectionGroup { selectionName :: String+ , selectionToken :: CGIFieldName+ , selectionString :: Maybe String+ , selectionValue :: Maybe a+ , selectionBound :: Bool+ }++validateSelectionGroup rg =+ case selectionValue rg of + Nothing | selectionBound rg -> + Left [ValidationError (selectionName rg) (selectionToken rg) (selectionString rg)]+ _ ->+ Right SelectionGroup { selectionName = selectionName rg+ , selectionToken = selectionToken rg+ , selectionString = selectionString rg+ , selectionValue = selectionValue rg+ , selectionBound = selectionBound rg+ }++valueSelectionGroup rg =+ case selectionValue rg of+ Nothing -> error ("SelectionGroup { " +++ "selectionName = " ++ show (selectionName rg) ++ ", " +++ "selectionString = " ++ show (selectionString rg) ++ ", " +++ "selectionBound = " ++ show (selectionBound rg) +++ " }")+ Just vl -> vl++-- |Create a selection group for a table. Selects one row.+selectionGroup :: (CGIMonad cgi) => WithHTML y cgi (SelectionGroup AR INVALID)+selectionGroup =+ do token <- lift nextName+ let fieldName = show token+ info <- lift getInfo+ lift $ addField fieldName False+ let bds = bindings info+ maybeString = bds >>= assocParm fieldName+ -- experimental+ isBound = fromMaybe False (do "UNSET" <- maybeString+ return True)+ maybeVal = maybeString >>= (g . reads)+ g ((a,""):_) = Just a+ g _ = Nothing+ input (do attr "type" "hidden"+ attr "name" fieldName+ attr "value" "UNSET")+ return $+ SelectionGroup { selectionName = fieldName+ , selectionToken = token+ , selectionString = maybeString+ , selectionValue = maybeVal+ , selectionBound = isBound+ }++-- |Create a selection button for an abstract table+selectionButton :: (CGIMonad cgi) =>+ SelectionGroup AR INVALID -> AT -> Int -> HTMLField cgi x y ()+selectionButton sg at row buttonAttrs =+ input (do attr "type" "radio"+ attr "name" (fieldName++"_")+ attr "onclick" ("var ff=this.form."++fieldName+++ ";ff.value=" ++ jsShow (show (getAR at row))+++ ";if(ff.getAttribute('onchange'))"+++ "{WASHSubmit(ff.name);"+++ "};")+ buttonAttrs)+ where+ fieldName = selectionName sg+++-- |Create a labelled selection display for an abstract table. The display+-- function takes the button element and a list of text nodes corresponding to+-- the selected row and is expected to perform the layout.+selectionDisplay :: (CGIMonad cgi) =>+ SelectionGroup AR INVALID -> AT -> Int ->+ (WithHTML x cgi () -> [WithHTML x cgi ()] -> WithHTML x cgi a) ->+ WithHTML x cgi a+selectionDisplay sg at row displayFun =+ displayFun (selectionButton sg at row empty)+ (Prelude.map text $ getRow (as_raw at) row)++-- |Create a choice group for a table (0-*).+choiceGroup :: (CGIMonad cgi) => WithHTML x cgi (SelectionGroup [AR] INVALID)+choiceGroup =+ do token <- lift nextName+ let fieldName = show token+ info <- lift getInfo+ lift $ addField fieldName False+ let bds = bindings info+ maybeString = bds >>= assocParm fieldName+ maybeVal = maybeString >>= (g . reads)+ g ((a,""):_) = Just a+ g _ = Nothing+ input (do attr "type" "hidden"+ attr "name" fieldName+ attr "value" "")+ return $+ SelectionGroup { selectionName = fieldName+ , selectionToken = token+ , selectionString = maybeString+ , selectionValue = maybeVal+ , selectionBound = isJust bds+ }++-- |Create one choice button for an abstract table+choiceButton :: (CGIMonad cgi) =>+ SelectionGroup [AR] INVALID -> AT -> Int -> HTMLField cgi x y ()+choiceButton sg at row buttonAttrs =+ do script_T (rawtext $+ "SubmitAction[SubmitAction.length]=" +++ "function(){"+++ "var f=document.forms[0];" +++ "if(f."++buttonFieldName++".checked){" ++ + "f."++fieldName++".value=" ++ jsShow ('+':show (getAR at row)) +++ "+f."++fieldName++".value;" +++ "};return true};")+ input_T+ (do attr "type" "checkbox"+ attr "name" buttonFieldName+ buttonAttrs)+ where+ fieldName = selectionName sg+ buttonFieldName = fieldName++'_':show row++-- |Create a labelled choice display for an abstract table. The display+-- function takes the button element and a list of text nodes corresponding to+-- the selected row and is expected to perform the layout.+choiceDisplay :: (CGIMonad cgi) =>+ SelectionGroup [AR] INVALID -> AT -> Int ->+ (WithHTML x cgi () -> [WithHTML x cgi ()] -> WithHTML x cgi a) ->+ WithHTML x cgi a+choiceDisplay sg at row displayFun =+ displayFun (choiceButton sg at row empty)+ (Prelude.map text $ getRow (as_raw at) row)
+ WASH/CGI/BaseCombinators.hs view
@@ -0,0 +1,548 @@+-- © 2001-2005 Peter Thiemann+module WASH.CGI.BaseCombinators+{-- interface+ (ask -- WithHTML x CGI a -> CGI ()+ ,tell -- CGIOutput a => a -> CGI ()+ ,htell -- WithHTML x IO () -> CGI ()+ ,run -- CGI () -> IO ()+ ,runWithHook -- ([String] -> CGI ()) -> CGI () -> IO ()+ )+--}+where++import qualified List+import Maybe+import Monad+import System+import IO++import WASH.Utility.Auxiliary+import qualified WASH.Utility.Base64 as Base64+import WASH.CGI.CookieIO+import WASH.CGI.CGIMonad+import WASH.CGI.CGIOutput+import WASH.CGI.CGITypes+import WASH.CGI.EventHandlers+import WASH.CGI.Fields+import WASH.CGI.Frames+import WASH.CGI.LogEntry+import WASH.CGI.CGIHistory+import qualified WASH.CGI.HTMLWrapper as H hiding (map,head)+import WASH.CGI.Images+import WASH.Utility.JavaScript+import qualified WASH.Utility.RFC2279 as RFC2279+import qualified WASH.Utility.RFC2397 as RFC2397+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..), getSessionMode)+import qualified WASH.Utility.URLCoding as URLCoding++import WASH.CGI.CGIConfig+++-- |Safe embedding of an 'IO' action into the 'CGI' monad. Intentionally not+-- parameterized óver its monad to avoid its use inside of transactions.+io :: (Read a, Show a) => IO a -> CGI a+io ioa =+ once (unsafe_io ioa)++-- |Runs a 'CGI' state transformer forever. Its specification is just+--+-- > feedback f x = f x >>= feedback f+-- +-- However, 'feedback' is more efficient because it avoids the +-- buildup of long interaction logs by cutting back every time just before 'f' +-- is invoked. Unfortunately, it's useless due to typing restrictions.+feedback :: (CGIMonad cgi, Read a, Show a) => (a -> cgi a) -> a -> cgi a+feedback f x = + wrapCGI (\ cgistate ->+ case inparm cgistate of+ -- if we've got a value in the log,+ -- ignore the parameter x and just use the logged value+ PAR_MARK _ : PAR_RESULT code : rest ->+ case reads code of+ (result, ""):_ ->+ return (result+ ,cgistate { inparm = rest })+ _ ->+ reportError "Result unreadable"+ (H.text_S "Cannot read " >> H.text (show code)) cgistate+ [] ->+ let stid = stateID cgistate + newparm = PAR_MARK stid+ newvalue = PAR_RESULT (show x)+ in+ do (nextx, cgistate') <- + unwrapCGI (f x) cgistate { outparm = newvalue : newparm : outparm cgistate+ , stateID = nextstid (nextstid stid newparm) newvalue }+ let (oldstid, outparm') = popToMark $ outparm cgistate'+ unwrapCGI (feedback f nextx)+ cgistate { inparm = inparm cgistate'+ , outparm = outparm'+ , stateID = oldstid+ , cookieMap = cookieMap cgistate' + , cookiesToSend = cookiesToSend cgistate' }+ _ -> + reportError "Out of sync" H.empty cgistate)++-- |Control operator for the 'CGI' monad. Its specification is+--+-- > callWithCurrentHistory (\backto x -> action x >>= backto) x+-- > ==+-- > action x >>= callWithCurrentHistory (\backto x -> action x >>= backto)+-- +-- However, 'callWithCurrentHistory' is more efficient because it avoids the +-- buildup of long interaction logs by cutting back every time just before+-- 'action' gets executed. +callWithCurrentHistory :: (CGIMonad cgi, Read a, Show a) =>+ ((a -> cgi ()) -> a -> cgi ()) -> a -> cgi ()+callWithCurrentHistory g x = + wrapCGI (\ cgistate ->+ let+ prompt stid x =+ wrapCGI (\ cgistate' ->+ let outparm' = popTo stid (outparm cgistate') + in+ unwrapCGI (callWithCurrentHistory g x) + cgistate { inparm = inparm cgistate'+ , outparm = outparm'+ , stateID = stid+ , cookieMap = cookieMap cgistate' + , cookiesToSend = cookiesToSend cgistate' } )+ popTo stid [] = error "popTo did not find its mark"+ popTo stid (PAR_MARK stid' : rest) | stid' == stid = rest+ popTo stid (_ : rest) = popTo stid rest+ in+ case inparm cgistate of+ -- if we've got a value in the log,+ -- ignore the parameter x and just use the logged value+ PAR_MARK stid : PAR_RESULT code : rest ->+ case reads code of+ (result, ""):_ ->+ unwrapCGI (g (prompt stid) result) cgistate { inparm = rest }+ _ ->+ reportError "Result unreadable"+ (H.text_S "Cannot read " >> H.text (show code)) cgistate+ [] ->+ let stid = stateID cgistate + newmark = PAR_MARK stid+ newvalue = PAR_RESULT (show x)+ in+ unwrapCGI (g (prompt stid) x)+ cgistate { outparm = newvalue : newmark : outparm cgistate+ , stateID = nextstid (nextstid stid newmark) newvalue }+ _ -> + reportError "Out of sync" H.empty cgistate)++-- |Brackets a 'CGI' action so that only its result is visible. Improves+-- efficiency by not executing the bracketed action after it has been performed+-- once. Use this for avoiding the inefficient buildup of long interaction logs.+once :: (CGIMonad cgi, Read a, Show a) => cgi a -> cgi a+once cgi = + wrapCGI (\ cgistate ->+ case inparm cgistate of+ PAR_RESULT code : rest ->+ case reads code of+ (result, ""):_ ->+ return (result+ ,cgistate { inparm = rest })+ _ ->+ reportError "Result unreadable"+ (H.text_S "Cannot read " >> H.text (show code)) cgistate+ [] ->+ let stid = stateID cgistate + newparm = PAR_MARK stid in+ unwrapCGI cgi cgistate { outparm = newparm : outparm cgistate+ , stateID = nextstid stid newparm }+ >>= finish cgistate+ PAR_MARK _ : rest -> + unwrapCGI cgi cgistate { inparm = rest } >>= finish cgistate+ _ -> + reportError "Out of sync" H.empty cgistate)+ where finish cgistate (v, cgistate') =+ let (oldstid, outparm') = popToMark $ outparm cgistate'+ newparm = PAR_RESULT (show v)+ in+ return (v+ ,cgistate { inparm = inparm cgistate'+ , outparm = newparm : outparm'+ , stateID = nextstid oldstid newparm+ , cookieMap = cookieMap cgistate' + , cookiesToSend = cookiesToSend cgistate' })++-- |Repeats a 'CGI' action without saving its state so that the size of the+-- interaction log remains constant.+forever :: (CGIMonad cgi) => cgi () -> cgi ()+forever cgi = + wrapCGI (\ cgistate ->+ case inparm cgistate of+ [] ->+ let stid = stateID cgistate + newparm = PAR_MARK stid in+ unwrapCGI cgi cgistate { outparm = newparm : outparm cgistate+ , stateID = nextstid stid newparm }+ >>= + const (reportError "Black hole" H.empty cgistate)+ PAR_MARK _ : rest -> + unwrapCGI cgi cgistate { inparm = rest } >>= finish (mcount cgistate)+ _ -> + reportError "Out of sync" H.empty cgistate)+ where finish previousMcount (v, cgistate') =+ let (oldstid, outparm') = popToMark $ outparm cgistate'+ newparm_ignored = PAR_RESULT (show v)+ newparm = PAR_MARK oldstid+ in+ unwrapCGI cgi + cgistate' { inparm = []+ , outparm = newparm : outparm'+ , stateID = nextstid oldstid newparm+ , mcount = previousMcount }++-- |Unsafe variant of 'once': returns the computed value only the first time+-- and returns a default value in all later invocations.+-- [deprecated]+onceAndThen :: (CGIMonad cgi, Read a, Show a) => a -> cgi a -> cgi a+onceAndThen a cgi = + wrapCGI (\ cgistate ->+ case inparm cgistate of+ PAR_IGNORED : rest ->+ return (a+ ,cgistate { inparm = rest })+ [] ->+ unwrapCGI cgi cgistate { outparm = PAR_MARK (stateID cgistate) : outparm cgistate }+ >>= finish+ PAR_MARK _ : rest -> + unwrapCGI cgi cgistate { inparm = rest } >>= finish+ _ -> + reportError "Out of sync" H.empty cgistate)+ where popToMark [] = []+ popToMark (PAR_MARK _: rest) = rest+ popToMark (_: rest) = popToMark rest+ finish (v, cgistate') =+ let out = outparm cgistate' in+ return (v+ ,cgistate' { outparm = PAR_IGNORED : popToMark out })++-- internal helper function+popToMark [] = error "popToMark did not find MARK"+popToMark (PAR_MARK v: rest) = (v, rest)+popToMark (_: rest) = popToMark rest++-- |Directly lifts the 'IO' monad into the 'CGI' monad. This is generally unsafe+-- and should be avoided. Use 'io' instead.+unsafe_io :: IO a -> CGI a+unsafe_io = lift++-- |Takes a monadic value that constructs a HTML page and delivers this+-- page to the browser. This page may contain forms and input widgets.+ask :: (CGIMonad cgi) => H.WithHTML x cgi a -> cgi ()+ask ma =+ do sessionMode <- getSessionMode+ case sessionMode of+ LogOnly -> + askResumptive ma+ _ ->+ askContinuously ma++-- |Implementation of `ask` for the pure logged variant.+askResumptive :: (CGIMonad cgi) => H.WithHTML x cgi a -> cgi ()+askResumptive ma =+ do wrapCGI (\cgistate -> + return ((), cgistate { pageInfo = initialPageInfo cgistate }))+ setAction tell+ elem <- H.build_document ma + wrapCGI $+ \cgistate -> let+ pi = pageInfo cgistate+ atable = actionTable pi+ mbnds = bindings pi+ msubmitter = mbnds >>= assocParm subVar+ maction = msubmitter >>= \x -> lookup x atable+ nextState = nextCGIState cgistate+ defsubmission = liftM snd $ listToMaybe (reverse atable)+ defaction = maybe (rawTell) + (const (maybe (tellError "Unspecified action")+ id+ defsubmission))+ mbnds+ go = (maybe defaction id maction) elem nextState+ oldgo = (nextaction pi elem) nextState+ in+ -- appendDebugFile "/tmp/ask" (show (List.map fst atable, msubmitter)) >>+ go++-- |Experimental implementation of continuous version.+askContinuously :: (CGIMonad cgi) => H.WithHTML x cgi a -> cgi ()+askContinuously ma =+ fromCGIstate id >>= \initialState -> + let+ scriptName = cgiScriptName (cgiInfo initialState)+ parentID = (scriptName, stateID initialState)+ askLoop = do + wrapCGI (\cgistate -> + return ((), cgistate { pageInfo = initialPageInfo cgistate })) + setAction tellContinuously -- is this still required?+ elem <- H.build_document ma + wrapCGI $+ \cgistate -> let+ tellAction x = \ cst ->+ do rawTellContinuously x cst+ hClose (cgiHandle (cgiInfo cgistate))+ (decoded_parameters, hout) <- readParameters parentID+ -- newparm :: CGIParameters+ let newparm = PAR_VALUES $ dropSpecialParameters decoded_parameters+ newState = initialState { inparm = [newparm]+ , outparm = newparm : outparm initialState+ , cgiInfo = (cgiInfo initialState) { cgiHandle = hout}+ }+ unwrapCGI askLoop newState+ + pi = pageInfo cgistate+ atable = actionTable pi+ mbnds = bindings pi+ msubmitter = mbnds >>= assocParm subVar+ maction = msubmitter >>= \x -> lookup x atable+ nextState = nextCGIState cgistate+ defsubmission = liftM snd $ listToMaybe (reverse atable)+ nextparam = head (inparm cgistate)+ myID = (scriptName, nextstid (snd parentID) nextparam)+ boost maction =+ maction >>= \ cgiact -> + return (\ elem -> + unwrapCGI (lift (createEntry myID (Just parentID) nextparam Nothing)+ >> wrapCGI (cgiact elem)))+ defaction = maybe tellAction+ (const (maybe (tellError "Unspecified action")+ id+ (boost defsubmission)))+ mbnds+ in + (maybe defaction id (boost maction)) elem nextState+ in askLoop+++-- |Like 'ask', but passes the constructed HTML page to the @elementAction@+-- parameter. This function may send the page via Email or store it into a+-- file. Anyone loading this page in a browser can resume the interaction.+askOffline :: (CGIMonad cgi) => H.WithHTML x cgi a -> (H.Element -> IO ()) -> cgi ()+askOffline ma elementAction =+ do wrapCGI (\cgistate -> return ((), cgistate { pageInfo = initialPageInfo cgistate }))+ setAction tell+ elem <- H.build_document ma + wrapCGI $+ \cgistate ->+ case bindings (pageInfo cgistate) of+ Nothing ->+ elementAction elem >> return ((), cgistate)+ Just _ ->+ (nextaction (pageInfo cgistate) elem) (nextCGIState cgistate)++-- |Turns a 'CGI' action into an 'IO' action. Used to turn the main 'CGI' action+-- into the @main@ function of the program. Typical use:+-- +-- > main = run mainCGI+run :: CGI () -> IO ()+run =+ runWithOptions []++-- |Turns a 'CGI' action into an 'IO' action. Used to turn the main 'CGI' action+-- into the @main@ function of the program. Takes additional low-level+-- options. Typical use: +-- +-- > main = runWithOptions [] mainCGI+runWithOptions :: CGIOptions -> CGI () -> IO ()+runWithOptions options =+ runInternal options (fallbackTranslator Nothing)++-- |Variant of 'run' where an additional argument @cgigen@ specifies an action+-- taken when the script is invoked with a non-empty query string as in+-- @script-name?query-string@ +runWithHook :: CGIOptions -> ([String] -> CGI ()) -> CGI () -> IO ()+runWithHook options cgigen =+ runInternal options (fallbackTranslator (Just cgigen))++runInternal options cgigen cgiProg =+ start options $ makeServletInternal cgigen cgiProg++-- |Transform a CGI action into a servlet suitable for running from Marlow's web+-- server.+makeServlet :: CGI () -> CGIProgram+makeServlet cgiProg = + makeServletInternal (fallbackTranslator Nothing) cgiProg++-- |Like 'makeServlet' with additional CGI generator as in 'runWithHook'.+makeServletWithHook :: ([String] -> CGI ()) -> CGI () -> CGIProgram+makeServletWithHook cgigen cgiProg =+ makeServletInternal (fallbackTranslator $ Just cgigen) cgiProg++makeServletInternal cgigen (CGI cgi) = \ info decoded_parameters ->+ let maybecgiparm = assocParm "=CGI=parm=" decoded_parameters in+ let maybecgistid = assocParm "=CGI=stid=" decoded_parameters in+ let maybejsenabl = assocParm "js_enabled" decoded_parameters in+ let clean_parameters = dropSpecialParameters decoded_parameters in+ let no_parameters = null decoded_parameters in+ do oldparm <- case maybecgiparm of+ Just cgiparm ->+ liftM read $ liftM RFC2279.decode $ decode $ Base64.decode' $ cgiparm+ Nothing -> + return []+ key <- generateKey+ let newparm + | no_parameters = []+ | otherwise = (PAR_VALUES $ clean_parameters)+ : oldparm+ oldstid+ | null decoded_parameters || isNothing maybecgistid = initialStateID+ | otherwise = Base64.decode' $ fromJust maybecgistid+ cgistate = CGIState { inparm = reverse newparm+ , outparm = newparm+ , stateID = oldstid+ , cgiInfo = info+ , mcount = 0+ , jsEnabled = liftM read maybejsenabl+ , pageInfo = (initialPageInfo cgistate) {inFrame = 0}+ , encoder = makeEncoder key+ , cookieMap = map decodeCookie (cgiCookies info)+ , cookiesToSend = []+ }+ args = cgiArgs info+ scriptName = cgiScriptName info+ sessionMode = cgiSessionMode info+ -- writeDebugFile "/tmp/CGIOLDPARM" (show oldparm)+ -- writeDebugFile "/tmp/CGINEWPARM" (show newparm)+ + -- set b==False if replaying is required+ b <- case sessionMode of+ LogOnly ->+ return False+ _ ->+ if no_parameters then+ do createEntry (scriptName, initialStateID) Nothing PAR_IGNORED Nothing+ return False+ else+ notify (scriptName, oldstid) clean_parameters (cgiHandle info)+ -- if b is True at this point, we have found a thread to handle+ -- this request. However, we cannot terminate at this time because+ -- exiting will close the output handle for the other thread!+ unless b $ do+ if null args || null (head args)+ then cgi cgistate >> return ()+ else unCGI (cgigen $ args) cgistate >> return ()+ exitWith ExitSuccess++-- ======================================================================+-- output routines++-- |Terminates script by sending its argument to the browser.+tell :: (CGIMonad cgi, CGIOutput a) => a -> cgi ()+tell a =+ wrapCGI (rawTell a)++-- rawTell :: (CGIOutput a) => a -> CGIAction ()+rawTell a cgistate =+ -- appendFile "/tmp/CGIFRAME" ("tell/enter\n") >>+ let frameno = inFrame $ pageInfo cgistate in+ -- appendFile "/tmp/CGIFRAME" ("tell #" ++ show frameno ++ "\n") >>+ if frameno == 0 then+ do putCookies cgistate+ cgiPut (cgiHandle $ cgiInfo cgistate) a+ exitWith ExitSuccess+ else+ do let fname = frameFullPath (outparm cgistate) frameno+ h <- openFile fname WriteMode+ cgiPut h a+ hClose h+ return ((), cgistate)++-- |(experimental: continuous version) send argument to the browser.+tellContinuously :: (CGIMonad cgi, CGIOutput a) => a -> cgi ()+tellContinuously a =+ wrapCGI (rawTellContinuously a)++rawTellContinuously :: (CGIOutput a) => a -> CGIAction ()+rawTellContinuously a =+ (\cgistate -> + let h = cgiHandle $ cgiInfo cgistate in+ do putCookies cgistate+ cgiPut h a+ -- hFlush h+ return ((), cgistate))+++-- |Terminate script by sending a HTML page constructed by monadic argument. +htell :: (CGIMonad cgi) => H.WithHTML x IO () -> cgi a+htell hma =+ wrapCGI (\cgistate ->+ do putCookies cgistate+ itell (cgiHandle $ cgiInfo cgistate) hma)+ -- never reached++rawHtell hma = + \cgistate ->+ do putCookies cgistate+ itell (cgiHandle $ cgiInfo cgistate) hma++-- +tellError :: String -> H.Element -> CGIAction a+tellError str elems = + rawHtell message + where message = + H.standardPage str (backLink H.empty)++-- +reportError :: String -> H.WithHTML x IO () -> CGIState -> IO (a, CGIState)+reportError ttl elems cgistate =+ unCGI (htell message) cgistate+ -- never reached+ where message = + H.standardPage ttl (elems >> backLink H.empty)++-- |Link to previous page in browser's history. Uses JavaScript.+backLink :: Monad m => H.HTMLCons x y m ()+backLink attrs =+ hlink (URL "javascript:back()") (H.text_S "Try again..." >> attrs)++-- |Plain Hyperlink from an URL string.+hlink :: Monad m => URL -> H.HTMLCons x y m ()+hlink url subs = + H.a_T (H.attr_SD "href" (unURL url) >> subs)++-- +fallbackTranslator mCgigen =+ docTranslator [nothing, question] $+ frameTranslator $+ nextTranslator mCgigen++-- +frameTranslator :: (CGIMonad cgi) => ([String] -> cgi ()) -> [String] -> cgi ()+frameTranslator next (name@('F':'R':'A':'M':'E':':':_):_) =+ tell (ResponseFileReference (frameDir ++ name))+frameTranslator next strs =+ next strs++-- |A /translator/ is a function @[String] -> CGI ()@. It takes the query string+-- of the URL (of type @[String]@) and translates it into a CGI+-- action. @docTranslator docs next@ +-- takes a list of 'FreeForm' documents and a next translator. It tries to+-- select a document by its 'ffName' and falls through to the+-- @next@ translator if no document matches.+docTranslator :: [FreeForm] -> ([String] -> CGI ()) -> [String] -> CGI ()+docTranslator docs next [name] =+ let f (doc : rest) =+ if name == ffName doc then tell doc else f rest+ f [] = next [name]+ in f docs+docTranslator docs next strs =+ next strs++-- |Terminates a sequence of translators.+lastTranslator :: [String] -> CGI ()+lastTranslator =+ nextTranslator Nothing++nextTranslator Nothing _ =+ tell (Status 404 "Not Found" Nothing)+nextTranslator (Just cgigen) strs =+ cgigen strs++-- | Internal: name for the submission variable and form field+subVar :: String+subVar = "WASHsub"
+ WASH/CGI/CGI.hs view
@@ -0,0 +1,125 @@+-- © 2001-2003 Peter Thiemann+{-|+ One stop shop for the WASH\/CGI library. All high-level scripts should + get along with importing just this module. Low-level scripts may have to + import "RawCGI".+ -} +module WASH.CGI.CGI (+ -- * Basics+ CGI, CGIMonad+ , ask, tell, io, run, runWithOptions+ , once, forever, callWithCurrentHistory, htell, askOffline+ -- * Links and Images+ , Image, internalImage, externalImage, makeImg, makeRef, makePopupRef, makeA+ , backLink, hlink, popuplink, restart+ -- * Page Templates+ , H.standardPage, H.htmlHeader, H.html, H.cssPage, H.cssHeader+ -- * Forms and Widgets+ , HTMLField+ -- ** Form Creation+ , makeForm, standardQuery+ -- ** Form Submission+ , submit, submit0, defaultSubmit, resetField, activeInputField, activate+ , submitLink, submitLink0, defaultSubmitLink+ , submitx, DTree, dtleaf, dtnode+ -- ** Textual Input + , inputField, textInputField, checkedTextInputField, passwordInputField, makeTextarea+ -- ** Checkbox+ , checkboxInputField+ -- ** Button+ , makeButton, RadioGroup, radioGroup, radioButton, radioError+ -- ** Image+ , imageField+ -- ** Selection Box+ , selectMultiple, selectSingle, selectBounded+ -- ** File+ , fileInputField, checkedFileInputField+ -- ** Abstract Selection+ , as_rows, as_cols, table_io, getText, unAR+ , selectionGroup, selectionButton, selectionDisplay+ , choiceGroup, choiceButton, choiceDisplay+ -- ** Handle Manipulation+ , InputField, VALID, INVALID, value, InputHandle, HasValue+ , F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F7 (F7), F8 (F8)+ , FL (FL), FA (FA)+ -- ** Handle Concatenation+ , concatFields, concatFieldsWith+ -- ** Attribute Shortcuts+ , fieldSIZE, fieldMAXLENGTH, fieldVALUE+ -- * Advanced+ -- ** Installing Translators+ , runWithHook, docTranslator, lastTranslator+ -- ** Outputable Stuff+ , CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)+ -- ** Predefined Types for Input Fields+ , Text(..), NonEmpty(..), AllDigits(..), Phone(..)+ , EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)+ , Password(..), Optional(..)+ -- ** Lowlevel Stuff+ , CGIOption (..), CGIOptions, URL (..)+ -- ** Servlets+ , makeServlet, makeServletWithHook+ -- * HTML and Style+ , module WASH.CGI.HTMLWrapper+ , module WASH.CGI.Style+ -- * Experimental Stuff+ , FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage+ )+where++import WASH.CGI.CGIMonad (CGIMonad())+-- import qualified Prelude+import WASH.CGI.AbstractSelector+ ( as_rows, as_cols, table_io, getText, unAR+ , selectionGroup, selectionButton, selectionDisplay+ , choiceGroup, choiceButton, choiceDisplay+ )+import WASH.CGI.BaseCombinators+ ( io, once, forever, callWithCurrentHistory, ask, askOffline+ , run, runWithOptions, runWithHook+ , tell, htell, backLink, hlink+ , docTranslator, lastTranslator+ , makeServlet, makeServletWithHook+ )+import WASH.CGI.CGITypes+ ( FileReference(..), CGIOption(..), CGIOptions, URL(..)+ )+import WASH.CGI.CGIMonad (CGI)+import WASH.CGI.CGIInternals + ( makeRef, makeA, makePopupRef, popuplink+ , InputField, VALID, INVALID+ , makeForm, makeImg, Image, internalImage, externalImage+ , HTMLField, resetField, activeInputField+ , inputField, textInputField, checkedTextInputField, passwordInputField+ , checkboxInputField, fileInputField, checkedFileInputField, imageField+ , RadioGroup, radioGroup, radioButton, radioError, makeButton+ , makeTextarea+ , selectMultiple, selectSingle, selectBounded+ , fieldSIZE, fieldMAXLENGTH, fieldVALUE+ , restart+ , concatFields, concatFieldsWith+ , standardQuery+ )+import WASH.CGI.Submit98 + ( value, InputHandle, HasValue+ , F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F7 (F7), F8 (F8)+ , FL (FL), FA (FA)+ , submit, submit0, defaultSubmit, DTree, submitx, dtleaf, dtnode+ , submitLink, submitLink0, defaultSubmitLink+ , activate+ )+import WASH.CGI.CGIOutput+ ( CGIOutput+ )+import WASH.CGI.CGITypes+ ( Status(..), Location(..), FreeForm(..)+ )+import WASH.CGI.Fields+import WASH.CGI.Style +import WASH.CGI.HTMLWrapper+ hiding (input, form, select, option, textarea, + cssHeader, cssPage, html, htmlHeader, standardPage)+import qualified WASH.CGI.HTMLWrapper as H++import WASH.CGI.Frames + (FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage)
+ WASH/CGI/CGIConfig.hs view
@@ -0,0 +1,33 @@+-- © 2002 Peter Thiemann+module WASH.CGI.CGIConfig where++import System.IO.Unsafe+import System++tmpDir, varDir, imageDir, emailTmpDir, frameDir, persistentDir, persistent2Dir, registryDir, keyFile, pbmPath, catProgram, sendmailProgram :: String++-- |global root for WASH data+globalRoot :: String+globalRoot =+ unsafePerformIO (catch (getEnv "HOME") (\ ioe -> return ""))++-- temporary storage+tmpDir = globalRoot ++ "/tmp/"+-- persistent, mutable storage+varDir = globalRoot ++ "/tmp/"++imageDir = tmpDir ++ "Images/"+emailTmpDir = tmpDir+frameDir = tmpDir ++ "Frames/"+persistentDir = varDir ++ "Persistent/"+persistent2Dir = varDir ++ "Persistent2/"+transactionDir = varDir ++ "Transactions/"+registryDir = tmpDir ++ "REGISTRY/"+keyFile = varDir ++ "KEYFILE"++-- path to PBMplus programs+pbmPath = "/usr/X11R6/bin/"+-- path of cat program+catProgram = "/bin/cat"+-- path of sendmail program+sendmailProgram = "/usr/sbin/sendmail"
+ WASH/CGI/CGIGraphics.hs view
@@ -0,0 +1,194 @@+-- © 2001 Peter Thiemann+module WASH.CGI.CGIGraphics + (activeImage+ ,newImage+ ,drawOval, fillOval+ ,drawRectangle, fillRectangle+ ,drawLine, drawPoint+ ,makeText+ ,gifImage, xwdImage, xpmImage, bmpImage+ ,activateImage, activateXY, activateColor+ ,overlay+ ,storeDirectory+ ,Pixel, CGIImage, ActionFun) + where++import Maybe+import Monad+import System++import WASH.Utility.Hex+import qualified WASH.CGI.RawCGIInternal as RawCGI+import WASH.CGI.CGITypes as CGITypes+import WASH.CGI.BaseCombinators (unsafe_io)+import WASH.CGI.CGIMonad hiding (lift)+import WASH.CGI.PPM+import WASH.HTML.HTMLMonad hiding (head, div, span, map)+import WASH.Utility.Unique++import WASH.CGI.CGIConfig++storeDirectory = imageDir++ppmtogif = pbmPath ++ "ppmtogif "+pbmtext = pbmPath ++ "pbmtext "+pnmcrop = pbmPath ++ "pnmcrop "+pbmtopgm = pbmPath ++ "pbmtopgm 1 1 "+pgmtoppm = pbmPath ++ "pgmtoppm "+++type CGIImage = IO CGIImage'+type ActionFun = Int -> Int -> Maybe (CGI ())+data CGIImage' = + CGIImage'{ pixmap :: Pixmap+ , actionFun :: ActionFun+ }+++activeImage :: CGIImage -> WithHTML x CGI ()+activeImage img =+ do fieldName <- liftM show $ lift nextName+ (url, actFun) <- lift (flushImage img)+ input (attr "type" "image" ##+ attr "name" fieldName ##+ attr "src" (unURL url))+ info <- lift getInfo+ let maybeSetAction = + do bds <- bindings info+ x <- RawCGI.assocParm (fieldName ++ ".x") bds+ y <- RawCGI.assocParm (fieldName ++ ".y") bds+ act <- actFun (read x) (read y)+ return (lift $ setAction (const act))+ fromMaybe (return ()) maybeSetAction++-- internal+flushImage :: CGIImage -> CGI (CGITypes.URL, ActionFun)+flushImage img = + do cgi_image <- unsafe_io img+ pageInfo <- getInfo+ baseUrl <- getUrl+ case bindings pageInfo of+ Nothing ->+ unsafe_io $ do+ key <- inventStdKey+ let path = storeDirectory ++ key+ ppmPath = path ++ ".ppm"+ gifPath = path ++ ".gif"+ writeFile ppmPath (show $ pixmap cgi_image)+ system (ppmtogif ++ ppmPath ++ " > " ++ gifPath)+ return (URL (baseUrl ++ '?' : key ++ ".gif"), actionFun cgi_image)+ Just _ ->+ return (URL "", actionFun cgi_image)++newImage :: (Int, Int) -> Pixel -> CGIImage+newImage (w, h) bg =+ return $ CGIImage' + { pixmap = create w h 8 bg+ , actionFun = const (const Nothing)+ }++makeOval :: Bool -> CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+drawOval :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+fillOval :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+drawOval = makeOval False+fillOval = makeOval True+makeOval fill img ul lr p =+ do cgi_image <- img+ return $ cgi_image { pixmap = oval (pixmap cgi_image) ul lr p fill }++makeRectangle :: Bool -> CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+drawRectangle :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+fillRectangle :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+drawRectangle = makeRectangle False+fillRectangle = makeRectangle True+makeRectangle fill img ul lr p =+ do cgi_image <- img+ return $ cgi_image { pixmap = rectangle (pixmap cgi_image) ul lr p fill }++drawLine :: CGIImage -> (Int, Int) -> (Int, Int) -> Pixel -> CGIImage+drawLine img ul lr p =+ do cgi_image <- img+ return $ cgi_image { pixmap = line (pixmap cgi_image) ul lr p }++drawPoint :: CGIImage -> (Int, Int) -> Pixel -> CGIImage+drawPoint img xy p =+ do cgi_image <- img+ return $ cgi_image { pixmap = point (pixmap cgi_image) xy p }++makeText :: String -> Pixel -> CGIImage+makeText str fg =+ do key <- inventStdKey+ let path = storeDirectory ++ key+ ppmPath = path ++ ".ppm"+ gifPath = path ++ ".gif"+ system (pbmtext ++ "'" ++ str ++ "' | "+ ++ pnmcrop ++ "| "+ ++ pbmtopgm ++ "| "+ ++ pgmtoppm ++ rgb fg ++ "-black > " ++ ppmPath)+ pixmapStr <- readFile ppmPath+ return $ CGIImage'+ { pixmap = read pixmapStr+ , actionFun = const (const Nothing)+ }++rgb (r, g, b) =+ "rgb:" ++ showHex2 r ++ '/' : showHex2 g ++ '/' : showHex2 b++gifImage, xwdImage, xpmImage, bmpImage :: String -> CGIImage+gifImage gifPath =+ anyImage "gif" gifPath+xwdImage xwdPath =+ anyImage "xwd" xwdPath+xpmImage xpmPath =+ anyImage "xpm" xpmPath+bmpImage bmpPath =+ anyImage "bmp" bmpPath++-- internal+anyImage :: String -> String -> CGIImage+anyImage format anyPath =+ do key <- inventStdKey+ let path = storeDirectory ++ key+ ppmPath = path ++ ".ppm"+ system (pbmPath ++ format ++ "toppm " ++ anyPath ++ " > " ++ ppmPath)+ pixmapStr <- readFile ppmPath+ return $ CGIImage'+ { pixmap = read pixmapStr+ , actionFun = const (const Nothing)+ }++activateImage :: CGIImage -> CGI () -> CGIImage+activateImage img act =+ activateXY img (const (const (Just act)))++activateXY :: CGIImage -> ActionFun -> CGIImage+activateXY img actFun =+ do cgi_image <- img+ return $ cgi_image { actionFun = actFun }++activateColor :: CGIImage -> Pixel -> CGI () -> CGIImage+activateColor img p act =+ do cgi_image <- img+ let fun x y = if pixelAt (pixmap cgi_image) x y == p + then Just act+ else actionFun cgi_image x y+ return $ cgi_image { actionFun = fun }++overlay :: CGIImage -> CGIImage -> (Int, Int) -> Pixel -> CGIImage+overlay img1 img2 (xul, yul) p =+ do cgi1 <- img1+ cgi2 <- img2+ return $ + cgi1 { pixmap = comp (pixmap cgi1) (pixmap cgi2) (xul, yul) p+ , actionFun = fun cgi1 cgi2+ }+ where fun cgi1 cgi2 x1 y1 = + let x2 = x1 - xul+ y2 = y1 - yul+ w2 = width $ pixmap cgi2+ h2 = height $ pixmap cgi2+ maybeAction2 = actionFun cgi2 x2 y2+ maybeAction1 = actionFun cgi1 x1 y1+ in if x2 >= 0 && y2 >= 0 && x2 < w2 && y2 < w2 && isJust maybeAction2 + then maybeAction2+ else maybeAction1
+ WASH/CGI/CGIHistory.hs view
@@ -0,0 +1,104 @@+module WASH.CGI.CGIHistory where++import System.IO.Unsafe (unsafePerformIO)++import IO+import Maybe+import Monad+import Control.Concurrent+import Control.Concurrent.MVar+import qualified Data.Map as Map+-- +import WASH.Utility.SHA1+import WASH.CGI.RawCGITypes+import WASH.CGI.CGIMonad+import WASH.CGI.LogEntry++-- | standard value for timeout of interaction threads: one hundred seconds+historyTimeout :: Int+historyTimeout = 100000000++-- | comprises the name of the application and a hash value.+type StateID = (String, String)++{-# NOINLINE history #-}+history :: MVar (Map.Map StateID TableEntry)+history = unsafePerformIO $ newMVar Map.empty++data TableEntry =+ TableEntry + { myID :: StateID -- ^ script name and hash key+ , parentID :: Maybe StateID -- ^ root has no parent+ , nextparm :: PARAMETER+ , timeout :: Int -- ^ timeout for this stage of interaction+ , threads :: MVar [MVar (CGIParameters, Handle)]-- ^ next round of parameters and output handle+ }++-- | Takes the id of the current node, the id of the father node (if any), the+-- current parameter, and (perhaps) a timeout value for the current interaction+-- and enters a corresponding record into the history table.+createEntry :: StateID -> Maybe StateID -> PARAMETER -> Maybe Int -> IO ()+createEntry myID parentID nextparm mTimeout = do+ -- putStrLn ("createEntry "++ show myID ++ " "++ show parentID ++ " " ++ show nextparm)+ threadsvar <- newMVar []+ let protoEntry = TableEntry { myID = myID+ , parentID = parentID+ , nextparm = nextparm+ , timeout = fromMaybe historyTimeout mTimeout+ , threads = threadsvar+ }+ modifyMVar_ history (return . Map.insertWith (\ new old -> old) myID protoEntry)+ -- putStrLn ("createEntry finished")++-- | Suspends the current thread by waiting on an entry with the current node's+-- id. Returns the parameters passed to this node.+readParameters :: StateID -> IO (CGIParameters, Handle)+readParameters stateID = do+ -- putStrLn ("readParameters "++ show stateID)+ (myVar, myTimeout) <- modifyMVar history update+ myID <- myThreadId+ killerID <- forkIO (killmeOnTimeout myID myVar myTimeout)+ ch <- takeMVar myVar -- suspend until notify puts s.t.+ killThread killerID+ -- putStrLn ("readParameters "++ show stateID ++ " returns " ++ show ch)+ return ch+ where+ update t = do + let Just entry = Map.lookup stateID t+ myVar <- newEmptyMVar+ modifyMVar_ (threads entry) (\ ms -> return (myVar : ms))+ return (t, (myVar, timeout entry))+ remove v t = do+ let Just entry = Map.lookup stateID t+ modifyMVar (threads entry) (\ ms -> return (filter (/= v) ms, v `elem` ms))+ killmeOnTimeout tid var timeout = do+ threadDelay timeout+ wasPresent <- withMVar history (remove var)+ when wasPresent (killThread tid)+ -- putStrLn ("killmeOnTimeout: had to kill = "++show wasPresent)+ -- otherwise thread tid is on its way to kill me++-- | Attempts to pass parameters and a handle to a thread waiting for the given+-- stateID. Returns True if successful and False if no such thread was found.+notify :: StateID -> CGIParameters -> Handle -> IO Bool+notify stateID parms hout = do+ -- putStrLn ("notify "++ show stateID ++ " "++ show parms ++ " " ++ show hout)+ b <- withMVar history update+ -- putStrLn ("notify returns "++ show b)+ return b+ where+ update t = + case Map.lookup stateID t of+ Just entry ->+ do maybeVar <- modifyMVar (threads entry) (return . uncons)+ case maybeVar of+ Just myVar -> do+ putMVar myVar (parms, hout)+ return True+ Nothing ->+ return False+ Nothing -> -- may happen after server restart+ return False++uncons (x : xs) = (xs, Just x)+uncons [] = ([], Nothing)
+ WASH/CGI/CGIInternals.hs view
@@ -0,0 +1,882 @@+-- © 2001-2005 Peter Thiemann+module WASH.CGI.CGIInternals (module WASH.CGI.CGIInternals, getPathInfo)+{-- interface+ (ask -- WithHTML x CGI a -> CGI ()+ ,tell -- CGIOutput a => a -> CGI ()+ ,htell -- WithHTML x IO () -> CGI ()+ ,run -- CGI () -> IO ()+ ,runWithHook -- ([String] -> CGI ()) -> CGI () -> IO ()+ )+--}+where++import Prelude hiding (head,div,span)+import qualified Prelude+import qualified List+import Maybe+import Monad+import System+import IO++import WASH.Utility.Auxiliary+import qualified WASH.Utility.Base64 as Base64+import WASH.CGI.BaseCombinators+import WASH.CGI.CookieIO+import WASH.CGI.CGIMonad+import WASH.CGI.CGIOutput+import WASH.CGI.CGITypes+import WASH.CGI.EventHandlers+import WASH.CGI.Fields+import WASH.CGI.Frames+import WASH.CGI.CGIHistory+import qualified WASH.CGI.HTMLWrapper as H hiding (map)+import WASH.CGI.Images+import WASH.Utility.JavaScript+import qualified WASH.Utility.RFC2279 as RFC2279+import qualified WASH.Utility.RFC2397 as RFC2397+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..), getSessionMode)+import qualified WASH.Utility.URLCoding as URLCoding++import WASH.CGI.CGIConfig++-- ======================================================================+-- internal references++-- |Create a hyperlink to internal entity.+makeRef :: (CGIMonad cgi, Monad m)+ => String -- ^internal name of entity+ -> H.WithHTML x m () -- ^body of the reference+ -> cgi (H.WithHTML y m ())+makeRef fileName elems =+ wrapCGI (\cgistate ->+ let fileURL = url cgistate ++ '?' : fileName in+ return (hlink (URL fileURL) elems, cgistate))++-- |Create a popup hyperlink to internal entity.+makePopupRef :: (CGIMonad cgi) =>+ String -- ^name of popup window+ -> String -- ^internal name of entity+ -> H.HTMLCons x y cgi ()+makePopupRef name fileName elems =+ do baseUrl <- H.lift getUrl+ let fileURL = baseUrl ++ '?' : fileName+ popuplink name (URL fileURL) elems++-- |Create hyperlink to internal entity @\/path?name@.+makeA :: (CGIMonad cgi) => String -> String -> HTMLField cgi x y ()+makeA path name elems =+ do url <- H.lift getUrl+ let querystring = if null name then "" else '?' : name+ pathstring = if null path then "" else '/' : path+ fullurl = url ++ pathstring ++ querystring+ hlink (URL fullurl) elems++-- ======================================================================+-- input fields & forms+-- +data VALID = VALID+data INVALID = INVALID++data InputField a x = + InputField { ifName :: String+ , ifToken :: CGIFieldName + , ifFty :: String+ , ifString :: Maybe String+ , ifValue :: Maybe a+ , ifRaw :: CGIParameters+ , ifBound :: Bool -- True if form submitted+ }++-- |create a virtual input field from the concatenation of two input fields+concatFields :: (Reason c, Read c)+ => InputField c INVALID -> InputField Text INVALID+ -> InputField c INVALID+concatFields ifa ifb = + concatFieldsWith g ifa [ifb]+ where g sa [sb] = sa ++ sb++-- |Create a virtual input field from the result of applying a function to two+-- input fields. Parsing is applied to the result of the function call.+concatFieldsWith :: (Reason c, Read c) + => (String -> [String] -> String)+ -> InputField c INVALID + -> [InputField Text INVALID]+ -> InputField c INVALID+concatFieldsWith trans ifa ifbs =+ let newString = do stra <- ifString ifa+ strbs <- mapM ifString ifbs+ return (trans stra strbs)+ newValue = do s <- newString+ maybeRead s+ in + InputField { ifName = ifName ifa -- ++ '|' : ifName ifb+ , ifToken = ifToken ifa+ , ifFty = ifFty ifa+ , ifString = newString+ , ifValue = newValue+ , ifRaw = ifRaw ifa+ , ifBound = ifBound ifa && all ifBound ifbs+ }++-- |Combine the values of separately parsed fields+combineFieldsWith2 f2 if1 if2 =+ InputField { ifName = ifName if1 -- ++ '|' : ifName if2+ , ifToken = ifToken if1+ , ifFty = ifFty if1+ , ifString = Nothing+ , ifValue = liftM2 f2 (ifValue if1) (ifValue if2)+ , ifRaw = ifRaw if1+ , ifBound = ifBound if1 && ifBound if2+ }++-- transition code+name = ifName+string = ifString+valueInputField inf =+ case ifValue inf of+ Nothing -> error ("InputField { " +++ "ifName = " ++ show (ifName inf) ++ ", " +++ "ifString = " ++ show (ifString inf) ++ ", " +++ "ifBound = " ++ show (ifBound inf) +++ " }")+ Just vl -> vl+-- raw = ifRaw+-- transition code end++feither :: (a -> b) -> (c -> d) -> Either a c -> Either b d+feither f g (Left a) = Left (f a)+feither f g (Right b) = Right (g b)++-- to expose less of the implementation, the following type could be +-- propagate :: MonadPlus err => Either (err x) a -> .. Either (err x) (a, b)+propagate :: Either [err] a -> Either [err] b -> Either [err] (a,b)+propagate (Right a) (Right b) = Right (a, b)+propagate (Right a) (Left bss) = Left bss+propagate (Left ass) (Right b) = Left ass+propagate (Left ass) (Left bss) = Left (mplus ass bss)++data ValidationError =+ ValidationError { veName :: String -- name of erroneous field+ , veToken :: CGIFieldName -- token of erroneous field+ , veString :: Maybe String -- value of erroneous field+ }++validateInputField inf =+ case ifValue inf of + Nothing | ifBound inf -> + Left [ValidationError (ifName inf) (ifToken inf) (ifString inf)]+ _ ->+ Right InputField{ ifName = ifName inf+ , ifToken = ifToken inf+ , ifFty = ifFty inf+ , ifString = ifString inf+ , ifValue = ifValue inf+ , ifRaw = ifRaw inf+ , ifBound = ifBound inf+ }++-- internal+data InputType = TEXT | PASSWORD | CHECKBOX |+ RADIO | SUBMIT | RESET |+ FILE | HIDDEN | IMAGE | BUTTON+ deriving (Eq)++instance Show InputType where+ show TEXT = "text"+ show PASSWORD = "password"+ show CHECKBOX = "checkbox"+ show RADIO = "radio"+ show SUBMIT = "submit"+ show RESET = "reset"+ show FILE = "file"+ show HIDDEN = "hidden"+ show IMAGE = "image"+ show BUTTON = "button"++textual :: InputType -> Bool+textual TEXT = True+textual PASSWORD = True+textual FILE = True+textual _ = False++-- |Every input widget maps the content generator for the widget (which may+-- produce HTML elements or attributes) to the content generator of the widget. +type HTMLField cgi x y a = H.WithHTML x cgi () -> H.WithHTML y cgi a++-- |Creates a reset button that clears all fields of a form.+resetField :: (CGIMonad cgi) => HTMLField cgi x y (InputField () INVALID)+resetField = + genericField RESET (const (Just ()))++-- |Creates a submit button. Unsafe. Internal use only.+submitField :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()+submitField action =+ internalSubmitField False (Right action)++defaultSubmitField :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()+defaultSubmitField action =+ internalSubmitField True (Right action)++internalSubmitField isDefault what attrs =+ do sf <- genericField SUBMIT (const (Just ())) attrs+ attachAction (ifName sf) isDefault what++attachAction fname isDefault what =+ do pageInfo <- H.lift getInfo+ let mbnds = bindings pageInfo+ localAction = + case what of+ Right action ->+ let act = resetFrame >> action in+ do H.lift (setAction (const act))+ H.lift (registerAction fname (const act))+ Left sts ->+ let names = map veName sts+ values = map (fromMaybe "" . veString) sts+ in+ do H.lift (setAction tell) -- CHANGE THIS+ H.lift (registerAction fname tell)+ H.lift (setFaulty $ zip names values)+{-- + lift (unsafe_io (do appendFile "/tmp/CGIMBNDS" ("\nlooking for "++name sf++"\n")+ appendFile "/tmp/CGIMBNDS" (show mbnds)))+--}+ case mbnds of+ Nothing ->+ return ()+ Just bnds ->+ case assocParm fname bnds of+ Just _ ->+ localAction+ Nothing ->+ case assocParm subVar bnds of+ Just submitter |+ submitter == fname || submitter == "" && isDefault + -> localAction+ _ -> return ()+ +-- |Creates an input field that submits the field to the browser when data is+-- entered into this field. +activeInputField :: (CGIMonad cgi, Reason a, Read a)+ => (a -> cgi ()) -- ^Function that maps input data to a CGI action.+ -> HTMLField cgi x y ()+activeInputField actionFun attrs =+ activateI actionFun inputField attrs++-- |Attach a CGI action to the value returned by the input field. Activation+-- means that data is submitted as soon as it is entered.+activateI :: (CGIMonad cgi) =>+ (a -> cgi ()) -> HTMLField cgi x y (InputField a INVALID) -> HTMLField cgi x y ()+activateI actionFun inputField attrs =+ do js_enabled <- H.lift getJSEnabled+ let use_js = maybe True id js_enabled+ invalid_inf <- inputField (do attrs+ when use_js $ onChange $ "WASHSubmit(this.name);")+ let r = validateInputField invalid_inf+ rv = either Left (Right . valueInputField) r+ when (ifBound invalid_inf) $+ activateInternal actionFun (ifName invalid_inf) rv++activateInternal actionFun name what =+ case what of+ Right val -> + let act = resetFrame >> actionFun val in+ do H.lift (setAction (const act))+ H.lift (registerAction name (const act))+ Left sts ->+ let names = map veName sts+ values = map (fromMaybe "" . veString) sts+ in+ do H.lift (setAction tell) -- CHANGE THIS+ H.lift (setFaulty $ zip names values)+ H.lift (registerAction name tell)++-- |Create a textual input field. Return type can be *anything* in class 'Reason'+-- and 'Read'.+inputField :: (CGIMonad cgi, Reason a, Read a) => HTMLField cgi x y (InputField a INVALID)+inputField = + genericField TEXT (maybeRead . fromMaybe "")++maybeRead :: Read a => String -> Maybe a+maybeRead s = g (reads s)+ where g ((a,""):_) = Just a+ g _ = Nothing++-- |Create a textual input field that returns the string entered. (Avoids having+-- to put quotes around a string.)+textInputField :: (CGIMonad cgi) => HTMLField cgi x y (InputField String INVALID)+textInputField =+ genericField TEXT id++-- |Creates a textual input field that takes a custom validation function.+checkedTextInputField :: (CGIMonad cgi) => (Maybe String -> Maybe String)+ -> HTMLField cgi x y (InputField String INVALID)+checkedTextInputField g attrs =+ genericField TEXT g attrs++-- |Like 'inputField' but the characters are not echoed on the screen.+passwordInputField :: (CGIMonad cgi, Reason a, Read a) => HTMLField cgi x y (InputField a INVALID)+passwordInputField =+ genericField PASSWORD (maybeRead . fromMaybe "")++-- |Creates a checkbox. Returns 'True' if box was checked.+checkboxInputField :: (CGIMonad cgi) => HTMLField cgi x y (InputField Bool INVALID)+checkboxInputField =+ genericField CHECKBOX g+ where g Nothing = Just False+ g (Just _) = Just True++-- |Creates a file input field. Returns a temporary 'FileReference'. The+-- 'fileReferenceName' of the result is *not* guaranteed to be persistent. The+-- application is responsible for filing it away at a safe place.+fileInputField :: (CGIMonad cgi) => HTMLField cgi x y (InputField FileReference INVALID)+fileInputField attrs =+ H.lift (setEnctype "multipart/form-data") >>+ genericField FILE (maybeRead . fromMaybe "") attrs++-- |Creates a file input field. Like 'fileInputField' but has an additional+-- parameter for additional validation of the input.+checkedFileInputField :: (CGIMonad cgi) => (Maybe FileReference -> Maybe FileReference) + -> HTMLField cgi x y (InputField FileReference INVALID)+checkedFileInputField filter attrs =+ H.lift (setEnctype "multipart/form-data") >>+ genericField FILE (filter . maybeRead . fromMaybe "") attrs++instance Reason FileReference where+ reason _ = "FileReference"++genericField :: (Reason a, CGIMonad cgi) => InputType -> (Maybe String -> Maybe a) -> HTMLField cgi x y (InputField a INVALID)+genericField inputType decode fieldAttrs =+ let isSUBMIT = inputType == SUBMIT + isFILE = inputType == FILE+ in+ do fieldName'' <- H.lift nextName+ let fieldName' = show fieldName''+ fieldName | isSUBMIT = 's' : tail fieldName' + | otherwise = fieldName'+ fieldType = show inputType+ isTextual = textual inputType+ info <- H.lift getInfo+ js_enabled <- H.lift getJSEnabled+ let use_js = maybe True id js_enabled+ (explanation, result) <-+ H.input_T+ (do H.attr_SS "type" fieldType+ H.attr_SD "name" fieldName+ fieldAttrs+ -- unless isTextual $ H.attr_SD "name" fieldName+ when (use_js && isSUBMIT) $+ onClick ("this.form."++subVar++".value=this.name; return true")+ attrs <- H.get_attrs+ let [nameAttr] = [ H.attr_value a + | a <- attrs, H.attr_name a == "name" + ]+ bds = bindings info+ maybestring = bds >>= assocParm nameAttr+ rawvalues = maybeToList bds >>= assocParmR nameAttr+ mdecoded = decode maybestring+ decoded = fromJust mdecoded+ isBound = isJust bds+ theReason = reason decoded+ advice = "Enter " ++ prependArticle theReason+ explanation = theReason ++ " expected"+ -- H.attr_SD "washtype" (washtype decoded)+ when (use_js && isTextual) $ do+ onMouseOver ("self.status=" ++ jsShow advice ++ "; return true")+ onMouseOut ("self.status=''; return true")+ unless (isFILE || isSUBMIT) $ case maybestring of + Nothing -> H.empty+ Just str -> H.attr_SD "value" str+ H.attr_SS "title" explanation+ return (explanation,+ InputField { ifName = nameAttr+ , ifToken = fieldName''+ , ifFty = fieldType+ , ifString = maybestring+ , ifValue = mdecoded+ , ifRaw = rawvalues+ , ifBound = isBound+ }))+ H.lift $ addField (ifName result) isTextual+-- {- obsoleted by working css stuff -}+-- when isTextual $ do+-- nothingI <- internalImage nothing explanation+-- makeImg nothingI +-- (do H.attr_SS "align" "center"+-- H.attr_SD "name" ('i' : ifName result))+ return result++-- |generates a hyperlink that submits the current form.+internalSubmitLink :: (CGIMonad cgi) =>+ Bool -> Either [ValidationError] (cgi ()) -> H.HTMLCons x y cgi ()+internalSubmitLink isDefault what subs =+ do fieldToken <- H.lift nextName+ let fieldName = show fieldToken+ atv = "javascript:" ++ "WASHSubmit('"++fieldName++"'); void 0;"+ H.a_T (H.attr_SS "href" atv >> subs)+ attachAction fieldName isDefault what++-- |Create an input field from an image. Returns (x,y)+-- position clicked in the image.+imageField :: (CGIMonad cgi) => Image -> HTMLField cgi x y (InputField (Int, Int) INVALID)+imageField image fieldAttrs =+ do fieldToken <- H.lift nextName+ let fieldName = show fieldToken+ H.input_T (do H.attr_SS "type" "image"+ H.attr_SD "name" fieldName+ H.attr_SD "src" (unURL $ imageSRC image)+ fieldAttrs)+ H.lift $ addField fieldName False+ info <- H.lift getInfo+ return $+ let maybe_xy = + do bds <- bindings info+ x <- assocParm (fieldName ++ ".x") bds+ y <- assocParm (fieldName ++ ".y") bds+ return (x, y)+ in+ InputField { ifName = fieldName+ , ifToken = fieldToken+ , ifFty = "image"+ , ifString = do (x, y) <- maybe_xy+ return ("(" ++ x ++ "," ++ y ++ ")")+ , ifValue = do (x, y) <- maybe_xy+ return (read x, read y)+ , ifRaw = []+ , ifBound = isJust (bindings info)+ }++-- a virtual field that never appears on the screen+data RadioGroup a x =+ RadioGroup { radioName :: String+ , radioToken :: CGIFieldName+ , radioString :: Maybe String+ , radioValue :: Maybe a+ , radioBound :: Bool+ }++validateRadioGroup rg =+ case radioValue rg of + Nothing | radioBound rg -> + Left [ValidationError (radioName rg) (radioToken rg) (radioString rg)]+ _ ->+ Right RadioGroup { radioName = radioName rg+ , radioToken = radioToken rg+ , radioString = radioString rg+ , radioValue = radioValue rg+ , radioBound = radioBound rg+ }++valueRadioGroup rg =+ case radioValue rg of+ Nothing -> error ("RadioGroup { " +++ "radioName = " ++ show (radioName rg) ++ ", " +++ "radioString = " ++ show (radioString rg) ++ ", " +++ "radioBound = " ++ show (radioBound rg) +++ " }")+ Just vl -> vl++-- |Create a handle for a new radio group. /This handle is invisible on the screen!/+radioGroup :: (CGIMonad cgi, Read a) => H.WithHTML x cgi (RadioGroup a INVALID)+radioGroup =+ do token <- H.lift nextName+ let fieldName = show token+ info <- H.lift getInfo+ H.lift $ addField fieldName False+ let bds = bindings info+ maybeString = bds >>= assocParm fieldName+ maybeVal = maybeString >>= (g . reads . URLCoding.decode)+ g ((a,""):_) = Just a+ g _ = Nothing+ return $+ RadioGroup { radioName = fieldName+ , radioToken = token+ , radioString = maybeString+ , radioValue = maybeVal+ , radioBound = isJust bds+ }++-- |Create a new radio button and attach it to an existing 'RadioGroup'.+radioButton :: (Show a, Monad cgi) => RadioGroup a INVALID -> a -> HTMLField cgi x y ()+radioButton rg val fieldAttrs =+ H.input_T (do H.attr_SS "type" "radio"+ H.attr_SD "name" (radioName rg)+ H.attr_SD "value" (URLCoding.encode (show val)) + fieldAttrs)++-- |Create and place the error indicator for an existing 'RadioGroup'. Becomes+-- visible only if no button of a radio group is pressed.+radioError :: (CGIMonad cgi) => RadioGroup a INVALID -> H.WithHTML x cgi ()+radioError rg = + let name = radioName rg in+ do im <- internalImage nothing "Select exactly one button"+ makeImg im (H.attr "align" "center" >> H.attr "name" ('i' : name))++-- buttons++-- |Create a single button.+makeButton :: (CGIMonad cgi) => HTMLField cgi x y (InputField Bool INVALID)+makeButton fieldAttrs =+ let fieldType = "button" in+ do fieldToken <- H.lift nextName+ let fieldName = show fieldToken+ H.input_T (do H.attr_SS "type" fieldType+ H.attr_SD "name" fieldName + fieldAttrs)+ H.lift $ addField fieldName False+ info <- H.lift getInfo+ let bds = bindings info+ maybeString = bds >>= assocParm fieldName+ maybeVal = + case bds of+ Nothing -> Nothing+ Just parms ->+ case maybeString of+ Nothing -> Just False+ Just _ -> Just True+ return $+ InputField { ifName = fieldName+ , ifToken = fieldToken+ , ifFty = fieldType+ , ifString = maybeString+ , ifValue = maybeVal+ , ifRaw = []+ , ifBound = isJust bds+ }++-- form+-- multiple arguments formed according to CGI 1.1 rev 3 spec+-- http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html#5.0++constructQuery url [] =+ url+constructQuery url args =+ url ++ '?' : concat (List.intersperse "+" (map URLCoding.encode args))++-- |Wraps an HTML form around its arguments. All standard attributes are+-- computed and need not be supplied explicitly.+makeForm :: (CGIMonad cgi) => H.WithHTML x cgi a -> H.WithHTML y cgi ()+makeForm attrs_elems = + makeFormWithErrorMark+ -- ["style.backgroundColor='red'", "style.borderColor='black'"]+ ["className='faultyinput'"]+ attrs_elems++makeFormWithErrorMark errorMarks attrs_elems = do+ url <- H.lift getUrl+ args <- H.lift getCGIArgs+ js_enabled <- H.lift getJSEnabled+ let use_js = maybe True id js_enabled+ when use_js $ H.script_S + (do H.attr_SS "type" "text/javascript"+ H.comment $+ "\n" +++ "var SubmitAction=[];" ++ + "function OnSubmit(){" +++ "var r=true;" +++ "for(var i=0;i<SubmitAction.length;i++){r=r&&SubmitAction[i]();};" ++ + "return r;};"+++ "function WASHSubmit(fn){" +++ "var ff = document.forms[0];" +++ "ff."++subVar++".value=fn;" +++ "ff.submit();" +++ "}" +++ "\n// "+ )+ jsprog <- H.form_T $+ do H.attr_SD "action" (constructQuery url args)+ H.attr_SS "method" "post"+ when use_js $ onSubmit ("return OnSubmit();")+ attrs_elems+ H.attr_SS "target" "_self" -- ensure target attr is present+ -- formname <- liftM show $ H.lift nextName+ info <- H.lift getInfo+ parm <- H.lift getParm+ stid <- H.lift getStateID+ sessionMode <- H.lift getSessionMode+ encoder <- H.lift getEncoder+ fields <- H.lift getFields+ let ff = faultyfields info+ realparm | null ff = parm+ | otherwise = tail parm+ enabledString =+ case js_enabled of+ Just True -> "True"+ _ -> "False"+ H.input_S+ (do H.attr_SS "type" "hidden"+ H.attr_SS "name" "js_enabled"+ H.attr_SS "value" enabledString)+ H.input_S+ (do H.attr_SS "type" "hidden"+ H.attr_SS "name" subVar+ H.attr_SS "value" "")+ when (sessionNeedsLog sessionMode) $+ H.input_S + (do H.attr_SS "type" "hidden"+ H.attr_SS "name" "=CGI=parm="+ H.attr_SD "value"+ (Base64.encode' $ encoder $ RFC2279.encode $ show $ realparm))+ when (sessionNeedsState sessionMode) $+ H.input_S + (do H.attr_SS "type" "hidden"+ H.attr_SS "name" "=CGI=stid="+ H.attr_SD "value" (Base64.encode' stid))+ let + checkForJS =+ case js_enabled of+ Nothing ->+ "document.forms[0].js_enabled.value='True';"+ _ -> ""+ iFields = [iname | (iname@('f':_), True) <- fields]+ questionURL = url ++ '?' : ffName question+ hilight =+ case iFields of+ [] -> []+ name':_ -> ["document.forms[0]." ++ name' ++ ".focus();"+ ,"document.forms[0]." ++ name' ++ ".select();"]+ markAsFaulty (fname, fvalue) | fname `elem` iFields =+ "if(document.i" ++ fname ++ ")" +++ "document.i" ++ fname ++ ".src = " ++ jsShow questionURL ++ ";" +++ "else{" +++ (let f mark = "document.forms[0]." ++ fname ++ "." ++ mark ++ ";" in+ List.concatMap f errorMarks) +++ "}"+ | otherwise =+ "popupstr += " + ++ jsShow ("In a previous form, the field " ++ fname ++ + " had an unparsable input value: " ++ fvalue ++ "\n")+ ++ ";"+ jsprog | null ff = hilight+ | otherwise =+ "popupstr = '';"+ : map markAsFaulty ff+ ++ "if (popupstr != '') alert(popupstr + 'Please go back and reenter!');"+ : hilight+ when (not (null ff)) $ H.comment_T ("Faultyfields: " ++ show ff)+ -- H.attr_SD "name" formname+ H.attr_SD "enctype" (enctype info)+ return (checkForJS : jsprog)+ when (use_js && not (null jsprog)) $+ H.script_T+ (do H.attr_SS "type" "text/javascript"+ H.rawtext_S "<!-- "+ H.rawtext ('\n' : unlines jsprog)+ H.rawtext_S "// -->")++-- textarea++-- |Create a text area with a preset string.+makeTextarea :: (CGIMonad cgi) => String -> HTMLField cgi x y (InputField String INVALID)+makeTextarea fieldValue fieldAttrs =+ do token <- H.lift nextName+ info <- H.lift getInfo+ let bds = bindings info+ mvalue = bds >>= assocParm name+ name = show token+ displayValue = fromMaybe fieldValue mvalue+ H.textarea_T (do H.attr_SD "name" name+ H.text_S displayValue+ fieldAttrs)+ return $+ InputField { ifName = name+ , ifToken = token+ , ifFty = "textarea"+ , ifString = mvalue+ , ifValue = mvalue+ , ifRaw = maybeToList bds >>= assocParmR name+ , ifBound = isJust bds+ }++-- select++selectTags = map (('o':) . show) [(1::Int)..] ++-- |Create a selection box where multiple entries can be selected.+selectMultiple :: (CGIMonad cgi, Eq a)+ => (a -> String) -- ^function to display values of type a+ -> [a] -- ^list of preselected entries+ -> [a] -- ^list of all possible entries+ -> (Int, Int) -- ^(min, max) number of fields that must be selected + -> HTMLField cgi x y (InputField [a] INVALID)+selectMultiple shw defs opts (minSel, maxSel) attrs =+ do token <- H.lift nextName+ let name = show token+ info <- H.lift getInfo+ let bds = bindings info+ rawvalues = maybeToList bds >>= assocParmR name+ g ('o':i:rest) = i /= '0' + g _ = False+ inputs = filter g $ map fieldContents rawvalues+ values = inputs >>=+ (maybeToList . flip List.elemIndex selectTags) >>=+ (\i -> [opts !! i])+ len = length inputs+ mvalue | minSel <= len && len <= maxSel = Just values+ | otherwise = Nothing+ revisedDefaults | isJust bds && not (null inputs) = values+ | otherwise = defs+ let makeoption (opt, tag) = + H.option_T (do H.text (shw opt)+ H.attr_SD "value" tag+ when (opt `elem` revisedDefaults) $+ H.attr_SS "selected" "selected")+ makeChoice :: Int -> String+ makeChoice n | n == 0 = "no choice"+ | n == 1 = "1 choice"+ | n == maxBound = "arbitrary many choices"+ | otherwise = show n ++ " choices"+ makeRange :: Int -> Int -> String+ makeRange lo hi | lo == maxBound = "Arbitrary many choices"+ | lo == hi = "Exactly " ++ makeChoice lo+ | otherwise = "Minimum " ++ makeChoice lo +++ "; maximum " ++ makeChoice hi+ H.select_T+ (do attrs+ H.attr_SD "name" name+ when (maxSel > 1) $+ H.attr_SS "multiple" "multiple"+ when (null defs && minSel > 0) $+ H.option_S (do H.text_S "--"+ H.attr_SS "value" "o0")+ mapM_ makeoption (zip opts selectTags))+ im <- internalImage nothing (makeRange minSel maxSel)+ makeImg im (do H.attr_SS "align" "center"+ H.attr_SD "name" ('i' : name))+ return $ + InputField { ifName = name+ , ifToken = token+ , ifFty = "select"+ , ifString = Nothing -- fmap show value+ , ifValue = mvalue+ , ifRaw = rawvalues+ , ifBound = isJust bds+ }++-- |Create a selection box where exactly one entry can be selected.+selectSingle :: (CGIMonad cgi, Eq a)+ => (a -> String) -- ^function to display values of type a+ -> Maybe a -- ^optional preselected value+ -> [a] -- ^list of all possible values+ -> HTMLField cgi x y (InputField a INVALID)+selectSingle shw mdef opts attrs =+ do inf <- selectMultiple shw (maybeToList mdef) opts (1,1) attrs+ return $+ InputField { ifName = ifName inf+ , ifToken = ifToken inf+ , ifFty = "select"+ , ifString = ifString inf+ , ifValue = fmap Prelude.head (ifValue inf)+ , ifRaw = ifRaw inf+ , ifBound = ifBound inf+ }++-- |Selection box for elements of a "Bounded" type. Argument is the optional+-- preselected value.+selectBounded :: (CGIMonad cgi, Enum a, Bounded a, Read a, Show a, Eq a) =>+ Maybe a -> HTMLField cgi x y (InputField a INVALID)+selectBounded def =+ selectSingle show def [minBound..maxBound]+ +-- ======================================================================+-- attributes++-- |Create a 'SIZE' attribute from an 'Int'.+fieldSIZE :: Monad m => Int -> H.WithHTML x m ()+fieldSIZE i = H.attr_SD "size" (show i)++-- |Create a 'MAXLENGTH' attribute from an 'Int'.+fieldMAXLENGTH :: Monad m => Int -> H.WithHTML x m ()+fieldMAXLENGTH i = H.attr_SD "maxlength" (show i)++-- |Create a 'VALUE' attribute from any 'Show'able.+fieldVALUE :: (Monad m, Show a) => a -> H.WithHTML x m ()+fieldVALUE a = H.attr_SD "value" (show a)+++-- Images++data Image =+ Image { imageSRC :: URL+ , imageALT :: String+ }++-- |Reference to internal image.+internalImage :: (CGIMonad cgi) =>+ FreeForm -- ^the raw image+ -> String -- ^alternative text+ -> H.WithHTML x cgi Image+internalImage ff alttext =+ do baseUrl <- H.lift getUrl+ externalImage (URL (baseUrl ++ '?' : ffName ff)) alttext++-- |Reference to internal image via data URL (small images, only).+dataImage :: (CGIMonad cgi) =>+ FreeForm -- ^the raw image+ -> String -- ^alternative text+ -> H.WithHTML x cgi Image+dataImage ff alttext =+ let url = URL (RFC2397.encode (ffContentType ff, ffRawContents ff)) in+ externalImage url alttext++-- |Reference to internal image via javascript URL (does not seem to work).+jsImage :: (CGIMonad cgi) =>+ FreeForm -- ^the raw image+ -> String -- ^alternative text+ -> H.WithHTML x cgi Image+jsImage ff alttext =+ let url = URL ("javascript:" ++ jsShow (ffRawContents ff)) in+ externalImage url alttext++-- |Reference to image by URL.+externalImage :: (CGIMonad cgi) =>+ URL -- ^URL of image+ -> String -- ^alternative text+ -> H.WithHTML x cgi Image+externalImage url alttext =+ return $ Image { imageSRC = url+ , imageALT = alttext+ }++-- |Create an inline image.+makeImg :: (Monad cgi) => Image -> HTMLField cgi x y ()+makeImg image attrs = + H.img_T (do H.attr_SD "src" (unURL $ imageSRC image)+ H.attr_SD "alt" (imageALT image)+ H.attr_SD "title" (imageALT image)+ attrs)+++-- |Hyperlink that creates a named popup window from an URL string.+popuplink :: Monad m => String -> URL -> H.HTMLCons x y m ()+popuplink name url subs = + let atv = "javascript:window.open(" +++ jsShow (unURL url) ++ "," +++ jsShow name +++ "); void(0);" in+ H.a_T (H.attr_SD "href" atv >> subs)++-- |restart application.+restart :: (CGIMonad cgi) => cgi ()+restart = + do myurl <- getUrl+ tell (Location $ URL myurl)++-- |Convenient workhorse. Takes the title of a page and a monadic HTML value for+-- the contents of the page. Wraps the contents in a form so that input fields+-- and buttons may be used inside.+standardQuery :: (CGIMonad cgi) => String -> H.WithHTML x cgi a -> cgi ()+standardQuery ttl elems =+ ask (H.standardPage ttl (makeForm elems))++-- +debug message = unsafe_io $+ do putStrLn "content-type: text/plain"+ putStrLn ""+ putStrLn message+ putStrLn "------------------------------------------------------------"+-- +prependArticle "" = ""+prependArticle xs@(x:_) =+ if x `elem` "aeiouAEIOU" then "an " ++ xs else "a " ++ xs+
+ WASH/CGI/CGIMonad.hs view
@@ -0,0 +1,209 @@+{-# OPTIONS_GHC -fno-monomorphism-restriction #-}+-- © 2001- 2005 Peter Thiemann+-- |Definition of the monad underlying the CGI library.+module WASH.CGI.CGIMonad+where++import Maybe++import Control.Monad.Fix++import WASH.CGI.CGITypes+import WASH.HTML.HTMLMonad hiding (span, map, div, head)+import WASH.CGI.LogEntry+import WASH.CGI.RawCGIInternal hiding (contentType)+import qualified WASH.Utility.SHA1 as SHA1++newtype CGI a = CGI { unCGI :: CGIAction a }+type CGIAction a = CGIState -> IO (a, CGIState)+data CGIState+ = CGIState { inparm :: [PARAMETER]+ , outparm :: [PARAMETER]+ , stateID :: String+ , mcount :: Int+ , cgiInfo :: CGIInfo+ , pageInfo :: PageInfo+ , jsEnabled :: Maybe Bool+ , encoder :: String -> String+ , cookieMap :: [(String, (Maybe String, Maybe String))]+ , cookiesToSend :: [String]+ }++data PageInfo =+ PageInfo { count :: Int+ , nextaction :: Element -> CGIAction ()+ , actionTable :: [(String, Element -> CGIAction ())]+ , bindings :: Maybe CGIParameters+ , enctype :: String+ , inFrame :: Int+ , allFields :: [(String, Bool)]+ , faultyfields :: [(String, String)]+ }++data CGIFieldName =+ CGIFieldName { fnMcount :: Int, fnCount :: Int }++instance Show CGIFieldName where+ showsPrec i cfn = showChar 'f' .+ shows (fnMcount cfn) .+ showChar 'x' .+ shows (fnCount cfn)++args = cgiArgs . cgiInfo+url = unURL . cgiUrl . cgiInfo+contentType = cgiContentType . cgiInfo++sessionMode = cgiSessionMode . cgiInfo++fromCGIstate select =+ wrapCGI $ \cgistate ->+ return (select cgistate, cgistate)++getCGIArgs = fromCGIstate args+getUrl = fromCGIstate url+getParm = fromCGIstate outparm+getStateID = fromCGIstate stateID+getInfo = fromCGIstate pageInfo+getEncoder = fromCGIstate encoder+getJSEnabled = fromCGIstate jsEnabled+getScriptName = fromCGIstate (cgiScriptName . cgiInfo)+getPathInfo = fromCGIstate (cgiPathInfo . cgiInfo)+getHandle = fromCGIstate (cgiHandle . cgiInfo)+getFields = fromCGIstate (reverse . allFields . pageInfo)+getMcount = fromCGIstate mcount+getSessionMode = fromCGIstate sessionMode++-- | wrapper to transform IO computation to CGIAction+wrapIO :: IO a -> CGIAction a+wrapIO ioa = \ cgistate -> ioa >>= \ a -> return (a, cgistate)++-- | lift IO monad to CGI monad+lift :: IO a -> CGI a+lift = CGI . wrapIO++inc = + wrapCGI $ \cgistate ->+ let info = pageInfo cgistate in+ return (info + ,cgistate { pageInfo = info { count = count info + 1}})++setAction :: (CGIMonad cgi) => (Element -> cgi ()) -> cgi ()+setAction actionFun =+ wrapCGI $ \cgistate ->+ return (()+ ,cgistate { pageInfo = (pageInfo cgistate) { nextaction = unwrapCGI . actionFun }})++registerAction :: (CGIMonad cgi) => String -> (Element -> cgi ()) -> cgi ()+registerAction submitter actionFun =+ wrapCGI $ \cgistate ->+ let pi = pageInfo cgistate+ pi' = pi { actionTable = (submitter, unwrapCGI . actionFun) : actionTable pi }+ in return ((), cgistate { pageInfo = pi'})++incFrame :: (CGIMonad cgi) => cgi Int+incFrame =+ wrapCGI $ \cgistate ->+ let info = pageInfo cgistate+ lastFrame = inFrame info+ nextFrame = lastFrame + 1+ in+ return (nextFrame+ ,cgistate { pageInfo = info { inFrame = nextFrame }})++resetFrame :: (CGIMonad cgi) => cgi ()+resetFrame =+ wrapCGI $ \cgistate ->+ let info = pageInfo cgistate+ in+ return (()+ ,cgistate { pageInfo = info { inFrame = 0 }})++setEnctype :: (CGIMonad cgi) => String -> cgi ()+setEnctype contentType =+ wrapCGI $ \cgistate ->+ return (()+ ,cgistate { pageInfo = (pageInfo cgistate) { enctype = contentType } })++setFaulty :: (CGIMonad cgi) => [(String, String)] -> cgi ()+setFaulty ss =+ wrapCGI $ \cgistate ->+ return (()+ ,cgistate { pageInfo = (pageInfo cgistate) { faultyfields = ss } })++instance Monad CGI where+ return a = + CGI ( \cgistate -> return (a, cgistate))+ CGI cgi >>= f = + CGI ( \cgistate -> + cgi cgistate >>= \ (x, cgistate') ->+ unCGI (f x) cgistate')++-- contributed by Frederik Eaton <frederik@ofb.net>+instance MonadFix CGI where+ mfix f = CGI (\s ->+ mfix (\x -> (unCGI (f x)) s >>= (return.fst))+ >>= (\x -> return (x,s)))+++class Monad cgi => CGIMonad cgi where+ wrapCGI :: CGIAction a -> cgi a+ unwrapCGI :: cgi a -> CGIAction a+ chooser :: a -> a -> cgi a++instance CGIMonad CGI where+ wrapCGI = CGI+ unwrapCGI = unCGI+ chooser x y = return x+++nextName :: (CGIMonad cgi) => cgi CGIFieldName+nextName =+ do mc <- getMcount+ pageInfo <- inc+ return CGIFieldName { fnMcount = mc, fnCount = count pageInfo }++addField :: (CGIMonad cgi) => String -> Bool -> cgi ()+addField s f =+ wrapCGI ( \cgistate ->+ let info = pageInfo cgistate in+ return ((), cgistate { pageInfo = info { allFields = (s,f): allFields info }}))++-- +initialPageInfo cgistate =+ let bnds = listToMaybe [ parms | PAR_VALUES parms <- inparm cgistate ]+ in PageInfo+ { count = 0+ , nextaction = \ _ st -> return ((), st)+ , actionTable = []+ , bindings = bnds+ , enctype = contentTypeUrlencoded+ , inFrame = inFrame (pageInfo cgistate)+ , allFields = []+ , faultyfields = []+ }++dropFirstPARVALUES parms =+ let f rps [] = error "dropFirstPARVALUES: no PAR_VALUES found"+ f rps (p : ps) = + case p of+ PAR_VALUES _ ->+ (p, reverse rps ++ ps)+ _ ->+ f (p : rps) ps+ in f [] parms++nextCGIState cgistate = cgistate'+ where + (newparm, inparm') = dropFirstPARVALUES (inparm cgistate)+ cgistate' = cgistate { inparm = inparm'+ , stateID = nextstid (stateID cgistate) newparm+ , mcount = mcount cgistate + 1+ , pageInfo = (initialPageInfo cgistate')+ { inFrame = inFrame (pageInfo cgistate) }+ }+-- +initialStateID = "00000000000000000000"++nextstid oldstid parm =+ SHA1.sha1 (oldstid ++ show parm)+
+ WASH/CGI/CGIOutput.hs view
@@ -0,0 +1,132 @@+-- © 2001, 2002 Peter Thiemann+-- |Defines the class 'CGIOutput' of data types that can be output from a CGI+-- program. +module WASH.CGI.CGIOutput where++import IO+import Maybe+import Monad+import System++import WASH.Utility.Auxiliary+import WASH.Utility.BulkIO (rawHandleCopy)+import qualified WASH.CGI.Debug as Debug+import qualified WASH.Utility.RFC2279 as RFC2279++import qualified WASH.Utility.Shell as Shell++import WASH.CGI.CGIConfig+import WASH.CGI.CGITypes+import WASH.CGI.HTMLWrapper hiding (head, div, span, map)+import WASH.HTML.HTMLTemplates++-- import qualified PostElementAction++-- |(internal) takes an output handle and a document without forms and input+-- widgets, displays the document with suitable mime type and encoding, and+-- terminates the program+itell :: Handle -> WithHTML x IO () -> IO a+itell h hma = do elem <- build_document hma+ cgiPut h elem+ exitWith ExitSuccess++-- +class CGIOutput a where+ cgiPut' :: Handle -> a -> IO ()+ cgiPutList :: Handle -> [a] -> IO ()+ + cgiPutList h xs = cgiPutList h xs++cgiPut :: CGIOutput a => Handle -> a -> IO ()+cgiPut h x =+ do cgiPut' h x++instance CGIOutput a => CGIOutput [a] where+ cgiPut' h xs = cgiPutList h xs++-- instance CGIOutput Element where+instance CGIOutput ELEMENT_ where+ cgiPut' h x = hPutElement h x++instance CGIOutput Char where+ cgiPut' h ch = cgiPutList h [ch]+ cgiPutList h x = hPutListChar h x++instance CGIOutput FileReference where+ cgiPut' h x = hPutFileReference h x++instance CGIOutput ResponseFileReference where+ cgiPut' h x = hPutResponseFileReference h x++instance CGIOutput Status where+ cgiPut' h x = hPutStatus h x+ +instance CGIOutput Location where+ cgiPut' h x = hPutLocation h x++instance CGIOutput FreeForm where+ cgiPut' h x = hPutFreeForm h x++-- ------------------------------------------------------------++hPutElement h elem =+ do hPutStrLn h "Content-Type: text/html; charset=utf-8"+ -- hPutStrLn h "Content-Type: application/xhtml+xml; charset=utf-8"+ -- This MIME type does not work with Mozilla 1.6. It says+ -- "This XML file does not appear to have any style information associated+ -- with it. The document tree is shown below."+ hPutStrLn h ""+ hPutStr h $ RFC2279.encode $ show elem+ -- PostElementAction.postElementAction h+ let new h = hPutStrLn h (showTemplatified elem "")+ old h = hPutStrLn h $ RFC2279.encode $ show elem+ Debug.logOutput "OLD" old+ -- Debug.logOutput "NEW" new++hPutListChar h str =+ do hPutStrLn h "Content-Type: text/plain; charset=utf-8"+ hPutStrLn h ""+ hPutStr h $ RFC2279.encode str++hPutFileReference h fr =+ do hPutStr h "Content-Type: "+ hPutStrLn h (fileReferenceContentType fr)+ hPutStrLn h ""+ hFlush h+ hin <- openFile (fileReferenceName fr) ReadMode+ rawHandleCopy hin h+ hClose hin++hPutResponseFileReference h (ResponseFileReference fname) =+ do hFlush h+ hin <- openFile fname ReadMode+ rawHandleCopy hin h+ hClose hin++hPutStatus h (Status status reason_phrase elems) =+ do hPutStr h "Status: "+ hPutStr h status_str+ hPutStr h " "+ hPutStrLn h reason_phrase+ case elems of+ Nothing -> hPutStrLn h ""+ Just _ -> itell h message+ where status_str = show status+ ttl = "Error: " ++ status_str ++ ' ' : reason_phrase+ message = standardPage ttl (fromJust elems)++hPutLocation h (Location url) =+ do hPutStr h "Location: "+ hPutStrLn h (unURL url)+ hPutStrLn h ""++hPutFreeForm h (FreeForm fileName contentType rawContents) =+ do hPutStr h "Content-Type: "+ hPutStr h contentType+ when (not (null fileName)) $+ do hPutStr h " ;name=\""+ hPutStr h fileName+ hPutStr h "\""+ hPutStrLn h ""+ hPutStrLn h ""+ hPutStr h rawContents
+ WASH/CGI/CGITypes.hs view
@@ -0,0 +1,64 @@+-- © 2001, 2002 Peter Thiemann+-- |Types of outputable data.+module WASH.CGI.CGITypes where++import WASH.CGI.HTMLWrapper (WithHTML)++newtype URL = URL { unURL :: String }++data FileReference =+ FileReference { fileReferenceName :: FilePath+ -- ^ valid local filename where this file can be accessed+ , fileReferenceContentType :: String+ , fileReferenceExternalName :: String+ }+ deriving (Show, Read)++-- |Assumes that file contains correctly formatted HTTP Response starting with+-- Content-Type. Used internally to implement frames.+data ResponseFileReference =+ ResponseFileReference FilePath++data Status = Status { statusCode :: Int -- ^ status code+ , statusReason :: String -- ^ reason phrase+ , statusContent :: Maybe (WithHTML () IO ()) -- ^ more explanation+ }++newtype Location = Location URL -- ^ redirection++data FreeForm =+ FreeForm { ffName :: String -- ^ internal name+ , ffContentType :: String -- ^ MIME type+ , ffRawContents :: String -- ^ contents as octet stream+ }++data CGIOption+ = NoPort -- ^ do not include port number in generated URLs+ | AutoPort -- ^ include automatically generated port number in generated URLs (default)+ | Port Int -- ^ use this port number in generated URLs++ | NoHttps -- ^ do not attempt to detect Https+ | AutoHttps -- ^ autodetect Https by checking for port number 443 and env var HTTPS (default)++ | FullURL -- ^ generate full URL including scheme, host, and port+ | PartialURL -- ^ generate absolute path URL, only (default)++ | SessionMode { unSessionMode :: SessionMode }+ deriving (Eq, Show)+type CGIOptions = [CGIOption]++data SessionMode+ = LogOnly -- ^ generate log in hidden field, full server replay (default)+ | StateIDOnly -- ^ generate state id, server threads without replay (only with WSP)+ | LogAndState -- ^ log and state id, server threads with replay as fallback (only with WSP)+ deriving (Eq, Show, Read, Bounded, Enum)++sessionNeedsLog :: SessionMode -> Bool+sessionNeedsLog LogOnly = True+sessionNeedsLog StateIDOnly = False+sessionNeedsLog LogAndState = True++sessionNeedsState :: SessionMode -> Bool+sessionNeedsState LogOnly = False+sessionNeedsState StateIDOnly = True+sessionNeedsState LogAndState = True
+ WASH/CGI/CGIXX.hs view
@@ -0,0 +1,102 @@+{-# OPTIONS -fglasgow-exts #-}+-- © 2001, 2002 Peter Thiemann+{-|+ One stop shop for the WASH\/CGI library. All high-level scripts should + get along with importing just this module. Low-level scripts may have to + import "RawCGI". This version requires features beyond Haskell98, in particular + multi parameter type classes and existential types.+ -} +module WASH.CGI.CGIXX (+ -- * Basics+ CGI+ , ask, tell, io, run+ , once, forever, htell, askOffline+ -- * Links and Images+ , Image, internalImage, externalImage, makeImg, makeRef, makeA+ , backLink, hlink+ -- * Forms and Widgets+ , HTMLField+ -- ** Form Creation+ , makeForm, standardQuery+ -- ** Form Submission+ , submit, submit0, defaultSubmit, resetField, activeInputField, activate+ , submitx, DTree, dtleaf, dtnode+ -- ** Textual Input + , inputField, textInputField, checkedTextInputField, passwordInputField, makeTextarea+ -- ** Checkbox+ , checkboxInputField+ -- ** Button+ , makeButton, RadioGroup, radioGroup, radioButton, radioError+ -- ** Image+ , imageField+ -- ** Selection Box+ , selectMultiple, selectSingle, selectBounded+ -- ** File+ , fileInputField, checkedFileInputField+ -- ** Handle Manipulation+ , InputField, VALID, INVALID+ -- ** Attribute Shortcuts+ , fieldSIZE, fieldMAXLENGTH, fieldVALUE+ -- * Advanced+ -- ** Installing Translators+ , runWithHook, docTranslator, lastTranslator+ -- ** Outputable Stuff+ , CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)+ -- ** Predefined Types for Input Fields+ , Text(..), NonEmpty(..), AllDigits(..)+ , EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)+ -- ** Lowlevel Options+ , CGIOption (..), CGIOptions+ -- ** Servlets+ , makeServlet, makeServletWithHook+ -- * HTML and Style+ , module WASH.CGI.HTMLWrapper+ , module WASH.CGI.Style+ -- * Experimental Stuff+ , FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage+ )+where++import qualified Prelude+import WASH.CGI.BaseCombinators+ ( io, once, forever, callWithCurrentHistory, ask, askOffline+ , run, runWithOptions, runWithHook+ , tell, htell, backLink, hlink+ , docTranslator, lastTranslator+ , makeServlet, makeServletWithHook+ )+import WASH.CGI.CGITypes+ ( FileReference(..), CGIOption(..), CGIOptions+ )+import WASH.CGI.CGIMonad (CGI)+import WASH.CGI.CGIInternals + ( makeRef, makeA, makePopupRef, popuplink+ , InputField, VALID, INVALID+ , makeForm, makeImg, Image, internalImage, externalImage+ , HTMLField, resetField, activeInputField+ , inputField, textInputField, checkedTextInputField, passwordInputField+ , checkboxInputField, fileInputField, checkedFileInputField, imageField+ , RadioGroup, radioGroup, radioButton, radioError, makeButton+ , makeTextarea+ , selectMultiple, selectSingle, selectBounded+ , fieldSIZE, fieldMAXLENGTH, fieldVALUE+ , restart+ , concatFields, concatFieldsWith+ , standardQuery+ )+import WASH.CGI.SubmitXX + ( submit, submit0, defaultSubmit+ , submitx, DTree, dtleaf, dtnode+ , activate )+import WASH.CGI.CGIOutput+ ( CGIOutput+ )+import WASH.CGI.CGITypes+ ( Status(..), Location(..), FreeForm(..)+ )+import WASH.CGI.Fields+import WASH.CGI.Style +import WASH.CGI.HTMLWrapper+ hiding (input, form, select, option, textarea)+import WASH.CGI.Frames+ (FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage)
+ WASH/CGI/ContentType.hs view
@@ -0,0 +1,20 @@+-- © 2001, 2002 Peter Thiemann+module WASH.CGI.ContentType where++import Char+import List++-- |tries to derive a MIME content type from a file name+guessContentType :: String -> String+guessContentType name = g (map toLower name) + where+ g name+ | ".eps" `isSuffixOf` name = "application/postscript"+ | ".ps" `isSuffixOf` name = "application/postscript"+ | ".ps.gz" `isSuffixOf` name = "application/postscript" -- correct?+ | ".pdf" `isSuffixOf` name = "application/pdf"+ | ".html" `isSuffixOf` name = "text/html"+ | ".gif" `isSuffixOf` name = "image/gif"+ | ".png" `isSuffixOf` name = "image/png"+ | ".jpg" `isSuffixOf` name = "image/jpeg"+ | otherwise = "application/octet-stream"
+ WASH/CGI/Cookie.hs view
@@ -0,0 +1,202 @@+-- © 2001, 2002, 2003 Peter Thiemann+-- |creating, setting, reading, and deleting cookies. Cookies are type-indexed,+-- i.e., there is a different cookie for each name and type.+module WASH.CGI.Cookie (T, check, create, createExpiring, init, initExpiring, get, set, current, delete) where++import Locale+import Maybe+import Prelude hiding (init)+import Random+import Time++import WASH.CGI.BaseCombinators+import WASH.CGI.CGIMonad+import WASH.HTML.HTMLMonad hiding (head, div, map, span)+import WASH.CGI.Types++import WASH.CGI.StateItem++-- |@check name@ returns the current handle to cookie @name@ if that exists.+check :: (Read a, Show a, Types a) => String -> CGI (Maybe (T a))+-- |@create name initValue@ creates cookie @name@ with initial value @initValue@+-- and returns its current handle. The cookie+-- expires at the end of the current run of the browser.+create :: (Read a, Show a, Types a) => String -> a -> CGI (T a)+-- |like 'create' with additional parameter specifying number of minutes until+-- cookie expires.+createExpiring :: (Read a, Show a, Types a) => String -> Int -> a -> CGI (T a)+-- |@init name initValue@ returns current handle to cookie @name@. If the+-- cookie did not exist before, it is created and set to @initialValue@. The cookie+-- expires at the end of the current run of the browser.+init :: (Read a, Show a, Types a) => String -> a -> CGI (T a)+-- |@initExpiring name minutes initValue@ works like 'init' except that the+-- expiration time is @minutes@ in the future.+initExpiring :: (Read a, Show a, Types a) => String -> Int -> a -> CGI (T a)+-- |@get handle@ returns the cookie's value if the handle is current, otherwise+-- returns 'Nothing' +get :: (Read a, Show a, Types a) => T a -> CGI (Maybe a)+-- |@set handle newValue@ overwrites the cookie's value with @newValue@ if the+-- handle is current. In that case it returns a handle which is current for+-- @newValue@. Otherwise, the result is 'Nothing'.+set :: (Read a, Show a, Types a) => T a -> a -> CGI (Maybe (T a))+-- |@current handle@ returns @Nothing@ if @handle@ is still current. Otherwise, it+-- returns @Just newHandle@ where @newHandle@ is current for the cookie pointed to by+-- @handle@.+current :: (Read a, Show a, Types a) => T a -> CGI (Maybe (T a))+-- |@delete handle@ removes the cookie determined by @handle@.+delete :: (Types a) => T a -> CGI ()+-- +++data P a = P { nr :: Int, vl :: a }+ deriving (Read, Show)++t :: String -> P a -> T a+t name (P i a) = T name i++check name =+ once (unsafe_getHandle name)++unsafe_getHandle name =+ CGI (\cgistate ->+ let mresult = fmap (t name) $ cookieLookup cgistate typedName+ myTyspec = ty (tvirtual (fromJust mresult))+ typedName = makeTypedName name myTyspec+ in + return (mresult, cgistate)) ++create name val = + once (unsafe_init False name val Nothing)++createExpiring name minutes val =+ once $ do timestr <- unsafe_io $ getTimeString minutes+ unsafe_init False name val (Just timestr)++initExpiring name minutes val =+ once $ do timestr <- unsafe_io $ getTimeString minutes+ unsafe_init True name val (Just timestr)++init name val = + once (unsafe_init True name val Nothing)++unsafe_init useExisting name val mexp =+ CGI (\cgistate ->+ case cookieLookup cgistate typedName of+ -- if name present and existing value is to be used+ -- then construct handle from map entry+ Just pair | useExisting ->+ return (t name pair, cgistate)+ _ -> + -- extend cookie map with name=val+ do nonce <- randomIO+ let p0val = P nonce val+ cm' = (typedName, (Just (show p0val), mexp)) : cookieMap cgistate+ -- register cookie for sending+ cts' = typedName : cookiesToSend cgistate+ -- construct handle+ return (t name p0val,+ cgistate { cookieMap = cm'+ , cookiesToSend = cts'+ }))+ where myTyspec = ty val+ typedName = makeTypedName name myTyspec+ +get handle =+ once (do eitherTP <- unsafe_get_current handle+ return $ either (const Nothing) Just eitherTP)++current handle =+ once (do eitherTP <- unsafe_get_current handle+ return $ either Just (const Nothing) eitherTP) ++unsafe_get_current :: (Types a, Read a, Show a) => T a -> CGI (Either (T a) a)+unsafe_get_current t@(T name i) =+ CGI (\cgistate ->+ case cookieLookup cgistate typedName of+ -- if name present and types match then construct handle from map entry+ (Just pair)+ | nr pair == i ->+ return (Right $ vl pair, cgistate)+ | otherwise ->+ return (Left $ T name (nr pair), cgistate)+ _ -> + reportError "Cookie disappeared" + (do let cm = cookieMap cgistate+ mms = lookup typedName cm+ mmp = if True then fmap (fmap reads . fst) mms + else Just (Just [(P 0 $ tvirtual t, "")])+ pre $ text $ (" " ++ typedName)+ pre $ text $ show cm+ pre $ text $ show mms+ pre $ text $ show mmp)+ cgistate)+ where myTyspec = ty (tvirtual t)+ typedName = makeTypedName name myTyspec++set handle val =+ once (unsafe_set handle val)++unsafe_set (T name i) val =+ CGI (\cgistate ->+ case cookieLookup cgistate typedName of+ (Just pair) | nr pair == i ->+ do nonce <- randomIO+ let pair' = if True then P nonce val else pair -- to unify their types+ cts = cookiesToSend cgistate+ cts' = if typedName `elem` cts then cts else typedName : cts+ cm' = (typedName, (Just (show pair'), Nothing)) :+ [ entry | entry@(aName, _) <- cookieMap cgistate+ , aName /= typedName ]+ return (Just (t name pair'),+ cgistate { cookieMap = cm'+ , cookiesToSend = cts'+ })+ _ -> return (Nothing, cgistate))+ where myTyspec = ty val+ typedName = makeTypedName name myTyspec++delete t = + once (unsafe_delete t)++unsafe_delete t@(T name i) =+ CGI (\cgistate ->+ let cts = cookiesToSend cgistate+ cts' = if typedName `elem` cts then cts else typedName : cts+ in return ( ()+ , cgistate { cookieMap = (typedName, (Nothing, Nothing))+ : cookieMap cgistate+ , cookiesToSend = cts'+ }))+ where myTyspec = ty (tvirtual t)+ typedName = makeTypedName name myTyspec++cookieLookup :: (Show a, Read a) => CGIState -> String -> Maybe (P a)+cookieLookup cgistate typedName =+ let cm = cookieMap cgistate+ fn = lookup typedName cm -- Maybe (Maybe String, Maybe String)+ cn = fmap (fmap reads . fst) fn -- Maybe (Maybe [(P a, String)])+ checkType [] = + Nothing+ checkType ((pair,_):_) =+ Just pair+ in cn >>= \mtp -> mtp >>= checkType++makeTypedName :: String -> TySpec -> String+makeTypedName s tys = s ++ '-' : tid tys ""++-- ++getTimeString :: Int -> IO String+getTimeString minutes =+ do now <- getClockTime+ let expireAt = addToClockTime TimeDiff {tdYear = 0,+ tdMonth = 0,+ tdDay = 0,+ tdHour = 0,+ tdMin = minutes,+ tdSec = 0,+ tdPicosec = 0} now+ -- Wdy, DD-Mon-YYYY HH:MM:SS GMT+ fmt = "%a, %d-%b-%Y %H:%M:%S GMT"+ loc = defaultTimeLocale+ return $ formatCalendarTime loc fmt (toUTCTime expireAt)
+ WASH/CGI/CookieIO.hs view
@@ -0,0 +1,52 @@+module WASH.CGI.CookieIO (decodeCookie, encodeCookie, putCookies) where++import IO++import WASH.CGI.CGIMonad+import qualified WASH.CGI.Debug as Debug+import WASH.CGI.RawCGITypes+import qualified WASH.Utility.URLCoding as URLCoding++decodeCookie :: (String, String) -> (String, (Maybe String, Maybe String))+encodeCookie :: (String, (Maybe String, Maybe String)) -> (String, String)+encodeCookie (k, (v, mexp)) =+ (URLCoding.encode k, + case v of + Just v' -> URLCoding.encode v' +++ (case mexp of+ Nothing -> ""+ Just exp -> "; expires=" ++ exp)+ Nothing -> "deleted; expires=Thu, 01-Jan-1970 00:00:00 GMT")+decodeCookie (k, v) = (URLCoding.decode k, (Just (URLCoding.decode v), Nothing))++putCookies :: CGIState -> IO ()+putCookies cgistate =+ let cookies = cookiesToSend cgistate+ cm = cookieMap cgistate+ h = cgiHandle (cgiInfo cgistate)+ sendCookie name = case lookup name cm of+ Nothing -> + return ()+ Just value -> + let (encName, encValue) = encodeCookie (name, value) in+ do hPutStr h "Set-Cookie: "+ hPutStr h encName+ hPutStr h "="+ hPutStr h encValue+ hPutStr h ";\n"+ in do printCookies cm cookies h+ Debug.logOutput "OLD" (printCookies cm cookies)++printCookies :: [(String,(Maybe String, Maybe String))] -> [String] -> Handle -> IO ()+printCookies cm cookies h =+ let sendCookie name = case lookup name cm of+ Nothing -> + return ()+ Just value -> + let (encName, encValue) = encodeCookie (name, value) in+ do hPutStr h "Set-Cookie: "+ hPutStr h encName+ hPutStr h "="+ hPutStr h encValue+ hPutStr h ";\n"+ in mapM_ sendCookie cookies
+ WASH/CGI/Debug.hs view
@@ -0,0 +1,116 @@+module WASH.CGI.Debug where++import Directory+import IO+import Monad+import System+import Time++import System.IO.Unsafe++import WASH.Utility.Auxiliary+import WASH.CGI.RawCGITypes+import WASH.CGI.HTTP+import qualified WASH.Utility.Shell as Shell+import qualified WASH.Utility.ISO8601 as ISO8601+import qualified WASH.Utility.IntToString as IntToString++-- |Turn this off for production use.+debugging :: Bool+debugging = False++logDirNakalele = "/export/data/thiemann"++dir :: String+dir = + unsafePerformIO $+ do (ts, tps) <- timestamp+ onNakalele <- doesDirectoryExist logDirNakalele+ ra <- protectedGetEnv "REMOTE_ADDR" "0.0.0.0"+ home <- protectedGetEnv "HOME" ""+ let root | not (null home) = home ++ "/tmp"+ | onNakalele = logDirNakalele+ | otherwise = "/tmp"+ n = root ++ "/WASHLOGA/" ++ ra ++ + '/' : IntToString.intToString 10 (toEnum ts) +++ ':' : IntToString.intToString 10 tps+ assertDirectoryExists n (return ())+ return n++timestamp :: IO (Int, Integer)+timestamp =+ do clkt <- getClockTime+ let dc = diffClockTimes clkt ISO8601.epochClkT+ return (tdSec dc, tdPicosec dc)++withLogFile :: String -> (Handle -> IO ()) -> IO ()+withLogFile path go =+ do h <- openFile path AppendMode+ go h+ hClose h++-- ------------------------------------------------------------++hPutEnvVar h val var =+ do hPutStr h var+ hPutChar h '='+ hPutStrLn h (Shell.quote val)+ hPutStr h "export "+ hPutStrLn h var++makeArgList h [] =+ return ()+makeArgList h (x:xs) =+ do hPutStr h (Shell.quote x)+ hPutChar h ' '+ makeArgList h xs+makeCommand h args =+ do hPutStr h "$1 "+ makeArgList h args+ hPutStrLn h "<< \\EOF"+makeInput h str =+ do hPutStrLn h str+ hPutStrLn h "\\EOF"++-- |Creates a shell script suitable for replaying the interactive submission.+logInput :: CGIEnv -> IO ()+logInput cgiEnv =+ when debugging $+ withLogFile (dir ++ "/IN.sh") $ \ h ->+ do hPutStrLn h "#!/bin/sh"+ hPutEnvVar h (serverName cgiEnv) "SERVER_NAME"+ hPutEnvVar h (serverPort cgiEnv) "SERVER_PORT"+ hPutEnvVar h (serverSoftware cgiEnv) "SERVER_SOFTWARE"+ hPutEnvVar h (serverProtocol cgiEnv) "SERVER_PROTOCOL"+ hPutEnvVar h (gatewayInterface cgiEnv) "GATEWAY_INTERFACE"+ hPutEnvVar h (scriptName cgiEnv) "SCRIPT_NAME"+ hPutEnvVar h (show $ requestMethod cgiEnv) "REQUEST_METHOD"+ hPutEnvVar h (contentLength cgiEnv) "CONTENT_LENGTH"+ hPutEnvVar h (contentType cgiEnv) "CONTENT_TYPE"+ hPutEnvVar h (httpCookie cgiEnv) "HTTP_COOKIE"+ hPutEnvVar h (httpAccept cgiEnv) "HTTP_ACCEPT"+ hPutEnvVar h (pathInfo cgiEnv) "PATH_INFO"+ hPutEnvVar h (pathTranslated cgiEnv) "PATH_TRANSLATED"+ hPutEnvVar h (remoteHost cgiEnv) "REMOTE_HOST"+ hPutEnvVar h (remoteAddr cgiEnv) "REMOTE_ADDR"+ hPutEnvVar h (remoteUser cgiEnv) "REMOTE_USER"+ hPutEnvVar h (authType cgiEnv) "AUTH_TYPE"+ if httpsEnabled cgiEnv + then hPutEnvVar h "on" "HTTPS"+ else hPutEnvVar h "off" "HTTPS"+ makeCommand h (rawArgs cgiEnv)+ makeInput h (rawContents cgiEnv)+ +logOutput :: String -> (Handle -> IO ()) -> IO ()+logOutput name f =+ let basename = dir ++ '/' : name in+ when debugging $ do+ before <- getClockTime+ withLogFile basename f+ after <- getClockTime+ let dc = diffClockTimes after before+ dSec = toInteger $ tdSec dc+ dPic = tdPicosec dc+ withLogFile (basename ++ ".time")+ (\h -> do hPutStrLn h (IntToString.intToString 10 dSec)+ hPutStrLn h (IntToString.intToString 10 dPic))
+ WASH/CGI/EventHandlers.hs view
@@ -0,0 +1,130 @@+-- © 2002 Peter Thiemann+module WASH.CGI.EventHandlers where++import WASH.CGI.HTMLWrapper++--abort+onAbort :: Monad m => String -> WithHTML x m ()+onAbort = attr_SS "onabort"+-- ^The user aborts the loading of an image (for example by clicking a link or+-- clicking the Stop button). ++--blur+onBlur :: Monad m => String -> WithHTML x m ()+onBlur = attr_SS "onblur"+-- ^A form element loses focus or when a window or frame loses focus.++--change+onChange :: Monad m => String -> WithHTML x m ()+onChange = attr_SS "onchange"+-- ^A select, text, or textarea field loses focus and its value has been modified.++--click+onClick :: Monad m => String -> WithHTML x m ()+onClick = attr_SS "onclick"+-- ^An object on a form is clicked.++--dblclick+onDblClick :: Monad m => String -> WithHTML x m ()+onDblClick = attr_SS "ondblclick"+-- ^The user double-clicks a form element or a link.++--dragdrop+onDragDrop :: Monad m => String -> WithHTML x m ()+onDragDrop = attr_SS "ondragdrop"+-- ^The user drops an object onto the browser window, such as dropping a file on+-- the browser window. ++--error+onError :: Monad m => String -> WithHTML x m ()+onError = attr_SS "onerror"+-- ^The loading of a document or image causes an error.++--focus+onFocus :: Monad m => String -> WithHTML x m ()+onFocus = attr_SS "onfocus"+-- ^A window, frame, or frameset receives focus or when a form element receives+-- input focus. ++--keydown+onKeyDown :: Monad m => String -> WithHTML x m ()+onKeyDown = attr_SS "onkeydown"+-- ^The user depresses a key.++--keypress+onKeyPress :: Monad m => String -> WithHTML x m ()+onKeyPress = attr_SS "onkeypress"+-- ^The user presses or holds down a key.++--keyup+onKeyUp :: Monad m => String -> WithHTML x m ()+onKeyUp = attr_SS "onkeyup"+-- ^The user releases a key.++--load+onLoad :: Monad m => String -> WithHTML x m ()+onLoad = attr_SS "onload"+-- ^The browser finishes loading a window or all of the frames within a FRAMESET tag.++--mousedown+onMouseDown :: Monad m => String -> WithHTML x m ()+onMouseDown = attr_SS "onmousedown"+-- ^The user depresses a mouse button.++--mousemove+onMouseMove :: Monad m => String -> WithHTML x m ()+onMouseMove = attr_SS "onmousemove"+-- ^The user moves the cursor.++--mouseout+onMouseOut :: Monad m => String -> WithHTML x m ()+onMouseOut = attr_SS "onmouseout"+-- ^The cursor leaves an area (client-side image map) or link from inside that+-- area or link. ++--mouseover+onMouseOver :: Monad m => String -> WithHTML x m ()+onMouseOver = attr_SS "onmouseover"+-- ^The cursor moves over an object or area from outside that object or area.++--mouseup+onMouseUp :: Monad m => String -> WithHTML x m ()+onMouseUp = attr_SS "onmouseup"+-- ^The user releases a mouse button.++--move+onMove :: Monad m => String -> WithHTML x m ()+onMove = attr_SS "onmove"+-- ^The user or script moves a window or frame.++--reset+onReset :: Monad m => String -> WithHTML x m ()+onReset = attr_SS "onreset"+-- ^The user resets a form (clicks a Reset button).++--resize+onResize :: Monad m => String -> WithHTML x m ()+onResize = attr_SS "onresize"+-- ^The user or script resizes a window or frame.++--select+onSelect :: Monad m => String -> WithHTML x m ()+onSelect = attr_SS "onselect"+-- ^The user selects some of the text within a text or textarea field.++--submit+onSubmit :: Monad m => String -> WithHTML x m ()+onSubmit = attr_SS "onsubmit"+-- ^The user submits a form. Event handler must return true to continue+-- submission. Returning false concels submission.++--unload+onUnload :: Monad m => String -> WithHTML x m ()+onUnload = attr_SS "onunload"+-- ^The user exits a document.++-- specialized event handlers+-- |Redirect result of form submission to specific target. Attach to submission+-- button. +toTarget :: Monad m => String -> WithHTML x m ()+toTarget t = onClick ("this.form.target='" ++ t ++ "'; this.form.submit(); return true")
+ WASH/CGI/Fields.hs view
@@ -0,0 +1,282 @@+-- © 2002 Peter Thiemann+module WASH.CGI.Fields where++import Char+import List+import WASH.Utility.ISO8601+import WASH.Utility.SimpleParser as SimpleParser+import WASH.CGI.CGITypes++-- |method 'reason' of this class maps a value of type /a/ to an explanation of+-- the input syntax for a value of type /a/+class Reason a where+ reason :: a -> String+ washtype :: a -> String+ reason _ = ""+ washtype x = reason x++instance Reason Int where+ reason _ = "Int"++instance Reason Integer where+ reason _ = "Integer"++instance Reason Double where+ reason _ = "Double"++instance Reason Float where+ reason _ = "Float"++instance Reason Bool where+ reason _ = "Bool"++instance Reason () where+ reason _ = "()"++instance Reason Char where+ reason _ = "Char"++instance Reason a => Reason [a] where+ reason ~(x:xs) = "[" ++ reason x ++ "]"++instance (Reason a, Reason b) => Reason (a, b) where+ reason ~(x,y) = "(" ++ reason x ++ "," ++ reason y ++ ")"++instance (Reason a, Reason b, Reason c) => Reason (a, b, c) where+ reason ~(x,y,z) = "(" ++ reason x ++ "," ++ reason y ++ "," ++ reason z ++ ")"++-- |Reads an email address according to RFC 2822+newtype EmailAddress = EmailAddress { unEmailAddress :: String }++instance Read EmailAddress where+ readsPrec i str = + let isAddressChar c = isAlpha c || isDigit c || c `elem` ".-_"+ (name, atDomain) = span isAddressChar (dropWhile isSpace str)+ in case atDomain of+ '@' : domainPart ->+ let (domain, rest) = span isAddressChar domainPart in+ let fulladdress = name ++ '@' : domain in+ if null name || null domain + || "." `isPrefixOf` name || "." `isSuffixOf` name || "." `isPrefixOf` domain+ || any (isPrefixOf "..") (tails name) + || any (isPrefixOf "..") (tails domain)+ then []+ else [(EmailAddress fulladdress, dropWhile isSpace rest)]+ _ -> []+ readList str = + case reads str of+ (em1, str'): _ ->+ case str' of+ ',': str'' ->+ case readList str'' of+ (ems, str'''): _ ->+ [(em1:ems, str''')]+ _ ->+ [([em1], str')]+ _ -> + [([em1], str')]+ _ -> []+ ++instance Show EmailAddress where+ showsPrec i (EmailAddress str) = showString str++instance Reason EmailAddress where+ reason _ = "email address {must contain @ and no special characters except . - _}"+ washtype _ = "EmailAddress"+ +-- |Reads a credit card number and performs Luhn check on it.+newtype CreditCardNumber = CreditCardNumber { unCreditCardNumber :: String }++instance Read CreditCardNumber where+ readsPrec i str = + let str' = dropWhile isSpace str+ str'' = take 16 str'+ str''' = dropWhile isSpace (drop 16 str'')+ in if length str'' == 16 && all isDigit str && luhnCheck str+ then [(CreditCardNumber str, str''')]+ else []++luhnCheck str = + checkEven (reverse str) 0+ where digitval d = ord d - ord '0'+ checkEven [] n = n `mod` 10 == 0+ checkEven (d:ds) n = checkOdd ds (n + digitval d)+ checkOdd [] n = n `mod` 10 == 0+ checkOdd (d:ds) n = checkEven ds (n + doubleval (digitval d))+ doubleval d = let d2 = 2*d in if d2 > 9 then d2 - 9 else d2++instance Show CreditCardNumber where+ showsPrec i (CreditCardNumber str) = showString str++instance Reason CreditCardNumber where+ reason _ = "credit card number"+ washtype _ = "CreditCardNumber"++-- |Reads credit card expiration dates in format ##\/##.+data CreditCardExp = CreditCardExp { cceMonth :: Int, cceYear :: Int }++instance Read CreditCardExp where+ readsPrec i str = + g $ dropWhile isSpace str+ where+ g str@(mh: ml: '/': yh: yl:cces) =+ let mo, yr :: Int+ mo = read [mh, ml]+ yr = read [yh, yl]+ in if isDigit mh && isDigit ml && isDigit yh && isDigit yl && mo >= 1 && mo <= 12+ then [(CreditCardExp mo yr, cces)]+ else []+ g _ = []++instance Show CreditCardExp where+ showsPrec i cce = shows (cceMonth cce) . showChar '/' . shows (cceYear cce)++instance Reason CreditCardExp where+ reason _ = "credit card expiration date: MM/YY"+ washtype _ = "CreditCardExp"++-- |Non-empty strings.+newtype NonEmpty = NonEmpty { unNonEmpty :: String }++instance Read NonEmpty where+ readsPrec i [] = []+ readsPrec i str = [(NonEmpty str, "")]++instance Show NonEmpty where+ showsPrec i (NonEmpty str) = showString str++instance Reason NonEmpty where+ reason _ = "non empty string"+ washtype _ = "NonEmpty"++-- |Phone numbers.+newtype Phone = Phone { unPhone :: String }++phoneChars = "0123456789 +-/()"++instance Read Phone where+ readsPrec i =+ parserToRead $+ (many1 (oneOf phoneChars) >>= (return . Phone))++instance Show Phone where+ showsPrec i (Phone str) = showString str++instance Reason Phone where+ reason _ = "non empty string of " ++ show phoneChars+ washtype _ = "Phone"++-- |Non-empty strings of digits.+newtype AllDigits = AllDigits { unAllDigits :: String }++instance Read AllDigits where+ readsPrec i str =+ let (digits, str') = span isDigit $ dropWhile isSpace str in + if null digits then [] else [(AllDigits digits, str')]++instance Show AllDigits where+ showsPrec i (AllDigits str) = showString str++instance Reason AllDigits where+ reason _ = "non empty string of digits"+ washtype _ = "AllDigits"++-- |Arbitrary string data. No quotes required.+newtype Text = Text { unText :: String }++instance Read Text where+ readsPrec i str = [(Text str, "")]+ +instance Show Text where+ showsPrec i (Text str) = showString str++instance Reason Text where+ reason _ = "arbitrary string"+ washtype _ = "Text"++-- |Date and time in ISO8601 format+instance Reason ISODate where+ reason _ = "date in ISO8601 format"+ washtype _ = "ISODate"++instance Reason ISOTime where+ reason _ = "time in ISO8601 format"+ washtype _ = "ISOTime"++instance Reason ISODateAndTime where+ reason _ = "date and time in ISO8601 format"+ washtype _ = "ISODateAndTime"++-- |String in URL format+instance Read URL where+ readsPrec i = parserToRead parseURL++parseURL = + do scheme <- parseScheme+ colon <- char ':'+ rest <- many1 ascii+ return $ URL (scheme ++ colon : rest)++parseScheme =+ do c <- alpha+ cs <- many SimpleParser.print+ return (c:cs)++instance Show URL where+ showsPrec i (URL str) = showString str++instance Reason URL where+ reason _ = "URL"++-- |A Password is a string of length >= 8 with characters taken from at least+-- three of the four sets: lower case characters, upper case characters, digits,+-- and special characters.+newtype Password = Password { unPassword :: String }++instance Reason Password where+ reason _ = "Password string of length >= 8 with characters taken from at \+ \least three of the four sets: lower case characters, upper case \+ \characters, digits, and special characters"++instance Read Password where+ readsPrec i str =+ let lower = any isLower str+ upper = any isUpper str+ digit = any isDigit str+ specl = any isSpecl str+ isSpecl c = isPrint c && not (isAlphaNum c)+ nclasses = sum (map fromEnum [lower, upper, digit, specl])+ in + if length str >= 8 && nclasses >= 3+ then [(Password str, "")]+ else []++instance Show Password where+ showsPrec i (Password pw) = showString pw++-- |Data type for transforming a field into an optional one. The 'Read' syntax of+-- @Absent@ is the empty string, whereas the 'Read' syntax of @Present a@ is just the+-- 'Read' syntax of @a@. Analogously for 'Show'.+data Optional a = Absent | Present a++-- |Analogous to Maybe.fromJust+fromPresent :: Optional a -> a+fromPresent ~(Present x) = x+-- |Analogous to Maybe.fromMaybe+fromOptional :: a -> Optional a -> a+fromOptional x Absent = x+fromOptional _ (Present x) = x++instance Show a => Show (Optional a) where+ showsPrec i Absent = id+ showsPrec i (Present x) = showsPrec i x++-- |Optional items are either empty or just the item+instance (Read a) => Read (Optional a) where+ readsPrec i "" = [(Absent, "")]+ readsPrec i xs = [(Present v, rest) | (v, rest) <- readsPrec i xs]++instance (Reason a) => Reason (Optional a) where+ reason x = "optional " ++ reason (fromPresent x)+
+ WASH/CGI/Frames.hs view
@@ -0,0 +1,90 @@+module WASH.CGI.Frames where++import WASH.Utility.Auxiliary+import qualified WASH.CGI.HTMLWrapper as H hiding (map)+import WASH.CGI.CookieIO+import WASH.CGI.CGIConfig+import WASH.CGI.CGIMonad+import WASH.CGI.CGIOutput+import WASH.CGI.CGITypes+import WASH.CGI.EventHandlers+import WASH.CGI.Fields+import WASH.CGI.Images+import WASH.CGI.RawCGIInternal hiding (CGIEnv (..))+import qualified WASH.Utility.URLCoding as URLCoding+import WASH.Utility.JavaScript+++-- ======================================================================+-- frames++-- |Overall layout of a frame set: row-wise or column-wise.+data FrameLayout = ROWS | COLS+ deriving Show++-- |Division of space between elements of a frameset. See+-- <http://wp.netscape.com/assist/net_sites/frame_syntax.html>+data FrameSpacing = FrameAbsolute Int -- ^in pixels+ | FrameRelative Int -- ^the @*@ format+ | FramePercent Int -- ^the @%@ format++instance Show FrameSpacing where+ showsPrec _ (FrameAbsolute n) = shows n+ showsPrec _ (FrameRelative n) = shows n . showChar '*'+ showsPrec _ (FramePercent n) = shows n . showChar '%'+ showList [] = id+ showList [ffmt] = shows ffmt+ showList (ffmt:ffmts) = shows ffmt . showChar ',' . showList ffmts++-- |Abstract data type of frame set generators.+data FrameSet = FrameSet { unFrameSet :: H.WithHTML () IO () }++-- |Create a frameset, given a layout, its spacing, and its subframe(set)s.+makeFrameset :: (CGIMonad cgi) =>+ FrameLayout+ -> [(FrameSpacing, cgi FrameSet)]+ -> cgi FrameSet+makeFrameset layout subframes =+ do nested <- mapM snd subframes+ return $ FrameSet $+ H.frameset_S (foldr (( >> ) . unFrameSet) + (H.attr_SD (show layout) (show (map fst subframes)))+ nested)++-- |Create a single frame. Returns the assigned name of the frame.+makeFrame :: (CGIMonad cgi) =>+ H.WithHTML x IO () -- ^additional attributes to <frame>+ -> cgi () -- ^contents of the frame+ -> cgi FrameSet -- ^returns HTML generator for the frame+makeFrame attrs subAction =+ do n <- incFrame+ -- unsafe_io (appendFile "/tmp/CGIFRAME" $ ("makeFrame #" ++ show n ++ "\n"))+ subAction+ baseUrl <- getUrl+ parm <- getParm+ let url = baseUrl ++ '?' : URLCoding.encode (frameFileName parm n)+ name = ("FRAME"++show n)+ -- unsafe_io (appendFile "/tmp/CGIFRAME" $ ("makeFrame finished\n"))+ return $ FrameSet $+ H.frame_S (do attrs+ H.attr_SD "SRC" url+ H.attr_SD "NAME" name)++frameFileName parm frameno =+ "FRAME:" ++ show frameno ++ ":" ++ (URLCoding.encode $ show $ parm)++frameFullPath parm frameno = + frameDir ++ frameFileName parm frameno++-- |Required wrapper for pages with frames. Takes a title and a FrameSet+-- generator and displays the page.+framesetPage :: (CGIMonad cgi) => String -> cgi FrameSet -> cgi ()+framesetPage ttl framesetgen =+ do resetFrame+ FrameSet pagegen <- framesetgen+ let ma = H.htmlHeader ttl pagegen+ resetFrame+ wrapCGI $ \ cgistate ->+ do elem <- H.build_document ma+ (nextaction (pageInfo cgistate) elem) (nextCGIState cgistate)+
+ WASH/CGI/GuaranteedCGI.hs view
@@ -0,0 +1,189 @@+module WASH.CGI.GuaranteedCGI (+ -- * Basics+ CGI, CGIMonad+ , ask, tell, io, run+ , once, forever, callWithCurrentHistory, htell, askOffline+ -- * Links and Images+ , Image, internalImage, externalImage, makeImg, makeRef, makePopupRef, makeA+ , backLink, hlink, popuplink, restart+ -- * Page Templates+ , standardPage, htmlHeader, WASH.CGI.GuaranteedCGI.html, cssPage, cssHeader+ -- * Forms and Widgets+ , HTMLField+ -- ** Form Creation+ , makeForm, standardQuery+ -- ** Form Submission+ , submit, submit0, defaultSubmit, resetField, activeInputField, activate+ , submitLink, submitLink0, defaultSubmitLink+ , submitx, DTree, dtleaf, dtnode+ -- ** Textual Input + , inputField, textInputField, checkedTextInputField, passwordInputField, makeTextarea+ -- ** Checkbox+ , checkboxInputField+ -- ** Button+ , makeButton, RadioGroup, radioGroup, radioButton, radioError+ -- ** Image+ , imageField+ -- ** Selection Box+ , selectMultiple, selectSingle, selectBounded+ -- ** File+ , fileInputField, checkedFileInputField+ -- ** Handle Manipulation+ , InputField, VALID, INVALID, value, InputHandle, HasValue+ , F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F8 (F8)+ , FL (FL), FA (FA)+ -- ** Attribute Shortcuts+ , fieldSIZE, fieldMAXLENGTH, fieldVALUE+ -- * Advanced+ -- ** Installing Translators+ , runWithHook, docTranslator, lastTranslator+ -- ** Outputable Stuff+ , CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)+ -- ** Predefined Types for Input Fields+ , Text(..), NonEmpty(..), AllDigits(..), Phone(..)+ , EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)+ , Password(..), Optional(..)+ -- ** Lowlevel Options+ , CGIOption (..), CGIOptions, URL (..)+ -- ** Servlets+ , makeServlet, makeServletWithHook+ -- * HTML and Style+ , module WASH.HTML.HTMLMonad98+ , module WASH.CGI.Style+ -- * Experimental Stuff+ , FrameSet, FrameLayout(..), FrameSpacing(..), makeFrame, makeFrameset, framesetPage+ ) where++import WASH.CGI.CGIMonad (CGIMonad())+import WASH.CGI.CGITypes+import WASH.CGI.Fields+import WASH.CGI.Style+import qualified WASH.CGI.CGIInternals as CGIInternals+import WASH.CGI.CGI (+ CGI+ , tell, io, run, once, forever, callWithCurrentHistory+ , Image, internalImage, externalImage+ , HTMLField, RadioGroup, radioGroup, InputField, VALID, INVALID, value+ , InputHandle, HasValue+ , F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F8 (F8)+ , FL (FL), FA (FA)+ , DTree, dtleaf, dtnode+ , runWithHook, docTranslator, lastTranslator+ , CGIOutput, Status(..), Location(..), FreeForm(..), FileReference (..)+ , Text(..), NonEmpty(..), AllDigits(..)+ , EmailAddress(..), CreditCardNumber(..), CreditCardExp(..)+ , CGIOption(..), CGIOptions+ , makeServlet, makeServletWithHook+ , FrameSet, FrameLayout(..), FrameSpacing(..)+ , makeFrameset, framesetPage+ , Style(..)+ )++import WASH.HTML.HTMLMonad98 hiding (html)+import qualified WASH.CGI.CGI as CGI++ask :: (CGIMonad cgi) => WithHTML DOCUMENT cgi a -> cgi ()+ask = CGI.ask+htell :: (CGIMonad cgi) => WithHTML HTML IO () -> cgi a+htell = CGI.htell+askOffline :: (CGIMonad cgi) => WithHTML HTML cgi a -> (Element -> IO ()) -> cgi ()+askOffline = CGI.askOffline+makeImg :: (Monad cgi, AdmitChildIMG y) => Image -> HTMLField cgi IMG y ()+makeImg = CGI.makeImg+makeRef :: (CGIMonad cgi, AdmitChildA y, Monad m) => String -> WithHTML A m () -> cgi (WithHTML y m ())+makeRef = CGI.makeRef+makeA :: (CGIMonad cgi, AdmitChildA y) => String -> String -> HTMLField cgi A y ()+makeA = CGI.makeA+makePopupRef :: (CGIMonad cgi, AdmitChildA y) => String -> String -> HTMLField cgi A y ()+makePopupRef = CGI.makePopupRef+backLink :: (AdmitChildA x, Monad m) => HTMLCons A x m ()+backLink = CGI.backLink+hlink :: (AdmitChildA y, Monad m) => URL -> HTMLCons A y m ()+hlink = CGI.hlink+popuplink :: (AdmitChildA y, Monad m) => String -> URL -> HTMLCons A y m ()+popuplink = CGI.popuplink+restart :: CGI ()+restart = CGI.restart+makeForm :: (AdmitChildFORM y) => WithHTML FORM CGI a -> WithHTML y CGI ()+makeForm = CGI.makeForm+standardQuery :: String -> WithHTML FORM CGI a -> CGI ()+standardQuery = CGI.standardQuery+submit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y ()+submit = CGI.submit+submit0 :: (CGIMonad cgi, AdmitChildINPUT y) => cgi () -> HTMLField cgi INPUT y ()+submit0 = CGI.submit0+defaultSubmit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y ()+defaultSubmit = CGI.defaultSubmit+submitLink :: (CGIMonad cgi, AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLCons A y cgi ()+submitLink = CGI.submitLink+submitLink0 :: (AdmitChildA y) => CGI () -> HTMLCons A y CGI ()+submitLink0 = CGI.submitLink0+defaultSubmitLink :: (AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> CGI ()) -> HTMLCons A y CGI ()+defaultSubmitLink = CGI.defaultSubmitLink+submitx :: (AdmitChildINPUT y) => DTree cgi INPUT y -> HTMLField cgi INPUT y ()+submitx = CGI.submitx+resetField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField () INVALID)+resetField = CGI.resetField+activeInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => (a -> cgi ()) -> HTMLField cgi INPUT y ()+activeInputField = CGI.activeInputField+activate :: (CGIMonad cgi, InputHandle (i a), HasValue i, AdmitChildINPUT y) => (a -> cgi ()) -> HTMLField cgi INPUT y (i a INVALID) -> HTMLField cgi INPUT y (i a INVALID)+activate = CGI.activate+inputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => HTMLField cgi INPUT y (InputField a INVALID)+inputField = CGI.inputField+checkedTextInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe String -> Maybe String) -> HTMLField cgi INPUT y (InputField String INVALID)+checkedTextInputField = CGI.checkedTextInputField+textInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField String INVALID)+textInputField = CGI.textInputField+passwordInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => HTMLField cgi INPUT y (InputField a INVALID)+passwordInputField = CGI.passwordInputField+makeTextarea :: (CGIMonad cgi, AdmitChildTEXTAREA y) => String -> HTMLField cgi TEXTAREA y (InputField String INVALID)+makeTextarea = CGI.makeTextarea+checkboxInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID)+checkboxInputField = CGI.checkboxInputField+makeButton :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID)+makeButton = CGI.makeButton+radioButton :: (CGIMonad cgi, AdmitChildINPUT y, Show a) => RadioGroup a INVALID -> a -> HTMLField cgi INPUT y ()+radioButton = CGI.radioButton+radioError :: (CGIMonad cgi, AdmitChildIMG x) => RadioGroup a INVALID -> WithHTML x cgi ()+radioError = CGI.radioError+imageField :: (CGIMonad cgi, AdmitChildINPUT y) => Image -> HTMLField cgi INPUT y (InputField (Int, Int) INVALID)+imageField = CGI.imageField+selectMultiple :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> [a] -> [a] -> (Int, Int) -> HTMLField cgi SELECT y (InputField [a] INVALID)+selectMultiple = CGI.selectMultiple+selectSingle :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> Maybe a -> [a] -> HTMLField cgi SELECT y (InputField a INVALID)+selectSingle = CGI.selectSingle+selectBounded :: (CGIMonad cgi, AdmitChildSELECT y, Enum a, Bounded a, Read a, Show a, Eq a) => Maybe a -> HTMLField cgi SELECT y (InputField a INVALID)+selectBounded = CGI.selectBounded+checkedFileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe FileReference -> Maybe FileReference) -> HTMLField cgi INPUT y (InputField FileReference INVALID)+checkedFileInputField = CGI.checkedFileInputField+fileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField FileReference INVALID)+fileInputField = CGI.fileInputField++fieldSIZE :: (Monad m, AdmitAttrSIZE e, AttrValueSIZE v) => v -> WithHTML e m ()+fieldSIZE = WASH.HTML.HTMLMonad98.atSIZE+fieldMAXLENGTH :: (Monad m, AdmitAttrMAXLENGTH e, AttrValueMAXLENGTH v) => v -> WithHTML e m ()+fieldMAXLENGTH = WASH.HTML.HTMLMonad98.atMAXLENGTH+fieldVALUE :: (Monad m, AdmitAttrVALUE e, AttrValueVALUE v) => v -> WithHTML e m ()+fieldVALUE = WASH.HTML.HTMLMonad98.atVALUE++-- module HTMLWrapper+standardPage :: (AdmitChildHTML y, Monad m) => String -> WithHTML BODY m a -> WithHTML y m ()+standardPage = CGI.standardPage+htmlHeader :: (AdmitChildHTML y, Monad m) => String -> WithHTML HTML m a -> WithHTML y m ()+htmlHeader = CGI.htmlHeader+html :: (Monad m, AdmitChildHTML y) => WithHTML HTML m a -> WithHTML y m ()+html = CGI.html+cssHeader :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML HTML m a -> WithHTML y m ()+cssHeader = CGI.cssHeader+cssPage :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML BODY m a -> WithHTML y m ()+cssPage = CGI.cssPage++-- module Style+using :: (AdmitAttrSTYLE x, Monad m)+ => Style+ -> (WithHTML x m b -> c) -- ^a field constructor, typically 'HTMLField'+ -> WithHTML x m b -> c -- ^styled version of this constructor+using = CGI.using++makeFrame :: WithHTML FRAME IO () -> CGI () -> CGI FrameSet+makeFrame = CGI.makeFrame
+ WASH/CGI/HTMLMail.hs view
@@ -0,0 +1,10 @@+module WASH.CGI.HTMLMail where++import Prelude hiding (head,div,span)+import WASH.HTML.HTMLMonad hiding (map)+import WASH.Mail.MIME ++-- |transform HTML Element into document suitable for sending as email.+htmlDOC :: Element -> DOC+htmlDOC el = + binaryDOC "text" "html" (show el)
+ WASH/CGI/HTMLWrapper.hs view
@@ -0,0 +1,44 @@+module WASH.CGI.HTMLWrapper+ (module H, module WASH.CGI.HTMLWrapper) where++import qualified Prelude+import WASH.HTML.HTMLMonad as H hiding (html)++-- |create a standard XHTML page from a title string and body elements+standardPage :: (Prelude.Monad m) => + Prelude.String -> WithHTML x m a -> WithHTML y m ()+standardPage ttl elems =+ htmlHeader ttl (body_S (h1_S (text ttl) ## elems))++-- |create a standard XHTML page without heading from a title string and body elements+htmlHeader :: (Prelude.Monad m) =>+ Prelude.String -> WithHTML x m a -> WithHTML y m ()+htmlHeader ttl elems =+ html (head_S (title_S (text ttl))+ ## elems)++-- |create a standard XHTML page from a title string, a stylesheet URL and body+-- elements +cssPage :: (Prelude.Monad m) =>+ Prelude.String -> Prelude.String -> WithHTML x m a -> WithHTML y m ()+cssPage ttl cssurl elems =+ cssHeader ttl cssurl (body_S (h1_S (text ttl) ## elems))++-- |create an XHTML page with CSS reference but without heading from a title+-- string, the URL of the stylesheet and body elements+cssHeader :: (Prelude.Monad m) =>+ Prelude.String -> Prelude.String -> WithHTML x m a -> WithHTML y m ()+cssHeader ttl cssurl elems =+ html (head_S (do title_S (text ttl)+ link_S (do attr_SS "rel" "stylesheet"+ attr_SS "type" "text/css" + attr_SD "href" cssurl))+ ## elems)++-- |create a bare XHTML root tag with proper namespace attribute+html :: (Prelude.Monad m) =>+ WithHTML x m a -> WithHTML y m ()+html elems =+ html_T (do elems+ attr_SS "xmlns" "http://www.w3.org/1999/xhtml")+
+ WASH/CGI/HTTP.hs view
@@ -0,0 +1,42 @@+module WASH.CGI.HTTP where++import Char++data Method =+ OPTIONS+ | GET+ | HEAD+ | POST+ | PUT+ | DELETE+ | TRACE+ | CONNECT+ | Extension String+ deriving Eq++instance Show Method where+ showsPrec _ OPTIONS = showString "OPTIONS"+ showsPrec _ GET = showString "GET"+ showsPrec _ HEAD = showString "HEAD"+ showsPrec _ POST = showString "POST"+ showsPrec _ PUT = showString "PUT"+ showsPrec _ DELETE = showString "DELETE"+ showsPrec _ TRACE = showString "TRACE"+ showsPrec _ CONNECT = showString "CONNECT"+ showsPrec _ (Extension s) = showString s++instance Read Method where+ readsPrec _ s =+ let (token, rest) = span isAlphaNum s in+ [(+ case token of+ "OPTIONS" -> OPTIONS+ "GET" -> GET+ "HEAD" -> HEAD+ "POST" -> POST+ "PUT" -> PUT+ "DELETE" -> DELETE+ "TRACE" -> TRACE+ "CONNECT" -> CONNECT+ other -> Extension other+ , dropWhile isSpace rest)]
+ WASH/CGI/Images.hs view
@@ -0,0 +1,20 @@+module WASH.CGI.Images (nothing, question, nothingURL, questionURL) where++import WASH.CGI.CGITypes+import WASH.Utility.RFC2397+import WASH.Utility.JavaScript++rawNothing1 = "GIF89a\SOH\NUL\SOH\NUL\128\NUL\NUL\NUL\NUL\NUL\NUL\NUL\216!\249\EOT\SOH\NUL\NUL\NUL\NUL,\NUL\NUL\NUL\NUL\SOH\NUL\SOH\NUL\NUL\STX\STXD\SOH\NUL;"+rawNothing = "GIF89a\DLE\NUL\DLE\NUL\128\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL!\249\EOT\SOH\NUL\NUL\NUL\NUL,\NUL\NUL\NUL\NUL\DLE\NUL\DLE\NUL\NUL\STX\SO\132\143\169\203\237\SI\163\156\180\218\139\179>\ENQ\NUL;"++rawQuestion = "GIF89a\DLE\NUL\DLE\NUL\128\NUL\NUL\NUL\NUL\NUL\255\NUL\NUL!\249\EOT\SOH\NUL\NUL\NUL\NUL,\NUL\NUL\NUL\NUL\DLE\NUL\DLE\NUL\NUL\STX#\132\GS\EM\199\167\191\SUBP\140\182$\177\204\250\194\238\129\155\181Ub9E\136\SUB~\229\199\162\242\140\146\178}\DC4\NUL;"++nothing = FreeForm "nothing.gif" "image/gif" rawNothing+question = FreeForm "question.gif" "image/gif" rawQuestion++nothingURL = "javascript:" ++ jsShow rawNothing+questionURL = "javascript:" ++ jsShow rawQuestion++-- data URL not universally supported+nothingURLdata = encode ("image/gif", rawNothing)+questionURLdata = encode ("image/gif", rawQuestion)
+ WASH/CGI/InputHandle.hs view
@@ -0,0 +1,20 @@+-- © 2005 Peter Thiemann+{-|+ Internal use only.+ Provides access to class "InputHandle" and thus enables the construction + new instances of this class, which requires knowledge about programming of+ validations. + -} +module WASH.CGI.InputHandle where++import WASH.CGI.CGIInternals++class HasValue i where+ -- | extract a value from various kinds of input handles+ value :: i a VALID -> a++class InputHandle h where+ -- | transforms an unvalidated input handle into either an error or a valid handle+ validate :: h INVALID -> Either [ValidationError] (h VALID)+ isBound :: h INVALID -> Bool+ ihNames :: h INVALID -> [String]
+ WASH/CGI/LogEntry.hs view
@@ -0,0 +1,53 @@+-- © 2001- 2006 Peter Thiemann+-- |Definition of the type of the redo log entries+module WASH.CGI.LogEntry where++import WASH.CGI.RawCGITypes++data PARAMETER + = PAR_RESULT String -- ^ result of an IO operation shown as a string+ | PAR_VALUES CGIParameters -- ^ record of a form input+ | PAR_MARK String -- ^ recorded stateID before the mark+ | PAR_IGNORED+ | PAR_TRANS String -- ^ recorded stateID at start of transaction+ | PAR_CRE_TV String String -- ^ record of a @create@ or @init@ operation+ | PAR_REM_TV String -- ^ record of a @remove@ operation+ | PAR_GET_TV String String -- ^ record of a @get@ operation+ | PAR_SET_TV String String -- ^ record of a @set@ operation+ | PAR_DB String -- ^ record entry for all DB operations.+ -- the string is already the result of a + -- show operation for DB tuples, so it is+ -- doubly encoded :-(++instance Show PARAMETER where+ showsPrec i par = case par of+ PAR_RESULT str -> showString ":R" . shows str+ PAR_VALUES cps -> showString ":V" . shows cps+ PAR_MARK str -> showString ":M" . shows str+ PAR_IGNORED -> showString ":I"+ PAR_TRANS str -> showString ":T" . shows str+ PAR_CRE_TV n v -> showString ":C" . shows n . shows v+ PAR_REM_TV n -> showString ":E" . shows n+ PAR_GET_TV n v -> showString ":G" . shows n . shows v+ PAR_SET_TV n v -> showString ":S" . shows n . shows v+ PAR_DB str -> showString ":D" . shows str++instance Read PARAMETER where+ readsPrec i str = case str of+ ':' : rest -> g rest+ _ -> []+ where g ('R' : str) = [(PAR_RESULT v, rest) | (v, rest) <- reads str]+ g ('V' : str) = [(PAR_VALUES v, rest) | (v, rest) <- reads str]+ g ('M' : str) = [(PAR_MARK v, rest) | (v, rest) <- reads str]+ g ('I' : str) = [(PAR_IGNORED, str)]+ g ('T' : str) = [(PAR_TRANS v, rest) | (v, rest) <- reads str]+ g ('C' : str) = [(PAR_CRE_TV n v, rest)+ |(n, str1) <- reads str, (v, rest) <- reads str1]+ g ('E' : str) = [(PAR_REM_TV n, rest)+ |(n, rest) <- reads str]+ g ('G' : str) = [(PAR_GET_TV n v, rest)+ |(n, str1) <- reads str, (v, rest) <- reads str1]+ g ('S' : str) = [(PAR_SET_TV n v, rest)+ |(n, str1) <- reads str, (v, rest) <- reads str1]+ g ('D' : str) = [(PAR_DB v, rest) | (v, rest) <- reads str]+ g _ = []
+ WASH/CGI/MakeTypedName.hs view
@@ -0,0 +1,17 @@+module WASH.CGI.MakeTypedName where++import WASH.CGI.Types++import WASH.Utility.SHA1+import qualified WASH.Utility.Base32 as Base32++-- |Create a probabilistically unique filename from a name and a type+-- descriptor. +makeTypedName :: String -> TySpec -> String+makeTypedName s tys = + Base32.encode (sha1 s) ++ '-' : Base32.encode (sha1 (tid tys ""))++-- |Create a probabilistically unique filename from a name and the type of a given value. +makeTypedNameFromVal :: Types a => String -> a -> String+makeTypedNameFromVal name val =+ makeTypedName name (ty val)
+ WASH/CGI/PPM.hs view
@@ -0,0 +1,285 @@+-- © 2001 Peter Thiemann+module WASH.CGI.PPM where++import Char++data Pixmap =+ Pixmap { width :: Int+ , height :: Int+ , maximumColorValue :: Int+ , pixelFun :: Int -> Int -> Pixel+ }++type Pixel = (Int, Int, Int)++instance Show Pixmap where+ show pm = if maximumColorValue pm > 255+ then showPixmap pm "P3" showAsciiPixel+ else showPixmap pm "P6" showBinaryPixel+ +showPixmap pm code showPixel =+ let w = width pm+ h = height pm+ in+ code +++ '\n' : (show w) +++ '\n' : (show h) +++ '\n' : (show $ maximumColorValue pm) +++ '\n' : [ ch | y <- [1..h], x <- [1..w], ch <- showPixel (pixelAt pm x y)]++showAsciiPixel (r, g, b) =+ show r ++ ' ' : show g ++ ' ' : show b ++ "\n"++showBinaryPixel (r, g, b) =+ [chr r, chr g, chr b]++instance Read Pixmap where+ readsPrec i = readsPixmap++readsPixmap ('P':'3':rest) = readsPixmap1 readsAsciiPixel (dropWhile isSpace rest)+readsPixmap ('P':'6':rest) = readsPixmap1 readsBinaryPixel (dropWhile isSpace rest)+readsPixmap str = []++readsPixmap1 readsPixel str = + do (w, rest1) <- reads str+ (h, rest2) <- reads (dropWhile isSpace rest1)+ (m, rest3) <- reads (dropWhile isSpace rest2)+ (pixs, rest4) <- readsPixels w h readsPixel (dropWhile isSpace rest3)+ return (Pixmap { width = w, + height = h, + maximumColorValue = m, + pixelFun = \x y -> (pixs !! y) !! x }+ ,dropWhile isSpace rest4)++readsPixels w h readsPixel str =+ if h > 0 + then do (sl1, rest1) <- readsScanline w readsPixel str+ (sls, rest2) <- readsPixels w (h-1) readsPixel rest1+ return (sl1 : sls, rest2)+ else return ([], str)++readsScanline w readsPixel str =+ if w > 0 + then do (pix1, rest1) <- readsPixel str+ (pixs, rest2) <- readsScanline (w-1) readsPixel rest1+ return (pix1 : pixs, rest2)+ else return ([], str)++readsAsciiPixel str =+ do (r, rest1) <- reads (dropWhile isSpace str)+ (g, rest2) <- reads (dropWhile isSpace rest1)+ (b, rest3) <- reads (dropWhile isSpace rest2)+ return ((r,g,b), rest3)++readsBinaryPixel (cr:cg:cb:rest) =+ return ((ord cr, ord cg, ord cb), rest)+readsBinaryPixel _ =+ []+ + +++-- ======================================================================++create :: Int -> Int -> Int -> Pixel -> Pixmap+create w h m p = + Pixmap w h m (const (const p))++oval :: Pixmap -> (Int, Int) -> (Int, Int) -> Pixel -> Bool -> Pixmap+line :: Pixmap -> (Int, Int) -> (Int, Int) -> Pixel -> Pixmap+rectangle :: Pixmap -> (Int, Int) -> (Int, Int) -> Pixel -> Bool -> Pixmap+-- arc+-- poly+-- text+-- bitmap+-- image ++oval pm (xul,yul) (xlr,ylr) p fill =+ pm { pixelFun = fun }+ where w2 = (xlr - xul) `div` 2+ h2 = (ylr - yul) `div` 2+ xm = xul + w2+ ym = yul + h2+ lastfun = pixelFun pm+ fun x y | y < yul || y > ylr || x < xul || x > xlr = lastfun x y+ | d <= 1.0 && (fill || d >= 0.9) = p+ | otherwise = lastfun x y+ where d = fromIntegral ((x - xm) ^ 2) / fromIntegral (w2 ^ 2) ++ fromIntegral ((y - ym) ^ 2) / fromIntegral (h2 ^ 2)++rectangle pm (xul,yul) (xlr,ylr) p fill =+ pm { pixelFun = fun }+ where lastfun = pixelFun pm+ fun x y | y < yul || y > ylr || x < xul || x > xlr = lastfun x y+ | x == xul || x == xlr || y == yul || y == ylr || fill = p+ | otherwise = lastfun x y+-- +line = line2++line1 pm (xul,yul) (xlr,ylr) p =+ pm { pixelFun = fun }+ where lastfun = pixelFun pm+ fun x y | x < xul && x < xlr || x > xul && x > xlr || y < yul && y < ylr || y > yul && y > ylr = lastfun x y+ | (x,y) `elem` points = p+ | otherwise = lastfun x y+ -- suppose abs dx >= abs dy+ dx = xlr - xul+ dy = ylr - yul+ adx = abs dx+ ady = abs dy+ sdx = signum dx+ sdy = signum dy+ points | adx >= ady = k adx ady sdx sdy xlr ylr (adx `div` 2) (xul,yul)+ | otherwise = + [(x,y) | (y,x) <- k ady adx sdy sdx ylr xlr (ady `div` 2) (yul,xul)]+ k adx ady sdx sdy xlr ylr = m+ where m v (x, y) | x == xlr && y == ylr = [(x,y)]+ | otherwise = (x, y) : m nv' (nx, ny)+ where+ nv = v - ady+ nv' | nv > 0 = nv+ | otherwise = nv + adx+ nx = x + sdx+ ny | nv > 0 = y+ | otherwise = y + sdy++line2 pm (xul,yul) (xlr,ylr) p =+ pm { pixelFun = fun }+ where lastfun = pixelFun pm+ dx = fromIntegral (xlr - xul)+ dy = fromIntegral (ylr - yul)+ xul' = fromIntegral xul+ yul' = fromIntegral yul+-- solve: dx1 * dx + dy1 * dy = 0+ dx1 = - dy+ dy1 = dx+ divisor = dy1 * dx - dy+ + fun x y | x < xul && x < xlr ||+ x > xul && x > xlr || + y < yul && y < ylr ||+ y > yul && y > ylr = lastfun x y+ | dx == 0 && x == xul ||+ dy == 0 && y == yul = p+ | d <= lineWidth = p+ | otherwise = lastfun x y+ where x' = fromIntegral x+ y' = fromIntegral y+-- solve: x0 = x + t * dx1 +-- && y0 = y + t * dy1+-- && x0 = xul + s * dx +-- && y0 = yul + s * dy+-- for x0, y0, s, t+ s = ((x' - xul') * dy1 + yul' - y') / divisor+ x0 = xul' + s * dx+ y0 = yul' + s * dy+ d = (x0 - x')^2 + (y0 - y')^2+ lineWidth = 1.0++point pm (x0,y0) p =+ pm { pixelFun = fun }+ where lastfun = pixelFun pm+ fun x y | x == x0 && y == y0 = p+ | otherwise = lastfun x y++comp pm1 pm2 (xul,yul) p =+ pm1 { pixelFun = fun }+ where + w2 = width pm2+ h2 = height pm2+ lastfun = pixelFun pm1+ fun x y | x2 >= 0 && y2 >= 0 && x2 < w2 && y2 < h2 && p2 /= p = p2+ | otherwise = lastfun x y+ where x2 = x - xul+ y2 = y - yul+ p2 = pixelFun pm2 x2 y2++-- for efficiency and versatility rely on external programs:++-- ppmmake : create a canvas+-- pbmtext : create a text image (pbmtopgm; pgmtoppm)+-- pnmcomp : compose two images+-- giftopnm : image to portable anymap++-- missing: ppmline ppmoval++pixelAt :: Pixmap -> Int -> Int -> Pixel+pixelAt =+ pixelFun++-- ======================================================================+-- a picture data type+-- ======================================================================+type Color = (Int, Int, Int)+data Picture = + Circle Bool -- radius 1 around origin (filled?)+ | Square Bool -- unit square, origin= lower left (filled?)+ | Line -- from origin to (1,0)+ | Colored Color Picture+ | Translate (Double, Double) Picture+ | Rotate Double Picture -- around origin+ | Scale (Double, Double) Picture+ | Invert Picture+ | And [Picture]+ | Or [Picture]++maxcv (Circle _) = 0+maxcv (Square _) = 0+maxcv (Line) = 0+maxcv (Colored (r,g,b) pic) = maximum [r,g,b,maxcv pic]+maxcv (Translate _ pic) = maxcv pic+maxcv (Rotate _ pic) = maxcv pic+maxcv (Scale _ pic) = maxcv pic+maxcv (Invert pic) = maxcv pic+maxcv (And pics) = maximum (0 : map maxcv pics)+maxcv (Or pics) = maximum (0 : map maxcv pics)++render :: Picture -> Int -> Int -> Color -> Pixmap+render pic w h bg =+ Pixmap { width = w, height = h, maximumColorValue = maxcv pic, pixelFun = pixelAt }+ where pixelAt x y =+ case renderPix pic bg (fromIntegral x) (fromIntegral y) (sqrt 2) of+ Nothing -> (0,0,0)+ Just cl -> cl++renderPix pic bg fx fy fr =+ case pic of+ Circle filled -> -- radius 1 around origin (filled?)+ let ra = fx * fx + fy * fy in+ if filled then+ if ra <= 1 + fr then Just bg else Nothing+ else+ if abs (ra - 1) <= fr then Just bg else Nothing+ Square filled -> -- unit square, origin= lower left (filled?)+ if filled then+ if fx + fr >= 0 && fx - fr <= 1 && fy + fr >= 0 && fy - fr <= 1 + then Just bg else Nothing+ else+ if abs fx <= fr && fy + fr >= 0 && fy - fr <= 1 + || abs fy <= fr && fx + fr >= 0 && fx - fr <= 1 + || abs (fx - 1) <= fr && fy + fr >= 0 && fy - fr <= 1 + || abs (fy - 1) <= fr && fx + fr >= 0 && fx - fr <= 1 + then Just bg else Nothing+ Line -> -- from origin+ if abs fx <= fr && fy + fr >= 0 && fy - fr <= 1 + then Just bg else Nothing + Colored clr pic ->+ renderPix pic bg fx fy fr >> Just clr+ Translate (dx, dy) pic ->+ renderPix pic bg (fx - dx) (fy - dy) fr+ Rotate phi pic -> -- around origin+ renderPix pic bg (fx * cos (- phi) - fy * sin (- phi)) + (fx * sin (- phi) + fy * cos (- phi)) fr+ Scale (sx, sy) pic ->+ renderPix pic bg (fx / sx) (fy / sy) (max (abs (fr / sx)) (abs (fr / sy)))+ Invert pic ->+ case renderPix pic bg fx fy fr of+ Just _ -> Nothing+ Nothing -> Just bg+ And pics ->+ foldl (\ j pic -> j >> renderPix pic bg fx fy fr) (Just bg) pics+ Or pics ->+ foldl (\ j pic -> case j of + Nothing -> renderPix pic bg fx fy fr+ Just clr -> Just clr+ ) Nothing pics
+ WASH/CGI/Persistent2.hs view
@@ -0,0 +1,170 @@+-- © 2001, 2002, 2003 Peter Thiemann+{-|This is the preferred, type-indexed implementation of server-side state.++Glossary++A persistent entity (PE) is a time-indexed, named global value.+The current value of a PE is the value that the PE has now.+A handle gives access to a snapshot of a persistent entity at a particular time, potentially in the past.+A handle is /current/ if the value of the PE has not been @set@ or @add@ed to after the creation of the handle.+-}++module WASH.CGI.Persistent2 (T, init, get, set, add, current) where++import WASH.CGI.CGIConfig++import System+import Prelude hiding (init)+import qualified Prelude (init)+import List hiding (init)+import qualified List (init)+import Maybe+import IO+import Directory+import Monad+import Random++import WASH.Utility.Auxiliary+import WASH.CGI.CGI hiding (head, div, span, map)+import WASH.CGI.BaseCombinators (unsafe_io)+import WASH.CGI.Types+import qualified WASH.Utility.Locking as L++import WASH.CGI.StateItem+import WASH.CGI.MakeTypedName+++-- |@init name initialValue@ creates a new PE with name @name@ with initial+-- value @initialValue@ and returns the handle to the initial value. If the PE+-- already exists, then @init@ returns the handle to the current value.+init :: (Read a, Show a, Types a) => String -> a -> CGI (T a)+-- |@get handle@ retrieves the value of @handle@. This value may not be current+-- because the handle may point to a snapshot from the past.+get :: (Read a, Types a) => T a -> CGI a+-- |@set handle newValue@ tries to overwrite the value of the pe pointed to by+-- @handle@ with @newValue@. Succeeds @Just handle1@ if @handle@ is current, in+-- this case it returns a handle to the new value. Fails @Nothing@ if the handle+-- is not current. +set :: (Read a, Show a, Types a) => T a -> a -> CGI (Maybe (T a))+-- |@add handle addValue@ conceptually, this operation adds @addValue@ to the+-- set of values stored in @handle@. Since this set is represented as a list,+-- @handle@ must point to a value of type @[a]@. Since the PE is assumed to+-- contain a set, it does not matter if @handle@ is current. However, the+-- returned handle is guaranteed to be current with a value that contains+-- @addValue@.+add :: (Read a, Show a, Types a) => T [a] -> a -> CGI (T [a])+-- |@current handle@ returns a handle to the PE pointed to by+-- @handle@. It returns @Nothing@ if @handle@ is still /current/. Otherwise, it+-- returns @Just newHandle@ where @newHandle@ is /current/ in the sense defined+-- above. Using the @newHandle@ obtained from @current@ explicitly discards the+-- value pointed to by @handle@ in favor of a value that may have been stored+-- by a concurrently executing script. Use with caution!+current :: (Read a, Types a) => T a -> CGI (Maybe (T a))+-- +++data P a = P { nr :: Int, vl :: a }+ deriving (Read, Show)++t :: String -> P a -> T a+t name (P i a) = T name i++traceInit =+ -- writeDebugFile (persistent2Dir ++ "TRACE") "" >>+ return ()+trace s = + -- appendFile (persistent2Dir ++ "TRACE") (s ++ "\n") >>+ return ()++init name val = do+ unsafe_io $+ assertDirectoryExists (List.init persistent2Dir) (return ())+ io $ catch (+ do traceInit+ trace ("P2: init " ++ name ++ " " ++ show val)+ trace ("P2: ty = " ++ show myTyspec)+ trace ("P2: tid ty = " ++ tid myTyspec "")+ trace ("P2: typedName = " ++ typedName)+ trace ("P2: fileName = " ++ show fileName)+ L.obtainLock fileName+ trace ("P2.init: after obtainLock ")+ contents <- readFileStrictly fileName+ trace ("P2.init: after readFileStrictly " ++ contents)+ L.releaseLock fileName+ trace ("P2.init: after releaseLock[1] " ++ contents)+ pairs <- return $ read contents+ return $ t name $ head $ pairs+ )+ $ \ ioError ->+ do trace ("P2.init: ioError caught")+ nonce <- randomIO+ let initialP = P nonce val+ writeFile fileName (show [initialP])+ trace ("P2.init: writing " ++ show [initialP])+ L.releaseLock fileName+ return (t name initialP)+ where+ fileName = persistent2Dir ++ typedName+ myTyspec = ty val+ typedName = makeTypedName name myTyspec++get tn@(T name i) =+ unsafe_io $+ do trace ("P2: get " ++ name ++ " " ++ show i)+ L.obtainLock fileName+ contents <- readFileStrictly fileName+ L.releaseLock fileName+ trace ("P2.get: fileName = " ++ show fileName)+ pairs <- return $ read contents+ return $ vl $ fromJust $ find ((== i) . nr) pairs+ where+ typedName = makeTypedNameFromVal name (tvirtual tn)+ fileName = persistent2Dir ++ typedName++set (T name i) val =+ io $+ do trace ("P2: set " ++ name ++ " " ++ show i ++ " " ++ show val)+ L.obtainLock fileName+ contents <- readFileStrictly fileName+ pairs <- return $ read contents+ i' <- randomIO+ if nr (head pairs) == i+ then do writeFile fileName (show (P i' val : take 15 pairs))+ L.releaseLock fileName+ return (Just (T name i'))+ else do L.releaseLock fileName+ return Nothing+ where+ typedName = makeTypedNameFromVal name val+ fileName = persistent2Dir ++ typedName++add (T name _) val =+ io $+ do trace ("P2: add " ++ name ++ " " ++ show val)+ L.obtainLock fileName+ contents <- readFileStrictly fileName+ pairs <- return $ read contents+ let P i vals = head pairs+ i' <- randomIO+ writeFile fileName (show (P i' (val : vals) : take 15 pairs))+ L.releaseLock fileName+ return (T name i')+ where+ typedName = makeTypedNameFromVal name [val]+ fileName = persistent2Dir ++ typedName++current tn@(T name i) =+ io $+ do trace ("P2: current " ++ name ++ " " ++ show i)+ L.obtainLock fileName+ contents <- readFileStrictly fileName+ L.releaseLock fileName+ pairs <- return $ read contents+ let P i' vals = head pairs+ if i==i'+ then return Nothing+ else return (Just (t name (head pairs)))+ where+ typedName = makeTypedNameFromVal name (tvirtual tn)+ fileName = persistent2Dir ++ typedName+
+ WASH/CGI/RawCGI.hs view
@@ -0,0 +1,10 @@+-- © 2001, 2002 Peter Thiemann+module WASH.CGI.RawCGI+ ( CGIProgram+ , CGIOption(..), CGIOptions+ , start+ ) where++import WASH.CGI.CGITypes+import WASH.CGI.RawCGIInternal+
+ WASH/CGI/RawCGIInternal.hs view
@@ -0,0 +1,385 @@+-- © 2001, 2002 Peter Thiemann+-- |Low-level interface to CGI scripting.+module WASH.CGI.RawCGIInternal + (module WASH.CGI.RawCGITypes, module WASH.CGI.RawCGIInternal) + where+-- (CGIParameter, CGIParameters, start, assocParm, assoc)++import Array+import Char+import IO+import List+import Maybe+import Random+import System+import WASH.Utility.Auxiliary+import WASH.Utility.Unique+import qualified WASH.Utility.URLCoding as URLCoding+import qualified WASH.Utility.RFC2279 as RFC2279++import WASH.CGI.CGIConfig+import WASH.CGI.CGITypes+import WASH.CGI.HTTP+import WASH.CGI.RawCGITypes+import WASH.Utility.BulkIO (rawGetBytes)++import WASH.Utility.Hex++import qualified WASH.CGI.Debug as Debug++getGenericOption isOption defaultOption options =+ fromJust (find isOption (reverse (defaultOption:options)))++-- | Decoding of 'CGIOption'.+isPortOption NoPort = True+isPortOption AutoPort = True+isPortOption (Port _) = True+isPortOption _ = False++getPortOption =+ getGenericOption isPortOption AutoPort++-- | Decoding of 'CGIOption'.+isHttpsOption NoHttps = True+isHttpsOption AutoHttps = True+isHttpsOption _ = False++getHttpsOption =+ getGenericOption isHttpsOption AutoHttps++-- | Decoding of 'CGIOption'.+isURLOption FullURL = True+isURLOption PartialURL = True+isURLOption _ = False++getURLOption =+ getGenericOption isURLOption PartialURL++-- | Decoding of 'CGIOption'.+isSessionOption (SessionMode _) = True+isSessionOption _ = False++getSessionMode =+ unSessionMode . getGenericOption isSessionOption (SessionMode LogOnly)++fieldName = fst+fieldContents = snd++-- |Initial and default content type of a link submission+contentTypeUrlencoded = "application/x-www-form-urlencoded"++-- |Construct a CGI environment from the input and output handle of the current+-- connection and the CGI variables in the environment.+initEnv :: Handle -> Handle -> IO CGIEnv+initEnv hIn hOut =+ do server_name <- protectedGetEnv "SERVER_NAME" "localhost"+ server_port <- protectedGetEnv "SERVER_PORT" "80"+ server_software <- protectedGetEnv "SERVER_SOFTWARE" ""+ server_protocol <- protectedGetEnv "SERVER_PROTOCOL" ""+ gateway_interface <- protectedGetEnv "GATEWAY_INTERFACE" ""+ script_name <- protectedGetEnv "SCRIPT_NAME" ""+ request_method <- protectedGetEnv "REQUEST_METHOD" "GET"+ content_length <- protectedGetEnv "CONTENT_LENGTH" "0"+ content_type <- protectedGetEnv "CONTENT_TYPE" contentTypeUrlencoded+ http_cookie <- protectedGetEnv "HTTP_COOKIE" ""+ http_accept <- protectedGetEnv "HTTP_ACCEPT" ""+ path_info <- protectedGetEnv "PATH_INFO" ""+ path_translated <- protectedGetEnv "PATH_TRANSLATED" ""+ remote_host <- protectedGetEnv "REMOTE_HOST" ""+ remote_addr <- protectedGetEnv "REMOTE_ADDR" ""+ remote_user <- protectedGetEnv "REMOTE_USER" ""+ auth_type <- protectedGetEnv "AUTH_TYPE" ""+ https <- protectedGetEnv "HTTPS" "off"+ raw_args <- getArgs+ let byteCount :: Int+ byteCount = read ('0':content_length)+ httpMethod :: Method+ httpMethod = read request_method+ raw_contents <- case httpMethod of+ GET -> return ""+ _ -> rawGetBytes hIn byteCount+ return+ CGIEnv { serverName = server_name+ , serverPort = server_port+ , serverSoftware= server_software+ , serverProtocol = server_protocol+ , scriptName = script_name+ , gatewayInterface = gateway_interface+ , requestMethod = httpMethod+ , contentLength = content_length+ , contentType = content_type+ , httpCookie = http_cookie+ , httpAccept = http_accept+ , pathInfo = path_info+ , pathTranslated = path_translated+ , remoteHost = remote_host+ , remoteAddr = remote_addr+ , remoteUser = remote_user+ , authType = auth_type+ , rawContents = raw_contents+ , rawArgs = raw_args+ , handle = hOut+ , httpsEnabled = (https == "on" || server_port == "443")+ }++-- |Main entry point for low-level CGI scripts. Takes a list of 'CGIOption' and+-- a 'CGIProgram' and runs it as a CGI script.+start :: CGIOptions -> (CGIInfo -> CGIParameters -> IO ()) -> IO ()+start options f = + do env <- initEnv stdin stdout+ Debug.logInput env+ -- use from a CGI program forces standard replay implementation+ startEnv env (SessionMode LogOnly : options) f ++startEnv :: CGIEnv -> CGIOptions -> (CGIInfo -> CGIParameters -> IO ()) -> IO ()+startEnv env options f =+ do let portString = + case getPortOption options of+ AutoPort -> ':' : serverPort env+ NoPort -> ""+ Port num -> ':' : show num+ schemeString =+ case getHttpsOption options of+ AutoHttps -> if httpsEnabled env then "https" else "http"+ NoHttps -> "http"+ myurl = + case getURLOption options of+ FullURL ->+ schemeString ++ "://" ++ serverName env ++ portString +++ scriptName env ++ pathInfo env+ PartialURL ->+ scriptName env ++ pathInfo env+ sessionMode =+ getSessionMode options+ methodIsGet + = requestMethod env == GET+ contentIsURLEncoded+ = contentTypeUrlencoded == map toLower (contentType env)+ contents = rawContents env+ rawDecodedParameters + | methodIsGet = []+ | contentIsURLEncoded = map decodeLine $ parameterLines contents+ | otherwise = decodeMultiPart (contentType env) contents+ parsed_cookies = parseCookies $ httpCookie env+ info = CGIInfo { cgiUrl = URL myurl+ , cgiPathInfo = pathInfo env+ , cgiScriptName = scriptName env+ , cgiContentType = contentType env+ , cgiContents = contents+ , cgiCookies = parsed_cookies+ , cgiArgs = rawArgs env+ , cgiHandle = handle env+ , cgiSessionMode = sessionMode+ }+ decodedParameters <- resolveFiles rawDecodedParameters+ -- appendDebugFile "/tmp/CGIDECODED" (show decodedParameters)+ f info decodedParameters++resolveFiles :: [(String, CGIRawValue)] -> IO CGIParameters+resolveFiles =+ let resolveOne (key, rv) =+ case rv of+ CGIRawString s -> + return (key, s)+ CGIRawFile fileName contentType fileContents ->+ do localName <- inventFilePath+ writeFile localName fileContents+ let fileRef = FileReference+ { fileReferenceName = localName+ , fileReferenceContentType = contentType+ , fileReferenceExternalName = fileName+ }+ return (key, show fileRef)+ in mapM resolveOne++parseCookies :: String -> [(String, String)]+parseCookies str = + let s0 = dropWhile isSpace str in+ if null s0 then [] else+ let (item, rest) = span (/= ';') s0 in+ case span (/= '=') item of+ (key, '=':value) ->+ (key, value) : parseCookies (dropWhile (== ';') rest)+ _ -> + error ("Trying to parse cookie: " ++ str)++dropSpecialParameters :: [(String,a)] -> [(String,a)]+dropSpecialParameters = filter (f . fieldName)+ where f ('=':_) = False+ f _ = True++decodeMultiPart :: String -> String -> [(String, CGIRawValue)]+decodeMultiPart contentType contents+ = let Just boundary = extractBoundary contentType + startBoundary = '-':'-':boundary+ g source = case + (+ advanceIC startBoundary source >>= \afterBoundary ->+ case afterBoundary of + '-':_ -> Nothing+ '\13':'\10':body ->+ advanceIC "content-disposition: form-data; name=\"" body+ >>= \fieldNameRest ->+ let (fieldName, rest) = span (/= '\"') fieldNameRest in+ advanceIC "\"" rest+ >>= \mayBeFileNameRest ->+ (case mayBeFileNameRest of+ ';':_ -> advanceIC "; filename=\"" mayBeFileNameRest+ >>= \fileNameRest ->+ let (fileName, rest) = span (/= '\"') fileNameRest in+ advanceIC "\"" rest+ >>= \mayBeContentTypeRest ->+ return (Just fileName, mayBeContentTypeRest)+ _ -> return (Nothing, mayBeFileNameRest))+ >>= \ (mFileName, fileNameRest) ->+ let (contentType, rest) =+ case advanceIC "\ncontent-type: " fileNameRest of+ Just contentTypeRest -> span (/= '\13') contentTypeRest+ Nothing -> ("text/plain", fileNameRest) in+ advanceIC "\n\n" rest+ >>= \contentRest ->+ extractContents startBoundary contentRest+ >>= \ (fieldContents, rest) ->+ -- fieldName must be rfc1522decoded (?)+ let moreParms = g rest + rawvalue = case mFileName of+ Nothing ->+ CGIRawString $ RFC2279.decode fieldContents+ Just fileName ->+ CGIRawFile fileName contentType fieldContents+ in return ((RFC2279.decode fieldName, rawvalue) : moreParms)+ )+ of+ Just parameters -> parameters+ Nothing -> []+ in g contents++extractContents :: String -> String -> Maybe (String, String)+extractContents boundary source+ = g "" source+ where g rev "" = Nothing+ g rev ('\r':'\n':xs) = case advanceIC boundary xs of+ Just _ -> Just (reverse rev, xs)+ Nothing -> g ('\n':'\r':rev) xs+ g rev (x:xs) = g (x:rev) xs+++extractBoundary :: String -> Maybe String+extractBoundary contentType = advanceIC "multipart/form-data; boundary=" contentType ++advanceIC :: String -> String -> Maybe String+advanceIC [] ys = Just ys+advanceIC xs [] = Nothing+advanceIC (' ':xs) (y:ys)+ | isSpace y = advanceIC xs (dropWhile isSpace ys)+advanceIC ('\n':xs) ('\13':'\10':ys)+ = advanceIC xs ys+advanceIC (x:xs) (y:ys) + | toUpper x == toUpper y = advanceIC xs ys+ | otherwise = Nothing++parameterLines :: String -> [String]+parameterLines "" = []+parameterLines xs = let (firstPar, restPar) = span (/= '&') xs in+ case restPar of+ '&' : moreParameters -> firstPar : parameterLines moreParameters+ _ -> [firstPar]++decodeLine :: String -> (String, CGIRawValue)+decodeLine str = + let (name, '=':value) = span (/= '=') str in+ ( RFC2279.decode $ URLCoding.decode name+ , CGIRawString $ RFC2279.decode $ URLCoding.decode value)++assocParm :: String -> CGIParameters -> Maybe CGIValue+assocParm key =+ listToMaybe . assocParmL key++assocParmL :: String -> CGIParameters -> [CGIValue]+assocParmL key =+ map fieldContents . assocParmR key++assocParmR :: String -> CGIParameters -> CGIParameters+assocParmR key =+ filter (\parm -> fieldName parm == key) ++assoc :: (Eq a) => a -> [(a,b)] -> Maybe b+assoc key alist =+ ass alist + where ass ((a,b):rest) = if a == key then Just b else ass rest+ ass [] = Nothing -- error ("assoc ("++show key++") "++show alist)++-- update :: [(a,b)] -> a -> b -> [(a,b)]+-- update alist a b = (a,b) : alist++fieldNames :: CGIParameters -> [String]+fieldNames = map fieldName++-- encryption++generateKey :: IO (Maybe (Integer, String, String))+generateKey =+ try (openFile keyFile ReadMode) >>= g+ where+ g (Left ioerror) =+ return Nothing+ g (Right h) =+ do size <- hFileSize h+ let size2 = size `div` 2+ pos <- randomRIO (0, size2)+ if pos < 0+ then return Nothing + else do hSeek h AbsoluteSeek pos+ xs <- hGetContents h+ g <- getStdGen+ return (Just (pos+ ,randomRs (minBound, maxBound) g+ ,extendRandomly xs))++extendRandomly :: [Char] -> [Char]+extendRandomly xs = h 0 xs+ where h n (x:xs) = x : h (n + ord x) xs+ h n [] = randoms (mkStdGen n)++nrNonces :: Int+nrNonces = 16++makeEncoder :: Maybe (Integer, String, String) -> String -> String+makeEncoder Nothing xs = xs+makeEncoder (Just (i, nonces, keys)) xs = + show i ++ ';' : encrypt1 (take nrNonces nonces ++ xs) keys++decode :: String -> IO String+decode inp = g (reads inp)+ where+ g :: [(Integer, String)] -> IO String+ g ((pos, ';':encrypted) : _) = + do h <- openFile keyFile ReadMode+ hSeek h AbsoluteSeek pos+ xs <- hGetContents h+ return (drop nrNonces $ decrypt1 encrypted (extendRandomly xs))+ g _ = return inp++encrypt1 inp keys = map chr (enc 0 (map ord inp) (map ord keys))+ where enc acc [] okeys = []+ enc acc (oinp : oinps) (okey : okeys) =+ let out = (oinp + okey + acc) `mod` 256 in+ out : enc ((acc + oinp) `mod` 256) oinps okeys++decrypt1 einp keys = map chr (dec 0 (map ord einp) (map ord keys))+ where dec acc [] okeys = []+ dec acc (oeinp : oeinps) (okey : okeys) =+ let oinp = (512 + oeinp - okey - acc) `mod` 256 in+ oinp : dec ((acc + oinp) `mod` 256) oeinps okeys++encrypt, decrypt :: String -> String -> String+encrypt = zipWith cadd+cadd c1 c2 = chr (ord c1 + ord c2 `mod` 256)+decrypt = zipWith csub+csub c1 c2 = chr ((ord c1 + 256 - ord c2) `mod` 256)+{-- +import Bits -- ghc specific+encrypt = zipWith cxor+decrypt = zipWith cxor+cxor c1 c2 = chr (ord c1 `xor` ord c2)+--}
+ WASH/CGI/RawCGITypes.hs view
@@ -0,0 +1,61 @@+-- © 2001-2006 Peter Thiemann+-- | Low-level types for raw CGI programming.++module WASH.CGI.RawCGITypes where++import IO++import WASH.CGI.CGITypes+import WASH.CGI.HTTP++type CGIProgram = (CGIInfo -> CGIParameters -> IO ())++type CGIParameter = (String, CGIValue)+type CGIParameters = [CGIParameter]++type CGIValue = String++-- | internal representation of a CGI parameter value+data CGIRawValue =+ CGIRawString String+ | CGIRawFile String String String -- ^ name, contentType, content++data CGIInfo = + CGIInfo { cgiUrl :: URL+ , cgiPathInfo :: String+ , cgiScriptName :: String+ , cgiContentType :: String+ , cgiContents :: String+ , cgiCookies :: [(String, String)]+ , cgiArgs :: [String]+ , cgiHandle :: Handle+ , cgiSessionMode :: SessionMode+ }++-- | corresponding to CGI environment variables+data CGIEnv =+ CGIEnv { serverName :: String+ , serverPort :: String+ , serverSoftware :: String+ , serverProtocol :: String+ , gatewayInterface :: String+ , scriptName :: String+ , requestMethod :: Method+ , contentLength :: String+ , contentType :: String+ , httpAccept :: String+ , httpCookie :: String+ , pathInfo :: String+ , pathTranslated :: String+ , remoteHost :: String+ , remoteAddr :: String+ , remoteUser :: String+ , authType :: String+ + , rawContents :: String+ , rawArgs :: [String]+ + , handle :: Handle+ , httpsEnabled :: Bool+ }+
+ WASH/CGI/StateItem.hs view
@@ -0,0 +1,19 @@+-- © 2002 Peter Thiemann+module WASH.CGI.StateItem where++import Char++-- +-- |type of handles to a PE of type @a@+data T a = T String Int | Tvirtual { tvirtual :: a }+instance Show (T a) where+ showsPrec _ (T s i) = showChar 'T' . shows s . shows i+ showsPrec _ (Tvirtual _) = showChar 'V'+instance Read (T a) where+ readsPrec i str = + case dropWhile isSpace str of+ 'T' : str' ->+ [(T s i, str''') | (s, str'') <- reads str', (i, str''') <- reads str'']+ 'V' : str' ->+ [(Tvirtual (error "uninitialized tvirtual"), str')]+ _ -> []
+ WASH/CGI/Style.hs view
@@ -0,0 +1,46 @@+-- © 2002 Peter Thiemann+module WASH.CGI.Style (Style(..), using) where++import WASH.HTML.HTMLMonad hiding (map, div, head, span)+import List++infixl 5 :^:+infix 9 :=:++-- |First class style elements. Intended for CSS2.+data Style + = NoStyle+ | String :=: String -- ^primitive style @name :=: value@+ | Style :^: Style -- ^combine two styles+ | Named String -- ^reference to style sheet++instance Show Style where+ showsPrec n NoStyle = id+ showsPrec n (s1 :=: s2) = showString s1 . showString ": " . showString s2+ showsPrec n (s1 :^: s2) = shows s1 . showString "; " . shows s2+ showsPrec n (Named s) = id++-- |collects a style into a list of class names and primitive styles+collect :: Style -> ([String], Style)+collect st = g ([],NoStyle) st+ where+ g acc NoStyle = acc+ g (cls, sts) st@(n :=: v) = (cls, st :^: sts)+ g acc (st1 :^: st2) = g (g acc st2) st1+ g (cls, sts) (Named n) = (n : cls, st)++attach :: (Monad m) => Style -> WithHTML x m ()+attach sty = + let (cls, st) = collect sty in+ do case cls of+ [] -> empty+ _ -> attr "class" (concat $ intersperse " " cls)+ case st of NoStyle -> empty+ _ -> attr "style" (show st)+ +-- |Attaches a style to a field constructor.+using :: (Monad m)+ => Style+ -> (WithHTML x m b -> c) -- ^a field constructor, typically 'HTMLField'+ -> WithHTML x m b -> c -- ^styled version of this constructor+using style elem x = elem (x ## attach style)
+ WASH/CGI/Submit98.hs view
@@ -0,0 +1,322 @@+-- © 2002-2005 Peter Thiemann+-- |Haskell98 version of the submission functions.+module WASH.CGI.Submit98+ ( InputHandle, HasValue (value)+ , F0 (F0), F1 (F1), F2 (F2), F3 (F3), F4 (F4), F5 (F5), F6 (F6), F7 (F7), F8 (F8)+ , FL (FL), FA (FA)+ , deF0, deF1, deF2, deF3, deF4, deF5, deF6, deF7, deF8+ , deFL, deFA+ , deValueF0, deValueF1, deValueF2, deValueF3, deValueF4, deValueF5, deValueF6, deValueF7, deValueF8+ , deValueFL, deValueFA+ , submit, submit0, defaultSubmit, DTree, submitx, dtleaf, dtnode+ , submitLink, submitLink0, defaultSubmitLink+ , activate+ )+ where++import WASH.CGI.AbstractSelector+import WASH.CGI.CGIInternals+import WASH.CGI.CGIMonad+import WASH.CGI.EventHandlers+import qualified WASH.CGI.HTMLWrapper as H+import WASH.CGI.InputHandle++import Monad++instance HasValue InputField where+ value inf = valueInputField inf++instance InputHandle (InputField a) where+ validate inf = validateInputField inf+ isBound inf = ifBound inf+ ihNames inf = [ifName inf]++data F0 x = F0+deF0 :: r -> (F0 x -> r)+deF0 r F0 = r++deValueF0 r F0 = r++instance InputHandle F0 where+ validate F0 = Right F0+ isBound F0 = True+ ihNames F0 = []++data F1 a x = F1 (a x)+deF1 :: (a x -> r) -> (F1 a x -> r)+deF1 g (F1 ax) = g ax++deValueF1 g (F1 ax) = g (value ax)++instance InputHandle a => InputHandle (F1 a) where+ validate (F1 ainv) =+ feither id F1 (validate ainv)+ isBound (F1 ainv) = isBound ainv+ ihNames (F1 ainv) = ihNames ainv++data F2 a b x = F2 (a x) (b x)+deF2 :: (a x -> b x -> r) -> (F2 a b x -> r)+deF2 g (F2 ax bx) = g ax bx++deValueF2 g (F2 ax bx) = g (value ax) (value bx)++instance (InputHandle a, InputHandle b) => InputHandle (F2 a b) where+ validate (F2 ainv binv) =+ feither id (uncurry F2)+ (propagate (validate ainv) (validate binv))+ isBound (F2 ainv binv) =+ isBound ainv && isBound binv+ ihNames (F2 ainv binv) =+ ihNames ainv ++ ihNames binv++data F3 a b c x = F3 (a x) (b x) (c x)+deF3 :: (a x -> b x -> c x -> r) -> (F3 a b c x -> r)+deF3 g (F3 ax bx cx) = g ax bx cx++deValueF3 g (F3 ax bx cx) = g (value ax) (value bx) (value cx)++instance (InputHandle a, InputHandle b, InputHandle c) => InputHandle (F3 a b c) where+ validate (F3 ainv binv cinv) =+ feither id (\ (aval,(bval,cval)) -> F3 aval bval cval)+ (propagate (validate ainv)+ (propagate (validate binv) (validate cinv)))+ isBound (F3 ainv binv cinv) =+ isBound ainv && isBound binv && isBound cinv+ ihNames (F3 ainv binv cinv) =+ ihNames ainv ++ ihNames binv ++ ihNames cinv++data F4 a b c d x = F4 (a x) (b x) (c x) (d x)+deF4 :: (a x -> b x -> c x -> d x -> r) -> (F4 a b c d x -> r)+deF4 g (F4 ax bx cx dx) = g ax bx cx dx++deValueF4 g (F4 ax bx cx dx) = g (value ax) (value bx) (value cx) (value dx)++instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d)+ => InputHandle (F4 a b c d) where+ validate (F4 ainv binv cinv dinv) =+ feither id (\ (aval,(bval,(cval,dval))) -> F4 aval bval cval dval)+ (propagate (validate ainv) + (propagate (validate binv)+ (propagate (validate cinv) (validate dinv))))+ isBound (F4 ainv binv cinv dinv) =+ isBound ainv && isBound binv && isBound cinv && isBound dinv+ ihNames (F4 ainv binv cinv dinv) =+ ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv++data F5 a b c d e x = F5 (a x) (b x) (c x) (d x) (e x)+deF5 :: (a x -> b x -> c x -> d x -> e x -> r) -> (F5 a b c d e x -> r)+deF5 g (F5 ax bx cx dx ex) = g ax bx cx dx ex++deValueF5 g (F5 ax bx cx dx ex) = g (value ax) (value bx) (value cx) (value dx) (value ex)++instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e)+ => InputHandle (F5 a b c d e) where+ validate (F5 ainv binv cinv dinv einv) =+ feither id (\ (aval,(bval,(cval,(dval,eval)))) -> F5 aval bval cval dval eval)+ (propagate (validate ainv) + (propagate (validate binv)+ (propagate (validate cinv)+ (propagate (validate dinv) (validate einv)))))+ isBound (F5 ainv binv cinv dinv einv) =+ isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv+ ihNames (F5 ainv binv cinv dinv einv) =+ ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv++data F6 a b c d e f x = F6 (a x) (b x) (c x) (d x) (e x) (f x)+deF6 :: (a x -> b x -> c x -> d x -> e x -> f x -> r) -> (F6 a b c d e f x -> r)+deF6 g (F6 ax bx cx dx ex fx) = g ax bx cx dx ex fx++deValueF6 g (F6 ax bx cx dx ex fx) = g (value ax) (value bx) (value cx) (value dx) (value ex) (value fx)++instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f)+ => InputHandle (F6 a b c d e f) where+ validate (F6 ainv binv cinv dinv einv finv) =+ feither id (\ (aval,(bval,(cval,(dval,(eval, fval))))) -> F6 aval bval cval dval eval fval)+ (propagate (validate ainv) + (propagate (validate binv)+ (propagate (validate cinv)+ (propagate (validate dinv) + (propagate (validate einv) (validate finv))))))+ isBound (F6 ainv binv cinv dinv einv finv) =+ isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv && isBound finv+ ihNames (F6 ainv binv cinv dinv einv finv) =+ ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv ++ ihNames finv++data F7 a b c d e f g x = F7 (a x) (b x) (c x) (d x) (e x) (f x) (g x)+deF7 :: (a x -> b x -> c x -> d x -> e x -> f x -> g x -> r) -> (F7 a b c d e f g x -> r)+deF7 g (F7 ax bx cx dx ex fx gx) = g ax bx cx dx ex fx gx++deValueF7 g (F7 ax bx cx dx ex fx gx) = g (value ax) (value bx) (value cx) (value dx) (value ex) (value fx) (value gx)++instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f, InputHandle g)+ => InputHandle (F7 a b c d e f g) where+ validate (F7 ainv binv cinv dinv einv finv ginv) =+ feither id (\ (aval,(bval,(cval,(dval,(eval, (fval, gval)))))) -> F7 aval bval cval dval eval fval gval)+ (propagate (validate ainv) + (propagate (validate binv)+ (propagate (validate cinv)+ (propagate (validate dinv) + (propagate (validate einv)+ (propagate (validate finv) (validate ginv)))))))+ isBound (F7 ainv binv cinv dinv einv finv ginv) =+ isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv && isBound finv && isBound ginv+ ihNames (F7 ainv binv cinv dinv einv finv ginv) =+ ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv ++ ihNames finv ++ ihNames ginv++data F8 a b c d e f g h x = F8 (a x) (b x) (c x) (d x) (e x) (f x) (g x) (h x)+deF8 :: (a x -> b x -> c x -> d x -> e x -> f x -> g x -> h x -> r) -> (F8 a b c d e f g h x -> r)+deF8 g (F8 ax bx cx dx ex fx gx hx) = g ax bx cx dx ex fx gx hx++deValueF8 g (F8 ax bx cx dx ex fx gx hx) = g (value ax) (value bx) (value cx) (value dx) (value ex) (value fx) (value gx) (value hx)++instance (InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f, InputHandle g, InputHandle h)+ => InputHandle (F8 a b c d e f g h) where+ validate (F8 ainv binv cinv dinv einv finv ginv hinv) =+ feither id (\ (aval,(bval,(cval,(dval,(eval, (fval, (gval, hval))))))) -> F8 aval bval cval dval eval fval gval hval)+ (propagate (validate ainv) + (propagate (validate binv)+ (propagate (validate cinv)+ (propagate (validate dinv) + (propagate (validate einv) + (propagate (validate finv)+ (propagate (validate ginv) (validate hinv))))))))+ isBound (F8 ainv binv cinv dinv einv finv ginv hinv) =+ isBound ainv && isBound binv && isBound cinv && isBound dinv && isBound einv && isBound finv && isBound ginv && isBound hinv+ ihNames (F8 ainv binv cinv dinv einv finv ginv hinv) =+ ihNames ainv ++ ihNames binv ++ ihNames cinv ++ ihNames dinv ++ ihNames einv ++ ihNames finv ++ ihNames ginv ++ ihNames hinv++-- |'FL' is required to pass an unknown number of handles of the same+-- type need to the callback function in a form submission. The+-- handles need to be collected in a list and then wrapped in the 'FL' data constructor+data FL a x = FL [a x]+deFL :: ([a x] -> r) -> (FL a x -> r)+deFL g (FL axs) = g axs++deValueFL g (FL axs) = g (map value axs)++instance InputHandle a => InputHandle (FL a) where+ validate (FL ainvs) =+ g (map validate ainvs) -- [Either [ValidationError] (h VALID)]+ where + g = foldr h (Right (FL []))+ h ev evs = feither id (\ (v, FL vs) -> FL (v : vs)) (propagate ev evs)+ isBound (FL ainvs) =+ all isBound ainvs+ ihNames (FL ainvs) =+ concatMap ihNames ainvs++-- |'FA' comes handy when you want to tag an input handle with some extra+-- information, which is not itsefl an input handle and which is not validated+-- by a form submission. The tag is the first argument and the handle is the+-- second argument of the data constructor.+data FA a b x = FA a (b x)+deFA :: (a -> b x -> r) -> (FA a b x -> r)+deFA g (FA a bx) = g a bx++deValueFA g (FA a bx) = g a (value bx)++instance InputHandle b => InputHandle (FA a b) where+ validate (FA a binv) =+ feither id (FA a) (validate binv)+ isBound (FA a binv) =+ isBound binv+ ihNames (FA a binv) =+ ihNames binv++-- |Create a submission button with attached action.+submit :: (CGIMonad cgi, InputHandle h)+ => h INVALID -- ^input field handles to be validated and passed to callback action + -> (h VALID -> cgi ()) -- ^callback maps valid input handles to a CGI action+ -> HTMLField cgi x y () -- ^returns a field so that attributes can be attached+submit = submitInternal False++-- |Create a continuation button that takes no parameters.+submit0 :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()+submit0 cont = submit F0 (\F0 -> cont)++-- |Create a submission button whose attached action is fired whenever the form+-- is submitted without explicitly clicking any submit button. This can happen if+-- an input field has an attached onclick="submit()" action.+defaultSubmit :: (CGIMonad cgi, InputHandle h) =>+ h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi x y ()+defaultSubmit = submitInternal True++-- |Create an ordinary link serving as a submission button.+submitLink :: (CGIMonad cgi, InputHandle h) =>+ h INVALID -> (h VALID -> cgi ()) -> H.HTMLCons x y cgi ()+submitLink = submitInternalLink False++-- |Create a continuation link.+submitLink0 :: (CGIMonad cgi) => cgi () -> H.HTMLCons x y cgi ()+submitLink0 cont = submitLink F0 (const cont)++defaultSubmitLink :: (CGIMonad cgi, InputHandle h) =>+ h INVALID -> (h VALID -> cgi ()) -> H.HTMLCons x y cgi ()+defaultSubmitLink = submitInternalLink True++-- |Abstract type of decisions trees. These trees provide structured validation.+newtype DTree cgi x y = DTree { unDTree :: HTMLField cgi x y () }++-- |Create a submission button whose validation proceeds according to a decision+-- tree. Trees are built using 'dtleaf' and 'dtnode'.+submitx :: DTree cgi x y -> HTMLField cgi x y ()+submitx = unDTree++-- |Create a leaf in a decision tree from a CGI action. +dtleaf :: (CGIMonad cgi) => cgi () -> DTree cgi x y+dtleaf action = DTree $ submit0 action++-- |Create a node in a decision tree. Takes an invalid input field and a+-- continuation. Validates the input field and passes it to the continuation if+-- the validation was successful. The continuation can dispatch on the value of+-- the input field and produces a new decision tree.+dtnode :: (CGIMonad cgi, InputHandle h) =>+ h INVALID -> (h VALID -> DTree cgi x y) -> DTree cgi x y+dtnode hinv next =+ if isBound hinv then+ case validate hinv of+ Right hval ->+ next hval+ Left ss ->+ DTree $ internalSubmitField False (Left ss)+ else + DTree $ internalSubmitField False (Left [])++submitInternal isDefault hinv g =+ internalSubmitField isDefault (validator hinv g)++validator hinv g =+ either Left (Right . g) (validate hinv)++submitInternalLink isDefault hinv g =+ internalSubmitLink isDefault (validator hinv g)+ ++instance HasValue RadioGroup where+ value rg = valueRadioGroup rg++instance InputHandle (RadioGroup a) where+ validate rg = validateRadioGroup rg+ isBound rg = radioBound rg+ ihNames rg = [radioName rg]++instance HasValue SelectionGroup where+ value sg = valueSelectionGroup sg++instance InputHandle (SelectionGroup a) where+ validate sg = validateSelectionGroup sg+ isBound sg = selectionBound sg+ ihNames sg = [selectionName sg]++-- |Attach a CGI action to the value returned by the input field. Activation+-- means that data is submitted as soon as it is entered.+activate :: (CGIMonad cgi, InputHandle (i a), HasValue i) =>+ (a -> cgi ()) -> HTMLField cgi x y (i a INVALID) -> HTMLField cgi x y (i a INVALID)+activate actionFun inputField attrs =+ do invalid_inf <- inputField (do attrs+ onChange $ "WASHSubmit(this.name);")+ let r = validate invalid_inf+ rv = either Left (Right . value) r+ when (isBound invalid_inf) $+ activateInternal actionFun (head $ ihNames invalid_inf) rv+ return invalid_inf
+ WASH/CGI/SubmitXX.hs view
@@ -0,0 +1,191 @@+{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}+-- © 2002-2005 Peter Thiemann+-- |Extended-Haskell version of the submission functions.+module WASH.CGI.SubmitXX where++import WASH.CGI.CGIInternals+import WASH.CGI.CGIMonad+import WASH.CGI.EventHandlers++import Monad++class StripHandle hx x | hx -> x where+ validate :: hx -> Either [ValidationError] x+ isBound :: hx -> Bool+ ihNames :: hx -> [String]++instance StripHandle (InputField a x) a where+ validate inf =+ case validateInputField inf of+ Left ss ->+ Left ss+ Right _ ->+ Right $ valueInputField inf+ isBound inf =+ ifBound inf+ ihNames inf =+ [ifName inf]++instance StripHandle (RadioGroup a x) a where+ validate rg =+ case validateRadioGroup rg of+ Left ss ->+ Left ss+ Right _ ->+ Right $ valueRadioGroup rg+ isBound rg =+ radioBound rg+ ihNames rg =+ [radioName rg]++instance StripHandle () () where+ validate () = Right ()+ isBound () = True+ ihNames () = []++instance (StripHandle hx x, StripHandle hy y) => StripHandle (hx, hy) (x, y) where+ validate (hx, hy) =+ propagate (validate hx) (validate hy)+ isBound (hx, hy) =+ isBound hx && isBound hy+ ihNames (hx, hy) =+ ihNames hx ++ ihNames hy++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z) + => StripHandle (hx, hy, hz) (x, y, z) where+ validate (hx, hy, hz) =+ feither id (\ (x, (y, z)) -> (x, y, z)) $+ propagate (validate hx) (propagate (validate hy) (validate hz))+ isBound (hx, hy, hz) =+ isBound hx && isBound (hy, hz)+ ihNames (hx, hy, hz) =+ ihNames hx ++ ihNames (hy, hz)++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a)+ => StripHandle (hx, hy, hz, ha) (x, y, z, a) where+ validate (hx, hy, hz, ha) =+ feither id (\ ((x, y), (z, a)) -> (x, y, z, a)) $+ propagate+ (propagate (validate hx) (validate hy))+ (propagate (validate hz) (validate ha))+ isBound (hx, hy, hz, ha) =+ isBound (hx, hy) && isBound (hz, ha)+ ihNames (hx, hy, hz, ha) =+ ihNames (hx, hy) ++ ihNames (hz, ha)++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b)+ => StripHandle (hx, hy, hz, ha, hb) (x, y, z, a, b) where+ validate (hx, hy, hz, ha, hb) =+ feither id (\ ((x, y), (z, (a, b))) -> (x, y, z, a, b)) $+ propagate+ (propagate (validate hx) (validate hy))+ (propagate (validate hz) (propagate (validate ha) (validate hb)))+ isBound (hx, hy, hz, ha, hb) =+ isBound (hx, hy) && isBound (hz, (ha, hb))+ ihNames (hx, hy, hz, ha, hb) =+ ihNames (hx, hy) ++ ihNames (hz, (ha, hb))++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c)+ => StripHandle (hx, hy, hz, ha, hb, hc) (x, y, z, a, b, c) where+ validate (hx, hy, hz, ha, hb, hc) =+ feither id (\ ((x, y, z), (a, b, c)) -> (x, y, z, a, b, c)) $+ propagate+ (validate (hx, hy, hz)) (validate (ha, hb, hc))+ isBound (hx, hy, hz, ha, hb, hc) =+ isBound (hx, hy, hz) && isBound (ha, hb, hc)+ ihNames (hx, hy, hz, ha, hb, hc) =+ ihNames (hx, hy, hz) ++ ihNames (ha, hb, hc)++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c, StripHandle hd d)+ => StripHandle (hx, hy, hz, ha, hb, hc, hd) (x, y, z, a, b, c, d) where+ validate (hx, hy, hz, ha, hb, hc, hd) =+ feither id (\ ((x, y, z), (a, b, c, d)) -> (x, y, z, a, b, c, d)) $+ propagate+ (validate (hx, hy, hz)) (validate (ha, hb, hc, hd))+ isBound (hx, hy, hz, ha, hb, hc, hd) =+ isBound (hx, hy, hz) && isBound (ha, hb, hc, hd)+ ihNames (hx, hy, hz, ha, hb, hc, hd) =+ ihNames (hx, hy, hz) ++ ihNames (ha, hb, hc, hd)++instance (StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c, StripHandle hd d, StripHandle he e)+ => StripHandle (hx, hy, hz, ha, hb, hc, hd, he) (x, y, z, a, b, c, d, e) where+ validate (hx, hy, hz, ha, hb, hc, hd, he) =+ feither id (\ ((x, y, z), (a, b, c, d, e)) -> (x, y, z, a, b, c, d, e)) $+ propagate+ (validate (hx, hy, hz)) (validate (ha, hb, hc, hd, he))+ isBound (hx, hy, hz, ha, hb, hc, hd, he) =+ isBound (hx, hy, hz) && isBound (ha, hb, hc, hd, he)+ ihNames (hx, hy, hz, ha, hb, hc, hd, he) =+ ihNames (hx, hy, hz) ++ ihNames (ha, hb, hc, hd, he)++instance (StripHandle hw w, StripHandle hx x, StripHandle hy y, StripHandle hz z, StripHandle ha a, StripHandle hb b, StripHandle hc c, StripHandle hd d, StripHandle he e)+ => StripHandle (hw, hx, hy, hz, ha, hb, hc, hd, he) (w, x, y, z, a, b, c, d, e) where+ validate (hw, hx, hy, hz, ha, hb, hc, hd, he) =+ feither id (\ ((w, x, y, z), (a, b, c, d, e)) -> (w, x, y, z, a, b, c, d, e)) $+ propagate+ (validate (hw, hx, hy, hz)) (validate (ha, hb, hc, hd, he))+ isBound (hw, hx, hy, hz, ha, hb, hc, hd, he) =+ isBound (hw, hx, hy, hz) && isBound (ha, hb, hc, hd, he)+ ihNames (hw, hx, hy, hz, ha, hb, hc, hd, he) =+ ihNames (hw, hx, hy, hz) ++ ihNames (ha, hb, hc, hd, he)++instance (StripHandle hx x) => StripHandle [hx] [x] where+ validate hxs =+ foldr (\ hx xs -> feither id (uncurry (:)) $ propagate (validate hx) xs)+ (Right []) hxs+ isBound hxs =+ all isBound hxs+ ihNames hxs =+ concatMap ihNames hxs++-- |create a submission button with attached action+submit, defaultSubmit :: (CGIMonad cgi, StripHandle handle_a a)+ => handle_a+ -> (a -> cgi ())+ -> HTMLField cgi x y ()+submit = submitInternal False+defaultSubmit = submitInternal True++-- |create a continuation button with parameters+submit0 :: (CGIMonad cgi) => cgi () -> HTMLField cgi x y ()+submit0 cont = submit () (const cont)++submitInternal isDefault hinv g =+ case validate hinv of+ Right hval ->+ internalSubmitField isDefault (Right (g hval))+ Left ss ->+ internalSubmitField isDefault (Left ss)++newtype DTree cgi x y = DTree { unDTree :: HTMLField cgi x y () }++-- |submission with staged validation+submitx :: DTree cgi x y -> HTMLField cgi x y ()+submitx = unDTree++dtleaf :: (CGIMonad cgi) => cgi () -> DTree cgi x y+dtleaf action = DTree $ submit0 action++dtnode :: (CGIMonad cgi, StripHandle handle_a a) =>+ handle_a -> (a -> DTree cgi x y) -> DTree cgi x y+dtnode hinv next =+ if isBound hinv then+ case validate hinv of+ Right hval ->+ next hval+ Left ss ->+ DTree $ internalSubmitField False (Left ss)+ else + DTree $ internalSubmitField False (Left [])+ +-- |Attach a CGI action to the value returned by the input field. Activation+-- means that data is submitted as soon as it is entered.+activate :: (CGIMonad cgi, StripHandle ha a) =>+ (a -> cgi ()) -> HTMLField cgi x y ha -> HTMLField cgi x y ha+activate actionFun inputField attrs =+ do invalid_inf <- inputField (do attrs+ onChange $ "WASHSubmit(this.name);")+ let rv = validate invalid_inf+ when (isBound invalid_inf) $+ activateInternal actionFun (head $ ihNames invalid_inf) rv+ return invalid_inf
+ WASH/CGI/TCGI.hs view
@@ -0,0 +1,31 @@+-- © 2006 Peter Thiemann+{- | Wrapper for the WASH.CGI.CGI monad type. Internal use only. Intended for+-- wrapping transactions. +-}++module WASH.CGI.TCGI where++import WASH.CGI.CGIMonad++-- |Type of a 'CGI' action in a transactional scope with a result variable of+-- type @a@.+newtype TCGI b a =+ TCGI { unTCGI :: CGIAction a }++outof :: TCGI b a -> CGI a+outof = CGI . unTCGI++into :: CGI a -> TCGI b a+into = TCGI . unCGI ++instance Monad (TCGI b) where+ return x = + into (return x)+ m >>= f = + into (outof m >>= (outof . f))++instance CGIMonad (TCGI b) where+ wrapCGI = TCGI+ unwrapCGI = unTCGI+ chooser x y = return y+
+ WASH/CGI/Transaction.hs view
@@ -0,0 +1,393 @@+-- © 2006 Peter Thiemann+{- | Transactional, type-indexed implementation of server-side state.++Glossary++A transactional entity (TE) is a named multi-versioned global variable.+-}++module WASH.CGI.Transaction (+ T (), init, create, remove, get, set,+ with, Control (..),+ TCGI ()+ ) where++import qualified WASH.CGI.BaseCombinators as B+import qualified WASH.CGI.CGIConfig as Conf+import WASH.CGI.CGIMonad+import WASH.CGI.CGI hiding (head, div, span, map)++import WASH.CGI.TCGI (TCGI)+import qualified WASH.CGI.TransactionUtil as TU+import WASH.CGI.TransactionUtil (Control (..))+import WASH.CGI.LogEntry+import WASH.CGI.MakeTypedName+import WASH.CGI.Types++import qualified WASH.CGI.HTMLWrapper as H hiding (map,head)++import qualified WASH.Utility.Auxiliary as Aux+import qualified WASH.Utility.Locking as L+import qualified WASH.Utility.Unique as Unique++import Directory+import IO+import qualified List+import Maybe+import Monad+import Prelude hiding (init)++transactionLock = Conf.transactionDir++-- |Handle of a transactional variable+newtype T a = + T String+ deriving (Read, Show)++-- |Attempt to create a new tv @n@ and set its initial value. Returns handle to+-- the variable. If the variable already exists, then just returns the handle.+init :: (Types a, Read a, Show a) => String -> a -> TCGI b (T a)+init name val =+ let v = show val + typedName = makeTypedNameFromVal name val+ h = T typedName + in+ wrapCGI (\ cgistate ->+ case inparm cgistate of+ [] -> -- first time here+ do Aux.assertDirectoryExists (List.init Conf.transactionDir) (return ())+ -- must try to read the variable at this point + -- because it may only exist in the log+ let out = outparm cgistate+ ev <- try (readValue out typedName)+ let newparm =+ case ev of+ Left _ ->+ -- value did not exist (but don't write it now)+ PAR_CRE_TV typedName v+ Right (v', cached) ->+ -- value did exist (although we have not read its value)+ PAR_GET_TV typedName v'+ return (h, cgistate { outparm = newparm : out })+ PAR_CRE_TV _ _ : rest -> -- created the variable+ return (h, cgistate { inparm = rest })+ PAR_GET_TV _ _ : rest -> -- touched existing variable+ return (h, cgistate { inparm = rest })+ le : rest ->+ error ("Transaction.init: got log entry "+ ++ show le +++ ". This should not happen")+ )+++-- |Read transactional variable through a typed handle.+get :: (Read a, Show a) => T a -> TCGI b a+get (T typedName) =+ wrapCGI (\ cgistate ->+ case inparm cgistate of+ [] ->+ -- check the log for preceding reads and writes;+ -- then fall back to physical read+ let out = outparm cgistate in+ do (v, cached) <- readValue out typedName+ let newparm | cached = PAR_RESULT v+ | otherwise = PAR_GET_TV typedName v+ return (read v, cgistate { outparm = newparm : out })+ PAR_GET_TV _ v : rest ->+ return (read v, cgistate { inparm = rest })+ PAR_RESULT v : rest ->+ return (read v, cgistate { inparm = rest })+ _ ->+ error "Transaction.get: this should not happen"+ )++-- |Write to a transactional variable through typed handle. Only affects the+-- log, no /physical/ write happens. Checks physically for existence of the+-- variable (but tries the log first). Raises exception if it does not exist.+set :: (Read a, Show a) => T a -> a -> TCGI b ()+set (T typedName) val =+ let v = show val+ in+ wrapCGI (\ cgistate ->+ case inparm cgistate of+ [] ->+ do let newparm = PAR_SET_TV typedName v + out = outparm cgistate+ readValue out typedName -- must not fail+ return ((), cgistate { outparm = newparm : outparm cgistate })+ PAR_SET_TV _ _ : rest ->+ return ((), cgistate { inparm = rest })+ _ ->+ error "Transaction.set: this should not happen"+ )++-- |Create a fresh transactional variable with an initial value and return its+-- handle. Performs a physical write to ensure that the variable's name is+-- unique. Locks the transaction directory during the write operation.+create :: (Read a, Show a, Types a) => a -> TCGI b (T a)+create val =+ let v = show val+ obtainUniqueHandle =+ do name <- Unique.inventStdKey+ let typedName = makeTypedNameFromVal name val+ h = T typedName+ L.obtainLock transactionLock+ conflict <- reallyExists typedName+ unless conflict $ reallyWrite typedName v+ L.releaseLock transactionLock+ if conflict then obtainUniqueHandle else return h+ in+ do wrapCGI $ \ cgistate ->+ case inparm cgistate of+ [] ->+ do Aux.assertDirectoryExists (List.init Conf.transactionDir) (return ())+ h@(T typedName) <- obtainUniqueHandle+ return (h, cgistate { outparm = PAR_CRE_TV typedName v : outparm cgistate })+ PAR_CRE_TV typedName _ : rest ->+ return (T typedName, cgistate { inparm = rest })+ _ ->+ error "Transaction.create: this should not happen"+++-- |Remove a transactional variable. Subsequent read accesses to this variable+-- will make the transaction fail. May throw an exception if the variable is not+-- present.+remove :: (Types a) => T a -> TCGI b ()+remove (T typedName) =+ wrapCGI (\ cgistate ->+ case inparm cgistate of+ [] ->+ -- check that the variable exists+ -- will raise an exception otherwise+ let out = outparm cgistate in+ do readValue out typedName+ return ((), cgistate { outparm = PAR_REM_TV typedName : out })+ PAR_REM_TV _ : rest ->+ return ((), cgistate { inparm = rest })+ _ ->+ error "Transaction.remove: this should not happen"+ )+++-- | @with@ creates a transactional scope in which transactional variables can+-- be manipulated. Transactions may be nested to an arbitrary depth, although a+-- check with the current state of the world only occurs at the point where the+-- top-level transaction tries to commit. +-- +-- @with@ takes three parameters, a default value of type @result@, a+-- continuation, and a body function that maps a @Control@ record to a+-- transactional computation. There are three ways in which a+-- transaction may be completed. First, the transaction may be abandoned+-- explicitly by a call to the @abandon@ function supplied as part of the+-- @Control@ record. In this case, the continuation is invoked on a pre-set+-- failure return value. Second, the transaction body runs to completion but+-- fails to commit. In this case, the continuation is also invoked on the+-- pre-set failure return value. Third, the transaction body runs to completion+-- and commits successfully. In this case, the continuation is invoked, but on+-- the pre-set success value. +-- The @result@-type argument initializes the default return value for both, the+-- success and the failure case. The body function implements the body of the+-- transaction. +-- +class CGIMonad cgi => WithMonad cgi where+ with :: (Read result, Show result) =>+ result + -> (result -> cgi ())+ -> (TU.Control (TCGI result) result -> (TCGI result) ())+ -> cgi ()++instance WithMonad CGI where+ with result onResult fun =+ TU.withCGI commitFromLog result onResult fun++instance WithMonad (TCGI x) where+-- !!! needs to be checked !!!+ with result onResult fun =+ TU.withTCGI (const $ return True) result onResult fun++-- |Read value of a variable first from log prefix. Return value @True@+-- indicates a value from the log, @False@ indicates a value read from file. May+-- raise an exception if the variable has been removed.+readValue :: [PARAMETER] -> String -> IO (String, Bool)+readValue [] n =+ do v' <- reallyRead n+ return (v', False)+readValue (PAR_SET_TV n' v':rest) n =+ if n==n' + then return (v', True) -- has been overwritten + else readValue rest n+readValue (PAR_GET_TV n' v':rest) n =+ if n==n' + then return (v', True) -- read before+ else readValue rest n+readValue (PAR_CRE_TV n' v':rest) n =+ if n==n'+ then return (v', True)+ else readValue rest n+readValue (PAR_REM_TV n':rest) n =+ if n==n'+ then fail ("Transactional variable " ++ n ++ " has vanished")+ else readValue rest n+readValue (PAR_TRANS stid:rest) n =+ do v' <- reallyRead n+ return (v', False)+readValue (_:rest) n =+ readValue rest n++-- |Descriptor of a transactional variable.+data TV_DESC + = TV_DESC { tv_name :: String+ -- ^ variable name + , tv_old :: Maybe (Maybe String)+ -- ^ value on first read+ -- @Nothing@ if not read+ -- @Just Nothing@ if created+ -- @Just (Just val)@ first value+ , tv_new :: Maybe (Maybe String)+ -- ^ value after last write+ -- @Nothing@ if not written to+ -- @Just Nothing@ if removed+ -- @Just (Just val)@ if @val@ was written+ }+ deriving Show++-- |Obtain list of descriptors of transaction variables from a list of log+-- entries. Each variable has at most one descriptor. Input list is in reverse+-- chronological order, /e.g./, the earliest entries come last.+getDescriptors :: [PARAMETER] -> [TV_DESC]+getDescriptors logEntries =+ foldr f [] logEntries+ where+ f (PAR_GET_TV n v) r = doRead n v r+ f (PAR_SET_TV n v) r = doWrite n v r+ f (PAR_CRE_TV n v) r = doCreate n v r+ f (PAR_REM_TV n) r = doRemove n r+ f _ r = r++ doCreate n v ds =+ TV_DESC {tv_name = n, tv_old = Just Nothing, tv_new = Just (Just v)}+ : ds+ doRemove n ds =+ doProcess g n ds+ where+ g (TV_DESC { tv_old = Just Nothing } : rest) = + rest+ g (tvd : rest) =+ tvd { tv_new = Just Nothing } : rest+ g [] =+ [TV_DESC {tv_name = n, tv_old = Nothing, tv_new = Just Nothing}]+ doProcess g n ds =+ f ds+ where+ f [] =+ g []+ f ds@(d':ds') =+ if tv_name d' == n then g ds else d' : f ds'+ doRead n v ds =+ doProcess h n ds+ where + h [] = + [TV_DESC {tv_name = n, tv_old = Just (Just v), tv_new = Nothing }]+ h (tvd : rest) =+ tvd : rest -- not first read+ doWrite n v ds = + doProcess h n ds+ where+ h [] = + [TV_DESC {tv_name = n, tv_old = Nothing, tv_new = Just (Just v) }]+ h (tvd : rest) =+ tvd { tv_new = Just (Just v) } : rest -- do write+ +-- | Get the descriptors and try to commit+commitFromLog :: [PARAMETER] -> IO Bool+commitFromLog =+ tryToCommit . getDescriptors++-- |Attempt to commit a list of descriptors by checking for the old values to+-- match and then overwriting with the new values. A read-only transaction+-- always succeeds, even if the values have changed after they have been+-- read. Returns @True@ if commit succeeded.+tryToCommit :: [TV_DESC] -> IO Bool+tryToCommit ds =+ if checkOnlyReads ds then return True else+ do L.obtainLock transactionLock+ oldValuesPreserved <- checkOldValuesPreserved ds+ when oldValuesPreserved (writeNewValues ds)+ L.releaseLock transactionLock+ return oldValuesPreserved++-- |Check if the values of all transactional variable in a list of descriptors+-- match the current values. Called with all variables locked.+checkOldValuesPreserved :: [TV_DESC] -> IO Bool+checkOldValuesPreserved [] = + return True+checkOldValuesPreserved (d:ds) =+ do b <- checkOldValuePreserved d+ if b then checkOldValuesPreserved ds+ else return False++checkOldValuePreserved :: TV_DESC -> IO Bool+checkOldValuePreserved d =+ do + let n = tv_name d+ varExists <- reallyExists n+ case tv_old d of+ Nothing -> -- not read, check for presence+ return varExists+ Just Nothing -> -- created, check that it does *not* exist now+ return (not varExists)+ Just (Just ov) -> -- read old value @ov@+ if varExists+ then -- value is still present; check if equal+ do cv <- reallyRead n+ return (cv == ov)+ else -- value has disappeared: fail+ return False++-- |Overwrite transactional variables from a list of descriptors with new values.+writeNewValues :: [TV_DESC] -> IO ()+writeNewValues ds = + mapM_ g ds+ where+ g d = + let n = tv_name d in+ case tv_new d of+ Nothing -> -- not written+ return ()+ Just Nothing -> -- removed+ reallyRemove n+ Just (Just nv) -> -- new value+ reallyWrite n nv++-- |Check that no variable has been written to.+checkOnlyReads :: [TV_DESC] -> Bool+checkOnlyReads ds = + and (map wasNotWritten ds)+ where+ wasNotWritten d =+ isNothing (tv_new d)+ +-- |Physically access current shared value of transactional variable. Internal+-- use only.+reallyRead :: String -> IO String+reallyRead n =+ let fileName = Conf.transactionDir ++ n in+ Aux.readFileStrictly fileName++-- |Physically overwrite current shared value of transactional variable.+reallyWrite :: String -> String -> IO ()+reallyWrite n v =+ let fileName = Conf.transactionDir ++ n in+ writeFile fileName v++-- |Physically checks the existence of a transactional variable.+reallyExists :: String -> IO Bool+reallyExists n =+ let fileName = Conf.transactionDir ++ n in+ doesFileExist fileName++-- |Physically remove transactional variable.+reallyRemove :: String -> IO ()+reallyRemove n =+ let fileName = Conf.transactionDir ++ n in+ removeFile fileName
+ WASH/CGI/TransactionUtil.hs view
@@ -0,0 +1,353 @@+-- © 2006 Peter Thiemann+{- | Generic utilities for implementing transactionsal memories+-}+module WASH.CGI.TransactionUtil + (withCGI, withTCGI, Control (..))+ where++import qualified WASH.CGI.BaseCombinators as B+import qualified WASH.CGI.HTMLWrapper as H hiding (map,head)++import WASH.CGI.CGIMonad+import WASH.CGI.LogEntry++import IO++import WASH.CGI.TCGI++-- | Checks presence of a transaction mark on the stack+onStack :: String -> [PARAMETER] -> Bool+onStack stid parms =+ any h parms+ where+ h (PAR_TRANS stid') = stid' == stid+ h _ = False++-- | Pops log entries up to and including the transaction mark with given state+-- ID. +popTo :: String -> [PARAMETER] -> [PARAMETER]+popTo stid parms =+ g parms+ where+ g [] = error "popTo did not find its transaction mark"+ g (PAR_TRANS stid' : rest) | stid' == stid = rest+ g (_ : rest) = popTo stid rest++-- | Splits the log at the transaction mark with given state ID.+splitTo :: String -> [PARAMETER] -> ([PARAMETER], [PARAMETER])+splitTo stid parms =+ g parms+ where+ g [] = error "splitTo did not find its transaction mark"+ g (mark@(PAR_TRANS stid') : rest) | stid' == stid =+ ([mark], rest)+ g (entry : rest) =+ let (prefix, rest') = splitTo stid rest in+ (entry : prefix, rest')++-- | Applies a function to a transaction mark with given state ID.+applyTo :: String -> ([PARAMETER] -> [PARAMETER]) -> ([PARAMETER] -> [PARAMETER])+applyTo stid trafo parms =+ g parms []+ where+ g [] _ = error "applyTo did not find its transaction mark"+ g (mark@(PAR_TRANS stid') : rest) acc | stid' == stid =+ reverse (trafo (mark : acc)) ++rest+ g (entry : rest) acc =+ g rest (entry : acc)++data Control cgi result =+ Control { abandon :: result -> cgi () -- ^ abandon with result (rollback)+ , setFail :: result -> cgi () -- ^ set result on failure+ , setCommit :: result -> cgi () -- ^ set result on successful commit+ }++with :: (CGIMonad cgi, Read result, Show result) =>+ ([PARAMETER] -> IO Bool) -- committer function+ -> result -- default result+ -> (result -> cgi ()) -- result continuation+ -> (Control (TCGI result) result -> (TCGI result) ())+ -> cgi ()+with commitFromLog result onResult fun =+ wrapCGI (\cgistate -> + let abandon stid res =+ wrapCGI (\cgistate -> ioError (userError (shows stid $ show res)))+ setFail stid res = + B.once $+ wrapCGI (\cgistate ->+ let out = outparm cgistate + out' = applyTo stid onFail out+ onFail (pmark : pfail : psucc : rest) =+ (pmark : PAR_RESULT (show res) : psucc : rest)+ in+ return ((), cgistate { outparm = out' })+ )+ setCommit stid res = + B.once $+ wrapCGI (\cgistate ->+ let out = outparm cgistate + out' = applyTo stid onSucc out+ onSucc (pmark : pfail : psucc : rest) =+ (pmark : pfail : PAR_RESULT (show res) : rest)+ in+ return ((), cgistate { outparm = out' })+ )+ control stid =+ Control { abandon = abandon stid+ , setFail = setFail stid+ , setCommit = setCommit stid+ }+ run stid cgistate =+ do lr <- try (unwrapCGI (fun (control stid)) cgistate)+ case lr of+ Right (v, cgistate') ->+ -- body of transaction finished successfully; now commit+ let out = outparm cgistate'+ (prefix, outparm') = splitTo stid out+ PAR_TRANS _ :+ failp@(PAR_RESULT failString) :+ succp@(PAR_RESULT succString) : _ = reverse prefix+ in+ do committed <- commitFromLog prefix+ if committed then+ unwrapCGI (onResult (read succString))+ cgistate' { outparm = succp : outparm' }+ else+ unwrapCGI (onResult (read failString))+ cgistate' { outparm = failp : outparm' }+ + Left err ->+ -- Caught an exception; might be due to an @anbandon@ operation+ case reads (ioeGetErrorString err) of+ (stid', rest) : _ | stid' == stid ->+ let result = read rest+ newvalue = PAR_RESULT rest+ out' = popTo stid (outparm cgistate)+ in+ unwrapCGI (onResult result)+ cgistate { inparm = []+ , outparm = newvalue : out'+ , stateID = nextstid stid newvalue + }+ _ ->+ ioError err+ in+ case inparm cgistate of+ [] ->+ let stid = stateID cgistate+ newmark = PAR_TRANS stid+ newvalue = PAR_RESULT (show result)+ in+ run stid cgistate + { outparm = newvalue : newvalue : newmark : outparm cgistate+ , stateID = nextstid (nextstid (nextstid stid newmark) newvalue) newvalue }+ -- ongoing transaction+ PAR_TRANS stid : PAR_RESULT failString : PAR_RESULT successString : rest ->+ run stid cgistate { inparm = rest }+ + -- finished transaction, go on with result continuation+ PAR_RESULT str : rest ->+ unwrapCGI (onResult (read str)) cgistate { inparm = rest }+ _ -> + B.reportError "Out of sync" H.empty cgistate+ ) +++-- |Unnested transaction+withCGI :: (Read result, Show result) =>+ ([PARAMETER] -> IO Bool) -- committer function+ -> result -- default result+ -> (result -> CGI ()) -- result continuation+ -> (Control (TCGI result) result -> (TCGI result) ())+ -> CGI ()+withCGI commitFromLog result onResult fun =+ wrapCGI (\cgistate -> + let abandon stid res =+ wrapCGI (\cgistate -> ioError (userError (shows stid $ show res)))+ setFail stid res = + B.once $+ wrapCGI (\cgistate ->+ let out = outparm cgistate + out' = applyTo stid onFail out+ onFail (pmark : pfail : psucc : rest) =+ (pmark : PAR_RESULT (show res) : psucc : rest)+ in+ return ((), cgistate { outparm = out' })+ )+ setCommit stid res = + B.once $+ wrapCGI (\cgistate ->+ let out = outparm cgistate + out' = applyTo stid onSucc out+ onSucc (pmark : pfail : psucc : rest) =+ (pmark : pfail : PAR_RESULT (show res) : rest)+ in+ return ((), cgistate { outparm = out' })+ )+ control stid =+ Control { abandon = abandon stid+ , setFail = setFail stid+ , setCommit = setCommit stid+ }+ run stid cgistate =+ do lr <- try (unwrapCGI (fun (control stid)) cgistate)+ case lr of+ Right (v, cgistate') ->+ -- body of transaction finished successfully; now commit+ let out = outparm cgistate'+ (prefix, outparm') = splitTo stid out+ PAR_TRANS _ :+ failp@(PAR_RESULT failString) :+ succp@(PAR_RESULT succString) : _ = reverse prefix+ in+ do committed <- commitFromLog prefix+ if committed then+ unwrapCGI (onResult (read succString))+ cgistate' { outparm = succp : outparm' }+ else+ unwrapCGI (onResult (read failString))+ cgistate' { outparm = failp : outparm' }+ + Left err ->+ -- Caught an exception; might be due to an @anbandon@ operation+ case reads (ioeGetErrorString err) of+ (stid', rest) : _ | stid' == stid ->+ let result = read rest+ newvalue = PAR_RESULT rest+ out' = popTo stid (outparm cgistate)+ in+ unwrapCGI (onResult result)+ cgistate { inparm = []+ , outparm = newvalue : out'+ , stateID = nextstid stid newvalue + }+ _ ->+ ioError err+ in+ case inparm cgistate of+ [] ->+ let stid = stateID cgistate+ newmark = PAR_TRANS stid+ newvalue = PAR_RESULT (show result)+ in+ run stid cgistate + { outparm = newvalue : newvalue : newmark : outparm cgistate+ , stateID = nextstid (nextstid (nextstid stid newmark) newvalue) newvalue }+ -- ongoing transaction+ PAR_TRANS stid : PAR_RESULT failString : PAR_RESULT successString : rest ->+ run stid cgistate { inparm = rest }+ + -- finished transaction, go on with result continuation+ PAR_RESULT str : rest ->+ unwrapCGI (onResult (read str)) cgistate { inparm = rest }+ _ -> + B.reportError "Out of sync" H.empty cgistate+ ) +++-- | nested transaction+withTCGI :: (Read result, Show result) =>+ ([PARAMETER] -> IO Bool) -- committer function+ -> result -- default result+ -> (result -> TCGI result1 ()) -- result continuation+ -> (Control (TCGI result) result -> (TCGI result) ())+ -> TCGI result1 ()+withTCGI checkIfCommittable result onResult fun =+ wrapCGI (\cgistate -> + let abandon stid res =+ wrapCGI (\cgistate -> ioError (userError (shows stid $ show res)))+ setFail stid res = + B.once $+ wrapCGI (\cgistate ->+ let out = outparm cgistate + out' = applyTo stid onFail out+ onFail (pmark : pfail : psucc : rest) =+ (pmark : PAR_RESULT (show res) : psucc : rest)+ in+ return ((), cgistate { outparm = out' })+ )+ setCommit stid res = + B.once $+ wrapCGI (\cgistate ->+ let out = outparm cgistate + out' = applyTo stid onSucc out+ onSucc (pmark : pfail : psucc : rest) =+ (pmark : pfail : PAR_RESULT (show res) : rest)+ in+ return ((), cgistate { outparm = out' })+ )+ control stid =+ Control { abandon = abandon stid+ , setFail = setFail stid+ , setCommit = setCommit stid+ }+ run stid cgistate =+ do lr <- try (unwrapCGI (fun (control stid)) cgistate)+ case lr of+ Right (v, cgistate') ->+ -- body of transaction finished successfully; now commit+ let out = outparm cgistate'+ (prefix, outparm') = splitTo stid out+ PAR_TRANS _ :+ failp@(PAR_RESULT failString) :+ succp@(PAR_RESULT succString) : _ = reverse prefix+ in+ do committed <- checkIfCommittable prefix+ if committed then+ -- if commit can succeed, then its reads and writes+ -- must not be lost! + let marker = PAR_RESULT ""+ logentries = [ x | x@(PAR_DB _) <- prefix]+ in+ unwrapCGI (onResult (read succString))+ cgistate' { outparm = succp : logentries ++ + marker : outparm' }+ else+ unwrapCGI (onResult (read failString))+ cgistate' { outparm = failp : outparm' }+ + Left err ->+ -- Caught an exception; might be due to an @anbandon@ operation+ case reads (ioeGetErrorString err) of+ (stid', rest) : _ | stid' == stid ->+ let result = read rest+ newvalue = PAR_RESULT rest+ out' = popTo stid (outparm cgistate)+ in+ unwrapCGI (onResult result)+ cgistate { inparm = []+ , outparm = newvalue : out'+ , stateID = nextstid stid newvalue + }+ _ ->+ ioError err+ in+ case inparm cgistate of+ [] ->+ let stid = stateID cgistate+ newmark = PAR_TRANS stid+ newvalue = PAR_RESULT (show result)+ in+ run stid cgistate + { outparm = newvalue : newvalue : newmark : outparm cgistate+ , stateID = nextstid (nextstid (nextstid stid newmark) newvalue) newvalue }+ -- ongoing transaction+ PAR_TRANS stid : PAR_RESULT failString : PAR_RESULT successString : rest ->+ run stid cgistate { inparm = rest }+ + -- finished nested transaction successfully+ PAR_RESULT "" : rest ->+ let loop (PAR_RESULT str : rest) =+ unwrapCGI (onResult (read str)) cgistate { inparm = rest }+ loop (PAR_DB _ : rest) =+ loop rest+ loop _ =+ B.reportError "Format error in nested transaction log" H.empty cgistate+ in loop rest+ -- finished transaction, go on with result continuation+ PAR_RESULT str : rest ->+ unwrapCGI (onResult (read str)) cgistate { inparm = rest }+ _ -> + B.reportError "Out of sync" H.empty cgistate+ ) +
+ WASH/CGI/Types.hs view
@@ -0,0 +1,184 @@+-- © 2001, 2002, 2003 Peter Thiemann+{-| The Types module aims at providing a representation for (first-order)+monomorphic Haskell types. Two type representations are equal if and+only if the represented types have identical definitions. Thus a type+representation consists of a type term and the smallest list of all+(data or newtype) definitions needed either in the type term or in+another definition. The list of definitions is sorted to make+representations unique.++The main use of type representations is to provide a type index for+storing Haskell values externally and for reading them back into a+running program without sacrificing type safety. Just reading them+back with the @Read@ class is not sufficient because++ * @Read@ does not distinguish between @Int@ and @Integer@, @Float@ and @Double@y++ * @Read@ cannot avoid accidental matches of constructor names++Meanwhile, the 'Data.Typeable' class of GHC provides an encoding with similar+goals.+-}+module WASH.CGI.Types where++import Maybe++-- | A type specification consists of a type representation 'TyRep' and a list of+-- type declarations.+data TySpec = + TS TyRep [TyDecl] -- declarations sorted!+ deriving (Read, Show, Eq)++-- | A type representation is built from base types, type variables, tuples, and+-- references to data-defined types.+data TyRep =+ TRBase String+ | TRVar String+ | TRTuple [TyRep]+ | TRData String [TyRep]+ deriving (Read, Show, Eq)++-- | A data declaration consists of the name of the data type, a list of type+-- variables, and a list of constructor representations.+data TyDecl =+ TD String [String] [ConRep]+ deriving (Read, Show, Eq)++-- | A constructor is represented by its name, a list of field names (if defined+-- using record notation), and the list of its argument types+data ConRep =+ CR String -- ctor name+ (Maybe [String]) -- field names+ [TyRep] -- field types+ deriving (Read, Show, Eq)++class Types a where+ ty :: a -> TySpec++instance Types () where+ ty i = TS (TRBase "()") []++instance Types Bool where+ ty i = TS (TRBase "Bool") []+ +instance Types Int where+ ty i = TS (TRBase "Int") []+ +instance Types Integer where+ ty i = TS (TRBase "Integer") []+ +--instance Types Rational where+-- ty i = TS (TRBase "Rational") []++instance Types Double where+ ty d = TS (TRBase "Double") []++instance Types Float where+ ty d = TS (TRBase "Float") []++instance Types Char where+ ty c = TS (TRBase "Char") []++instance (Types a, Types b) => Types (a,b) where+ ty xy = TS (TRTuple [tra, trb]) (merge defsa defsb)+ where TS tra defsa = ty (fst xy)+ TS trb defsb = ty (snd xy)++instance (Types a, Types b, Types c) => Types (a,b,c) where+ ty ~(xa,xb,xc) = TS (TRTuple [tra, trb, trc]) (merge (merge defsa defsb) defsc)+ where TS tra defsa = ty xa+ TS trb defsb = ty xb+ TS trc defsc = ty xc++instance (Types a, Types b, Types c, Types d) => Types (a,b,c,d) where+ ty ~(xa,xb,xc,xd) = TS (TRTuple [tra, trb, trc, trd]) + (merge (merge defsa defsb) (merge defsc defsd))+ where TS tra defsa = ty xa+ TS trb defsb = ty xb+ TS trc defsc = ty xc+ TS trd defsd = ty xd++instance (Types a, Types b, Types c, Types d, Types e) => Types (a,b,c,d,e) where+ ty ~(xa,xb,xc,xd,xe) = TS (TRTuple [tra, trb, trc, trd, tre]) + (merges [defsa, defsb, defsc, defsd, defse])+ where TS tra defsa = ty xa+ TS trb defsb = ty xb+ TS trc defsc = ty xc+ TS trd defsd = ty xd+ TS tre defse = ty xe++instance (Types a) => Types [a] where+ ty xs = TS (TRData (tdName listDef) [tr]) (merge defs [listDef])+ where TS tr defs = ty (head xs)++listDef :: TyDecl+listDef = TD "[]" ["a"] [CR "[]" Nothing []+ ,CR ":" Nothing [TRVar "a"+ ,TRData (tdName listDef) [TRVar "a"]]]++instance (Types a) => Types (Maybe a) where+ ty mx = TS (TRData (tdName maybeDef) [tr]) (merge defs [maybeDef])+ where TS tr defs = ty (fromJust mx)++-- fromJust (Just x) = x -- in Module Maybe++maybeDef :: TyDecl+maybeDef = + TD "Maybe" ["a"][CR "Nothing" Nothing []+ ,CR "Just" Nothing [TRVar "a"]]++instance (Types a, Types b) => Types (Either a b) where+ ty xy = TS (TRData (tdName eitherDef) [tra, trb]) + (merge (merge defsa defsb) [eitherDef])+ where TS tra defsa = ty (fromLeft xy)+ TS trb defsb = ty (fromRight xy)++fromLeft (Left x) = x+fromRight (Right y) = y++eitherDef :: TyDecl+eitherDef =+ TD "Either"+ ["a", "b"]+ [CR "Left" Nothing [TRVar "a"]+ ,CR "Right" Nothing [TRVar "b"]]++tdName (TD name _ _) = name++merge :: [TyDecl] -> [TyDecl] -> [TyDecl]+merge [] ys = ys+merge xs [] = xs+merge (x:xs) (y:ys) + | x == y = x : merge xs ys+ | tdName x == tdName y = error ("Different types with identical name: " ++ tdName x)+ | tdName x <= tdName y = x : merge xs (y:ys)+ | otherwise = y : merge (x:xs) ys++merges :: [[TyDecl]] -> [TyDecl]+merges tss = foldr merge [] tss++class TID a where+ tid :: a -> ShowS+ +instance TID TySpec where+ tid (TS tyRep tyDecls) =+ tid tyRep . tid tyDecls++instance TID a => TID [a] where+ tid [] = showChar '.'+ tid (x : xs) = showChar ',' . tid x . tid xs++instance TID TyRep where+ tid (TRBase str) = showChar 'B' . shows str+ tid (TRVar str) = showChar 'V' . shows str+ tid (TRTuple tyReps) = showChar 'T' . tid tyReps+ tid (TRData str tyReps) = showChar 'D' . shows str . tid tyReps++instance TID TyDecl where+ tid (TD name tyvars conreps) =+ shows name . shows tyvars . tid conreps++instance TID ConRep where+ tid (CR ctorname mFields tyReps) =+ shows ctorname . shows mFields . tid tyReps+
+ WASH/HTML/HTMLBase.hs view
@@ -0,0 +1,180 @@+-- © 2001-2003 Peter Thiemann+module WASH.HTML.HTMLBase +{- + (ATTR_(), attr_, attr_name, attr_value+ ,ELEMENT_(), element_, empty_, cdata_, comment_, doctype_+ ,CDATA_OPTIONS(..)+ ,add_, add_attr_+ ,get_attrs_+ ,BT(..)+ ,element_S, empty_S, cdata_S, comment_S, doctype_S+ ,element_T, empty_T, cdata_T, comment_T, doctype_T+ ,attr_SS, attr_SD, attr_TS, attr_TD+ ,showTemplatified)+-}+where++import Char++data BT = STATIC | DYNAMIC | TOPLEVEL++-- untyped layer+-- attributes++data ATTR_ =+ ATTR_ { attr_BT :: BT+ , attr_value_BT :: BT+ , attr_name :: String+ , attr_value :: String+ }++attr_ = ATTR_ DYNAMIC DYNAMIC+attr_SS = ATTR_ STATIC STATIC+attr_SD = ATTR_ STATIC DYNAMIC+attr_TS = ATTR_ TOPLEVEL STATIC+attr_TD = ATTR_ TOPLEVEL DYNAMIC++-- elements++data ELEMENT_ =+ ELEMENT_ { elem_BT :: BT+ , tag :: String+ , attrs :: [ATTR_]+ , elems :: [ELEMENT_]+ }+ | EMPTY_ { elem_BT :: BT+ , tag :: String+ , attrs :: [ATTR_]+ }+ | CDATA_ { elem_BT :: BT+ , elem_cdata :: String+ }+ | COMMENT_ { elem_BT :: BT+ , elem_comment :: String+ }+ | DOCTYPE_ { elem_BT :: BT+ , doctype :: [String]+ , elems :: [ELEMENT_]+ }++data CDATA_OPTIONS = CDATA_ENCODED | CDATA_FORMATTED+ deriving (Eq)++element_ = ELEMENT_ DYNAMIC+element_S = ELEMENT_ STATIC+element_T = ELEMENT_ TOPLEVEL+empty_ = EMPTY_ DYNAMIC+empty_S = EMPTY_ STATIC+empty_T = EMPTY_ TOPLEVEL+makeEncoder opt = format . encode+ where format | CDATA_FORMATTED `elem` opt = id+ | otherwise = htmlFormat+ encode | CDATA_ENCODED `elem` opt = id+ | otherwise = htmlEncode+cdata_ opt = CDATA_ DYNAMIC . makeEncoder opt+cdata_S opt = CDATA_ STATIC . makeEncoder opt+cdata_T opt = CDATA_ TOPLEVEL . makeEncoder opt+comment_ = COMMENT_ DYNAMIC+comment_S = COMMENT_ STATIC+comment_T = COMMENT_ TOPLEVEL+doctype_ = DOCTYPE_ DYNAMIC+doctype_S = DOCTYPE_ STATIC+doctype_T = DOCTYPE_ TOPLEVEL++add_ e_ e'_ = e_ { elems = e'_ : elems e_}+-- | Takes element and attribute. Attaches attribute to the element. Replaces+-- prior attribute with same name.+add_attr_ e_ att = + let nameOfAtt = attr_name att+ all_attrs = attrs e_+ f [] = Nothing+ f (att' : attrs) = if attr_name att' == nameOfAtt + then return (att : attrs)+ else f attrs >>= \ attrs' -> return (att' : attrs')+ new_attrs = case f all_attrs of+ Nothing -> att : all_attrs+ Just attrs -> attrs+ in e_ { attrs = new_attrs }++get_attrs_ = attrs++-- show functions++instance Show ATTR_ where+ showsPrec i = shows_attribute+ showList = shows_attributes++shows_attributes :: [ATTR_] -> ShowS+shows_attributes atts = foldr (.) id (map shows_attribute atts)++shows_attribute :: ATTR_ -> ShowS+shows_attribute a =+ showChar ' ' . showString (attr_name a) .+ case attr_value a of+ "()" ->+ id+ str@('\"':_) ->+ showString "=\"" . htmlAttr (read str) . showString "\""+ str ->+ showString "=\"" . htmlAttr str . showString "\""++instance Show ELEMENT_ where+ showsPrec i = shows_element+ showList = shows_elements++shows_elements :: [ELEMENT_] -> ShowS+shows_elements elts = foldr (.) id (reverse (map shows_element elts))++shows_element :: ELEMENT_ -> ShowS+shows_element (EMPTY_ bt tag atts) =+ showChar '<' . showString tag . shows atts . showString "\n/>"+shows_element (ELEMENT_ bt tag atts elts) =+ showChar '<' . showString tag . shows atts . showChar '>'+ . shows_elements elts+ . showString "</" . showString tag . showString "\n>"+shows_element (DOCTYPE_ bt strs elems) =+ showString "<!DOCTYPE" . + foldr (\str f -> showChar ' ' . showString str . f) id strs . showString "\n>" .+ showString "<!-- generated by WASH/HTML 0.11\n-->" .+ shows_elements elems .+ showChar '\n'+shows_element (CDATA_ bt str) =+ showString str+shows_element (COMMENT_ bt str) =+ showString "<!-- " . commentEncode str . showString "\n-->"++-- |removes illegal characters and sequences of -- from comment+commentEncode :: String -> ShowS+commentEncode "" ys = ys+commentEncode ('-':xs@('-':_)) ys = '-':' ': commentEncode xs ys+commentEncode (x:xs) ys = + if x == chr 0x9 ||+ x == chr 0xa ||+ x == chr 0xd ||+ x >= chr 0x20 && x <= chr 0xd7ff ||+ x >= chr 0xe000 && x <= chr 0xfffd ||+ x >= chr 0x10000 && x <= chr 0x10ffff+ then x: commentEncode xs ys+ else '?': commentEncode xs ys++htmlForbiddenChars = "<&\""++htmlEncode :: String -> String+htmlEncode s = htmlAttr s ""++htmlFormat s = s++htmlAttr :: String -> ShowS+htmlAttr "" = id+htmlAttr (x:xs) =+ (if x `elem` htmlForbiddenChars+ then showString "&#" . shows (ord x) . showChar ';'+ else showChar x) . htmlAttr xs++{--htmlFormat "" = ""+htmlFormat (x:xs) =+ if isSpace x then+ "\n " ++ htmlFormat (dropWhile isSpace xs)+ else+ x : htmlFormat xs +--}
+ WASH/HTML/HTMLMonad.hs view
@@ -0,0 +1,372 @@+-- © 2001-2003 Peter Thiemann+-- this file is generated -- do not edit+module WASH.HTML.HTMLMonad + (module WASH.HTML.HTMLMonad,module WASH.HTML.HTMLMonadBase) + where+import Prelude hiding (div,head,map,span)+import WASH.HTML.HTMLMonadBase+-- end fixed prologue+a = mkElement "a"+a, a_S, a_T :: Monad m => HTMLCons x y m a+a_S = mkElement_S "a"+a_T = mkElement_T "a"+abbr = mkElement "abbr"+abbr, abbr_S, abbr_T :: Monad m => HTMLCons x y m a+abbr_S = mkElement_S "abbr"+abbr_T = mkElement_T "abbr"+acronym = mkElement "acronym"+acronym, acronym_S, acronym_T :: Monad m => HTMLCons x y m a+acronym_S = mkElement_S "acronym"+acronym_T = mkElement_T "acronym"+address = mkElement "address"+address, address_S, address_T :: Monad m => HTMLCons x y m a+address_S = mkElement_S "address"+address_T = mkElement_T "address"+applet = mkElement "applet"+applet, applet_S, applet_T :: Monad m => HTMLCons x y m a+applet_S = mkElement_S "applet"+applet_T = mkElement_T "applet"+area = mkEmpty "area"+area, area_S, area_T :: Monad m => HTMLCons x y m a+area_S = mkEmpty_S "area"+area_T = mkEmpty_T "area"+b = mkElement "b"+b, b_S, b_T :: Monad m => HTMLCons x y m a+b_S = mkElement_S "b"+b_T = mkElement_T "b"+base = mkEmpty "base"+base, base_S, base_T :: Monad m => HTMLCons x y m a+base_S = mkEmpty_S "base"+base_T = mkEmpty_T "base"+basefont = mkEmpty "basefont"+basefont, basefont_S, basefont_T :: Monad m => HTMLCons x y m a+basefont_S = mkEmpty_S "basefont"+basefont_T = mkEmpty_T "basefont"+bdo = mkElement "bdo"+bdo, bdo_S, bdo_T :: Monad m => HTMLCons x y m a+bdo_S = mkElement_S "bdo"+bdo_T = mkElement_T "bdo"+big = mkElement "big"+big, big_S, big_T :: Monad m => HTMLCons x y m a+big_S = mkElement_S "big"+big_T = mkElement_T "big"+blockquote = mkElement "blockquote"+blockquote, blockquote_S, blockquote_T :: Monad m => HTMLCons x y m a+blockquote_S = mkElement_S "blockquote"+blockquote_T = mkElement_T "blockquote"+body = mkElement "body"+body, body_S, body_T :: Monad m => HTMLCons x y m a+body_S = mkElement_S "body"+body_T = mkElement_T "body"+br = mkEmpty "br"+br, br_S, br_T :: Monad m => HTMLCons x y m a+br_S = mkEmpty_S "br"+br_T = mkEmpty_T "br"+button = mkElement "button"+button, button_S, button_T :: Monad m => HTMLCons x y m a+button_S = mkElement_S "button"+button_T = mkElement_T "button"+caption = mkElement "caption"+caption, caption_S, caption_T :: Monad m => HTMLCons x y m a+caption_S = mkElement_S "caption"+caption_T = mkElement_T "caption"+center = mkElement "center"+center, center_S, center_T :: Monad m => HTMLCons x y m a+center_S = mkElement_S "center"+center_T = mkElement_T "center"+cite = mkElement "cite"+cite, cite_S, cite_T :: Monad m => HTMLCons x y m a+cite_S = mkElement_S "cite"+cite_T = mkElement_T "cite"+code = mkElement "code"+code, code_S, code_T :: Monad m => HTMLCons x y m a+code_S = mkElement_S "code"+code_T = mkElement_T "code"+col = mkEmpty "col"+col, col_S, col_T :: Monad m => HTMLCons x y m a+col_S = mkEmpty_S "col"+col_T = mkEmpty_T "col"+colgroup = mkElement "colgroup"+colgroup, colgroup_S, colgroup_T :: Monad m => HTMLCons x y m a+colgroup_S = mkElement_S "colgroup"+colgroup_T = mkElement_T "colgroup"+dd = mkElement "dd"+dd, dd_S, dd_T :: Monad m => HTMLCons x y m a+dd_S = mkElement_S "dd"+dd_T = mkElement_T "dd"+del = mkElement "del"+del, del_S, del_T :: Monad m => HTMLCons x y m a+del_S = mkElement_S "del"+del_T = mkElement_T "del"+dfn = mkElement "dfn"+dfn, dfn_S, dfn_T :: Monad m => HTMLCons x y m a+dfn_S = mkElement_S "dfn"+dfn_T = mkElement_T "dfn"+dir = mkElement "dir"+dir, dir_S, dir_T :: Monad m => HTMLCons x y m a+dir_S = mkElement_S "dir"+dir_T = mkElement_T "dir"+div = mkElement "div"+div, div_S, div_T :: Monad m => HTMLCons x y m a+div_S = mkElement_S "div"+div_T = mkElement_T "div"+dl = mkElement "dl"+dl, dl_S, dl_T :: Monad m => HTMLCons x y m a+dl_S = mkElement_S "dl"+dl_T = mkElement_T "dl"+dt = mkElement "dt"+dt, dt_S, dt_T :: Monad m => HTMLCons x y m a+dt_S = mkElement_S "dt"+dt_T = mkElement_T "dt"+em = mkElement "em"+em, em_S, em_T :: Monad m => HTMLCons x y m a+em_S = mkElement_S "em"+em_T = mkElement_T "em"+fieldset = mkElement "fieldset"+fieldset, fieldset_S, fieldset_T :: Monad m => HTMLCons x y m a+fieldset_S = mkElement_S "fieldset"+fieldset_T = mkElement_T "fieldset"+font = mkElement "font"+font, font_S, font_T :: Monad m => HTMLCons x y m a+font_S = mkElement_S "font"+font_T = mkElement_T "font"+form = mkElement "form"+form, form_S, form_T :: Monad m => HTMLCons x y m a+form_S = mkElement_S "form"+form_T = mkElement_T "form"+frame = mkEmpty "frame"+frame, frame_S, frame_T :: Monad m => HTMLCons x y m a+frame_S = mkEmpty_S "frame"+frame_T = mkEmpty_T "frame"+frameset = mkElement "frameset"+frameset, frameset_S, frameset_T :: Monad m => HTMLCons x y m a+frameset_S = mkElement_S "frameset"+frameset_T = mkElement_T "frameset"+h1 = mkElement "h1"+h1, h1_S, h1_T :: Monad m => HTMLCons x y m a+h1_S = mkElement_S "h1"+h1_T = mkElement_T "h1"+h2 = mkElement "h2"+h2, h2_S, h2_T :: Monad m => HTMLCons x y m a+h2_S = mkElement_S "h2"+h2_T = mkElement_T "h2"+h3 = mkElement "h3"+h3, h3_S, h3_T :: Monad m => HTMLCons x y m a+h3_S = mkElement_S "h3"+h3_T = mkElement_T "h3"+h4 = mkElement "h4"+h4, h4_S, h4_T :: Monad m => HTMLCons x y m a+h4_S = mkElement_S "h4"+h4_T = mkElement_T "h4"+h5 = mkElement "h5"+h5, h5_S, h5_T :: Monad m => HTMLCons x y m a+h5_S = mkElement_S "h5"+h5_T = mkElement_T "h5"+h6 = mkElement "h6"+h6, h6_S, h6_T :: Monad m => HTMLCons x y m a+h6_S = mkElement_S "h6"+h6_T = mkElement_T "h6"+head = mkElement "head"+head, head_S, head_T :: Monad m => HTMLCons x y m a+head_S = mkElement_S "head"+head_T = mkElement_T "head"+hr = mkEmpty "hr"+hr, hr_S, hr_T :: Monad m => HTMLCons x y m a+hr_S = mkEmpty_S "hr"+hr_T = mkEmpty_T "hr"+html = mkElement "html"+html, html_S, html_T :: Monad m => HTMLCons x y m a+html_S = mkElement_S "html"+html_T = mkElement_T "html"+i = mkElement "i"+i, i_S, i_T :: Monad m => HTMLCons x y m a+i_S = mkElement_S "i"+i_T = mkElement_T "i"+iframe = mkElement "iframe"+iframe, iframe_S, iframe_T :: Monad m => HTMLCons x y m a+iframe_S = mkElement_S "iframe"+iframe_T = mkElement_T "iframe"+img = mkEmpty "img"+img, img_S, img_T :: Monad m => HTMLCons x y m a+img_S = mkEmpty_S "img"+img_T = mkEmpty_T "img"+input = mkEmpty "input"+input, input_S, input_T :: Monad m => HTMLCons x y m a+input_S = mkEmpty_S "input"+input_T = mkEmpty_T "input"+ins = mkElement "ins"+ins, ins_S, ins_T :: Monad m => HTMLCons x y m a+ins_S = mkElement_S "ins"+ins_T = mkElement_T "ins"+isindex = mkEmpty "isindex"+isindex, isindex_S, isindex_T :: Monad m => HTMLCons x y m a+isindex_S = mkEmpty_S "isindex"+isindex_T = mkEmpty_T "isindex"+kbd = mkElement "kbd"+kbd, kbd_S, kbd_T :: Monad m => HTMLCons x y m a+kbd_S = mkElement_S "kbd"+kbd_T = mkElement_T "kbd"+label = mkElement "label"+label, label_S, label_T :: Monad m => HTMLCons x y m a+label_S = mkElement_S "label"+label_T = mkElement_T "label"+legend = mkElement "legend"+legend, legend_S, legend_T :: Monad m => HTMLCons x y m a+legend_S = mkElement_S "legend"+legend_T = mkElement_T "legend"+li = mkElement "li"+li, li_S, li_T :: Monad m => HTMLCons x y m a+li_S = mkElement_S "li"+li_T = mkElement_T "li"+link = mkEmpty "link"+link, link_S, link_T :: Monad m => HTMLCons x y m a+link_S = mkEmpty_S "link"+link_T = mkEmpty_T "link"+map = mkElement "map"+map, map_S, map_T :: Monad m => HTMLCons x y m a+map_S = mkElement_S "map"+map_T = mkElement_T "map"+menu = mkElement "menu"+menu, menu_S, menu_T :: Monad m => HTMLCons x y m a+menu_S = mkElement_S "menu"+menu_T = mkElement_T "menu"+meta = mkEmpty "meta"+meta, meta_S, meta_T :: Monad m => HTMLCons x y m a+meta_S = mkEmpty_S "meta"+meta_T = mkEmpty_T "meta"+noframes = mkElement "noframes"+noframes, noframes_S, noframes_T :: Monad m => HTMLCons x y m a+noframes_S = mkElement_S "noframes"+noframes_T = mkElement_T "noframes"+noscript = mkElement "noscript"+noscript, noscript_S, noscript_T :: Monad m => HTMLCons x y m a+noscript_S = mkElement_S "noscript"+noscript_T = mkElement_T "noscript"+object = mkElement "object"+object, object_S, object_T :: Monad m => HTMLCons x y m a+object_S = mkElement_S "object"+object_T = mkElement_T "object"+ol = mkElement "ol"+ol, ol_S, ol_T :: Monad m => HTMLCons x y m a+ol_S = mkElement_S "ol"+ol_T = mkElement_T "ol"+optgroup = mkElement "optgroup"+optgroup, optgroup_S, optgroup_T :: Monad m => HTMLCons x y m a+optgroup_S = mkElement_S "optgroup"+optgroup_T = mkElement_T "optgroup"+option = mkElement "option"+option, option_S, option_T :: Monad m => HTMLCons x y m a+option_S = mkElement_S "option"+option_T = mkElement_T "option"+p = mkElement "p"+p, p_S, p_T :: Monad m => HTMLCons x y m a+p_S = mkElement_S "p"+p_T = mkElement_T "p"+param = mkEmpty "param"+param, param_S, param_T :: Monad m => HTMLCons x y m a+param_S = mkEmpty_S "param"+param_T = mkEmpty_T "param"+pre = mkElement "pre"+pre, pre_S, pre_T :: Monad m => HTMLCons x y m a+pre_S = mkElement_S "pre"+pre_T = mkElement_T "pre"+q = mkElement "q"+q, q_S, q_T :: Monad m => HTMLCons x y m a+q_S = mkElement_S "q"+q_T = mkElement_T "q"+s = mkElement "s"+s, s_S, s_T :: Monad m => HTMLCons x y m a+s_S = mkElement_S "s"+s_T = mkElement_T "s"+samp = mkElement "samp"+samp, samp_S, samp_T :: Monad m => HTMLCons x y m a+samp_S = mkElement_S "samp"+samp_T = mkElement_T "samp"+script = mkElement "script"+script, script_S, script_T :: Monad m => HTMLCons x y m a+script_S = mkElement_S "script"+script_T = mkElement_T "script"+select = mkElement "select"+select, select_S, select_T :: Monad m => HTMLCons x y m a+select_S = mkElement_S "select"+select_T = mkElement_T "select"+small = mkElement "small"+small, small_S, small_T :: Monad m => HTMLCons x y m a+small_S = mkElement_S "small"+small_T = mkElement_T "small"+span = mkElement "span"+span, span_S, span_T :: Monad m => HTMLCons x y m a+span_S = mkElement_S "span"+span_T = mkElement_T "span"+strike = mkElement "strike"+strike, strike_S, strike_T :: Monad m => HTMLCons x y m a+strike_S = mkElement_S "strike"+strike_T = mkElement_T "strike"+strong = mkElement "strong"+strong, strong_S, strong_T :: Monad m => HTMLCons x y m a+strong_S = mkElement_S "strong"+strong_T = mkElement_T "strong"+style = mkElement "style"+style, style_S, style_T :: Monad m => HTMLCons x y m a+style_S = mkElement_S "style"+style_T = mkElement_T "style"+sub = mkElement "sub"+sub, sub_S, sub_T :: Monad m => HTMLCons x y m a+sub_S = mkElement_S "sub"+sub_T = mkElement_T "sub"+sup = mkElement "sup"+sup, sup_S, sup_T :: Monad m => HTMLCons x y m a+sup_S = mkElement_S "sup"+sup_T = mkElement_T "sup"+table = mkElement "table"+table, table_S, table_T :: Monad m => HTMLCons x y m a+table_S = mkElement_S "table"+table_T = mkElement_T "table"+tbody = mkElement "tbody"+tbody, tbody_S, tbody_T :: Monad m => HTMLCons x y m a+tbody_S = mkElement_S "tbody"+tbody_T = mkElement_T "tbody"+td = mkElement "td"+td, td_S, td_T :: Monad m => HTMLCons x y m a+td_S = mkElement_S "td"+td_T = mkElement_T "td"+textarea = mkElement "textarea"+textarea, textarea_S, textarea_T :: Monad m => HTMLCons x y m a+textarea_S = mkElement_S "textarea"+textarea_T = mkElement_T "textarea"+tfoot = mkElement "tfoot"+tfoot, tfoot_S, tfoot_T :: Monad m => HTMLCons x y m a+tfoot_S = mkElement_S "tfoot"+tfoot_T = mkElement_T "tfoot"+th = mkElement "th"+th, th_S, th_T :: Monad m => HTMLCons x y m a+th_S = mkElement_S "th"+th_T = mkElement_T "th"+thead = mkElement "thead"+thead, thead_S, thead_T :: Monad m => HTMLCons x y m a+thead_S = mkElement_S "thead"+thead_T = mkElement_T "thead"+title = mkElement "title"+title, title_S, title_T :: Monad m => HTMLCons x y m a+title_S = mkElement_S "title"+title_T = mkElement_T "title"+tr = mkElement "tr"+tr, tr_S, tr_T :: Monad m => HTMLCons x y m a+tr_S = mkElement_S "tr"+tr_T = mkElement_T "tr"+tt = mkElement "tt"+tt, tt_S, tt_T :: Monad m => HTMLCons x y m a+tt_S = mkElement_S "tt"+tt_T = mkElement_T "tt"+u = mkElement "u"+u, u_S, u_T :: Monad m => HTMLCons x y m a+u_S = mkElement_S "u"+u_T = mkElement_T "u"+ul = mkElement "ul"+ul, ul_S, ul_T :: Monad m => HTMLCons x y m a+ul_S = mkElement_S "ul"+ul_T = mkElement_T "ul"+var = mkElement "var"+var, var_S, var_T :: Monad m => HTMLCons x y m a+var_S = mkElement_S "var"+var_T = mkElement_T "var"
+ WASH/HTML/HTMLMonad98.hs view
@@ -0,0 +1,5852 @@+-- © 2001, 2002 Peter Thiemann+-- this file is generated -- do not edit+module WASH.HTML.HTMLMonad98+ (module WASH.HTML.HTMLMonad98,+ Element,Attributes,Attribute,WithHTML,lift,get_attrs,empty,( ## ),HTMLCons,attr)+ where+import Prelude hiding (div,head,map,span)+import qualified WASH.HTML.HTMLMonad as HTMLMonad+-- fixed top level code+import WASH.HTML.HTMLMonad+ ( Element, Attributes, Attribute+ , WithHTML, lift, get_attrs+ , empty, ( ## )+ , HTMLCons, attr, av, addMaker)+data DOCUMENT = DOCUMENT+instance AdmitChildHTML DOCUMENT+build_document :: (Monad m) => WithHTML DOCUMENT m a -> m Element+build_document = HTMLMonad.build_document+class AdmitChildCDATA e where+ text, rawtext, formattedtext :: Monad m => String -> WithHTML e m ()+ text = HTMLMonad.text+ rawtext = HTMLMonad.rawtext+ formattedtext = HTMLMonad.formattedtext+-- end fixed prologue+class AdmitAttrVERSION e where+ uaVERSION :: (Monad m) => String -> WithHTML e m ()+ uaVERSION str = attr "VERSION" str+ atVERSION :: (Monad m, AttrValueVERSION v) => v -> WithHTML e m ()+ atVERSION v = attr "VERSION" (av $ show v)+class AdmitAttrDIR e where+ uaDIR :: (Monad m) => String -> WithHTML e m ()+ uaDIR str = attr "DIR" str+ atDIR :: (Monad m, AttrValueDIR v) => v -> WithHTML e m ()+ atDIR v = attr "DIR" (av $ show v)+class AdmitAttrLANG e where+ uaLANG :: (Monad m) => String -> WithHTML e m ()+ uaLANG str = attr "LANG" str+ atLANG :: (Monad m, AttrValueLANG v) => v -> WithHTML e m ()+ atLANG v = attr "LANG" (av $ show v)+class AdmitAttrONKEYUP e where+ uaONKEYUP :: (Monad m) => String -> WithHTML e m ()+ uaONKEYUP str = attr "ONKEYUP" str+ atONKEYUP :: (Monad m, AttrValueONKEYUP v) => v -> WithHTML e m ()+ atONKEYUP v = attr "ONKEYUP" (av $ show v)+class AdmitAttrONKEYDOWN e where+ uaONKEYDOWN :: (Monad m) => String -> WithHTML e m ()+ uaONKEYDOWN str = attr "ONKEYDOWN" str+ atONKEYDOWN :: (Monad m, AttrValueONKEYDOWN v) => v -> WithHTML e m ()+ atONKEYDOWN v = attr "ONKEYDOWN" (av $ show v)+class AdmitAttrONKEYPRESS e where+ uaONKEYPRESS :: (Monad m) => String -> WithHTML e m ()+ uaONKEYPRESS str = attr "ONKEYPRESS" str+ atONKEYPRESS :: (Monad m, AttrValueONKEYPRESS v) => v -> WithHTML e m ()+ atONKEYPRESS v = attr "ONKEYPRESS" (av $ show v)+class AdmitAttrONMOUSEOUT e where+ uaONMOUSEOUT :: (Monad m) => String -> WithHTML e m ()+ uaONMOUSEOUT str = attr "ONMOUSEOUT" str+ atONMOUSEOUT :: (Monad m, AttrValueONMOUSEOUT v) => v -> WithHTML e m ()+ atONMOUSEOUT v = attr "ONMOUSEOUT" (av $ show v)+class AdmitAttrONMOUSEMOVE e where+ uaONMOUSEMOVE :: (Monad m) => String -> WithHTML e m ()+ uaONMOUSEMOVE str = attr "ONMOUSEMOVE" str+ atONMOUSEMOVE :: (Monad m, AttrValueONMOUSEMOVE v) => v -> WithHTML e m ()+ atONMOUSEMOVE v = attr "ONMOUSEMOVE" (av $ show v)+class AdmitAttrONMOUSEOVER e where+ uaONMOUSEOVER :: (Monad m) => String -> WithHTML e m ()+ uaONMOUSEOVER str = attr "ONMOUSEOVER" str+ atONMOUSEOVER :: (Monad m, AttrValueONMOUSEOVER v) => v -> WithHTML e m ()+ atONMOUSEOVER v = attr "ONMOUSEOVER" (av $ show v)+class AdmitAttrONMOUSEUP e where+ uaONMOUSEUP :: (Monad m) => String -> WithHTML e m ()+ uaONMOUSEUP str = attr "ONMOUSEUP" str+ atONMOUSEUP :: (Monad m, AttrValueONMOUSEUP v) => v -> WithHTML e m ()+ atONMOUSEUP v = attr "ONMOUSEUP" (av $ show v)+class AdmitAttrONMOUSEDOWN e where+ uaONMOUSEDOWN :: (Monad m) => String -> WithHTML e m ()+ uaONMOUSEDOWN str = attr "ONMOUSEDOWN" str+ atONMOUSEDOWN :: (Monad m, AttrValueONMOUSEDOWN v) => v -> WithHTML e m ()+ atONMOUSEDOWN v = attr "ONMOUSEDOWN" (av $ show v)+class AdmitAttrONDBLCLICK e where+ uaONDBLCLICK :: (Monad m) => String -> WithHTML e m ()+ uaONDBLCLICK str = attr "ONDBLCLICK" str+ atONDBLCLICK :: (Monad m, AttrValueONDBLCLICK v) => v -> WithHTML e m ()+ atONDBLCLICK v = attr "ONDBLCLICK" (av $ show v)+class AdmitAttrONCLICK e where+ uaONCLICK :: (Monad m) => String -> WithHTML e m ()+ uaONCLICK str = attr "ONCLICK" str+ atONCLICK :: (Monad m, AttrValueONCLICK v) => v -> WithHTML e m ()+ atONCLICK v = attr "ONCLICK" (av $ show v)+class AdmitAttrTITLE e where+ uaTITLE :: (Monad m) => String -> WithHTML e m ()+ uaTITLE str = attr "TITLE" str+ atTITLE :: (Monad m, AttrValueTITLE v) => v -> WithHTML e m ()+ atTITLE v = attr "TITLE" (av $ show v)+class AdmitAttrSTYLE e where+ uaSTYLE :: (Monad m) => String -> WithHTML e m ()+ uaSTYLE str = attr "STYLE" str+ atSTYLE :: (Monad m, AttrValueSTYLE v) => v -> WithHTML e m ()+ atSTYLE v = attr "STYLE" (av $ show v)+class AdmitAttrCLASS e where+ uaCLASS :: (Monad m) => String -> WithHTML e m ()+ uaCLASS str = attr "CLASS" str+ atCLASS :: (Monad m, AttrValueCLASS v) => v -> WithHTML e m ()+ atCLASS v = attr "CLASS" (av $ show v)+class AdmitAttrID e where+ uaID :: (Monad m) => String -> WithHTML e m ()+ uaID str = attr "ID" str+ atID :: (Monad m, AttrValueID v) => v -> WithHTML e m ()+ atID v = attr "ID" (av $ show v)+class AdmitAttrFOR e where+ uaFOR :: (Monad m) => String -> WithHTML e m ()+ uaFOR str = attr "FOR" str+ atFOR :: (Monad m, AttrValueFOR v) => v -> WithHTML e m ()+ atFOR v = attr "FOR" (av $ show v)+class AdmitAttrEVENT e where+ uaEVENT :: (Monad m) => String -> WithHTML e m ()+ uaEVENT str = attr "EVENT" str+ atEVENT :: (Monad m, AttrValueEVENT v) => v -> WithHTML e m ()+ atEVENT v = attr "EVENT" (av $ show v)+class AdmitAttrDEFER e where+ uaDEFER :: (Monad m) => String -> WithHTML e m ()+ uaDEFER str = attr "DEFER" str+ atDEFER :: (Monad m, AttrValueDEFER v) => v -> WithHTML e m ()+ atDEFER v = attr "DEFER" (av $ show v)+class AdmitAttrSRC e where+ uaSRC :: (Monad m) => String -> WithHTML e m ()+ uaSRC str = attr "SRC" str+ atSRC :: (Monad m, AttrValueSRC v) => v -> WithHTML e m ()+ atSRC v = attr "SRC" (av $ show v)+class AdmitAttrLANGUAGE e where+ uaLANGUAGE :: (Monad m) => String -> WithHTML e m ()+ uaLANGUAGE str = attr "LANGUAGE" str+ atLANGUAGE :: (Monad m, AttrValueLANGUAGE v) => v -> WithHTML e m ()+ atLANGUAGE v = attr "LANGUAGE" (av $ show v)+class AdmitAttrTYPE e where+ uaTYPE :: (Monad m) => String -> WithHTML e m ()+ uaTYPE str = attr "TYPE" str+ atTYPE :: (Monad m, AttrValueTYPE v) => v -> WithHTML e m ()+ atTYPE v = attr "TYPE" (av $ show v)+class AdmitAttrCHARSET e where+ uaCHARSET :: (Monad m) => String -> WithHTML e m ()+ uaCHARSET str = attr "CHARSET" str+ atCHARSET :: (Monad m, AttrValueCHARSET v) => v -> WithHTML e m ()+ atCHARSET v = attr "CHARSET" (av $ show v)+class AdmitAttrMEDIA e where+ uaMEDIA :: (Monad m) => String -> WithHTML e m ()+ uaMEDIA str = attr "MEDIA" str+ atMEDIA :: (Monad m, AttrValueMEDIA v) => v -> WithHTML e m ()+ atMEDIA v = attr "MEDIA" (av $ show v)+class AdmitAttrSCHEME e where+ uaSCHEME :: (Monad m) => String -> WithHTML e m ()+ uaSCHEME str = attr "SCHEME" str+ atSCHEME :: (Monad m, AttrValueSCHEME v) => v -> WithHTML e m ()+ atSCHEME v = attr "SCHEME" (av $ show v)+class AdmitAttrCONTENT e where+ uaCONTENT :: (Monad m) => String -> WithHTML e m ()+ uaCONTENT str = attr "CONTENT" str+ atCONTENT :: (Monad m, AttrValueCONTENT v) => v -> WithHTML e m ()+ atCONTENT v = attr "CONTENT" (av $ show v)+class AdmitAttrNAME e where+ uaNAME :: (Monad m) => String -> WithHTML e m ()+ uaNAME str = attr "NAME" str+ atNAME :: (Monad m, AttrValueNAME v) => v -> WithHTML e m ()+ atNAME v = attr "NAME" (av $ show v)+class AdmitAttrHTTP_EQUIV e where+ uaHTTP_EQUIV :: (Monad m) => String -> WithHTML e m ()+ uaHTTP_EQUIV str = attr "HTTP_EQUIV" str+ atHTTP_EQUIV :: (Monad m, AttrValueHTTP_EQUIV v) => v -> WithHTML e m ()+ atHTTP_EQUIV v = attr "HTTP_EQUIV" (av $ show v)+class AdmitAttrTARGET e where+ uaTARGET :: (Monad m) => String -> WithHTML e m ()+ uaTARGET str = attr "TARGET" str+ atTARGET :: (Monad m, AttrValueTARGET v) => v -> WithHTML e m ()+ atTARGET v = attr "TARGET" (av $ show v)+class AdmitAttrHREF e where+ uaHREF :: (Monad m) => String -> WithHTML e m ()+ uaHREF str = attr "HREF" str+ atHREF :: (Monad m, AttrValueHREF v) => v -> WithHTML e m ()+ atHREF v = attr "HREF" (av $ show v)+class AdmitAttrPROMPT e where+ uaPROMPT :: (Monad m) => String -> WithHTML e m ()+ uaPROMPT str = attr "PROMPT" str+ atPROMPT :: (Monad m, AttrValuePROMPT v) => v -> WithHTML e m ()+ atPROMPT v = attr "PROMPT" (av $ show v)+class AdmitAttrPROFILE e where+ uaPROFILE :: (Monad m) => String -> WithHTML e m ()+ uaPROFILE str = attr "PROFILE" str+ atPROFILE :: (Monad m, AttrValuePROFILE v) => v -> WithHTML e m ()+ atPROFILE v = attr "PROFILE" (av $ show v)+class AdmitAttrWIDTH e where+ uaWIDTH :: (Monad m) => String -> WithHTML e m ()+ uaWIDTH str = attr "WIDTH" str+ atWIDTH :: (Monad m, AttrValueWIDTH v) => v -> WithHTML e m ()+ atWIDTH v = attr "WIDTH" (av $ show v)+class AdmitAttrHEIGHT e where+ uaHEIGHT :: (Monad m) => String -> WithHTML e m ()+ uaHEIGHT str = attr "HEIGHT" str+ atHEIGHT :: (Monad m, AttrValueHEIGHT v) => v -> WithHTML e m ()+ atHEIGHT v = attr "HEIGHT" (av $ show v)+class AdmitAttrALIGN e where+ uaALIGN :: (Monad m) => String -> WithHTML e m ()+ uaALIGN str = attr "ALIGN" str+ atALIGN :: (Monad m, AttrValueALIGN v) => v -> WithHTML e m ()+ atALIGN v = attr "ALIGN" (av $ show v)+class AdmitAttrSCROLLING e where+ uaSCROLLING :: (Monad m) => String -> WithHTML e m ()+ uaSCROLLING str = attr "SCROLLING" str+ atSCROLLING :: (Monad m, AttrValueSCROLLING v) => v -> WithHTML e m ()+ atSCROLLING v = attr "SCROLLING" (av $ show v)+class AdmitAttrMARGINHEIGHT e where+ uaMARGINHEIGHT :: (Monad m) => String -> WithHTML e m ()+ uaMARGINHEIGHT str = attr "MARGINHEIGHT" str+ atMARGINHEIGHT :: (Monad m, AttrValueMARGINHEIGHT v) => v -> WithHTML e m ()+ atMARGINHEIGHT v = attr "MARGINHEIGHT" (av $ show v)+class AdmitAttrMARGINWIDTH e where+ uaMARGINWIDTH :: (Monad m) => String -> WithHTML e m ()+ uaMARGINWIDTH str = attr "MARGINWIDTH" str+ atMARGINWIDTH :: (Monad m, AttrValueMARGINWIDTH v) => v -> WithHTML e m ()+ atMARGINWIDTH v = attr "MARGINWIDTH" (av $ show v)+class AdmitAttrFRAMEBORDER e where+ uaFRAMEBORDER :: (Monad m) => String -> WithHTML e m ()+ uaFRAMEBORDER str = attr "FRAMEBORDER" str+ atFRAMEBORDER :: (Monad m, AttrValueFRAMEBORDER v) => v -> WithHTML e m ()+ atFRAMEBORDER v = attr "FRAMEBORDER" (av $ show v)+class AdmitAttrLONGDESC e where+ uaLONGDESC :: (Monad m) => String -> WithHTML e m ()+ uaLONGDESC str = attr "LONGDESC" str+ atLONGDESC :: (Monad m, AttrValueLONGDESC v) => v -> WithHTML e m ()+ atLONGDESC v = attr "LONGDESC" (av $ show v)+class AdmitAttrNORESIZE e where+ uaNORESIZE :: (Monad m) => String -> WithHTML e m ()+ uaNORESIZE str = attr "NORESIZE" str+ atNORESIZE :: (Monad m, AttrValueNORESIZE v) => v -> WithHTML e m ()+ atNORESIZE v = attr "NORESIZE" (av $ show v)+class AdmitAttrONUNLOAD e where+ uaONUNLOAD :: (Monad m) => String -> WithHTML e m ()+ uaONUNLOAD str = attr "ONUNLOAD" str+ atONUNLOAD :: (Monad m, AttrValueONUNLOAD v) => v -> WithHTML e m ()+ atONUNLOAD v = attr "ONUNLOAD" (av $ show v)+class AdmitAttrONLOAD e where+ uaONLOAD :: (Monad m) => String -> WithHTML e m ()+ uaONLOAD str = attr "ONLOAD" str+ atONLOAD :: (Monad m, AttrValueONLOAD v) => v -> WithHTML e m ()+ atONLOAD v = attr "ONLOAD" (av $ show v)+class AdmitAttrCOLS e where+ uaCOLS :: (Monad m) => String -> WithHTML e m ()+ uaCOLS str = attr "COLS" str+ atCOLS :: (Monad m, AttrValueCOLS v) => v -> WithHTML e m ()+ atCOLS v = attr "COLS" (av $ show v)+class AdmitAttrROWS e where+ uaROWS :: (Monad m) => String -> WithHTML e m ()+ uaROWS str = attr "ROWS" str+ atROWS :: (Monad m, AttrValueROWS v) => v -> WithHTML e m ()+ atROWS v = attr "ROWS" (av $ show v)+class AdmitAttrBGCOLOR e where+ uaBGCOLOR :: (Monad m) => String -> WithHTML e m ()+ uaBGCOLOR str = attr "BGCOLOR" str+ atBGCOLOR :: (Monad m, AttrValueBGCOLOR v) => v -> WithHTML e m ()+ atBGCOLOR v = attr "BGCOLOR" (av $ show v)+class AdmitAttrNOWRAP e where+ uaNOWRAP :: (Monad m) => String -> WithHTML e m ()+ uaNOWRAP str = attr "NOWRAP" str+ atNOWRAP :: (Monad m, AttrValueNOWRAP v) => v -> WithHTML e m ()+ atNOWRAP v = attr "NOWRAP" (av $ show v)+class AdmitAttrVALIGN e where+ uaVALIGN :: (Monad m) => String -> WithHTML e m ()+ uaVALIGN str = attr "VALIGN" str+ atVALIGN :: (Monad m, AttrValueVALIGN v) => v -> WithHTML e m ()+ atVALIGN v = attr "VALIGN" (av $ show v)+class AdmitAttrCHAROFF e where+ uaCHAROFF :: (Monad m) => String -> WithHTML e m ()+ uaCHAROFF str = attr "CHAROFF" str+ atCHAROFF :: (Monad m, AttrValueCHAROFF v) => v -> WithHTML e m ()+ atCHAROFF v = attr "CHAROFF" (av $ show v)+class AdmitAttrCHAR e where+ uaCHAR :: (Monad m) => String -> WithHTML e m ()+ uaCHAR str = attr "CHAR" str+ atCHAR :: (Monad m, AttrValueCHAR v) => v -> WithHTML e m ()+ atCHAR v = attr "CHAR" (av $ show v)+class AdmitAttrCOLSPAN e where+ uaCOLSPAN :: (Monad m) => String -> WithHTML e m ()+ uaCOLSPAN str = attr "COLSPAN" str+ atCOLSPAN :: (Monad m, AttrValueCOLSPAN v) => v -> WithHTML e m ()+ atCOLSPAN v = attr "COLSPAN" (av $ show v)+class AdmitAttrROWSPAN e where+ uaROWSPAN :: (Monad m) => String -> WithHTML e m ()+ uaROWSPAN str = attr "ROWSPAN" str+ atROWSPAN :: (Monad m, AttrValueROWSPAN v) => v -> WithHTML e m ()+ atROWSPAN v = attr "ROWSPAN" (av $ show v)+class AdmitAttrSCOPE e where+ uaSCOPE :: (Monad m) => String -> WithHTML e m ()+ uaSCOPE str = attr "SCOPE" str+ atSCOPE :: (Monad m, AttrValueSCOPE v) => v -> WithHTML e m ()+ atSCOPE v = attr "SCOPE" (av $ show v)+class AdmitAttrHEADERS e where+ uaHEADERS :: (Monad m) => String -> WithHTML e m ()+ uaHEADERS str = attr "HEADERS" str+ atHEADERS :: (Monad m, AttrValueHEADERS v) => v -> WithHTML e m ()+ atHEADERS v = attr "HEADERS" (av $ show v)+class AdmitAttrAXIS e where+ uaAXIS :: (Monad m) => String -> WithHTML e m ()+ uaAXIS str = attr "AXIS" str+ atAXIS :: (Monad m, AttrValueAXIS v) => v -> WithHTML e m ()+ atAXIS v = attr "AXIS" (av $ show v)+class AdmitAttrABBR e where+ uaABBR :: (Monad m) => String -> WithHTML e m ()+ uaABBR str = attr "ABBR" str+ atABBR :: (Monad m, AttrValueABBR v) => v -> WithHTML e m ()+ atABBR v = attr "ABBR" (av $ show v)+class AdmitAttrSPAN e where+ uaSPAN :: (Monad m) => String -> WithHTML e m ()+ uaSPAN str = attr "SPAN" str+ atSPAN :: (Monad m, AttrValueSPAN v) => v -> WithHTML e m ()+ atSPAN v = attr "SPAN" (av $ show v)+class AdmitAttrDATAPAGESIZE e where+ uaDATAPAGESIZE :: (Monad m) => String -> WithHTML e m ()+ uaDATAPAGESIZE str = attr "DATAPAGESIZE" str+ atDATAPAGESIZE :: (Monad m, AttrValueDATAPAGESIZE v) => v -> WithHTML e m ()+ atDATAPAGESIZE v = attr "DATAPAGESIZE" (av $ show v)+class AdmitAttrCELLPADDING e where+ uaCELLPADDING :: (Monad m) => String -> WithHTML e m ()+ uaCELLPADDING str = attr "CELLPADDING" str+ atCELLPADDING :: (Monad m, AttrValueCELLPADDING v) => v -> WithHTML e m ()+ atCELLPADDING v = attr "CELLPADDING" (av $ show v)+class AdmitAttrCELLSPACING e where+ uaCELLSPACING :: (Monad m) => String -> WithHTML e m ()+ uaCELLSPACING str = attr "CELLSPACING" str+ atCELLSPACING :: (Monad m, AttrValueCELLSPACING v) => v -> WithHTML e m ()+ atCELLSPACING v = attr "CELLSPACING" (av $ show v)+class AdmitAttrRULES e where+ uaRULES :: (Monad m) => String -> WithHTML e m ()+ uaRULES str = attr "RULES" str+ atRULES :: (Monad m, AttrValueRULES v) => v -> WithHTML e m ()+ atRULES v = attr "RULES" (av $ show v)+class AdmitAttrFRAME e where+ uaFRAME :: (Monad m) => String -> WithHTML e m ()+ uaFRAME str = attr "FRAME" str+ atFRAME :: (Monad m, AttrValueFRAME v) => v -> WithHTML e m ()+ atFRAME v = attr "FRAME" (av $ show v)+class AdmitAttrBORDER e where+ uaBORDER :: (Monad m) => String -> WithHTML e m ()+ uaBORDER str = attr "BORDER" str+ atBORDER :: (Monad m, AttrValueBORDER v) => v -> WithHTML e m ()+ atBORDER v = attr "BORDER" (av $ show v)+class AdmitAttrSUMMARY e where+ uaSUMMARY :: (Monad m) => String -> WithHTML e m ()+ uaSUMMARY str = attr "SUMMARY" str+ atSUMMARY :: (Monad m, AttrValueSUMMARY v) => v -> WithHTML e m ()+ atSUMMARY v = attr "SUMMARY" (av $ show v)+class AdmitAttrONBLUR e where+ uaONBLUR :: (Monad m) => String -> WithHTML e m ()+ uaONBLUR str = attr "ONBLUR" str+ atONBLUR :: (Monad m, AttrValueONBLUR v) => v -> WithHTML e m ()+ atONBLUR v = attr "ONBLUR" (av $ show v)+class AdmitAttrONFOCUS e where+ uaONFOCUS :: (Monad m) => String -> WithHTML e m ()+ uaONFOCUS str = attr "ONFOCUS" str+ atONFOCUS :: (Monad m, AttrValueONFOCUS v) => v -> WithHTML e m ()+ atONFOCUS v = attr "ONFOCUS" (av $ show v)+class AdmitAttrACCESSKEY e where+ uaACCESSKEY :: (Monad m) => String -> WithHTML e m ()+ uaACCESSKEY str = attr "ACCESSKEY" str+ atACCESSKEY :: (Monad m, AttrValueACCESSKEY v) => v -> WithHTML e m ()+ atACCESSKEY v = attr "ACCESSKEY" (av $ show v)+class AdmitAttrTABINDEX e where+ uaTABINDEX :: (Monad m) => String -> WithHTML e m ()+ uaTABINDEX str = attr "TABINDEX" str+ atTABINDEX :: (Monad m, AttrValueTABINDEX v) => v -> WithHTML e m ()+ atTABINDEX v = attr "TABINDEX" (av $ show v)+class AdmitAttrDISABLED e where+ uaDISABLED :: (Monad m) => String -> WithHTML e m ()+ uaDISABLED str = attr "DISABLED" str+ atDISABLED :: (Monad m, AttrValueDISABLED v) => v -> WithHTML e m ()+ atDISABLED v = attr "DISABLED" (av $ show v)+class AdmitAttrVALUE e where+ uaVALUE :: (Monad m) => String -> WithHTML e m ()+ uaVALUE str = attr "VALUE" str+ atVALUE :: (Monad m, AttrValueVALUE v) => v -> WithHTML e m ()+ atVALUE v = attr "VALUE" (av $ show v)+class AdmitAttrONCHANGE e where+ uaONCHANGE :: (Monad m) => String -> WithHTML e m ()+ uaONCHANGE str = attr "ONCHANGE" str+ atONCHANGE :: (Monad m, AttrValueONCHANGE v) => v -> WithHTML e m ()+ atONCHANGE v = attr "ONCHANGE" (av $ show v)+class AdmitAttrONSELECT e where+ uaONSELECT :: (Monad m) => String -> WithHTML e m ()+ uaONSELECT str = attr "ONSELECT" str+ atONSELECT :: (Monad m, AttrValueONSELECT v) => v -> WithHTML e m ()+ atONSELECT v = attr "ONSELECT" (av $ show v)+class AdmitAttrREADONLY e where+ uaREADONLY :: (Monad m) => String -> WithHTML e m ()+ uaREADONLY str = attr "READONLY" str+ atREADONLY :: (Monad m, AttrValueREADONLY v) => v -> WithHTML e m ()+ atREADONLY v = attr "READONLY" (av $ show v)+class AdmitAttrLABEL e where+ uaLABEL :: (Monad m) => String -> WithHTML e m ()+ uaLABEL str = attr "LABEL" str+ atLABEL :: (Monad m, AttrValueLABEL v) => v -> WithHTML e m ()+ atLABEL v = attr "LABEL" (av $ show v)+class AdmitAttrSELECTED e where+ uaSELECTED :: (Monad m) => String -> WithHTML e m ()+ uaSELECTED str = attr "SELECTED" str+ atSELECTED :: (Monad m, AttrValueSELECTED v) => v -> WithHTML e m ()+ atSELECTED v = attr "SELECTED" (av $ show v)+class AdmitAttrMULTIPLE e where+ uaMULTIPLE :: (Monad m) => String -> WithHTML e m ()+ uaMULTIPLE str = attr "MULTIPLE" str+ atMULTIPLE :: (Monad m, AttrValueMULTIPLE v) => v -> WithHTML e m ()+ atMULTIPLE v = attr "MULTIPLE" (av $ show v)+class AdmitAttrSIZE e where+ uaSIZE :: (Monad m) => String -> WithHTML e m ()+ uaSIZE str = attr "SIZE" str+ atSIZE :: (Monad m, AttrValueSIZE v) => v -> WithHTML e m ()+ atSIZE v = attr "SIZE" (av $ show v)+class AdmitAttrACCEPT e where+ uaACCEPT :: (Monad m) => String -> WithHTML e m ()+ uaACCEPT str = attr "ACCEPT" str+ atACCEPT :: (Monad m, AttrValueACCEPT v) => v -> WithHTML e m ()+ atACCEPT v = attr "ACCEPT" (av $ show v)+class AdmitAttrISMAP e where+ uaISMAP :: (Monad m) => String -> WithHTML e m ()+ uaISMAP str = attr "ISMAP" str+ atISMAP :: (Monad m, AttrValueISMAP v) => v -> WithHTML e m ()+ atISMAP v = attr "ISMAP" (av $ show v)+class AdmitAttrUSEMAP e where+ uaUSEMAP :: (Monad m) => String -> WithHTML e m ()+ uaUSEMAP str = attr "USEMAP" str+ atUSEMAP :: (Monad m, AttrValueUSEMAP v) => v -> WithHTML e m ()+ atUSEMAP v = attr "USEMAP" (av $ show v)+class AdmitAttrALT e where+ uaALT :: (Monad m) => String -> WithHTML e m ()+ uaALT str = attr "ALT" str+ atALT :: (Monad m, AttrValueALT v) => v -> WithHTML e m ()+ atALT v = attr "ALT" (av $ show v)+class AdmitAttrMAXLENGTH e where+ uaMAXLENGTH :: (Monad m) => String -> WithHTML e m ()+ uaMAXLENGTH str = attr "MAXLENGTH" str+ atMAXLENGTH :: (Monad m, AttrValueMAXLENGTH v) => v -> WithHTML e m ()+ atMAXLENGTH v = attr "MAXLENGTH" (av $ show v)+class AdmitAttrCHECKED e where+ uaCHECKED :: (Monad m) => String -> WithHTML e m ()+ uaCHECKED str = attr "CHECKED" str+ atCHECKED :: (Monad m, AttrValueCHECKED v) => v -> WithHTML e m ()+ atCHECKED v = attr "CHECKED" (av $ show v)+class AdmitAttrACCEPT_CHARSET e where+ uaACCEPT_CHARSET :: (Monad m) => String -> WithHTML e m ()+ uaACCEPT_CHARSET str = attr "ACCEPT_CHARSET" str+ atACCEPT_CHARSET :: (Monad m, AttrValueACCEPT_CHARSET v) => v -> WithHTML e m ()+ atACCEPT_CHARSET v = attr "ACCEPT_CHARSET" (av $ show v)+class AdmitAttrONRESET e where+ uaONRESET :: (Monad m) => String -> WithHTML e m ()+ uaONRESET str = attr "ONRESET" str+ atONRESET :: (Monad m, AttrValueONRESET v) => v -> WithHTML e m ()+ atONRESET v = attr "ONRESET" (av $ show v)+class AdmitAttrONSUBMIT e where+ uaONSUBMIT :: (Monad m) => String -> WithHTML e m ()+ uaONSUBMIT str = attr "ONSUBMIT" str+ atONSUBMIT :: (Monad m, AttrValueONSUBMIT v) => v -> WithHTML e m ()+ atONSUBMIT v = attr "ONSUBMIT" (av $ show v)+class AdmitAttrENCTYPE e where+ uaENCTYPE :: (Monad m) => String -> WithHTML e m ()+ uaENCTYPE str = attr "ENCTYPE" str+ atENCTYPE :: (Monad m, AttrValueENCTYPE v) => v -> WithHTML e m ()+ atENCTYPE v = attr "ENCTYPE" (av $ show v)+class AdmitAttrMETHOD e where+ uaMETHOD :: (Monad m) => String -> WithHTML e m ()+ uaMETHOD str = attr "METHOD" str+ atMETHOD :: (Monad m, AttrValueMETHOD v) => v -> WithHTML e m ()+ atMETHOD v = attr "METHOD" (av $ show v)+class AdmitAttrACTION e where+ uaACTION :: (Monad m) => String -> WithHTML e m ()+ uaACTION str = attr "ACTION" str+ atACTION :: (Monad m, AttrValueACTION v) => v -> WithHTML e m ()+ atACTION v = attr "ACTION" (av $ show v)+class AdmitAttrCOMPACT e where+ uaCOMPACT :: (Monad m) => String -> WithHTML e m ()+ uaCOMPACT str = attr "COMPACT" str+ atCOMPACT :: (Monad m, AttrValueCOMPACT v) => v -> WithHTML e m ()+ atCOMPACT v = attr "COMPACT" (av $ show v)+class AdmitAttrSTART e where+ uaSTART :: (Monad m) => String -> WithHTML e m ()+ uaSTART str = attr "START" str+ atSTART :: (Monad m, AttrValueSTART v) => v -> WithHTML e m ()+ atSTART v = attr "START" (av $ show v)+class AdmitAttrDATETIME e where+ uaDATETIME :: (Monad m) => String -> WithHTML e m ()+ uaDATETIME str = attr "DATETIME" str+ atDATETIME :: (Monad m, AttrValueDATETIME v) => v -> WithHTML e m ()+ atDATETIME v = attr "DATETIME" (av $ show v)+class AdmitAttrCITE e where+ uaCITE :: (Monad m) => String -> WithHTML e m ()+ uaCITE str = attr "CITE" str+ atCITE :: (Monad m, AttrValueCITE v) => v -> WithHTML e m ()+ atCITE v = attr "CITE" (av $ show v)+class AdmitAttrNOSHADE e where+ uaNOSHADE :: (Monad m) => String -> WithHTML e m ()+ uaNOSHADE str = attr "NOSHADE" str+ atNOSHADE :: (Monad m, AttrValueNOSHADE v) => v -> WithHTML e m ()+ atNOSHADE v = attr "NOSHADE" (av $ show v)+class AdmitAttrVSPACE e where+ uaVSPACE :: (Monad m) => String -> WithHTML e m ()+ uaVSPACE str = attr "VSPACE" str+ atVSPACE :: (Monad m, AttrValueVSPACE v) => v -> WithHTML e m ()+ atVSPACE v = attr "VSPACE" (av $ show v)+class AdmitAttrHSPACE e where+ uaHSPACE :: (Monad m) => String -> WithHTML e m ()+ uaHSPACE str = attr "HSPACE" str+ atHSPACE :: (Monad m, AttrValueHSPACE v) => v -> WithHTML e m ()+ atHSPACE v = attr "HSPACE" (av $ show v)+class AdmitAttrOBJECT e where+ uaOBJECT :: (Monad m) => String -> WithHTML e m ()+ uaOBJECT str = attr "OBJECT" str+ atOBJECT :: (Monad m, AttrValueOBJECT v) => v -> WithHTML e m ()+ atOBJECT v = attr "OBJECT" (av $ show v)+class AdmitAttrCODE e where+ uaCODE :: (Monad m) => String -> WithHTML e m ()+ uaCODE str = attr "CODE" str+ atCODE :: (Monad m, AttrValueCODE v) => v -> WithHTML e m ()+ atCODE v = attr "CODE" (av $ show v)+class AdmitAttrARCHIVE e where+ uaARCHIVE :: (Monad m) => String -> WithHTML e m ()+ uaARCHIVE str = attr "ARCHIVE" str+ atARCHIVE :: (Monad m, AttrValueARCHIVE v) => v -> WithHTML e m ()+ atARCHIVE v = attr "ARCHIVE" (av $ show v)+class AdmitAttrCODEBASE e where+ uaCODEBASE :: (Monad m) => String -> WithHTML e m ()+ uaCODEBASE str = attr "CODEBASE" str+ atCODEBASE :: (Monad m, AttrValueCODEBASE v) => v -> WithHTML e m ()+ atCODEBASE v = attr "CODEBASE" (av $ show v)+class AdmitAttrVALUETYPE e where+ uaVALUETYPE :: (Monad m) => String -> WithHTML e m ()+ uaVALUETYPE str = attr "VALUETYPE" str+ atVALUETYPE :: (Monad m, AttrValueVALUETYPE v) => v -> WithHTML e m ()+ atVALUETYPE v = attr "VALUETYPE" (av $ show v)+class AdmitAttrSTANDBY e where+ uaSTANDBY :: (Monad m) => String -> WithHTML e m ()+ uaSTANDBY str = attr "STANDBY" str+ atSTANDBY :: (Monad m, AttrValueSTANDBY v) => v -> WithHTML e m ()+ atSTANDBY v = attr "STANDBY" (av $ show v)+class AdmitAttrCODETYPE e where+ uaCODETYPE :: (Monad m) => String -> WithHTML e m ()+ uaCODETYPE str = attr "CODETYPE" str+ atCODETYPE :: (Monad m, AttrValueCODETYPE v) => v -> WithHTML e m ()+ atCODETYPE v = attr "CODETYPE" (av $ show v)+class AdmitAttrDATA e where+ uaDATA :: (Monad m) => String -> WithHTML e m ()+ uaDATA str = attr "DATA" str+ atDATA :: (Monad m, AttrValueDATA v) => v -> WithHTML e m ()+ atDATA v = attr "DATA" (av $ show v)+class AdmitAttrCLASSID e where+ uaCLASSID :: (Monad m) => String -> WithHTML e m ()+ uaCLASSID str = attr "CLASSID" str+ atCLASSID :: (Monad m, AttrValueCLASSID v) => v -> WithHTML e m ()+ atCLASSID v = attr "CLASSID" (av $ show v)+class AdmitAttrDECLARE e where+ uaDECLARE :: (Monad m) => String -> WithHTML e m ()+ uaDECLARE str = attr "DECLARE" str+ atDECLARE :: (Monad m, AttrValueDECLARE v) => v -> WithHTML e m ()+ atDECLARE v = attr "DECLARE" (av $ show v)+class AdmitAttrREV e where+ uaREV :: (Monad m) => String -> WithHTML e m ()+ uaREV str = attr "REV" str+ atREV :: (Monad m, AttrValueREV v) => v -> WithHTML e m ()+ atREV v = attr "REV" (av $ show v)+class AdmitAttrREL e where+ uaREL :: (Monad m) => String -> WithHTML e m ()+ uaREL str = attr "REL" str+ atREL :: (Monad m, AttrValueREL v) => v -> WithHTML e m ()+ atREL v = attr "REL" (av $ show v)+class AdmitAttrHREFLANG e where+ uaHREFLANG :: (Monad m) => String -> WithHTML e m ()+ uaHREFLANG str = attr "HREFLANG" str+ atHREFLANG :: (Monad m, AttrValueHREFLANG v) => v -> WithHTML e m ()+ atHREFLANG v = attr "HREFLANG" (av $ show v)+class AdmitAttrNOHREF e where+ uaNOHREF :: (Monad m) => String -> WithHTML e m ()+ uaNOHREF str = attr "NOHREF" str+ atNOHREF :: (Monad m, AttrValueNOHREF v) => v -> WithHTML e m ()+ atNOHREF v = attr "NOHREF" (av $ show v)+class AdmitAttrCOORDS e where+ uaCOORDS :: (Monad m) => String -> WithHTML e m ()+ uaCOORDS str = attr "COORDS" str+ atCOORDS :: (Monad m, AttrValueCOORDS v) => v -> WithHTML e m ()+ atCOORDS v = attr "COORDS" (av $ show v)+class AdmitAttrSHAPE e where+ uaSHAPE :: (Monad m) => String -> WithHTML e m ()+ uaSHAPE str = attr "SHAPE" str+ atSHAPE :: (Monad m, AttrValueSHAPE v) => v -> WithHTML e m ()+ atSHAPE v = attr "SHAPE" (av $ show v)+class AdmitAttrALINK e where+ uaALINK :: (Monad m) => String -> WithHTML e m ()+ uaALINK str = attr "ALINK" str+ atALINK :: (Monad m, AttrValueALINK v) => v -> WithHTML e m ()+ atALINK v = attr "ALINK" (av $ show v)+class AdmitAttrVLINK e where+ uaVLINK :: (Monad m) => String -> WithHTML e m ()+ uaVLINK str = attr "VLINK" str+ atVLINK :: (Monad m, AttrValueVLINK v) => v -> WithHTML e m ()+ atVLINK v = attr "VLINK" (av $ show v)+class AdmitAttrLINK e where+ uaLINK :: (Monad m) => String -> WithHTML e m ()+ uaLINK str = attr "LINK" str+ atLINK :: (Monad m, AttrValueLINK v) => v -> WithHTML e m ()+ atLINK v = attr "LINK" (av $ show v)+class AdmitAttrTEXT e where+ uaTEXT :: (Monad m) => String -> WithHTML e m ()+ uaTEXT str = attr "TEXT" str+ atTEXT :: (Monad m, AttrValueTEXT v) => v -> WithHTML e m ()+ atTEXT v = attr "TEXT" (av $ show v)+class AdmitAttrBACKGROUND e where+ uaBACKGROUND :: (Monad m) => String -> WithHTML e m ()+ uaBACKGROUND str = attr "BACKGROUND" str+ atBACKGROUND :: (Monad m, AttrValueBACKGROUND v) => v -> WithHTML e m ()+ atBACKGROUND v = attr "BACKGROUND" (av $ show v)+class AdmitAttrCLEAR e where+ uaCLEAR :: (Monad m) => String -> WithHTML e m ()+ uaCLEAR str = attr "CLEAR" str+ atCLEAR :: (Monad m, AttrValueCLEAR v) => v -> WithHTML e m ()+ atCLEAR v = attr "CLEAR" (av $ show v)+class AdmitAttrFACE e where+ uaFACE :: (Monad m) => String -> WithHTML e m ()+ uaFACE str = attr "FACE" str+ atFACE :: (Monad m, AttrValueFACE v) => v -> WithHTML e m ()+ atFACE v = attr "FACE" (av $ show v)+class AdmitAttrCOLOR e where+ uaCOLOR :: (Monad m) => String -> WithHTML e m ()+ uaCOLOR str = attr "COLOR" str+ atCOLOR :: (Monad m, AttrValueCOLOR v) => v -> WithHTML e m ()+ atCOLOR v = attr "COLOR" (av $ show v)+class Show v => AttrValueABBR v+class Show v => AttrValueACCEPT v+class Show v => AttrValueACCEPT_CHARSET v+class Show v => AttrValueACCESSKEY v+class Show v => AttrValueACTION v+class Show v => AttrValueALIGN v+class Show v => AttrValueALINK v+class Show v => AttrValueALT v+class Show v => AttrValueARCHIVE v+class Show v => AttrValueAXIS v+class Show v => AttrValueBACKGROUND v+class Show v => AttrValueBGCOLOR v+class Show v => AttrValueBORDER v+class Show v => AttrValueCELLPADDING v+class Show v => AttrValueCELLSPACING v+class Show v => AttrValueCHAR v+class Show v => AttrValueCHAROFF v+class Show v => AttrValueCHARSET v+class Show v => AttrValueCHECKED v+class Show v => AttrValueCITE v+class Show v => AttrValueCLASS v+class Show v => AttrValueCLASSID v+class Show v => AttrValueCLEAR v+class Show v => AttrValueCODE v+class Show v => AttrValueCODEBASE v+class Show v => AttrValueCODETYPE v+class Show v => AttrValueCOLOR v+class Show v => AttrValueCOLS v+class Show v => AttrValueCOLSPAN v+class Show v => AttrValueCOMPACT v+class Show v => AttrValueCONTENT v+class Show v => AttrValueCOORDS v+class Show v => AttrValueDATA v+class Show v => AttrValueDATAPAGESIZE v+class Show v => AttrValueDATETIME v+class Show v => AttrValueDECLARE v+class Show v => AttrValueDEFER v+class Show v => AttrValueDIR v+class Show v => AttrValueDISABLED v+class Show v => AttrValueENCTYPE v+class Show v => AttrValueEVENT v+class Show v => AttrValueFACE v+class Show v => AttrValueFOR v+class Show v => AttrValueFRAME v+class Show v => AttrValueFRAMEBORDER v+class Show v => AttrValueHEADERS v+class Show v => AttrValueHEIGHT v+class Show v => AttrValueHREF v+class Show v => AttrValueHREFLANG v+class Show v => AttrValueHSPACE v+class Show v => AttrValueHTTP_EQUIV v+class Show v => AttrValueID v+class Show v => AttrValueISMAP v+class Show v => AttrValueLABEL v+class Show v => AttrValueLANG v+class Show v => AttrValueLANGUAGE v+class Show v => AttrValueLINK v+class Show v => AttrValueLONGDESC v+class Show v => AttrValueMARGINHEIGHT v+class Show v => AttrValueMARGINWIDTH v+class Show v => AttrValueMAXLENGTH v+class Show v => AttrValueMEDIA v+class Show v => AttrValueMETHOD v+class Show v => AttrValueMULTIPLE v+class Show v => AttrValueNAME v+class Show v => AttrValueNOHREF v+class Show v => AttrValueNORESIZE v+class Show v => AttrValueNOSHADE v+class Show v => AttrValueNOWRAP v+class Show v => AttrValueOBJECT v+class Show v => AttrValueONBLUR v+class Show v => AttrValueONCHANGE v+class Show v => AttrValueONCLICK v+class Show v => AttrValueONDBLCLICK v+class Show v => AttrValueONFOCUS v+class Show v => AttrValueONKEYDOWN v+class Show v => AttrValueONKEYPRESS v+class Show v => AttrValueONKEYUP v+class Show v => AttrValueONLOAD v+class Show v => AttrValueONMOUSEDOWN v+class Show v => AttrValueONMOUSEMOVE v+class Show v => AttrValueONMOUSEOUT v+class Show v => AttrValueONMOUSEOVER v+class Show v => AttrValueONMOUSEUP v+class Show v => AttrValueONRESET v+class Show v => AttrValueONSELECT v+class Show v => AttrValueONSUBMIT v+class Show v => AttrValueONUNLOAD v+class Show v => AttrValuePROFILE v+class Show v => AttrValuePROMPT v+class Show v => AttrValueREADONLY v+class Show v => AttrValueREL v+class Show v => AttrValueREV v+class Show v => AttrValueROWS v+class Show v => AttrValueROWSPAN v+class Show v => AttrValueRULES v+class Show v => AttrValueSCHEME v+class Show v => AttrValueSCOPE v+class Show v => AttrValueSCROLLING v+class Show v => AttrValueSELECTED v+class Show v => AttrValueSHAPE v+class Show v => AttrValueSIZE v+class Show v => AttrValueSPAN v+class Show v => AttrValueSRC v+class Show v => AttrValueSTANDBY v+class Show v => AttrValueSTART v+class Show v => AttrValueSTYLE v+class Show v => AttrValueSUMMARY v+class Show v => AttrValueTABINDEX v+class Show v => AttrValueTARGET v+class Show v => AttrValueTEXT v+class Show v => AttrValueTITLE v+class Show v => AttrValueTYPE v+class Show v => AttrValueUSEMAP v+class Show v => AttrValueVALIGN v+class Show v => AttrValueVALUE v+class Show v => AttrValueVALUETYPE v+class Show v => AttrValueVERSION v+class Show v => AttrValueVLINK v+class Show v => AttrValueVSPACE v+class Show v => AttrValueWIDTH v+class AdmitChildA e where+ a :: (Monad m) => WithHTML A m a -> WithHTML e m a+ a = HTMLMonad.a+class AdmitChildABBR e where+ abbr :: (Monad m) => WithHTML ABBR m a -> WithHTML e m a+ abbr = HTMLMonad.abbr+class AdmitChildACRONYM e where+ acronym :: (Monad m) => WithHTML ACRONYM m a -> WithHTML e m a+ acronym = HTMLMonad.acronym+class AdmitChildADDRESS e where+ address :: (Monad m) => WithHTML ADDRESS m a -> WithHTML e m a+ address = HTMLMonad.address+class AdmitChildAPPLET e where+ applet :: (Monad m) => WithHTML APPLET m a -> WithHTML e m a+ applet = HTMLMonad.applet+class AdmitChildAREA e where+ area :: (Monad m) => WithHTML AREA m a -> WithHTML e m a+ area = HTMLMonad.area+class AdmitChildB e where+ b :: (Monad m) => WithHTML B m a -> WithHTML e m a+ b = HTMLMonad.b+class AdmitChildBASE e where+ base :: (Monad m) => WithHTML BASE m a -> WithHTML e m a+ base = HTMLMonad.base+class AdmitChildBASEFONT e where+ basefont :: (Monad m) => WithHTML BASEFONT m a -> WithHTML e m a+ basefont = HTMLMonad.basefont+class AdmitChildBDO e where+ bdo :: (Monad m) => WithHTML BDO m a -> WithHTML e m a+ bdo = HTMLMonad.bdo+class AdmitChildBIG e where+ big :: (Monad m) => WithHTML BIG m a -> WithHTML e m a+ big = HTMLMonad.big+class AdmitChildBLOCKQUOTE e where+ blockquote :: (Monad m) => WithHTML BLOCKQUOTE m a -> WithHTML e m a+ blockquote = HTMLMonad.blockquote+class AdmitChildBODY e where+ body :: (Monad m) => WithHTML BODY m a -> WithHTML e m a+ body = HTMLMonad.body+class AdmitChildBR e where+ br :: (Monad m) => WithHTML BR m a -> WithHTML e m a+ br = HTMLMonad.br+class AdmitChildBUTTON e where+ button :: (Monad m) => WithHTML BUTTON m a -> WithHTML e m a+ button = HTMLMonad.button+class AdmitChildCAPTION e where+ caption :: (Monad m) => WithHTML CAPTION m a -> WithHTML e m a+ caption = HTMLMonad.caption+class AdmitChildCENTER e where+ center :: (Monad m) => WithHTML CENTER m a -> WithHTML e m a+ center = HTMLMonad.center+class AdmitChildCITE e where+ cite :: (Monad m) => WithHTML CITE m a -> WithHTML e m a+ cite = HTMLMonad.cite+class AdmitChildCODE e where+ code :: (Monad m) => WithHTML CODE m a -> WithHTML e m a+ code = HTMLMonad.code+class AdmitChildCOL e where+ col :: (Monad m) => WithHTML COL m a -> WithHTML e m a+ col = HTMLMonad.col+class AdmitChildCOLGROUP e where+ colgroup :: (Monad m) => WithHTML COLGROUP m a -> WithHTML e m a+ colgroup = HTMLMonad.colgroup+class AdmitChildDD e where+ dd :: (Monad m) => WithHTML DD m a -> WithHTML e m a+ dd = HTMLMonad.dd+class AdmitChildDEL e where+ del :: (Monad m) => WithHTML DEL m a -> WithHTML e m a+ del = HTMLMonad.del+class AdmitChildDFN e where+ dfn :: (Monad m) => WithHTML DFN m a -> WithHTML e m a+ dfn = HTMLMonad.dfn+class AdmitChildDIR e where+ dir :: (Monad m) => WithHTML DIR m a -> WithHTML e m a+ dir = HTMLMonad.dir+class AdmitChildDIV e where+ div :: (Monad m) => WithHTML DIV m a -> WithHTML e m a+ div = HTMLMonad.div+class AdmitChildDL e where+ dl :: (Monad m) => WithHTML DL m a -> WithHTML e m a+ dl = HTMLMonad.dl+class AdmitChildDT e where+ dt :: (Monad m) => WithHTML DT m a -> WithHTML e m a+ dt = HTMLMonad.dt+class AdmitChildEM e where+ em :: (Monad m) => WithHTML EM m a -> WithHTML e m a+ em = HTMLMonad.em+class AdmitChildFIELDSET e where+ fieldset :: (Monad m) => WithHTML FIELDSET m a -> WithHTML e m a+ fieldset = HTMLMonad.fieldset+class AdmitChildFONT e where+ font :: (Monad m) => WithHTML FONT m a -> WithHTML e m a+ font = HTMLMonad.font+class AdmitChildFORM e where+ form :: (Monad m) => WithHTML FORM m a -> WithHTML e m a+ form = HTMLMonad.form+class AdmitChildFRAME e where+ frame :: (Monad m) => WithHTML FRAME m a -> WithHTML e m a+ frame = HTMLMonad.frame+class AdmitChildFRAMESET e where+ frameset :: (Monad m) => WithHTML FRAMESET m a -> WithHTML e m a+ frameset = HTMLMonad.frameset+class AdmitChildH1 e where+ h1 :: (Monad m) => WithHTML H1 m a -> WithHTML e m a+ h1 = HTMLMonad.h1+class AdmitChildH2 e where+ h2 :: (Monad m) => WithHTML H2 m a -> WithHTML e m a+ h2 = HTMLMonad.h2+class AdmitChildH3 e where+ h3 :: (Monad m) => WithHTML H3 m a -> WithHTML e m a+ h3 = HTMLMonad.h3+class AdmitChildH4 e where+ h4 :: (Monad m) => WithHTML H4 m a -> WithHTML e m a+ h4 = HTMLMonad.h4+class AdmitChildH5 e where+ h5 :: (Monad m) => WithHTML H5 m a -> WithHTML e m a+ h5 = HTMLMonad.h5+class AdmitChildH6 e where+ h6 :: (Monad m) => WithHTML H6 m a -> WithHTML e m a+ h6 = HTMLMonad.h6+class AdmitChildHEAD e where+ head :: (Monad m) => WithHTML HEAD m a -> WithHTML e m a+ head = HTMLMonad.head+class AdmitChildHR e where+ hr :: (Monad m) => WithHTML HR m a -> WithHTML e m a+ hr = HTMLMonad.hr+class AdmitChildHTML e where+ html :: (Monad m) => WithHTML HTML m a -> WithHTML e m a+ html = HTMLMonad.html+class AdmitChildI e where+ i :: (Monad m) => WithHTML I m a -> WithHTML e m a+ i = HTMLMonad.i+class AdmitChildIFRAME e where+ iframe :: (Monad m) => WithHTML IFRAME m a -> WithHTML e m a+ iframe = HTMLMonad.iframe+class AdmitChildIMG e where+ img :: (Monad m) => WithHTML IMG m a -> WithHTML e m a+ img = HTMLMonad.img+class AdmitChildINPUT e where+ input :: (Monad m) => WithHTML INPUT m a -> WithHTML e m a+ input = HTMLMonad.input+class AdmitChildINS e where+ ins :: (Monad m) => WithHTML INS m a -> WithHTML e m a+ ins = HTMLMonad.ins+class AdmitChildISINDEX e where+ isindex :: (Monad m) => WithHTML ISINDEX m a -> WithHTML e m a+ isindex = HTMLMonad.isindex+class AdmitChildKBD e where+ kbd :: (Monad m) => WithHTML KBD m a -> WithHTML e m a+ kbd = HTMLMonad.kbd+class AdmitChildLABEL e where+ label :: (Monad m) => WithHTML LABEL m a -> WithHTML e m a+ label = HTMLMonad.label+class AdmitChildLEGEND e where+ legend :: (Monad m) => WithHTML LEGEND m a -> WithHTML e m a+ legend = HTMLMonad.legend+class AdmitChildLI e where+ li :: (Monad m) => WithHTML LI m a -> WithHTML e m a+ li = HTMLMonad.li+class AdmitChildLINK e where+ link :: (Monad m) => WithHTML LINK m a -> WithHTML e m a+ link = HTMLMonad.link+class AdmitChildMAP e where+ map :: (Monad m) => WithHTML MAP m a -> WithHTML e m a+ map = HTMLMonad.map+class AdmitChildMENU e where+ menu :: (Monad m) => WithHTML MENU m a -> WithHTML e m a+ menu = HTMLMonad.menu+class AdmitChildMETA e where+ meta :: (Monad m) => WithHTML META m a -> WithHTML e m a+ meta = HTMLMonad.meta+class AdmitChildNOFRAMES e where+ noframes :: (Monad m) => WithHTML NOFRAMES m a -> WithHTML e m a+ noframes = HTMLMonad.noframes+class AdmitChildNOSCRIPT e where+ noscript :: (Monad m) => WithHTML NOSCRIPT m a -> WithHTML e m a+ noscript = HTMLMonad.noscript+class AdmitChildOBJECT e where+ object :: (Monad m) => WithHTML OBJECT m a -> WithHTML e m a+ object = HTMLMonad.object+class AdmitChildOL e where+ ol :: (Monad m) => WithHTML OL m a -> WithHTML e m a+ ol = HTMLMonad.ol+class AdmitChildOPTGROUP e where+ optgroup :: (Monad m) => WithHTML OPTGROUP m a -> WithHTML e m a+ optgroup = HTMLMonad.optgroup+class AdmitChildOPTION e where+ option :: (Monad m) => WithHTML OPTION m a -> WithHTML e m a+ option = HTMLMonad.option+class AdmitChildP e where+ p :: (Monad m) => WithHTML P m a -> WithHTML e m a+ p = HTMLMonad.p+class AdmitChildPARAM e where+ param :: (Monad m) => WithHTML PARAM m a -> WithHTML e m a+ param = HTMLMonad.param+class AdmitChildPRE e where+ pre :: (Monad m) => WithHTML PRE m a -> WithHTML e m a+ pre = HTMLMonad.pre+class AdmitChildQ e where+ q :: (Monad m) => WithHTML Q m a -> WithHTML e m a+ q = HTMLMonad.q+class AdmitChildS e where+ s :: (Monad m) => WithHTML S m a -> WithHTML e m a+ s = HTMLMonad.s+class AdmitChildSAMP e where+ samp :: (Monad m) => WithHTML SAMP m a -> WithHTML e m a+ samp = HTMLMonad.samp+class AdmitChildSCRIPT e where+ script :: (Monad m) => WithHTML SCRIPT m a -> WithHTML e m a+ script = HTMLMonad.script+class AdmitChildSELECT e where+ select :: (Monad m) => WithHTML SELECT m a -> WithHTML e m a+ select = HTMLMonad.select+class AdmitChildSMALL e where+ small :: (Monad m) => WithHTML SMALL m a -> WithHTML e m a+ small = HTMLMonad.small+class AdmitChildSPAN e where+ span :: (Monad m) => WithHTML SPAN m a -> WithHTML e m a+ span = HTMLMonad.span+class AdmitChildSTRIKE e where+ strike :: (Monad m) => WithHTML STRIKE m a -> WithHTML e m a+ strike = HTMLMonad.strike+class AdmitChildSTRONG e where+ strong :: (Monad m) => WithHTML STRONG m a -> WithHTML e m a+ strong = HTMLMonad.strong+class AdmitChildSTYLE e where+ style :: (Monad m) => WithHTML STYLE m a -> WithHTML e m a+ style = HTMLMonad.style+class AdmitChildSUB e where+ sub :: (Monad m) => WithHTML SUB m a -> WithHTML e m a+ sub = HTMLMonad.sub+class AdmitChildSUP e where+ sup :: (Monad m) => WithHTML SUP m a -> WithHTML e m a+ sup = HTMLMonad.sup+class AdmitChildTABLE e where+ table :: (Monad m) => WithHTML TABLE m a -> WithHTML e m a+ table = HTMLMonad.table+class AdmitChildTBODY e where+ tbody :: (Monad m) => WithHTML TBODY m a -> WithHTML e m a+ tbody = HTMLMonad.tbody+class AdmitChildTD e where+ td :: (Monad m) => WithHTML TD m a -> WithHTML e m a+ td = HTMLMonad.td+class AdmitChildTEXTAREA e where+ textarea :: (Monad m) => WithHTML TEXTAREA m a -> WithHTML e m a+ textarea = HTMLMonad.textarea+class AdmitChildTFOOT e where+ tfoot :: (Monad m) => WithHTML TFOOT m a -> WithHTML e m a+ tfoot = HTMLMonad.tfoot+class AdmitChildTH e where+ th :: (Monad m) => WithHTML TH m a -> WithHTML e m a+ th = HTMLMonad.th+class AdmitChildTHEAD e where+ thead :: (Monad m) => WithHTML THEAD m a -> WithHTML e m a+ thead = HTMLMonad.thead+class AdmitChildTITLE e where+ title :: (Monad m) => WithHTML TITLE m a -> WithHTML e m a+ title = HTMLMonad.title+class AdmitChildTR e where+ tr :: (Monad m) => WithHTML TR m a -> WithHTML e m a+ tr = HTMLMonad.tr+class AdmitChildTT e where+ tt :: (Monad m) => WithHTML TT m a -> WithHTML e m a+ tt = HTMLMonad.tt+class AdmitChildU e where+ u :: (Monad m) => WithHTML U m a -> WithHTML e m a+ u = HTMLMonad.u+class AdmitChildUL e where+ ul :: (Monad m) => WithHTML UL m a -> WithHTML e m a+ ul = HTMLMonad.ul+class AdmitChildVAR e where+ var :: (Monad m) => WithHTML VAR m a -> WithHTML e m a+ var = HTMLMonad.var+data A = A+instance Show A where show A = "A"+data ABBR = ABBR+instance Show ABBR where show ABBR = "ABBR"+data ACRONYM = ACRONYM+instance Show ACRONYM where show ACRONYM = "ACRONYM"+data ADDRESS = ADDRESS+instance Show ADDRESS where show ADDRESS = "ADDRESS"+data APPLET = APPLET+instance Show APPLET where show APPLET = "APPLET"+data AREA = AREA+instance Show AREA where show AREA = "AREA"+data B = B+instance Show B where show B = "B"+data BASE = BASE+instance Show BASE where show BASE = "BASE"+data BASEFONT = BASEFONT+instance Show BASEFONT where show BASEFONT = "BASEFONT"+data BDO = BDO+instance Show BDO where show BDO = "BDO"+data BIG = BIG+instance Show BIG where show BIG = "BIG"+data BLOCKQUOTE = BLOCKQUOTE+instance Show BLOCKQUOTE where show BLOCKQUOTE = "BLOCKQUOTE"+data BODY = BODY+instance Show BODY where show BODY = "BODY"+data BR = BR+instance Show BR where show BR = "BR"+data BUTTON = BUTTON+instance Show BUTTON where show BUTTON = "BUTTON"+data CAPTION = CAPTION+instance Show CAPTION where show CAPTION = "CAPTION"+data CENTER = CENTER+instance Show CENTER where show CENTER = "CENTER"+data CITE = CITE+instance Show CITE where show CITE = "CITE"+data CODE = CODE+instance Show CODE where show CODE = "CODE"+data COL = COL+instance Show COL where show COL = "COL"+data COLGROUP = COLGROUP+instance Show COLGROUP where show COLGROUP = "COLGROUP"+data DD = DD+instance Show DD where show DD = "DD"+data DEL = DEL+instance Show DEL where show DEL = "DEL"+data DFN = DFN+instance Show DFN where show DFN = "DFN"+data DIR = DIR+instance Show DIR where show DIR = "DIR"+data DIV = DIV+instance Show DIV where show DIV = "DIV"+data DL = DL+instance Show DL where show DL = "DL"+data DT = DT+instance Show DT where show DT = "DT"+data EM = EM+instance Show EM where show EM = "EM"+data FIELDSET = FIELDSET+instance Show FIELDSET where show FIELDSET = "FIELDSET"+data FONT = FONT+instance Show FONT where show FONT = "FONT"+data FORM = FORM+instance Show FORM where show FORM = "FORM"+data FRAME = FRAME+instance Show FRAME where show FRAME = "FRAME"+data FRAMESET = FRAMESET+instance Show FRAMESET where show FRAMESET = "FRAMESET"+data H1 = H1+instance Show H1 where show H1 = "H1"+data H2 = H2+instance Show H2 where show H2 = "H2"+data H3 = H3+instance Show H3 where show H3 = "H3"+data H4 = H4+instance Show H4 where show H4 = "H4"+data H5 = H5+instance Show H5 where show H5 = "H5"+data H6 = H6+instance Show H6 where show H6 = "H6"+data HEAD = HEAD+instance Show HEAD where show HEAD = "HEAD"+data HR = HR+instance Show HR where show HR = "HR"+data HTML = HTML+instance Show HTML where show HTML = "HTML"+data I = I+instance Show I where show I = "I"+data IFRAME = IFRAME+instance Show IFRAME where show IFRAME = "IFRAME"+data IMG = IMG+instance Show IMG where show IMG = "IMG"+data INPUT = INPUT+instance Show INPUT where show INPUT = "INPUT"+data INS = INS+instance Show INS where show INS = "INS"+data ISINDEX = ISINDEX+instance Show ISINDEX where show ISINDEX = "ISINDEX"+data KBD = KBD+instance Show KBD where show KBD = "KBD"+data LABEL = LABEL+instance Show LABEL where show LABEL = "LABEL"+data LEGEND = LEGEND+instance Show LEGEND where show LEGEND = "LEGEND"+data LI = LI+instance Show LI where show LI = "LI"+data LINK = LINK+instance Show LINK where show LINK = "LINK"+data MAP = MAP+instance Show MAP where show MAP = "MAP"+data MENU = MENU+instance Show MENU where show MENU = "MENU"+data META = META+instance Show META where show META = "META"+data NOFRAMES = NOFRAMES+instance Show NOFRAMES where show NOFRAMES = "NOFRAMES"+data NOSCRIPT = NOSCRIPT+instance Show NOSCRIPT where show NOSCRIPT = "NOSCRIPT"+data OBJECT = OBJECT+instance Show OBJECT where show OBJECT = "OBJECT"+data OL = OL+instance Show OL where show OL = "OL"+data OPTGROUP = OPTGROUP+instance Show OPTGROUP where show OPTGROUP = "OPTGROUP"+data OPTION = OPTION+instance Show OPTION where show OPTION = "OPTION"+data P = P+instance Show P where show P = "P"+data PARAM = PARAM+instance Show PARAM where show PARAM = "PARAM"+data PRE = PRE+instance Show PRE where show PRE = "PRE"+data Q = Q+instance Show Q where show Q = "Q"+data S = S+instance Show S where show S = "S"+data SAMP = SAMP+instance Show SAMP where show SAMP = "SAMP"+data SCRIPT = SCRIPT+instance Show SCRIPT where show SCRIPT = "SCRIPT"+data SELECT = SELECT+instance Show SELECT where show SELECT = "SELECT"+data SMALL = SMALL+instance Show SMALL where show SMALL = "SMALL"+data SPAN = SPAN+instance Show SPAN where show SPAN = "SPAN"+data STRIKE = STRIKE+instance Show STRIKE where show STRIKE = "STRIKE"+data STRONG = STRONG+instance Show STRONG where show STRONG = "STRONG"+data STYLE = STYLE+instance Show STYLE where show STYLE = "STYLE"+data SUB = SUB+instance Show SUB where show SUB = "SUB"+data SUP = SUP+instance Show SUP where show SUP = "SUP"+data TABLE = TABLE+instance Show TABLE where show TABLE = "TABLE"+data TBODY = TBODY+instance Show TBODY where show TBODY = "TBODY"+data TD = TD+instance Show TD where show TD = "TD"+data TEXTAREA = TEXTAREA+instance Show TEXTAREA where show TEXTAREA = "TEXTAREA"+data TFOOT = TFOOT+instance Show TFOOT where show TFOOT = "TFOOT"+data TH = TH+instance Show TH where show TH = "TH"+data THEAD = THEAD+instance Show THEAD where show THEAD = "THEAD"+data TITLE = TITLE+instance Show TITLE where show TITLE = "TITLE"+data TR = TR+instance Show TR where show TR = "TR"+data TT = TT+instance Show TT where show TT = "TT"+data U = U+instance Show U where show U = "U"+data UL = UL+instance Show UL where show UL = "UL"+data VAR = VAR+instance Show VAR where show VAR = "VAR"++instance AdmitChildHEAD HTML+instance AdmitChildFRAMESET HTML++instance AdmitChildP NOSCRIPT+instance AdmitChildH1 NOSCRIPT+instance AdmitChildH2 NOSCRIPT+instance AdmitChildH3 NOSCRIPT+instance AdmitChildH4 NOSCRIPT+instance AdmitChildH5 NOSCRIPT+instance AdmitChildH6 NOSCRIPT+instance AdmitChildUL NOSCRIPT+instance AdmitChildOL NOSCRIPT+instance AdmitChildDIR NOSCRIPT+instance AdmitChildMENU NOSCRIPT+instance AdmitChildPRE NOSCRIPT+instance AdmitChildDL NOSCRIPT+instance AdmitChildDIV NOSCRIPT+instance AdmitChildCENTER NOSCRIPT+instance AdmitChildNOSCRIPT NOSCRIPT+instance AdmitChildNOFRAMES NOSCRIPT+instance AdmitChildBLOCKQUOTE NOSCRIPT+instance AdmitChildFORM NOSCRIPT+instance AdmitChildISINDEX NOSCRIPT+instance AdmitChildHR NOSCRIPT+instance AdmitChildTABLE NOSCRIPT+instance AdmitChildFIELDSET NOSCRIPT+instance AdmitChildADDRESS NOSCRIPT+instance AdmitChildCDATA NOSCRIPT+instance AdmitChildTT NOSCRIPT+instance AdmitChildI NOSCRIPT+instance AdmitChildB NOSCRIPT+instance AdmitChildU NOSCRIPT+instance AdmitChildS NOSCRIPT+instance AdmitChildSTRIKE NOSCRIPT+instance AdmitChildBIG NOSCRIPT+instance AdmitChildSMALL NOSCRIPT+instance AdmitChildEM NOSCRIPT+instance AdmitChildSTRONG NOSCRIPT+instance AdmitChildDFN NOSCRIPT+instance AdmitChildCODE NOSCRIPT+instance AdmitChildSAMP NOSCRIPT+instance AdmitChildKBD NOSCRIPT+instance AdmitChildVAR NOSCRIPT+instance AdmitChildCITE NOSCRIPT+instance AdmitChildABBR NOSCRIPT+instance AdmitChildACRONYM NOSCRIPT+instance AdmitChildA NOSCRIPT+instance AdmitChildIMG NOSCRIPT+instance AdmitChildAPPLET NOSCRIPT+instance AdmitChildOBJECT NOSCRIPT+instance AdmitChildFONT NOSCRIPT+instance AdmitChildBASEFONT NOSCRIPT+instance AdmitChildBR NOSCRIPT+instance AdmitChildSCRIPT NOSCRIPT+instance AdmitChildMAP NOSCRIPT+instance AdmitChildQ NOSCRIPT+instance AdmitChildSUB NOSCRIPT+instance AdmitChildSUP NOSCRIPT+instance AdmitChildSPAN NOSCRIPT+instance AdmitChildBDO NOSCRIPT+instance AdmitChildIFRAME NOSCRIPT+instance AdmitChildINPUT NOSCRIPT+instance AdmitChildSELECT NOSCRIPT+instance AdmitChildTEXTAREA NOSCRIPT+instance AdmitChildLABEL NOSCRIPT+instance AdmitChildBUTTON NOSCRIPT++instance AdmitChildCDATA SCRIPT++instance AdmitChildCDATA STYLE+++++instance AdmitChildCDATA TITLE++instance AdmitChildTITLE HEAD+instance AdmitChildISINDEX HEAD+instance AdmitChildBASE HEAD+instance AdmitChildSCRIPT HEAD+instance AdmitChildSTYLE HEAD+instance AdmitChildMETA HEAD+instance AdmitChildLINK HEAD+instance AdmitChildOBJECT HEAD++instance AdmitChildBODY NOFRAMES++instance AdmitChildP IFRAME+instance AdmitChildH1 IFRAME+instance AdmitChildH2 IFRAME+instance AdmitChildH3 IFRAME+instance AdmitChildH4 IFRAME+instance AdmitChildH5 IFRAME+instance AdmitChildH6 IFRAME+instance AdmitChildUL IFRAME+instance AdmitChildOL IFRAME+instance AdmitChildDIR IFRAME+instance AdmitChildMENU IFRAME+instance AdmitChildPRE IFRAME+instance AdmitChildDL IFRAME+instance AdmitChildDIV IFRAME+instance AdmitChildCENTER IFRAME+instance AdmitChildNOSCRIPT IFRAME+instance AdmitChildNOFRAMES IFRAME+instance AdmitChildBLOCKQUOTE IFRAME+instance AdmitChildFORM IFRAME+instance AdmitChildISINDEX IFRAME+instance AdmitChildHR IFRAME+instance AdmitChildTABLE IFRAME+instance AdmitChildFIELDSET IFRAME+instance AdmitChildADDRESS IFRAME+instance AdmitChildCDATA IFRAME+instance AdmitChildTT IFRAME+instance AdmitChildI IFRAME+instance AdmitChildB IFRAME+instance AdmitChildU IFRAME+instance AdmitChildS IFRAME+instance AdmitChildSTRIKE IFRAME+instance AdmitChildBIG IFRAME+instance AdmitChildSMALL IFRAME+instance AdmitChildEM IFRAME+instance AdmitChildSTRONG IFRAME+instance AdmitChildDFN IFRAME+instance AdmitChildCODE IFRAME+instance AdmitChildSAMP IFRAME+instance AdmitChildKBD IFRAME+instance AdmitChildVAR IFRAME+instance AdmitChildCITE IFRAME+instance AdmitChildABBR IFRAME+instance AdmitChildACRONYM IFRAME+instance AdmitChildA IFRAME+instance AdmitChildIMG IFRAME+instance AdmitChildAPPLET IFRAME+instance AdmitChildOBJECT IFRAME+instance AdmitChildFONT IFRAME+instance AdmitChildBASEFONT IFRAME+instance AdmitChildBR IFRAME+instance AdmitChildSCRIPT IFRAME+instance AdmitChildMAP IFRAME+instance AdmitChildQ IFRAME+instance AdmitChildSUB IFRAME+instance AdmitChildSUP IFRAME+instance AdmitChildSPAN IFRAME+instance AdmitChildBDO IFRAME+instance AdmitChildIFRAME IFRAME+instance AdmitChildINPUT IFRAME+instance AdmitChildSELECT IFRAME+instance AdmitChildTEXTAREA IFRAME+instance AdmitChildLABEL IFRAME+instance AdmitChildBUTTON IFRAME+++instance AdmitChildFRAMESET FRAMESET+instance AdmitChildFRAME FRAMESET+instance AdmitChildNOFRAMES FRAMESET++instance AdmitChildP TH+instance AdmitChildH1 TH+instance AdmitChildH2 TH+instance AdmitChildH3 TH+instance AdmitChildH4 TH+instance AdmitChildH5 TH+instance AdmitChildH6 TH+instance AdmitChildUL TH+instance AdmitChildOL TH+instance AdmitChildDIR TH+instance AdmitChildMENU TH+instance AdmitChildPRE TH+instance AdmitChildDL TH+instance AdmitChildDIV TH+instance AdmitChildCENTER TH+instance AdmitChildNOSCRIPT TH+instance AdmitChildNOFRAMES TH+instance AdmitChildBLOCKQUOTE TH+instance AdmitChildFORM TH+instance AdmitChildISINDEX TH+instance AdmitChildHR TH+instance AdmitChildTABLE TH+instance AdmitChildFIELDSET TH+instance AdmitChildADDRESS TH+instance AdmitChildCDATA TH+instance AdmitChildTT TH+instance AdmitChildI TH+instance AdmitChildB TH+instance AdmitChildU TH+instance AdmitChildS TH+instance AdmitChildSTRIKE TH+instance AdmitChildBIG TH+instance AdmitChildSMALL TH+instance AdmitChildEM TH+instance AdmitChildSTRONG TH+instance AdmitChildDFN TH+instance AdmitChildCODE TH+instance AdmitChildSAMP TH+instance AdmitChildKBD TH+instance AdmitChildVAR TH+instance AdmitChildCITE TH+instance AdmitChildABBR TH+instance AdmitChildACRONYM TH+instance AdmitChildA TH+instance AdmitChildIMG TH+instance AdmitChildAPPLET TH+instance AdmitChildOBJECT TH+instance AdmitChildFONT TH+instance AdmitChildBASEFONT TH+instance AdmitChildBR TH+instance AdmitChildSCRIPT TH+instance AdmitChildMAP TH+instance AdmitChildQ TH+instance AdmitChildSUB TH+instance AdmitChildSUP TH+instance AdmitChildSPAN TH+instance AdmitChildBDO TH+instance AdmitChildIFRAME TH+instance AdmitChildINPUT TH+instance AdmitChildSELECT TH+instance AdmitChildTEXTAREA TH+instance AdmitChildLABEL TH+instance AdmitChildBUTTON TH++instance AdmitChildP TD+instance AdmitChildH1 TD+instance AdmitChildH2 TD+instance AdmitChildH3 TD+instance AdmitChildH4 TD+instance AdmitChildH5 TD+instance AdmitChildH6 TD+instance AdmitChildUL TD+instance AdmitChildOL TD+instance AdmitChildDIR TD+instance AdmitChildMENU TD+instance AdmitChildPRE TD+instance AdmitChildDL TD+instance AdmitChildDIV TD+instance AdmitChildCENTER TD+instance AdmitChildNOSCRIPT TD+instance AdmitChildNOFRAMES TD+instance AdmitChildBLOCKQUOTE TD+instance AdmitChildFORM TD+instance AdmitChildISINDEX TD+instance AdmitChildHR TD+instance AdmitChildTABLE TD+instance AdmitChildFIELDSET TD+instance AdmitChildADDRESS TD+instance AdmitChildCDATA TD+instance AdmitChildTT TD+instance AdmitChildI TD+instance AdmitChildB TD+instance AdmitChildU TD+instance AdmitChildS TD+instance AdmitChildSTRIKE TD+instance AdmitChildBIG TD+instance AdmitChildSMALL TD+instance AdmitChildEM TD+instance AdmitChildSTRONG TD+instance AdmitChildDFN TD+instance AdmitChildCODE TD+instance AdmitChildSAMP TD+instance AdmitChildKBD TD+instance AdmitChildVAR TD+instance AdmitChildCITE TD+instance AdmitChildABBR TD+instance AdmitChildACRONYM TD+instance AdmitChildA TD+instance AdmitChildIMG TD+instance AdmitChildAPPLET TD+instance AdmitChildOBJECT TD+instance AdmitChildFONT TD+instance AdmitChildBASEFONT TD+instance AdmitChildBR TD+instance AdmitChildSCRIPT TD+instance AdmitChildMAP TD+instance AdmitChildQ TD+instance AdmitChildSUB TD+instance AdmitChildSUP TD+instance AdmitChildSPAN TD+instance AdmitChildBDO TD+instance AdmitChildIFRAME TD+instance AdmitChildINPUT TD+instance AdmitChildSELECT TD+instance AdmitChildTEXTAREA TD+instance AdmitChildLABEL TD+instance AdmitChildBUTTON TD++instance AdmitChildTH TR+instance AdmitChildTD TR+++instance AdmitChildCOL COLGROUP++instance AdmitChildTR TBODY++instance AdmitChildTR TFOOT++instance AdmitChildTR THEAD++instance AdmitChildCDATA CAPTION+instance AdmitChildTT CAPTION+instance AdmitChildI CAPTION+instance AdmitChildB CAPTION+instance AdmitChildU CAPTION+instance AdmitChildS CAPTION+instance AdmitChildSTRIKE CAPTION+instance AdmitChildBIG CAPTION+instance AdmitChildSMALL CAPTION+instance AdmitChildEM CAPTION+instance AdmitChildSTRONG CAPTION+instance AdmitChildDFN CAPTION+instance AdmitChildCODE CAPTION+instance AdmitChildSAMP CAPTION+instance AdmitChildKBD CAPTION+instance AdmitChildVAR CAPTION+instance AdmitChildCITE CAPTION+instance AdmitChildABBR CAPTION+instance AdmitChildACRONYM CAPTION+instance AdmitChildA CAPTION+instance AdmitChildIMG CAPTION+instance AdmitChildAPPLET CAPTION+instance AdmitChildOBJECT CAPTION+instance AdmitChildFONT CAPTION+instance AdmitChildBASEFONT CAPTION+instance AdmitChildBR CAPTION+instance AdmitChildSCRIPT CAPTION+instance AdmitChildMAP CAPTION+instance AdmitChildQ CAPTION+instance AdmitChildSUB CAPTION+instance AdmitChildSUP CAPTION+instance AdmitChildSPAN CAPTION+instance AdmitChildBDO CAPTION+instance AdmitChildIFRAME CAPTION+instance AdmitChildINPUT CAPTION+instance AdmitChildSELECT CAPTION+instance AdmitChildTEXTAREA CAPTION+instance AdmitChildLABEL CAPTION+instance AdmitChildBUTTON CAPTION++instance AdmitChildCAPTION TABLE+instance AdmitChildCOL TABLE+instance AdmitChildCOLGROUP TABLE+instance AdmitChildTHEAD TABLE+instance AdmitChildTFOOT TABLE+instance AdmitChildTBODY TABLE++instance AdmitChildP BUTTON+instance AdmitChildH1 BUTTON+instance AdmitChildH2 BUTTON+instance AdmitChildH3 BUTTON+instance AdmitChildH4 BUTTON+instance AdmitChildH5 BUTTON+instance AdmitChildH6 BUTTON+instance AdmitChildUL BUTTON+instance AdmitChildOL BUTTON+instance AdmitChildDIR BUTTON+instance AdmitChildMENU BUTTON+instance AdmitChildPRE BUTTON+instance AdmitChildDL BUTTON+instance AdmitChildDIV BUTTON+instance AdmitChildCENTER BUTTON+instance AdmitChildNOSCRIPT BUTTON+instance AdmitChildNOFRAMES BUTTON+instance AdmitChildBLOCKQUOTE BUTTON+instance AdmitChildHR BUTTON+instance AdmitChildTABLE BUTTON+instance AdmitChildADDRESS BUTTON+instance AdmitChildCDATA BUTTON+instance AdmitChildTT BUTTON+instance AdmitChildI BUTTON+instance AdmitChildB BUTTON+instance AdmitChildU BUTTON+instance AdmitChildS BUTTON+instance AdmitChildSTRIKE BUTTON+instance AdmitChildBIG BUTTON+instance AdmitChildSMALL BUTTON+instance AdmitChildEM BUTTON+instance AdmitChildSTRONG BUTTON+instance AdmitChildDFN BUTTON+instance AdmitChildCODE BUTTON+instance AdmitChildSAMP BUTTON+instance AdmitChildKBD BUTTON+instance AdmitChildVAR BUTTON+instance AdmitChildCITE BUTTON+instance AdmitChildABBR BUTTON+instance AdmitChildACRONYM BUTTON+instance AdmitChildIMG BUTTON+instance AdmitChildAPPLET BUTTON+instance AdmitChildOBJECT BUTTON+instance AdmitChildFONT BUTTON+instance AdmitChildBASEFONT BUTTON+instance AdmitChildBR BUTTON+instance AdmitChildSCRIPT BUTTON+instance AdmitChildMAP BUTTON+instance AdmitChildQ BUTTON+instance AdmitChildSUB BUTTON+instance AdmitChildSUP BUTTON+instance AdmitChildSPAN BUTTON+instance AdmitChildBDO BUTTON++instance AdmitChildCDATA LEGEND+instance AdmitChildTT LEGEND+instance AdmitChildI LEGEND+instance AdmitChildB LEGEND+instance AdmitChildU LEGEND+instance AdmitChildS LEGEND+instance AdmitChildSTRIKE LEGEND+instance AdmitChildBIG LEGEND+instance AdmitChildSMALL LEGEND+instance AdmitChildEM LEGEND+instance AdmitChildSTRONG LEGEND+instance AdmitChildDFN LEGEND+instance AdmitChildCODE LEGEND+instance AdmitChildSAMP LEGEND+instance AdmitChildKBD LEGEND+instance AdmitChildVAR LEGEND+instance AdmitChildCITE LEGEND+instance AdmitChildABBR LEGEND+instance AdmitChildACRONYM LEGEND+instance AdmitChildA LEGEND+instance AdmitChildIMG LEGEND+instance AdmitChildAPPLET LEGEND+instance AdmitChildOBJECT LEGEND+instance AdmitChildFONT LEGEND+instance AdmitChildBASEFONT LEGEND+instance AdmitChildBR LEGEND+instance AdmitChildSCRIPT LEGEND+instance AdmitChildMAP LEGEND+instance AdmitChildQ LEGEND+instance AdmitChildSUB LEGEND+instance AdmitChildSUP LEGEND+instance AdmitChildSPAN LEGEND+instance AdmitChildBDO LEGEND+instance AdmitChildIFRAME LEGEND+instance AdmitChildINPUT LEGEND+instance AdmitChildSELECT LEGEND+instance AdmitChildTEXTAREA LEGEND+instance AdmitChildLABEL LEGEND+instance AdmitChildBUTTON LEGEND++instance AdmitChildCDATA FIELDSET+instance AdmitChildLEGEND FIELDSET+instance AdmitChildP FIELDSET+instance AdmitChildH1 FIELDSET+instance AdmitChildH2 FIELDSET+instance AdmitChildH3 FIELDSET+instance AdmitChildH4 FIELDSET+instance AdmitChildH5 FIELDSET+instance AdmitChildH6 FIELDSET+instance AdmitChildUL FIELDSET+instance AdmitChildOL FIELDSET+instance AdmitChildDIR FIELDSET+instance AdmitChildMENU FIELDSET+instance AdmitChildPRE FIELDSET+instance AdmitChildDL FIELDSET+instance AdmitChildDIV FIELDSET+instance AdmitChildCENTER FIELDSET+instance AdmitChildNOSCRIPT FIELDSET+instance AdmitChildNOFRAMES FIELDSET+instance AdmitChildBLOCKQUOTE FIELDSET+instance AdmitChildFORM FIELDSET+instance AdmitChildISINDEX FIELDSET+instance AdmitChildHR FIELDSET+instance AdmitChildTABLE FIELDSET+instance AdmitChildFIELDSET FIELDSET+instance AdmitChildADDRESS FIELDSET+instance AdmitChildTT FIELDSET+instance AdmitChildI FIELDSET+instance AdmitChildB FIELDSET+instance AdmitChildU FIELDSET+instance AdmitChildS FIELDSET+instance AdmitChildSTRIKE FIELDSET+instance AdmitChildBIG FIELDSET+instance AdmitChildSMALL FIELDSET+instance AdmitChildEM FIELDSET+instance AdmitChildSTRONG FIELDSET+instance AdmitChildDFN FIELDSET+instance AdmitChildCODE FIELDSET+instance AdmitChildSAMP FIELDSET+instance AdmitChildKBD FIELDSET+instance AdmitChildVAR FIELDSET+instance AdmitChildCITE FIELDSET+instance AdmitChildABBR FIELDSET+instance AdmitChildACRONYM FIELDSET+instance AdmitChildA FIELDSET+instance AdmitChildIMG FIELDSET+instance AdmitChildAPPLET FIELDSET+instance AdmitChildOBJECT FIELDSET+instance AdmitChildFONT FIELDSET+instance AdmitChildBASEFONT FIELDSET+instance AdmitChildBR FIELDSET+instance AdmitChildSCRIPT FIELDSET+instance AdmitChildMAP FIELDSET+instance AdmitChildQ FIELDSET+instance AdmitChildSUB FIELDSET+instance AdmitChildSUP FIELDSET+instance AdmitChildSPAN FIELDSET+instance AdmitChildBDO FIELDSET+instance AdmitChildIFRAME FIELDSET+instance AdmitChildINPUT FIELDSET+instance AdmitChildSELECT FIELDSET+instance AdmitChildTEXTAREA FIELDSET+instance AdmitChildLABEL FIELDSET+instance AdmitChildBUTTON FIELDSET++instance AdmitChildCDATA TEXTAREA++instance AdmitChildCDATA OPTION++instance AdmitChildOPTION OPTGROUP++instance AdmitChildOPTGROUP SELECT+instance AdmitChildOPTION SELECT+++instance AdmitChildCDATA LABEL+instance AdmitChildTT LABEL+instance AdmitChildI LABEL+instance AdmitChildB LABEL+instance AdmitChildU LABEL+instance AdmitChildS LABEL+instance AdmitChildSTRIKE LABEL+instance AdmitChildBIG LABEL+instance AdmitChildSMALL LABEL+instance AdmitChildEM LABEL+instance AdmitChildSTRONG LABEL+instance AdmitChildDFN LABEL+instance AdmitChildCODE LABEL+instance AdmitChildSAMP LABEL+instance AdmitChildKBD LABEL+instance AdmitChildVAR LABEL+instance AdmitChildCITE LABEL+instance AdmitChildABBR LABEL+instance AdmitChildACRONYM LABEL+instance AdmitChildA LABEL+instance AdmitChildIMG LABEL+instance AdmitChildAPPLET LABEL+instance AdmitChildOBJECT LABEL+instance AdmitChildFONT LABEL+instance AdmitChildBASEFONT LABEL+instance AdmitChildBR LABEL+instance AdmitChildSCRIPT LABEL+instance AdmitChildMAP LABEL+instance AdmitChildQ LABEL+instance AdmitChildSUB LABEL+instance AdmitChildSUP LABEL+instance AdmitChildSPAN LABEL+instance AdmitChildBDO LABEL+instance AdmitChildIFRAME LABEL+instance AdmitChildINPUT LABEL+instance AdmitChildSELECT LABEL+instance AdmitChildTEXTAREA LABEL+instance AdmitChildBUTTON LABEL++instance AdmitChildP FORM+instance AdmitChildH1 FORM+instance AdmitChildH2 FORM+instance AdmitChildH3 FORM+instance AdmitChildH4 FORM+instance AdmitChildH5 FORM+instance AdmitChildH6 FORM+instance AdmitChildUL FORM+instance AdmitChildOL FORM+instance AdmitChildDIR FORM+instance AdmitChildMENU FORM+instance AdmitChildPRE FORM+instance AdmitChildDL FORM+instance AdmitChildDIV FORM+instance AdmitChildCENTER FORM+instance AdmitChildNOSCRIPT FORM+instance AdmitChildNOFRAMES FORM+instance AdmitChildBLOCKQUOTE FORM+instance AdmitChildISINDEX FORM+instance AdmitChildHR FORM+instance AdmitChildTABLE FORM+instance AdmitChildFIELDSET FORM+instance AdmitChildADDRESS FORM+instance AdmitChildCDATA FORM+instance AdmitChildTT FORM+instance AdmitChildI FORM+instance AdmitChildB FORM+instance AdmitChildU FORM+instance AdmitChildS FORM+instance AdmitChildSTRIKE FORM+instance AdmitChildBIG FORM+instance AdmitChildSMALL FORM+instance AdmitChildEM FORM+instance AdmitChildSTRONG FORM+instance AdmitChildDFN FORM+instance AdmitChildCODE FORM+instance AdmitChildSAMP FORM+instance AdmitChildKBD FORM+instance AdmitChildVAR FORM+instance AdmitChildCITE FORM+instance AdmitChildABBR FORM+instance AdmitChildACRONYM FORM+instance AdmitChildA FORM+instance AdmitChildIMG FORM+instance AdmitChildAPPLET FORM+instance AdmitChildOBJECT FORM+instance AdmitChildFONT FORM+instance AdmitChildBASEFONT FORM+instance AdmitChildBR FORM+instance AdmitChildSCRIPT FORM+instance AdmitChildMAP FORM+instance AdmitChildQ FORM+instance AdmitChildSUB FORM+instance AdmitChildSUP FORM+instance AdmitChildSPAN FORM+instance AdmitChildBDO FORM+instance AdmitChildIFRAME FORM+instance AdmitChildINPUT FORM+instance AdmitChildSELECT FORM+instance AdmitChildTEXTAREA FORM+instance AdmitChildLABEL FORM+instance AdmitChildBUTTON FORM++instance AdmitChildP LI+instance AdmitChildH1 LI+instance AdmitChildH2 LI+instance AdmitChildH3 LI+instance AdmitChildH4 LI+instance AdmitChildH5 LI+instance AdmitChildH6 LI+instance AdmitChildUL LI+instance AdmitChildOL LI+instance AdmitChildDIR LI+instance AdmitChildMENU LI+instance AdmitChildPRE LI+instance AdmitChildDL LI+instance AdmitChildDIV LI+instance AdmitChildCENTER LI+instance AdmitChildNOSCRIPT LI+instance AdmitChildNOFRAMES LI+instance AdmitChildBLOCKQUOTE LI+instance AdmitChildFORM LI+instance AdmitChildISINDEX LI+instance AdmitChildHR LI+instance AdmitChildTABLE LI+instance AdmitChildFIELDSET LI+instance AdmitChildADDRESS LI+instance AdmitChildCDATA LI+instance AdmitChildTT LI+instance AdmitChildI LI+instance AdmitChildB LI+instance AdmitChildU LI+instance AdmitChildS LI+instance AdmitChildSTRIKE LI+instance AdmitChildBIG LI+instance AdmitChildSMALL LI+instance AdmitChildEM LI+instance AdmitChildSTRONG LI+instance AdmitChildDFN LI+instance AdmitChildCODE LI+instance AdmitChildSAMP LI+instance AdmitChildKBD LI+instance AdmitChildVAR LI+instance AdmitChildCITE LI+instance AdmitChildABBR LI+instance AdmitChildACRONYM LI+instance AdmitChildA LI+instance AdmitChildIMG LI+instance AdmitChildAPPLET LI+instance AdmitChildOBJECT LI+instance AdmitChildFONT LI+instance AdmitChildBASEFONT LI+instance AdmitChildBR LI+instance AdmitChildSCRIPT LI+instance AdmitChildMAP LI+instance AdmitChildQ LI+instance AdmitChildSUB LI+instance AdmitChildSUP LI+instance AdmitChildSPAN LI+instance AdmitChildBDO LI+instance AdmitChildIFRAME LI+instance AdmitChildINPUT LI+instance AdmitChildSELECT LI+instance AdmitChildTEXTAREA LI+instance AdmitChildLABEL LI+instance AdmitChildBUTTON LI++instance AdmitChildLI DIR++instance AdmitChildLI MENU++instance AdmitChildLI UL++instance AdmitChildLI OL++instance AdmitChildP DD+instance AdmitChildH1 DD+instance AdmitChildH2 DD+instance AdmitChildH3 DD+instance AdmitChildH4 DD+instance AdmitChildH5 DD+instance AdmitChildH6 DD+instance AdmitChildUL DD+instance AdmitChildOL DD+instance AdmitChildDIR DD+instance AdmitChildMENU DD+instance AdmitChildPRE DD+instance AdmitChildDL DD+instance AdmitChildDIV DD+instance AdmitChildCENTER DD+instance AdmitChildNOSCRIPT DD+instance AdmitChildNOFRAMES DD+instance AdmitChildBLOCKQUOTE DD+instance AdmitChildFORM DD+instance AdmitChildISINDEX DD+instance AdmitChildHR DD+instance AdmitChildTABLE DD+instance AdmitChildFIELDSET DD+instance AdmitChildADDRESS DD+instance AdmitChildCDATA DD+instance AdmitChildTT DD+instance AdmitChildI DD+instance AdmitChildB DD+instance AdmitChildU DD+instance AdmitChildS DD+instance AdmitChildSTRIKE DD+instance AdmitChildBIG DD+instance AdmitChildSMALL DD+instance AdmitChildEM DD+instance AdmitChildSTRONG DD+instance AdmitChildDFN DD+instance AdmitChildCODE DD+instance AdmitChildSAMP DD+instance AdmitChildKBD DD+instance AdmitChildVAR DD+instance AdmitChildCITE DD+instance AdmitChildABBR DD+instance AdmitChildACRONYM DD+instance AdmitChildA DD+instance AdmitChildIMG DD+instance AdmitChildAPPLET DD+instance AdmitChildOBJECT DD+instance AdmitChildFONT DD+instance AdmitChildBASEFONT DD+instance AdmitChildBR DD+instance AdmitChildSCRIPT DD+instance AdmitChildMAP DD+instance AdmitChildQ DD+instance AdmitChildSUB DD+instance AdmitChildSUP DD+instance AdmitChildSPAN DD+instance AdmitChildBDO DD+instance AdmitChildIFRAME DD+instance AdmitChildINPUT DD+instance AdmitChildSELECT DD+instance AdmitChildTEXTAREA DD+instance AdmitChildLABEL DD+instance AdmitChildBUTTON DD++instance AdmitChildCDATA DT+instance AdmitChildTT DT+instance AdmitChildI DT+instance AdmitChildB DT+instance AdmitChildU DT+instance AdmitChildS DT+instance AdmitChildSTRIKE DT+instance AdmitChildBIG DT+instance AdmitChildSMALL DT+instance AdmitChildEM DT+instance AdmitChildSTRONG DT+instance AdmitChildDFN DT+instance AdmitChildCODE DT+instance AdmitChildSAMP DT+instance AdmitChildKBD DT+instance AdmitChildVAR DT+instance AdmitChildCITE DT+instance AdmitChildABBR DT+instance AdmitChildACRONYM DT+instance AdmitChildA DT+instance AdmitChildIMG DT+instance AdmitChildAPPLET DT+instance AdmitChildOBJECT DT+instance AdmitChildFONT DT+instance AdmitChildBASEFONT DT+instance AdmitChildBR DT+instance AdmitChildSCRIPT DT+instance AdmitChildMAP DT+instance AdmitChildQ DT+instance AdmitChildSUB DT+instance AdmitChildSUP DT+instance AdmitChildSPAN DT+instance AdmitChildBDO DT+instance AdmitChildIFRAME DT+instance AdmitChildINPUT DT+instance AdmitChildSELECT DT+instance AdmitChildTEXTAREA DT+instance AdmitChildLABEL DT+instance AdmitChildBUTTON DT++instance AdmitChildDT DL+instance AdmitChildDD DL++instance AdmitChildP INS+instance AdmitChildH1 INS+instance AdmitChildH2 INS+instance AdmitChildH3 INS+instance AdmitChildH4 INS+instance AdmitChildH5 INS+instance AdmitChildH6 INS+instance AdmitChildUL INS+instance AdmitChildOL INS+instance AdmitChildDIR INS+instance AdmitChildMENU INS+instance AdmitChildPRE INS+instance AdmitChildDL INS+instance AdmitChildDIV INS+instance AdmitChildCENTER INS+instance AdmitChildNOSCRIPT INS+instance AdmitChildNOFRAMES INS+instance AdmitChildBLOCKQUOTE INS+instance AdmitChildFORM INS+instance AdmitChildISINDEX INS+instance AdmitChildHR INS+instance AdmitChildTABLE INS+instance AdmitChildFIELDSET INS+instance AdmitChildADDRESS INS+instance AdmitChildCDATA INS+instance AdmitChildTT INS+instance AdmitChildI INS+instance AdmitChildB INS+instance AdmitChildU INS+instance AdmitChildS INS+instance AdmitChildSTRIKE INS+instance AdmitChildBIG INS+instance AdmitChildSMALL INS+instance AdmitChildEM INS+instance AdmitChildSTRONG INS+instance AdmitChildDFN INS+instance AdmitChildCODE INS+instance AdmitChildSAMP INS+instance AdmitChildKBD INS+instance AdmitChildVAR INS+instance AdmitChildCITE INS+instance AdmitChildABBR INS+instance AdmitChildACRONYM INS+instance AdmitChildA INS+instance AdmitChildIMG INS+instance AdmitChildAPPLET INS+instance AdmitChildOBJECT INS+instance AdmitChildFONT INS+instance AdmitChildBASEFONT INS+instance AdmitChildBR INS+instance AdmitChildSCRIPT INS+instance AdmitChildMAP INS+instance AdmitChildQ INS+instance AdmitChildSUB INS+instance AdmitChildSUP INS+instance AdmitChildSPAN INS+instance AdmitChildBDO INS+instance AdmitChildIFRAME INS+instance AdmitChildINPUT INS+instance AdmitChildSELECT INS+instance AdmitChildTEXTAREA INS+instance AdmitChildLABEL INS+instance AdmitChildBUTTON INS++instance AdmitChildP DEL+instance AdmitChildH1 DEL+instance AdmitChildH2 DEL+instance AdmitChildH3 DEL+instance AdmitChildH4 DEL+instance AdmitChildH5 DEL+instance AdmitChildH6 DEL+instance AdmitChildUL DEL+instance AdmitChildOL DEL+instance AdmitChildDIR DEL+instance AdmitChildMENU DEL+instance AdmitChildPRE DEL+instance AdmitChildDL DEL+instance AdmitChildDIV DEL+instance AdmitChildCENTER DEL+instance AdmitChildNOSCRIPT DEL+instance AdmitChildNOFRAMES DEL+instance AdmitChildBLOCKQUOTE DEL+instance AdmitChildFORM DEL+instance AdmitChildISINDEX DEL+instance AdmitChildHR DEL+instance AdmitChildTABLE DEL+instance AdmitChildFIELDSET DEL+instance AdmitChildADDRESS DEL+instance AdmitChildCDATA DEL+instance AdmitChildTT DEL+instance AdmitChildI DEL+instance AdmitChildB DEL+instance AdmitChildU DEL+instance AdmitChildS DEL+instance AdmitChildSTRIKE DEL+instance AdmitChildBIG DEL+instance AdmitChildSMALL DEL+instance AdmitChildEM DEL+instance AdmitChildSTRONG DEL+instance AdmitChildDFN DEL+instance AdmitChildCODE DEL+instance AdmitChildSAMP DEL+instance AdmitChildKBD DEL+instance AdmitChildVAR DEL+instance AdmitChildCITE DEL+instance AdmitChildABBR DEL+instance AdmitChildACRONYM DEL+instance AdmitChildA DEL+instance AdmitChildIMG DEL+instance AdmitChildAPPLET DEL+instance AdmitChildOBJECT DEL+instance AdmitChildFONT DEL+instance AdmitChildBASEFONT DEL+instance AdmitChildBR DEL+instance AdmitChildSCRIPT DEL+instance AdmitChildMAP DEL+instance AdmitChildQ DEL+instance AdmitChildSUB DEL+instance AdmitChildSUP DEL+instance AdmitChildSPAN DEL+instance AdmitChildBDO DEL+instance AdmitChildIFRAME DEL+instance AdmitChildINPUT DEL+instance AdmitChildSELECT DEL+instance AdmitChildTEXTAREA DEL+instance AdmitChildLABEL DEL+instance AdmitChildBUTTON DEL++instance AdmitChildP BLOCKQUOTE+instance AdmitChildH1 BLOCKQUOTE+instance AdmitChildH2 BLOCKQUOTE+instance AdmitChildH3 BLOCKQUOTE+instance AdmitChildH4 BLOCKQUOTE+instance AdmitChildH5 BLOCKQUOTE+instance AdmitChildH6 BLOCKQUOTE+instance AdmitChildUL BLOCKQUOTE+instance AdmitChildOL BLOCKQUOTE+instance AdmitChildDIR BLOCKQUOTE+instance AdmitChildMENU BLOCKQUOTE+instance AdmitChildPRE BLOCKQUOTE+instance AdmitChildDL BLOCKQUOTE+instance AdmitChildDIV BLOCKQUOTE+instance AdmitChildCENTER BLOCKQUOTE+instance AdmitChildNOSCRIPT BLOCKQUOTE+instance AdmitChildNOFRAMES BLOCKQUOTE+instance AdmitChildBLOCKQUOTE BLOCKQUOTE+instance AdmitChildFORM BLOCKQUOTE+instance AdmitChildISINDEX BLOCKQUOTE+instance AdmitChildHR BLOCKQUOTE+instance AdmitChildTABLE BLOCKQUOTE+instance AdmitChildFIELDSET BLOCKQUOTE+instance AdmitChildADDRESS BLOCKQUOTE+instance AdmitChildCDATA BLOCKQUOTE+instance AdmitChildTT BLOCKQUOTE+instance AdmitChildI BLOCKQUOTE+instance AdmitChildB BLOCKQUOTE+instance AdmitChildU BLOCKQUOTE+instance AdmitChildS BLOCKQUOTE+instance AdmitChildSTRIKE BLOCKQUOTE+instance AdmitChildBIG BLOCKQUOTE+instance AdmitChildSMALL BLOCKQUOTE+instance AdmitChildEM BLOCKQUOTE+instance AdmitChildSTRONG BLOCKQUOTE+instance AdmitChildDFN BLOCKQUOTE+instance AdmitChildCODE BLOCKQUOTE+instance AdmitChildSAMP BLOCKQUOTE+instance AdmitChildKBD BLOCKQUOTE+instance AdmitChildVAR BLOCKQUOTE+instance AdmitChildCITE BLOCKQUOTE+instance AdmitChildABBR BLOCKQUOTE+instance AdmitChildACRONYM BLOCKQUOTE+instance AdmitChildA BLOCKQUOTE+instance AdmitChildIMG BLOCKQUOTE+instance AdmitChildAPPLET BLOCKQUOTE+instance AdmitChildOBJECT BLOCKQUOTE+instance AdmitChildFONT BLOCKQUOTE+instance AdmitChildBASEFONT BLOCKQUOTE+instance AdmitChildBR BLOCKQUOTE+instance AdmitChildSCRIPT BLOCKQUOTE+instance AdmitChildMAP BLOCKQUOTE+instance AdmitChildQ BLOCKQUOTE+instance AdmitChildSUB BLOCKQUOTE+instance AdmitChildSUP BLOCKQUOTE+instance AdmitChildSPAN BLOCKQUOTE+instance AdmitChildBDO BLOCKQUOTE+instance AdmitChildIFRAME BLOCKQUOTE+instance AdmitChildINPUT BLOCKQUOTE+instance AdmitChildSELECT BLOCKQUOTE+instance AdmitChildTEXTAREA BLOCKQUOTE+instance AdmitChildLABEL BLOCKQUOTE+instance AdmitChildBUTTON BLOCKQUOTE++instance AdmitChildCDATA Q+instance AdmitChildTT Q+instance AdmitChildI Q+instance AdmitChildB Q+instance AdmitChildU Q+instance AdmitChildS Q+instance AdmitChildSTRIKE Q+instance AdmitChildBIG Q+instance AdmitChildSMALL Q+instance AdmitChildEM Q+instance AdmitChildSTRONG Q+instance AdmitChildDFN Q+instance AdmitChildCODE Q+instance AdmitChildSAMP Q+instance AdmitChildKBD Q+instance AdmitChildVAR Q+instance AdmitChildCITE Q+instance AdmitChildABBR Q+instance AdmitChildACRONYM Q+instance AdmitChildA Q+instance AdmitChildIMG Q+instance AdmitChildAPPLET Q+instance AdmitChildOBJECT Q+instance AdmitChildFONT Q+instance AdmitChildBASEFONT Q+instance AdmitChildBR Q+instance AdmitChildSCRIPT Q+instance AdmitChildMAP Q+instance AdmitChildQ Q+instance AdmitChildSUB Q+instance AdmitChildSUP Q+instance AdmitChildSPAN Q+instance AdmitChildBDO Q+instance AdmitChildIFRAME Q+instance AdmitChildINPUT Q+instance AdmitChildSELECT Q+instance AdmitChildTEXTAREA Q+instance AdmitChildLABEL Q+instance AdmitChildBUTTON Q++instance AdmitChildCDATA PRE+instance AdmitChildTT PRE+instance AdmitChildI PRE+instance AdmitChildB PRE+instance AdmitChildU PRE+instance AdmitChildS PRE+instance AdmitChildSTRIKE PRE+instance AdmitChildEM PRE+instance AdmitChildSTRONG PRE+instance AdmitChildDFN PRE+instance AdmitChildCODE PRE+instance AdmitChildSAMP PRE+instance AdmitChildKBD PRE+instance AdmitChildVAR PRE+instance AdmitChildCITE PRE+instance AdmitChildABBR PRE+instance AdmitChildACRONYM PRE+instance AdmitChildA PRE+instance AdmitChildBR PRE+instance AdmitChildSCRIPT PRE+instance AdmitChildMAP PRE+instance AdmitChildQ PRE+instance AdmitChildSPAN PRE+instance AdmitChildBDO PRE+instance AdmitChildIFRAME PRE+instance AdmitChildINPUT PRE+instance AdmitChildSELECT PRE+instance AdmitChildTEXTAREA PRE+instance AdmitChildLABEL PRE+instance AdmitChildBUTTON PRE++instance AdmitChildCDATA H1+instance AdmitChildTT H1+instance AdmitChildI H1+instance AdmitChildB H1+instance AdmitChildU H1+instance AdmitChildS H1+instance AdmitChildSTRIKE H1+instance AdmitChildBIG H1+instance AdmitChildSMALL H1+instance AdmitChildEM H1+instance AdmitChildSTRONG H1+instance AdmitChildDFN H1+instance AdmitChildCODE H1+instance AdmitChildSAMP H1+instance AdmitChildKBD H1+instance AdmitChildVAR H1+instance AdmitChildCITE H1+instance AdmitChildABBR H1+instance AdmitChildACRONYM H1+instance AdmitChildA H1+instance AdmitChildIMG H1+instance AdmitChildAPPLET H1+instance AdmitChildOBJECT H1+instance AdmitChildFONT H1+instance AdmitChildBASEFONT H1+instance AdmitChildBR H1+instance AdmitChildSCRIPT H1+instance AdmitChildMAP H1+instance AdmitChildQ H1+instance AdmitChildSUB H1+instance AdmitChildSUP H1+instance AdmitChildSPAN H1+instance AdmitChildBDO H1+instance AdmitChildIFRAME H1+instance AdmitChildINPUT H1+instance AdmitChildSELECT H1+instance AdmitChildTEXTAREA H1+instance AdmitChildLABEL H1+instance AdmitChildBUTTON H1++instance AdmitChildCDATA H2+instance AdmitChildTT H2+instance AdmitChildI H2+instance AdmitChildB H2+instance AdmitChildU H2+instance AdmitChildS H2+instance AdmitChildSTRIKE H2+instance AdmitChildBIG H2+instance AdmitChildSMALL H2+instance AdmitChildEM H2+instance AdmitChildSTRONG H2+instance AdmitChildDFN H2+instance AdmitChildCODE H2+instance AdmitChildSAMP H2+instance AdmitChildKBD H2+instance AdmitChildVAR H2+instance AdmitChildCITE H2+instance AdmitChildABBR H2+instance AdmitChildACRONYM H2+instance AdmitChildA H2+instance AdmitChildIMG H2+instance AdmitChildAPPLET H2+instance AdmitChildOBJECT H2+instance AdmitChildFONT H2+instance AdmitChildBASEFONT H2+instance AdmitChildBR H2+instance AdmitChildSCRIPT H2+instance AdmitChildMAP H2+instance AdmitChildQ H2+instance AdmitChildSUB H2+instance AdmitChildSUP H2+instance AdmitChildSPAN H2+instance AdmitChildBDO H2+instance AdmitChildIFRAME H2+instance AdmitChildINPUT H2+instance AdmitChildSELECT H2+instance AdmitChildTEXTAREA H2+instance AdmitChildLABEL H2+instance AdmitChildBUTTON H2++instance AdmitChildCDATA H3+instance AdmitChildTT H3+instance AdmitChildI H3+instance AdmitChildB H3+instance AdmitChildU H3+instance AdmitChildS H3+instance AdmitChildSTRIKE H3+instance AdmitChildBIG H3+instance AdmitChildSMALL H3+instance AdmitChildEM H3+instance AdmitChildSTRONG H3+instance AdmitChildDFN H3+instance AdmitChildCODE H3+instance AdmitChildSAMP H3+instance AdmitChildKBD H3+instance AdmitChildVAR H3+instance AdmitChildCITE H3+instance AdmitChildABBR H3+instance AdmitChildACRONYM H3+instance AdmitChildA H3+instance AdmitChildIMG H3+instance AdmitChildAPPLET H3+instance AdmitChildOBJECT H3+instance AdmitChildFONT H3+instance AdmitChildBASEFONT H3+instance AdmitChildBR H3+instance AdmitChildSCRIPT H3+instance AdmitChildMAP H3+instance AdmitChildQ H3+instance AdmitChildSUB H3+instance AdmitChildSUP H3+instance AdmitChildSPAN H3+instance AdmitChildBDO H3+instance AdmitChildIFRAME H3+instance AdmitChildINPUT H3+instance AdmitChildSELECT H3+instance AdmitChildTEXTAREA H3+instance AdmitChildLABEL H3+instance AdmitChildBUTTON H3++instance AdmitChildCDATA H4+instance AdmitChildTT H4+instance AdmitChildI H4+instance AdmitChildB H4+instance AdmitChildU H4+instance AdmitChildS H4+instance AdmitChildSTRIKE H4+instance AdmitChildBIG H4+instance AdmitChildSMALL H4+instance AdmitChildEM H4+instance AdmitChildSTRONG H4+instance AdmitChildDFN H4+instance AdmitChildCODE H4+instance AdmitChildSAMP H4+instance AdmitChildKBD H4+instance AdmitChildVAR H4+instance AdmitChildCITE H4+instance AdmitChildABBR H4+instance AdmitChildACRONYM H4+instance AdmitChildA H4+instance AdmitChildIMG H4+instance AdmitChildAPPLET H4+instance AdmitChildOBJECT H4+instance AdmitChildFONT H4+instance AdmitChildBASEFONT H4+instance AdmitChildBR H4+instance AdmitChildSCRIPT H4+instance AdmitChildMAP H4+instance AdmitChildQ H4+instance AdmitChildSUB H4+instance AdmitChildSUP H4+instance AdmitChildSPAN H4+instance AdmitChildBDO H4+instance AdmitChildIFRAME H4+instance AdmitChildINPUT H4+instance AdmitChildSELECT H4+instance AdmitChildTEXTAREA H4+instance AdmitChildLABEL H4+instance AdmitChildBUTTON H4++instance AdmitChildCDATA H5+instance AdmitChildTT H5+instance AdmitChildI H5+instance AdmitChildB H5+instance AdmitChildU H5+instance AdmitChildS H5+instance AdmitChildSTRIKE H5+instance AdmitChildBIG H5+instance AdmitChildSMALL H5+instance AdmitChildEM H5+instance AdmitChildSTRONG H5+instance AdmitChildDFN H5+instance AdmitChildCODE H5+instance AdmitChildSAMP H5+instance AdmitChildKBD H5+instance AdmitChildVAR H5+instance AdmitChildCITE H5+instance AdmitChildABBR H5+instance AdmitChildACRONYM H5+instance AdmitChildA H5+instance AdmitChildIMG H5+instance AdmitChildAPPLET H5+instance AdmitChildOBJECT H5+instance AdmitChildFONT H5+instance AdmitChildBASEFONT H5+instance AdmitChildBR H5+instance AdmitChildSCRIPT H5+instance AdmitChildMAP H5+instance AdmitChildQ H5+instance AdmitChildSUB H5+instance AdmitChildSUP H5+instance AdmitChildSPAN H5+instance AdmitChildBDO H5+instance AdmitChildIFRAME H5+instance AdmitChildINPUT H5+instance AdmitChildSELECT H5+instance AdmitChildTEXTAREA H5+instance AdmitChildLABEL H5+instance AdmitChildBUTTON H5++instance AdmitChildCDATA H6+instance AdmitChildTT H6+instance AdmitChildI H6+instance AdmitChildB H6+instance AdmitChildU H6+instance AdmitChildS H6+instance AdmitChildSTRIKE H6+instance AdmitChildBIG H6+instance AdmitChildSMALL H6+instance AdmitChildEM H6+instance AdmitChildSTRONG H6+instance AdmitChildDFN H6+instance AdmitChildCODE H6+instance AdmitChildSAMP H6+instance AdmitChildKBD H6+instance AdmitChildVAR H6+instance AdmitChildCITE H6+instance AdmitChildABBR H6+instance AdmitChildACRONYM H6+instance AdmitChildA H6+instance AdmitChildIMG H6+instance AdmitChildAPPLET H6+instance AdmitChildOBJECT H6+instance AdmitChildFONT H6+instance AdmitChildBASEFONT H6+instance AdmitChildBR H6+instance AdmitChildSCRIPT H6+instance AdmitChildMAP H6+instance AdmitChildQ H6+instance AdmitChildSUB H6+instance AdmitChildSUP H6+instance AdmitChildSPAN H6+instance AdmitChildBDO H6+instance AdmitChildIFRAME H6+instance AdmitChildINPUT H6+instance AdmitChildSELECT H6+instance AdmitChildTEXTAREA H6+instance AdmitChildLABEL H6+instance AdmitChildBUTTON H6++instance AdmitChildCDATA P+instance AdmitChildTT P+instance AdmitChildI P+instance AdmitChildB P+instance AdmitChildU P+instance AdmitChildS P+instance AdmitChildSTRIKE P+instance AdmitChildBIG P+instance AdmitChildSMALL P+instance AdmitChildEM P+instance AdmitChildSTRONG P+instance AdmitChildDFN P+instance AdmitChildCODE P+instance AdmitChildSAMP P+instance AdmitChildKBD P+instance AdmitChildVAR P+instance AdmitChildCITE P+instance AdmitChildABBR P+instance AdmitChildACRONYM P+instance AdmitChildA P+instance AdmitChildIMG P+instance AdmitChildAPPLET P+instance AdmitChildOBJECT P+instance AdmitChildFONT P+instance AdmitChildBASEFONT P+instance AdmitChildBR P+instance AdmitChildSCRIPT P+instance AdmitChildMAP P+instance AdmitChildQ P+instance AdmitChildSUB P+instance AdmitChildSUP P+instance AdmitChildSPAN P+instance AdmitChildBDO P+instance AdmitChildIFRAME P+instance AdmitChildINPUT P+instance AdmitChildSELECT P+instance AdmitChildTEXTAREA P+instance AdmitChildLABEL P+instance AdmitChildBUTTON P+++instance AdmitChildPARAM APPLET+instance AdmitChildP APPLET+instance AdmitChildH1 APPLET+instance AdmitChildH2 APPLET+instance AdmitChildH3 APPLET+instance AdmitChildH4 APPLET+instance AdmitChildH5 APPLET+instance AdmitChildH6 APPLET+instance AdmitChildUL APPLET+instance AdmitChildOL APPLET+instance AdmitChildDIR APPLET+instance AdmitChildMENU APPLET+instance AdmitChildPRE APPLET+instance AdmitChildDL APPLET+instance AdmitChildDIV APPLET+instance AdmitChildCENTER APPLET+instance AdmitChildNOSCRIPT APPLET+instance AdmitChildNOFRAMES APPLET+instance AdmitChildBLOCKQUOTE APPLET+instance AdmitChildFORM APPLET+instance AdmitChildISINDEX APPLET+instance AdmitChildHR APPLET+instance AdmitChildTABLE APPLET+instance AdmitChildFIELDSET APPLET+instance AdmitChildADDRESS APPLET+instance AdmitChildCDATA APPLET+instance AdmitChildTT APPLET+instance AdmitChildI APPLET+instance AdmitChildB APPLET+instance AdmitChildU APPLET+instance AdmitChildS APPLET+instance AdmitChildSTRIKE APPLET+instance AdmitChildBIG APPLET+instance AdmitChildSMALL APPLET+instance AdmitChildEM APPLET+instance AdmitChildSTRONG APPLET+instance AdmitChildDFN APPLET+instance AdmitChildCODE APPLET+instance AdmitChildSAMP APPLET+instance AdmitChildKBD APPLET+instance AdmitChildVAR APPLET+instance AdmitChildCITE APPLET+instance AdmitChildABBR APPLET+instance AdmitChildACRONYM APPLET+instance AdmitChildA APPLET+instance AdmitChildIMG APPLET+instance AdmitChildAPPLET APPLET+instance AdmitChildOBJECT APPLET+instance AdmitChildFONT APPLET+instance AdmitChildBASEFONT APPLET+instance AdmitChildBR APPLET+instance AdmitChildSCRIPT APPLET+instance AdmitChildMAP APPLET+instance AdmitChildQ APPLET+instance AdmitChildSUB APPLET+instance AdmitChildSUP APPLET+instance AdmitChildSPAN APPLET+instance AdmitChildBDO APPLET+instance AdmitChildIFRAME APPLET+instance AdmitChildINPUT APPLET+instance AdmitChildSELECT APPLET+instance AdmitChildTEXTAREA APPLET+instance AdmitChildLABEL APPLET+instance AdmitChildBUTTON APPLET+++instance AdmitChildPARAM OBJECT+instance AdmitChildP OBJECT+instance AdmitChildH1 OBJECT+instance AdmitChildH2 OBJECT+instance AdmitChildH3 OBJECT+instance AdmitChildH4 OBJECT+instance AdmitChildH5 OBJECT+instance AdmitChildH6 OBJECT+instance AdmitChildUL OBJECT+instance AdmitChildOL OBJECT+instance AdmitChildDIR OBJECT+instance AdmitChildMENU OBJECT+instance AdmitChildPRE OBJECT+instance AdmitChildDL OBJECT+instance AdmitChildDIV OBJECT+instance AdmitChildCENTER OBJECT+instance AdmitChildNOSCRIPT OBJECT+instance AdmitChildNOFRAMES OBJECT+instance AdmitChildBLOCKQUOTE OBJECT+instance AdmitChildFORM OBJECT+instance AdmitChildISINDEX OBJECT+instance AdmitChildHR OBJECT+instance AdmitChildTABLE OBJECT+instance AdmitChildFIELDSET OBJECT+instance AdmitChildADDRESS OBJECT+instance AdmitChildCDATA OBJECT+instance AdmitChildTT OBJECT+instance AdmitChildI OBJECT+instance AdmitChildB OBJECT+instance AdmitChildU OBJECT+instance AdmitChildS OBJECT+instance AdmitChildSTRIKE OBJECT+instance AdmitChildBIG OBJECT+instance AdmitChildSMALL OBJECT+instance AdmitChildEM OBJECT+instance AdmitChildSTRONG OBJECT+instance AdmitChildDFN OBJECT+instance AdmitChildCODE OBJECT+instance AdmitChildSAMP OBJECT+instance AdmitChildKBD OBJECT+instance AdmitChildVAR OBJECT+instance AdmitChildCITE OBJECT+instance AdmitChildABBR OBJECT+instance AdmitChildACRONYM OBJECT+instance AdmitChildA OBJECT+instance AdmitChildIMG OBJECT+instance AdmitChildAPPLET OBJECT+instance AdmitChildOBJECT OBJECT+instance AdmitChildFONT OBJECT+instance AdmitChildBASEFONT OBJECT+instance AdmitChildBR OBJECT+instance AdmitChildSCRIPT OBJECT+instance AdmitChildMAP OBJECT+instance AdmitChildQ OBJECT+instance AdmitChildSUB OBJECT+instance AdmitChildSUP OBJECT+instance AdmitChildSPAN OBJECT+instance AdmitChildBDO OBJECT+instance AdmitChildIFRAME OBJECT+instance AdmitChildINPUT OBJECT+instance AdmitChildSELECT OBJECT+instance AdmitChildTEXTAREA OBJECT+instance AdmitChildLABEL OBJECT+instance AdmitChildBUTTON OBJECT+++++instance AdmitChildP MAP+instance AdmitChildH1 MAP+instance AdmitChildH2 MAP+instance AdmitChildH3 MAP+instance AdmitChildH4 MAP+instance AdmitChildH5 MAP+instance AdmitChildH6 MAP+instance AdmitChildUL MAP+instance AdmitChildOL MAP+instance AdmitChildDIR MAP+instance AdmitChildMENU MAP+instance AdmitChildPRE MAP+instance AdmitChildDL MAP+instance AdmitChildDIV MAP+instance AdmitChildCENTER MAP+instance AdmitChildNOSCRIPT MAP+instance AdmitChildNOFRAMES MAP+instance AdmitChildBLOCKQUOTE MAP+instance AdmitChildFORM MAP+instance AdmitChildISINDEX MAP+instance AdmitChildHR MAP+instance AdmitChildTABLE MAP+instance AdmitChildFIELDSET MAP+instance AdmitChildADDRESS MAP+instance AdmitChildAREA MAP++instance AdmitChildCDATA A+instance AdmitChildTT A+instance AdmitChildI A+instance AdmitChildB A+instance AdmitChildU A+instance AdmitChildS A+instance AdmitChildSTRIKE A+instance AdmitChildBIG A+instance AdmitChildSMALL A+instance AdmitChildEM A+instance AdmitChildSTRONG A+instance AdmitChildDFN A+instance AdmitChildCODE A+instance AdmitChildSAMP A+instance AdmitChildKBD A+instance AdmitChildVAR A+instance AdmitChildCITE A+instance AdmitChildABBR A+instance AdmitChildACRONYM A+instance AdmitChildIMG A+instance AdmitChildAPPLET A+instance AdmitChildOBJECT A+instance AdmitChildFONT A+instance AdmitChildBASEFONT A+instance AdmitChildBR A+instance AdmitChildSCRIPT A+instance AdmitChildMAP A+instance AdmitChildQ A+instance AdmitChildSUB A+instance AdmitChildSUP A+instance AdmitChildSPAN A+instance AdmitChildBDO A+instance AdmitChildIFRAME A+instance AdmitChildINPUT A+instance AdmitChildSELECT A+instance AdmitChildTEXTAREA A+instance AdmitChildLABEL A+instance AdmitChildBUTTON A++instance AdmitChildP CENTER+instance AdmitChildH1 CENTER+instance AdmitChildH2 CENTER+instance AdmitChildH3 CENTER+instance AdmitChildH4 CENTER+instance AdmitChildH5 CENTER+instance AdmitChildH6 CENTER+instance AdmitChildUL CENTER+instance AdmitChildOL CENTER+instance AdmitChildDIR CENTER+instance AdmitChildMENU CENTER+instance AdmitChildPRE CENTER+instance AdmitChildDL CENTER+instance AdmitChildDIV CENTER+instance AdmitChildCENTER CENTER+instance AdmitChildNOSCRIPT CENTER+instance AdmitChildNOFRAMES CENTER+instance AdmitChildBLOCKQUOTE CENTER+instance AdmitChildFORM CENTER+instance AdmitChildISINDEX CENTER+instance AdmitChildHR CENTER+instance AdmitChildTABLE CENTER+instance AdmitChildFIELDSET CENTER+instance AdmitChildADDRESS CENTER+instance AdmitChildCDATA CENTER+instance AdmitChildTT CENTER+instance AdmitChildI CENTER+instance AdmitChildB CENTER+instance AdmitChildU CENTER+instance AdmitChildS CENTER+instance AdmitChildSTRIKE CENTER+instance AdmitChildBIG CENTER+instance AdmitChildSMALL CENTER+instance AdmitChildEM CENTER+instance AdmitChildSTRONG CENTER+instance AdmitChildDFN CENTER+instance AdmitChildCODE CENTER+instance AdmitChildSAMP CENTER+instance AdmitChildKBD CENTER+instance AdmitChildVAR CENTER+instance AdmitChildCITE CENTER+instance AdmitChildABBR CENTER+instance AdmitChildACRONYM CENTER+instance AdmitChildA CENTER+instance AdmitChildIMG CENTER+instance AdmitChildAPPLET CENTER+instance AdmitChildOBJECT CENTER+instance AdmitChildFONT CENTER+instance AdmitChildBASEFONT CENTER+instance AdmitChildBR CENTER+instance AdmitChildSCRIPT CENTER+instance AdmitChildMAP CENTER+instance AdmitChildQ CENTER+instance AdmitChildSUB CENTER+instance AdmitChildSUP CENTER+instance AdmitChildSPAN CENTER+instance AdmitChildBDO CENTER+instance AdmitChildIFRAME CENTER+instance AdmitChildINPUT CENTER+instance AdmitChildSELECT CENTER+instance AdmitChildTEXTAREA CENTER+instance AdmitChildLABEL CENTER+instance AdmitChildBUTTON CENTER++instance AdmitChildP DIV+instance AdmitChildH1 DIV+instance AdmitChildH2 DIV+instance AdmitChildH3 DIV+instance AdmitChildH4 DIV+instance AdmitChildH5 DIV+instance AdmitChildH6 DIV+instance AdmitChildUL DIV+instance AdmitChildOL DIV+instance AdmitChildDIR DIV+instance AdmitChildMENU DIV+instance AdmitChildPRE DIV+instance AdmitChildDL DIV+instance AdmitChildDIV DIV+instance AdmitChildCENTER DIV+instance AdmitChildNOSCRIPT DIV+instance AdmitChildNOFRAMES DIV+instance AdmitChildBLOCKQUOTE DIV+instance AdmitChildFORM DIV+instance AdmitChildISINDEX DIV+instance AdmitChildHR DIV+instance AdmitChildTABLE DIV+instance AdmitChildFIELDSET DIV+instance AdmitChildADDRESS DIV+instance AdmitChildCDATA DIV+instance AdmitChildTT DIV+instance AdmitChildI DIV+instance AdmitChildB DIV+instance AdmitChildU DIV+instance AdmitChildS DIV+instance AdmitChildSTRIKE DIV+instance AdmitChildBIG DIV+instance AdmitChildSMALL DIV+instance AdmitChildEM DIV+instance AdmitChildSTRONG DIV+instance AdmitChildDFN DIV+instance AdmitChildCODE DIV+instance AdmitChildSAMP DIV+instance AdmitChildKBD DIV+instance AdmitChildVAR DIV+instance AdmitChildCITE DIV+instance AdmitChildABBR DIV+instance AdmitChildACRONYM DIV+instance AdmitChildA DIV+instance AdmitChildIMG DIV+instance AdmitChildAPPLET DIV+instance AdmitChildOBJECT DIV+instance AdmitChildFONT DIV+instance AdmitChildBASEFONT DIV+instance AdmitChildBR DIV+instance AdmitChildSCRIPT DIV+instance AdmitChildMAP DIV+instance AdmitChildQ DIV+instance AdmitChildSUB DIV+instance AdmitChildSUP DIV+instance AdmitChildSPAN DIV+instance AdmitChildBDO DIV+instance AdmitChildIFRAME DIV+instance AdmitChildINPUT DIV+instance AdmitChildSELECT DIV+instance AdmitChildTEXTAREA DIV+instance AdmitChildLABEL DIV+instance AdmitChildBUTTON DIV++instance AdmitChildCDATA ADDRESS+instance AdmitChildTT ADDRESS+instance AdmitChildI ADDRESS+instance AdmitChildB ADDRESS+instance AdmitChildU ADDRESS+instance AdmitChildS ADDRESS+instance AdmitChildSTRIKE ADDRESS+instance AdmitChildBIG ADDRESS+instance AdmitChildSMALL ADDRESS+instance AdmitChildEM ADDRESS+instance AdmitChildSTRONG ADDRESS+instance AdmitChildDFN ADDRESS+instance AdmitChildCODE ADDRESS+instance AdmitChildSAMP ADDRESS+instance AdmitChildKBD ADDRESS+instance AdmitChildVAR ADDRESS+instance AdmitChildCITE ADDRESS+instance AdmitChildABBR ADDRESS+instance AdmitChildACRONYM ADDRESS+instance AdmitChildA ADDRESS+instance AdmitChildIMG ADDRESS+instance AdmitChildAPPLET ADDRESS+instance AdmitChildOBJECT ADDRESS+instance AdmitChildFONT ADDRESS+instance AdmitChildBASEFONT ADDRESS+instance AdmitChildBR ADDRESS+instance AdmitChildSCRIPT ADDRESS+instance AdmitChildMAP ADDRESS+instance AdmitChildQ ADDRESS+instance AdmitChildSUB ADDRESS+instance AdmitChildSUP ADDRESS+instance AdmitChildSPAN ADDRESS+instance AdmitChildBDO ADDRESS+instance AdmitChildIFRAME ADDRESS+instance AdmitChildINPUT ADDRESS+instance AdmitChildSELECT ADDRESS+instance AdmitChildTEXTAREA ADDRESS+instance AdmitChildLABEL ADDRESS+instance AdmitChildBUTTON ADDRESS+instance AdmitChildP ADDRESS++instance AdmitChildP BODY+instance AdmitChildH1 BODY+instance AdmitChildH2 BODY+instance AdmitChildH3 BODY+instance AdmitChildH4 BODY+instance AdmitChildH5 BODY+instance AdmitChildH6 BODY+instance AdmitChildUL BODY+instance AdmitChildOL BODY+instance AdmitChildDIR BODY+instance AdmitChildMENU BODY+instance AdmitChildPRE BODY+instance AdmitChildDL BODY+instance AdmitChildDIV BODY+instance AdmitChildCENTER BODY+instance AdmitChildNOSCRIPT BODY+instance AdmitChildNOFRAMES BODY+instance AdmitChildBLOCKQUOTE BODY+instance AdmitChildFORM BODY+instance AdmitChildISINDEX BODY+instance AdmitChildHR BODY+instance AdmitChildTABLE BODY+instance AdmitChildFIELDSET BODY+instance AdmitChildADDRESS BODY+instance AdmitChildCDATA BODY+instance AdmitChildTT BODY+instance AdmitChildI BODY+instance AdmitChildB BODY+instance AdmitChildU BODY+instance AdmitChildS BODY+instance AdmitChildSTRIKE BODY+instance AdmitChildBIG BODY+instance AdmitChildSMALL BODY+instance AdmitChildEM BODY+instance AdmitChildSTRONG BODY+instance AdmitChildDFN BODY+instance AdmitChildCODE BODY+instance AdmitChildSAMP BODY+instance AdmitChildKBD BODY+instance AdmitChildVAR BODY+instance AdmitChildCITE BODY+instance AdmitChildABBR BODY+instance AdmitChildACRONYM BODY+instance AdmitChildA BODY+instance AdmitChildIMG BODY+instance AdmitChildAPPLET BODY+instance AdmitChildOBJECT BODY+instance AdmitChildFONT BODY+instance AdmitChildBASEFONT BODY+instance AdmitChildBR BODY+instance AdmitChildSCRIPT BODY+instance AdmitChildMAP BODY+instance AdmitChildQ BODY+instance AdmitChildSUB BODY+instance AdmitChildSUP BODY+instance AdmitChildSPAN BODY+instance AdmitChildBDO BODY+instance AdmitChildIFRAME BODY+instance AdmitChildINPUT BODY+instance AdmitChildSELECT BODY+instance AdmitChildTEXTAREA BODY+instance AdmitChildLABEL BODY+instance AdmitChildBUTTON BODY+instance AdmitChildINS BODY+instance AdmitChildDEL BODY+++instance AdmitChildCDATA FONT+instance AdmitChildTT FONT+instance AdmitChildI FONT+instance AdmitChildB FONT+instance AdmitChildU FONT+instance AdmitChildS FONT+instance AdmitChildSTRIKE FONT+instance AdmitChildBIG FONT+instance AdmitChildSMALL FONT+instance AdmitChildEM FONT+instance AdmitChildSTRONG FONT+instance AdmitChildDFN FONT+instance AdmitChildCODE FONT+instance AdmitChildSAMP FONT+instance AdmitChildKBD FONT+instance AdmitChildVAR FONT+instance AdmitChildCITE FONT+instance AdmitChildABBR FONT+instance AdmitChildACRONYM FONT+instance AdmitChildA FONT+instance AdmitChildIMG FONT+instance AdmitChildAPPLET FONT+instance AdmitChildOBJECT FONT+instance AdmitChildFONT FONT+instance AdmitChildBASEFONT FONT+instance AdmitChildBR FONT+instance AdmitChildSCRIPT FONT+instance AdmitChildMAP FONT+instance AdmitChildQ FONT+instance AdmitChildSUB FONT+instance AdmitChildSUP FONT+instance AdmitChildSPAN FONT+instance AdmitChildBDO FONT+instance AdmitChildIFRAME FONT+instance AdmitChildINPUT FONT+instance AdmitChildSELECT FONT+instance AdmitChildTEXTAREA FONT+instance AdmitChildLABEL FONT+instance AdmitChildBUTTON FONT+++instance AdmitChildCDATA BDO+instance AdmitChildTT BDO+instance AdmitChildI BDO+instance AdmitChildB BDO+instance AdmitChildU BDO+instance AdmitChildS BDO+instance AdmitChildSTRIKE BDO+instance AdmitChildBIG BDO+instance AdmitChildSMALL BDO+instance AdmitChildEM BDO+instance AdmitChildSTRONG BDO+instance AdmitChildDFN BDO+instance AdmitChildCODE BDO+instance AdmitChildSAMP BDO+instance AdmitChildKBD BDO+instance AdmitChildVAR BDO+instance AdmitChildCITE BDO+instance AdmitChildABBR BDO+instance AdmitChildACRONYM BDO+instance AdmitChildA BDO+instance AdmitChildIMG BDO+instance AdmitChildAPPLET BDO+instance AdmitChildOBJECT BDO+instance AdmitChildFONT BDO+instance AdmitChildBASEFONT BDO+instance AdmitChildBR BDO+instance AdmitChildSCRIPT BDO+instance AdmitChildMAP BDO+instance AdmitChildQ BDO+instance AdmitChildSUB BDO+instance AdmitChildSUP BDO+instance AdmitChildSPAN BDO+instance AdmitChildBDO BDO+instance AdmitChildIFRAME BDO+instance AdmitChildINPUT BDO+instance AdmitChildSELECT BDO+instance AdmitChildTEXTAREA BDO+instance AdmitChildLABEL BDO+instance AdmitChildBUTTON BDO++instance AdmitChildCDATA SPAN+instance AdmitChildTT SPAN+instance AdmitChildI SPAN+instance AdmitChildB SPAN+instance AdmitChildU SPAN+instance AdmitChildS SPAN+instance AdmitChildSTRIKE SPAN+instance AdmitChildBIG SPAN+instance AdmitChildSMALL SPAN+instance AdmitChildEM SPAN+instance AdmitChildSTRONG SPAN+instance AdmitChildDFN SPAN+instance AdmitChildCODE SPAN+instance AdmitChildSAMP SPAN+instance AdmitChildKBD SPAN+instance AdmitChildVAR SPAN+instance AdmitChildCITE SPAN+instance AdmitChildABBR SPAN+instance AdmitChildACRONYM SPAN+instance AdmitChildA SPAN+instance AdmitChildIMG SPAN+instance AdmitChildAPPLET SPAN+instance AdmitChildOBJECT SPAN+instance AdmitChildFONT SPAN+instance AdmitChildBASEFONT SPAN+instance AdmitChildBR SPAN+instance AdmitChildSCRIPT SPAN+instance AdmitChildMAP SPAN+instance AdmitChildQ SPAN+instance AdmitChildSUB SPAN+instance AdmitChildSUP SPAN+instance AdmitChildSPAN SPAN+instance AdmitChildBDO SPAN+instance AdmitChildIFRAME SPAN+instance AdmitChildINPUT SPAN+instance AdmitChildSELECT SPAN+instance AdmitChildTEXTAREA SPAN+instance AdmitChildLABEL SPAN+instance AdmitChildBUTTON SPAN++instance AdmitChildCDATA SUB+instance AdmitChildTT SUB+instance AdmitChildI SUB+instance AdmitChildB SUB+instance AdmitChildU SUB+instance AdmitChildS SUB+instance AdmitChildSTRIKE SUB+instance AdmitChildBIG SUB+instance AdmitChildSMALL SUB+instance AdmitChildEM SUB+instance AdmitChildSTRONG SUB+instance AdmitChildDFN SUB+instance AdmitChildCODE SUB+instance AdmitChildSAMP SUB+instance AdmitChildKBD SUB+instance AdmitChildVAR SUB+instance AdmitChildCITE SUB+instance AdmitChildABBR SUB+instance AdmitChildACRONYM SUB+instance AdmitChildA SUB+instance AdmitChildIMG SUB+instance AdmitChildAPPLET SUB+instance AdmitChildOBJECT SUB+instance AdmitChildFONT SUB+instance AdmitChildBASEFONT SUB+instance AdmitChildBR SUB+instance AdmitChildSCRIPT SUB+instance AdmitChildMAP SUB+instance AdmitChildQ SUB+instance AdmitChildSUB SUB+instance AdmitChildSUP SUB+instance AdmitChildSPAN SUB+instance AdmitChildBDO SUB+instance AdmitChildIFRAME SUB+instance AdmitChildINPUT SUB+instance AdmitChildSELECT SUB+instance AdmitChildTEXTAREA SUB+instance AdmitChildLABEL SUB+instance AdmitChildBUTTON SUB++instance AdmitChildCDATA SUP+instance AdmitChildTT SUP+instance AdmitChildI SUP+instance AdmitChildB SUP+instance AdmitChildU SUP+instance AdmitChildS SUP+instance AdmitChildSTRIKE SUP+instance AdmitChildBIG SUP+instance AdmitChildSMALL SUP+instance AdmitChildEM SUP+instance AdmitChildSTRONG SUP+instance AdmitChildDFN SUP+instance AdmitChildCODE SUP+instance AdmitChildSAMP SUP+instance AdmitChildKBD SUP+instance AdmitChildVAR SUP+instance AdmitChildCITE SUP+instance AdmitChildABBR SUP+instance AdmitChildACRONYM SUP+instance AdmitChildA SUP+instance AdmitChildIMG SUP+instance AdmitChildAPPLET SUP+instance AdmitChildOBJECT SUP+instance AdmitChildFONT SUP+instance AdmitChildBASEFONT SUP+instance AdmitChildBR SUP+instance AdmitChildSCRIPT SUP+instance AdmitChildMAP SUP+instance AdmitChildQ SUP+instance AdmitChildSUB SUP+instance AdmitChildSUP SUP+instance AdmitChildSPAN SUP+instance AdmitChildBDO SUP+instance AdmitChildIFRAME SUP+instance AdmitChildINPUT SUP+instance AdmitChildSELECT SUP+instance AdmitChildTEXTAREA SUP+instance AdmitChildLABEL SUP+instance AdmitChildBUTTON SUP++instance AdmitChildCDATA TT+instance AdmitChildTT TT+instance AdmitChildI TT+instance AdmitChildB TT+instance AdmitChildU TT+instance AdmitChildS TT+instance AdmitChildSTRIKE TT+instance AdmitChildBIG TT+instance AdmitChildSMALL TT+instance AdmitChildEM TT+instance AdmitChildSTRONG TT+instance AdmitChildDFN TT+instance AdmitChildCODE TT+instance AdmitChildSAMP TT+instance AdmitChildKBD TT+instance AdmitChildVAR TT+instance AdmitChildCITE TT+instance AdmitChildABBR TT+instance AdmitChildACRONYM TT+instance AdmitChildA TT+instance AdmitChildIMG TT+instance AdmitChildAPPLET TT+instance AdmitChildOBJECT TT+instance AdmitChildFONT TT+instance AdmitChildBASEFONT TT+instance AdmitChildBR TT+instance AdmitChildSCRIPT TT+instance AdmitChildMAP TT+instance AdmitChildQ TT+instance AdmitChildSUB TT+instance AdmitChildSUP TT+instance AdmitChildSPAN TT+instance AdmitChildBDO TT+instance AdmitChildIFRAME TT+instance AdmitChildINPUT TT+instance AdmitChildSELECT TT+instance AdmitChildTEXTAREA TT+instance AdmitChildLABEL TT+instance AdmitChildBUTTON TT++instance AdmitChildCDATA I+instance AdmitChildTT I+instance AdmitChildI I+instance AdmitChildB I+instance AdmitChildU I+instance AdmitChildS I+instance AdmitChildSTRIKE I+instance AdmitChildBIG I+instance AdmitChildSMALL I+instance AdmitChildEM I+instance AdmitChildSTRONG I+instance AdmitChildDFN I+instance AdmitChildCODE I+instance AdmitChildSAMP I+instance AdmitChildKBD I+instance AdmitChildVAR I+instance AdmitChildCITE I+instance AdmitChildABBR I+instance AdmitChildACRONYM I+instance AdmitChildA I+instance AdmitChildIMG I+instance AdmitChildAPPLET I+instance AdmitChildOBJECT I+instance AdmitChildFONT I+instance AdmitChildBASEFONT I+instance AdmitChildBR I+instance AdmitChildSCRIPT I+instance AdmitChildMAP I+instance AdmitChildQ I+instance AdmitChildSUB I+instance AdmitChildSUP I+instance AdmitChildSPAN I+instance AdmitChildBDO I+instance AdmitChildIFRAME I+instance AdmitChildINPUT I+instance AdmitChildSELECT I+instance AdmitChildTEXTAREA I+instance AdmitChildLABEL I+instance AdmitChildBUTTON I++instance AdmitChildCDATA B+instance AdmitChildTT B+instance AdmitChildI B+instance AdmitChildB B+instance AdmitChildU B+instance AdmitChildS B+instance AdmitChildSTRIKE B+instance AdmitChildBIG B+instance AdmitChildSMALL B+instance AdmitChildEM B+instance AdmitChildSTRONG B+instance AdmitChildDFN B+instance AdmitChildCODE B+instance AdmitChildSAMP B+instance AdmitChildKBD B+instance AdmitChildVAR B+instance AdmitChildCITE B+instance AdmitChildABBR B+instance AdmitChildACRONYM B+instance AdmitChildA B+instance AdmitChildIMG B+instance AdmitChildAPPLET B+instance AdmitChildOBJECT B+instance AdmitChildFONT B+instance AdmitChildBASEFONT B+instance AdmitChildBR B+instance AdmitChildSCRIPT B+instance AdmitChildMAP B+instance AdmitChildQ B+instance AdmitChildSUB B+instance AdmitChildSUP B+instance AdmitChildSPAN B+instance AdmitChildBDO B+instance AdmitChildIFRAME B+instance AdmitChildINPUT B+instance AdmitChildSELECT B+instance AdmitChildTEXTAREA B+instance AdmitChildLABEL B+instance AdmitChildBUTTON B++instance AdmitChildCDATA U+instance AdmitChildTT U+instance AdmitChildI U+instance AdmitChildB U+instance AdmitChildU U+instance AdmitChildS U+instance AdmitChildSTRIKE U+instance AdmitChildBIG U+instance AdmitChildSMALL U+instance AdmitChildEM U+instance AdmitChildSTRONG U+instance AdmitChildDFN U+instance AdmitChildCODE U+instance AdmitChildSAMP U+instance AdmitChildKBD U+instance AdmitChildVAR U+instance AdmitChildCITE U+instance AdmitChildABBR U+instance AdmitChildACRONYM U+instance AdmitChildA U+instance AdmitChildIMG U+instance AdmitChildAPPLET U+instance AdmitChildOBJECT U+instance AdmitChildFONT U+instance AdmitChildBASEFONT U+instance AdmitChildBR U+instance AdmitChildSCRIPT U+instance AdmitChildMAP U+instance AdmitChildQ U+instance AdmitChildSUB U+instance AdmitChildSUP U+instance AdmitChildSPAN U+instance AdmitChildBDO U+instance AdmitChildIFRAME U+instance AdmitChildINPUT U+instance AdmitChildSELECT U+instance AdmitChildTEXTAREA U+instance AdmitChildLABEL U+instance AdmitChildBUTTON U++instance AdmitChildCDATA S+instance AdmitChildTT S+instance AdmitChildI S+instance AdmitChildB S+instance AdmitChildU S+instance AdmitChildS S+instance AdmitChildSTRIKE S+instance AdmitChildBIG S+instance AdmitChildSMALL S+instance AdmitChildEM S+instance AdmitChildSTRONG S+instance AdmitChildDFN S+instance AdmitChildCODE S+instance AdmitChildSAMP S+instance AdmitChildKBD S+instance AdmitChildVAR S+instance AdmitChildCITE S+instance AdmitChildABBR S+instance AdmitChildACRONYM S+instance AdmitChildA S+instance AdmitChildIMG S+instance AdmitChildAPPLET S+instance AdmitChildOBJECT S+instance AdmitChildFONT S+instance AdmitChildBASEFONT S+instance AdmitChildBR S+instance AdmitChildSCRIPT S+instance AdmitChildMAP S+instance AdmitChildQ S+instance AdmitChildSUB S+instance AdmitChildSUP S+instance AdmitChildSPAN S+instance AdmitChildBDO S+instance AdmitChildIFRAME S+instance AdmitChildINPUT S+instance AdmitChildSELECT S+instance AdmitChildTEXTAREA S+instance AdmitChildLABEL S+instance AdmitChildBUTTON S++instance AdmitChildCDATA STRIKE+instance AdmitChildTT STRIKE+instance AdmitChildI STRIKE+instance AdmitChildB STRIKE+instance AdmitChildU STRIKE+instance AdmitChildS STRIKE+instance AdmitChildSTRIKE STRIKE+instance AdmitChildBIG STRIKE+instance AdmitChildSMALL STRIKE+instance AdmitChildEM STRIKE+instance AdmitChildSTRONG STRIKE+instance AdmitChildDFN STRIKE+instance AdmitChildCODE STRIKE+instance AdmitChildSAMP STRIKE+instance AdmitChildKBD STRIKE+instance AdmitChildVAR STRIKE+instance AdmitChildCITE STRIKE+instance AdmitChildABBR STRIKE+instance AdmitChildACRONYM STRIKE+instance AdmitChildA STRIKE+instance AdmitChildIMG STRIKE+instance AdmitChildAPPLET STRIKE+instance AdmitChildOBJECT STRIKE+instance AdmitChildFONT STRIKE+instance AdmitChildBASEFONT STRIKE+instance AdmitChildBR STRIKE+instance AdmitChildSCRIPT STRIKE+instance AdmitChildMAP STRIKE+instance AdmitChildQ STRIKE+instance AdmitChildSUB STRIKE+instance AdmitChildSUP STRIKE+instance AdmitChildSPAN STRIKE+instance AdmitChildBDO STRIKE+instance AdmitChildIFRAME STRIKE+instance AdmitChildINPUT STRIKE+instance AdmitChildSELECT STRIKE+instance AdmitChildTEXTAREA STRIKE+instance AdmitChildLABEL STRIKE+instance AdmitChildBUTTON STRIKE++instance AdmitChildCDATA BIG+instance AdmitChildTT BIG+instance AdmitChildI BIG+instance AdmitChildB BIG+instance AdmitChildU BIG+instance AdmitChildS BIG+instance AdmitChildSTRIKE BIG+instance AdmitChildBIG BIG+instance AdmitChildSMALL BIG+instance AdmitChildEM BIG+instance AdmitChildSTRONG BIG+instance AdmitChildDFN BIG+instance AdmitChildCODE BIG+instance AdmitChildSAMP BIG+instance AdmitChildKBD BIG+instance AdmitChildVAR BIG+instance AdmitChildCITE BIG+instance AdmitChildABBR BIG+instance AdmitChildACRONYM BIG+instance AdmitChildA BIG+instance AdmitChildIMG BIG+instance AdmitChildAPPLET BIG+instance AdmitChildOBJECT BIG+instance AdmitChildFONT BIG+instance AdmitChildBASEFONT BIG+instance AdmitChildBR BIG+instance AdmitChildSCRIPT BIG+instance AdmitChildMAP BIG+instance AdmitChildQ BIG+instance AdmitChildSUB BIG+instance AdmitChildSUP BIG+instance AdmitChildSPAN BIG+instance AdmitChildBDO BIG+instance AdmitChildIFRAME BIG+instance AdmitChildINPUT BIG+instance AdmitChildSELECT BIG+instance AdmitChildTEXTAREA BIG+instance AdmitChildLABEL BIG+instance AdmitChildBUTTON BIG++instance AdmitChildCDATA SMALL+instance AdmitChildTT SMALL+instance AdmitChildI SMALL+instance AdmitChildB SMALL+instance AdmitChildU SMALL+instance AdmitChildS SMALL+instance AdmitChildSTRIKE SMALL+instance AdmitChildBIG SMALL+instance AdmitChildSMALL SMALL+instance AdmitChildEM SMALL+instance AdmitChildSTRONG SMALL+instance AdmitChildDFN SMALL+instance AdmitChildCODE SMALL+instance AdmitChildSAMP SMALL+instance AdmitChildKBD SMALL+instance AdmitChildVAR SMALL+instance AdmitChildCITE SMALL+instance AdmitChildABBR SMALL+instance AdmitChildACRONYM SMALL+instance AdmitChildA SMALL+instance AdmitChildIMG SMALL+instance AdmitChildAPPLET SMALL+instance AdmitChildOBJECT SMALL+instance AdmitChildFONT SMALL+instance AdmitChildBASEFONT SMALL+instance AdmitChildBR SMALL+instance AdmitChildSCRIPT SMALL+instance AdmitChildMAP SMALL+instance AdmitChildQ SMALL+instance AdmitChildSUB SMALL+instance AdmitChildSUP SMALL+instance AdmitChildSPAN SMALL+instance AdmitChildBDO SMALL+instance AdmitChildIFRAME SMALL+instance AdmitChildINPUT SMALL+instance AdmitChildSELECT SMALL+instance AdmitChildTEXTAREA SMALL+instance AdmitChildLABEL SMALL+instance AdmitChildBUTTON SMALL++instance AdmitChildCDATA EM+instance AdmitChildTT EM+instance AdmitChildI EM+instance AdmitChildB EM+instance AdmitChildU EM+instance AdmitChildS EM+instance AdmitChildSTRIKE EM+instance AdmitChildBIG EM+instance AdmitChildSMALL EM+instance AdmitChildEM EM+instance AdmitChildSTRONG EM+instance AdmitChildDFN EM+instance AdmitChildCODE EM+instance AdmitChildSAMP EM+instance AdmitChildKBD EM+instance AdmitChildVAR EM+instance AdmitChildCITE EM+instance AdmitChildABBR EM+instance AdmitChildACRONYM EM+instance AdmitChildA EM+instance AdmitChildIMG EM+instance AdmitChildAPPLET EM+instance AdmitChildOBJECT EM+instance AdmitChildFONT EM+instance AdmitChildBASEFONT EM+instance AdmitChildBR EM+instance AdmitChildSCRIPT EM+instance AdmitChildMAP EM+instance AdmitChildQ EM+instance AdmitChildSUB EM+instance AdmitChildSUP EM+instance AdmitChildSPAN EM+instance AdmitChildBDO EM+instance AdmitChildIFRAME EM+instance AdmitChildINPUT EM+instance AdmitChildSELECT EM+instance AdmitChildTEXTAREA EM+instance AdmitChildLABEL EM+instance AdmitChildBUTTON EM++instance AdmitChildCDATA STRONG+instance AdmitChildTT STRONG+instance AdmitChildI STRONG+instance AdmitChildB STRONG+instance AdmitChildU STRONG+instance AdmitChildS STRONG+instance AdmitChildSTRIKE STRONG+instance AdmitChildBIG STRONG+instance AdmitChildSMALL STRONG+instance AdmitChildEM STRONG+instance AdmitChildSTRONG STRONG+instance AdmitChildDFN STRONG+instance AdmitChildCODE STRONG+instance AdmitChildSAMP STRONG+instance AdmitChildKBD STRONG+instance AdmitChildVAR STRONG+instance AdmitChildCITE STRONG+instance AdmitChildABBR STRONG+instance AdmitChildACRONYM STRONG+instance AdmitChildA STRONG+instance AdmitChildIMG STRONG+instance AdmitChildAPPLET STRONG+instance AdmitChildOBJECT STRONG+instance AdmitChildFONT STRONG+instance AdmitChildBASEFONT STRONG+instance AdmitChildBR STRONG+instance AdmitChildSCRIPT STRONG+instance AdmitChildMAP STRONG+instance AdmitChildQ STRONG+instance AdmitChildSUB STRONG+instance AdmitChildSUP STRONG+instance AdmitChildSPAN STRONG+instance AdmitChildBDO STRONG+instance AdmitChildIFRAME STRONG+instance AdmitChildINPUT STRONG+instance AdmitChildSELECT STRONG+instance AdmitChildTEXTAREA STRONG+instance AdmitChildLABEL STRONG+instance AdmitChildBUTTON STRONG++instance AdmitChildCDATA DFN+instance AdmitChildTT DFN+instance AdmitChildI DFN+instance AdmitChildB DFN+instance AdmitChildU DFN+instance AdmitChildS DFN+instance AdmitChildSTRIKE DFN+instance AdmitChildBIG DFN+instance AdmitChildSMALL DFN+instance AdmitChildEM DFN+instance AdmitChildSTRONG DFN+instance AdmitChildDFN DFN+instance AdmitChildCODE DFN+instance AdmitChildSAMP DFN+instance AdmitChildKBD DFN+instance AdmitChildVAR DFN+instance AdmitChildCITE DFN+instance AdmitChildABBR DFN+instance AdmitChildACRONYM DFN+instance AdmitChildA DFN+instance AdmitChildIMG DFN+instance AdmitChildAPPLET DFN+instance AdmitChildOBJECT DFN+instance AdmitChildFONT DFN+instance AdmitChildBASEFONT DFN+instance AdmitChildBR DFN+instance AdmitChildSCRIPT DFN+instance AdmitChildMAP DFN+instance AdmitChildQ DFN+instance AdmitChildSUB DFN+instance AdmitChildSUP DFN+instance AdmitChildSPAN DFN+instance AdmitChildBDO DFN+instance AdmitChildIFRAME DFN+instance AdmitChildINPUT DFN+instance AdmitChildSELECT DFN+instance AdmitChildTEXTAREA DFN+instance AdmitChildLABEL DFN+instance AdmitChildBUTTON DFN++instance AdmitChildCDATA CODE+instance AdmitChildTT CODE+instance AdmitChildI CODE+instance AdmitChildB CODE+instance AdmitChildU CODE+instance AdmitChildS CODE+instance AdmitChildSTRIKE CODE+instance AdmitChildBIG CODE+instance AdmitChildSMALL CODE+instance AdmitChildEM CODE+instance AdmitChildSTRONG CODE+instance AdmitChildDFN CODE+instance AdmitChildCODE CODE+instance AdmitChildSAMP CODE+instance AdmitChildKBD CODE+instance AdmitChildVAR CODE+instance AdmitChildCITE CODE+instance AdmitChildABBR CODE+instance AdmitChildACRONYM CODE+instance AdmitChildA CODE+instance AdmitChildIMG CODE+instance AdmitChildAPPLET CODE+instance AdmitChildOBJECT CODE+instance AdmitChildFONT CODE+instance AdmitChildBASEFONT CODE+instance AdmitChildBR CODE+instance AdmitChildSCRIPT CODE+instance AdmitChildMAP CODE+instance AdmitChildQ CODE+instance AdmitChildSUB CODE+instance AdmitChildSUP CODE+instance AdmitChildSPAN CODE+instance AdmitChildBDO CODE+instance AdmitChildIFRAME CODE+instance AdmitChildINPUT CODE+instance AdmitChildSELECT CODE+instance AdmitChildTEXTAREA CODE+instance AdmitChildLABEL CODE+instance AdmitChildBUTTON CODE++instance AdmitChildCDATA SAMP+instance AdmitChildTT SAMP+instance AdmitChildI SAMP+instance AdmitChildB SAMP+instance AdmitChildU SAMP+instance AdmitChildS SAMP+instance AdmitChildSTRIKE SAMP+instance AdmitChildBIG SAMP+instance AdmitChildSMALL SAMP+instance AdmitChildEM SAMP+instance AdmitChildSTRONG SAMP+instance AdmitChildDFN SAMP+instance AdmitChildCODE SAMP+instance AdmitChildSAMP SAMP+instance AdmitChildKBD SAMP+instance AdmitChildVAR SAMP+instance AdmitChildCITE SAMP+instance AdmitChildABBR SAMP+instance AdmitChildACRONYM SAMP+instance AdmitChildA SAMP+instance AdmitChildIMG SAMP+instance AdmitChildAPPLET SAMP+instance AdmitChildOBJECT SAMP+instance AdmitChildFONT SAMP+instance AdmitChildBASEFONT SAMP+instance AdmitChildBR SAMP+instance AdmitChildSCRIPT SAMP+instance AdmitChildMAP SAMP+instance AdmitChildQ SAMP+instance AdmitChildSUB SAMP+instance AdmitChildSUP SAMP+instance AdmitChildSPAN SAMP+instance AdmitChildBDO SAMP+instance AdmitChildIFRAME SAMP+instance AdmitChildINPUT SAMP+instance AdmitChildSELECT SAMP+instance AdmitChildTEXTAREA SAMP+instance AdmitChildLABEL SAMP+instance AdmitChildBUTTON SAMP++instance AdmitChildCDATA KBD+instance AdmitChildTT KBD+instance AdmitChildI KBD+instance AdmitChildB KBD+instance AdmitChildU KBD+instance AdmitChildS KBD+instance AdmitChildSTRIKE KBD+instance AdmitChildBIG KBD+instance AdmitChildSMALL KBD+instance AdmitChildEM KBD+instance AdmitChildSTRONG KBD+instance AdmitChildDFN KBD+instance AdmitChildCODE KBD+instance AdmitChildSAMP KBD+instance AdmitChildKBD KBD+instance AdmitChildVAR KBD+instance AdmitChildCITE KBD+instance AdmitChildABBR KBD+instance AdmitChildACRONYM KBD+instance AdmitChildA KBD+instance AdmitChildIMG KBD+instance AdmitChildAPPLET KBD+instance AdmitChildOBJECT KBD+instance AdmitChildFONT KBD+instance AdmitChildBASEFONT KBD+instance AdmitChildBR KBD+instance AdmitChildSCRIPT KBD+instance AdmitChildMAP KBD+instance AdmitChildQ KBD+instance AdmitChildSUB KBD+instance AdmitChildSUP KBD+instance AdmitChildSPAN KBD+instance AdmitChildBDO KBD+instance AdmitChildIFRAME KBD+instance AdmitChildINPUT KBD+instance AdmitChildSELECT KBD+instance AdmitChildTEXTAREA KBD+instance AdmitChildLABEL KBD+instance AdmitChildBUTTON KBD++instance AdmitChildCDATA VAR+instance AdmitChildTT VAR+instance AdmitChildI VAR+instance AdmitChildB VAR+instance AdmitChildU VAR+instance AdmitChildS VAR+instance AdmitChildSTRIKE VAR+instance AdmitChildBIG VAR+instance AdmitChildSMALL VAR+instance AdmitChildEM VAR+instance AdmitChildSTRONG VAR+instance AdmitChildDFN VAR+instance AdmitChildCODE VAR+instance AdmitChildSAMP VAR+instance AdmitChildKBD VAR+instance AdmitChildVAR VAR+instance AdmitChildCITE VAR+instance AdmitChildABBR VAR+instance AdmitChildACRONYM VAR+instance AdmitChildA VAR+instance AdmitChildIMG VAR+instance AdmitChildAPPLET VAR+instance AdmitChildOBJECT VAR+instance AdmitChildFONT VAR+instance AdmitChildBASEFONT VAR+instance AdmitChildBR VAR+instance AdmitChildSCRIPT VAR+instance AdmitChildMAP VAR+instance AdmitChildQ VAR+instance AdmitChildSUB VAR+instance AdmitChildSUP VAR+instance AdmitChildSPAN VAR+instance AdmitChildBDO VAR+instance AdmitChildIFRAME VAR+instance AdmitChildINPUT VAR+instance AdmitChildSELECT VAR+instance AdmitChildTEXTAREA VAR+instance AdmitChildLABEL VAR+instance AdmitChildBUTTON VAR++instance AdmitChildCDATA CITE+instance AdmitChildTT CITE+instance AdmitChildI CITE+instance AdmitChildB CITE+instance AdmitChildU CITE+instance AdmitChildS CITE+instance AdmitChildSTRIKE CITE+instance AdmitChildBIG CITE+instance AdmitChildSMALL CITE+instance AdmitChildEM CITE+instance AdmitChildSTRONG CITE+instance AdmitChildDFN CITE+instance AdmitChildCODE CITE+instance AdmitChildSAMP CITE+instance AdmitChildKBD CITE+instance AdmitChildVAR CITE+instance AdmitChildCITE CITE+instance AdmitChildABBR CITE+instance AdmitChildACRONYM CITE+instance AdmitChildA CITE+instance AdmitChildIMG CITE+instance AdmitChildAPPLET CITE+instance AdmitChildOBJECT CITE+instance AdmitChildFONT CITE+instance AdmitChildBASEFONT CITE+instance AdmitChildBR CITE+instance AdmitChildSCRIPT CITE+instance AdmitChildMAP CITE+instance AdmitChildQ CITE+instance AdmitChildSUB CITE+instance AdmitChildSUP CITE+instance AdmitChildSPAN CITE+instance AdmitChildBDO CITE+instance AdmitChildIFRAME CITE+instance AdmitChildINPUT CITE+instance AdmitChildSELECT CITE+instance AdmitChildTEXTAREA CITE+instance AdmitChildLABEL CITE+instance AdmitChildBUTTON CITE++instance AdmitChildCDATA ABBR+instance AdmitChildTT ABBR+instance AdmitChildI ABBR+instance AdmitChildB ABBR+instance AdmitChildU ABBR+instance AdmitChildS ABBR+instance AdmitChildSTRIKE ABBR+instance AdmitChildBIG ABBR+instance AdmitChildSMALL ABBR+instance AdmitChildEM ABBR+instance AdmitChildSTRONG ABBR+instance AdmitChildDFN ABBR+instance AdmitChildCODE ABBR+instance AdmitChildSAMP ABBR+instance AdmitChildKBD ABBR+instance AdmitChildVAR ABBR+instance AdmitChildCITE ABBR+instance AdmitChildABBR ABBR+instance AdmitChildACRONYM ABBR+instance AdmitChildA ABBR+instance AdmitChildIMG ABBR+instance AdmitChildAPPLET ABBR+instance AdmitChildOBJECT ABBR+instance AdmitChildFONT ABBR+instance AdmitChildBASEFONT ABBR+instance AdmitChildBR ABBR+instance AdmitChildSCRIPT ABBR+instance AdmitChildMAP ABBR+instance AdmitChildQ ABBR+instance AdmitChildSUB ABBR+instance AdmitChildSUP ABBR+instance AdmitChildSPAN ABBR+instance AdmitChildBDO ABBR+instance AdmitChildIFRAME ABBR+instance AdmitChildINPUT ABBR+instance AdmitChildSELECT ABBR+instance AdmitChildTEXTAREA ABBR+instance AdmitChildLABEL ABBR+instance AdmitChildBUTTON ABBR++instance AdmitChildCDATA ACRONYM+instance AdmitChildTT ACRONYM+instance AdmitChildI ACRONYM+instance AdmitChildB ACRONYM+instance AdmitChildU ACRONYM+instance AdmitChildS ACRONYM+instance AdmitChildSTRIKE ACRONYM+instance AdmitChildBIG ACRONYM+instance AdmitChildSMALL ACRONYM+instance AdmitChildEM ACRONYM+instance AdmitChildSTRONG ACRONYM+instance AdmitChildDFN ACRONYM+instance AdmitChildCODE ACRONYM+instance AdmitChildSAMP ACRONYM+instance AdmitChildKBD ACRONYM+instance AdmitChildVAR ACRONYM+instance AdmitChildCITE ACRONYM+instance AdmitChildABBR ACRONYM+instance AdmitChildACRONYM ACRONYM+instance AdmitChildA ACRONYM+instance AdmitChildIMG ACRONYM+instance AdmitChildAPPLET ACRONYM+instance AdmitChildOBJECT ACRONYM+instance AdmitChildFONT ACRONYM+instance AdmitChildBASEFONT ACRONYM+instance AdmitChildBR ACRONYM+instance AdmitChildSCRIPT ACRONYM+instance AdmitChildMAP ACRONYM+instance AdmitChildQ ACRONYM+instance AdmitChildSUB ACRONYM+instance AdmitChildSUP ACRONYM+instance AdmitChildSPAN ACRONYM+instance AdmitChildBDO ACRONYM+instance AdmitChildIFRAME ACRONYM+instance AdmitChildINPUT ACRONYM+instance AdmitChildSELECT ACRONYM+instance AdmitChildTEXTAREA ACRONYM+instance AdmitChildLABEL ACRONYM+instance AdmitChildBUTTON ACRONYM+data ALIGN_bottom = ALIGN_bottom+data ALIGN_center = ALIGN_center+data ALIGN_char = ALIGN_char+data ALIGN_justify = ALIGN_justify+data ALIGN_left = ALIGN_left+data ALIGN_middle = ALIGN_middle+data ALIGN_right = ALIGN_right+data ALIGN_top = ALIGN_top+data CHECKED_checked = CHECKED_checked+data CLEAR_all = CLEAR_all+data CLEAR_left = CLEAR_left+data CLEAR_none = CLEAR_none+data CLEAR_right = CLEAR_right+data COMPACT_compact = COMPACT_compact+data DECLARE_declare = DECLARE_declare+data DEFER_defer = DEFER_defer+data DIR_ltr = DIR_ltr+data DIR_rtl = DIR_rtl+data DISABLED_disabled = DISABLED_disabled+data FRAME_above = FRAME_above+data FRAME_below = FRAME_below+data FRAME_border = FRAME_border+data FRAME_box = FRAME_box+data FRAME_hsides = FRAME_hsides+data FRAME_lhs = FRAME_lhs+data FRAME_rhs = FRAME_rhs+data FRAME_void = FRAME_void+data FRAME_vsides = FRAME_vsides+data ISMAP_ismap = ISMAP_ismap+data METHOD_GET = METHOD_GET+data METHOD_POST = METHOD_POST+data MULTIPLE_multiple = MULTIPLE_multiple+data NOHREF_nohref = NOHREF_nohref+data NORESIZE_noresize = NORESIZE_noresize+data NOSHADE_noshade = NOSHADE_noshade+data NOWRAP_nowrap = NOWRAP_nowrap+data READONLY_readonly = READONLY_readonly+data RULES_all = RULES_all+data RULES_cols = RULES_cols+data RULES_groups = RULES_groups+data RULES_none = RULES_none+data RULES_rows = RULES_rows+data SCOPE_col = SCOPE_col+data SCOPE_colgroup = SCOPE_colgroup+data SCOPE_row = SCOPE_row+data SCOPE_rowgroup = SCOPE_rowgroup+data SCROLLING_auto = SCROLLING_auto+data SCROLLING_no = SCROLLING_no+data SCROLLING_yes = SCROLLING_yes+data SELECTED_selected = SELECTED_selected+data SHAPE_circle = SHAPE_circle+data SHAPE_default' = SHAPE_default'+data SHAPE_poly = SHAPE_poly+data SHAPE_rect = SHAPE_rect+data TYPE_BUTTON = TYPE_BUTTON+data TYPE_CHECKBOX = TYPE_CHECKBOX+data TYPE_FILE = TYPE_FILE+data TYPE_HIDDEN = TYPE_HIDDEN+data TYPE_IMAGE = TYPE_IMAGE+data TYPE_PASSWORD = TYPE_PASSWORD+data TYPE_RADIO = TYPE_RADIO+data TYPE_RESET = TYPE_RESET+data TYPE_SUBMIT = TYPE_SUBMIT+data TYPE_TEXT = TYPE_TEXT+data TYPE_button = TYPE_button+data TYPE_circle = TYPE_circle+data TYPE_disc = TYPE_disc+data TYPE_reset = TYPE_reset+data TYPE_square = TYPE_square+data TYPE_submit = TYPE_submit+data VALIGN_baseline = VALIGN_baseline+data VALIGN_bottom = VALIGN_bottom+data VALIGN_middle = VALIGN_middle+data VALIGN_top = VALIGN_top+data VALUETYPE_DATA = VALUETYPE_DATA+data VALUETYPE_OBJECT = VALUETYPE_OBJECT+data VALUETYPE_REF = VALUETYPE_REF+instance AttrValueABBR Char+instance AttrValueABBR a => AttrValueABBR [a]+instance AttrValueACCEPT Char+instance AttrValueACCEPT a => AttrValueACCEPT [a]+instance AttrValueACCEPT_CHARSET Char+instance AttrValueACCEPT_CHARSET a => AttrValueACCEPT_CHARSET [a]+instance AttrValueACCESSKEY Char+instance AttrValueACCESSKEY a => AttrValueACCESSKEY [a]+instance AttrValueACTION Char+instance AttrValueACTION a => AttrValueACTION [a]+instance AttrValueALIGN ALIGN_bottom+instance AttrValueALIGN ALIGN_center+instance AttrValueALIGN ALIGN_char+instance AttrValueALIGN ALIGN_justify+instance AttrValueALIGN ALIGN_left+instance AttrValueALIGN ALIGN_middle+instance AttrValueALIGN ALIGN_right+instance AttrValueALIGN ALIGN_top+instance AttrValueALINK Char+instance AttrValueALINK a => AttrValueALINK [a]+instance AttrValueALT Char+instance AttrValueALT a => AttrValueALT [a]+instance AttrValueARCHIVE Char+instance AttrValueARCHIVE a => AttrValueARCHIVE [a]+instance AttrValueAXIS Char+instance AttrValueAXIS a => AttrValueAXIS [a]+instance AttrValueBACKGROUND Char+instance AttrValueBACKGROUND a => AttrValueBACKGROUND [a]+instance AttrValueBGCOLOR Char+instance AttrValueBGCOLOR a => AttrValueBGCOLOR [a]+instance AttrValueBORDER Char+instance AttrValueBORDER a => AttrValueBORDER [a]+instance AttrValueCELLPADDING Char+instance AttrValueCELLPADDING a => AttrValueCELLPADDING [a]+instance AttrValueCELLSPACING Char+instance AttrValueCELLSPACING a => AttrValueCELLSPACING [a]+instance AttrValueCHAR Char+instance AttrValueCHAR a => AttrValueCHAR [a]+instance AttrValueCHAROFF Char+instance AttrValueCHAROFF a => AttrValueCHAROFF [a]+instance AttrValueCHARSET Char+instance AttrValueCHARSET a => AttrValueCHARSET [a]+instance AttrValueCHECKED CHECKED_checked+instance AttrValueCITE Char+instance AttrValueCITE a => AttrValueCITE [a]+instance AttrValueCLASS Char+instance AttrValueCLASS a => AttrValueCLASS [a]+instance AttrValueCLASSID Char+instance AttrValueCLASSID a => AttrValueCLASSID [a]+instance AttrValueCLEAR CLEAR_all+instance AttrValueCLEAR CLEAR_left+instance AttrValueCLEAR CLEAR_none+instance AttrValueCLEAR CLEAR_right+instance AttrValueCODE Char+instance AttrValueCODE a => AttrValueCODE [a]+instance AttrValueCODEBASE Char+instance AttrValueCODEBASE a => AttrValueCODEBASE [a]+instance AttrValueCODETYPE Char+instance AttrValueCODETYPE a => AttrValueCODETYPE [a]+instance AttrValueCOLOR Char+instance AttrValueCOLOR a => AttrValueCOLOR [a]+instance AttrValueCOLS Char+instance AttrValueCOLS Int+instance AttrValueCOLS a => AttrValueCOLS [a]+instance AttrValueCOLSPAN Int+instance AttrValueCOMPACT COMPACT_compact+instance AttrValueCONTENT Char+instance AttrValueCONTENT a => AttrValueCONTENT [a]+instance AttrValueCOORDS Char+instance AttrValueCOORDS a => AttrValueCOORDS [a]+instance AttrValueDATA Char+instance AttrValueDATA a => AttrValueDATA [a]+instance AttrValueDATAPAGESIZE Char+instance AttrValueDATAPAGESIZE a => AttrValueDATAPAGESIZE [a]+instance AttrValueDATETIME Char+instance AttrValueDATETIME a => AttrValueDATETIME [a]+instance AttrValueDECLARE DECLARE_declare+instance AttrValueDEFER DEFER_defer+instance AttrValueDIR DIR_ltr+instance AttrValueDIR DIR_rtl+instance AttrValueDISABLED DISABLED_disabled+instance AttrValueENCTYPE Char+instance AttrValueENCTYPE a => AttrValueENCTYPE [a]+instance AttrValueEVENT Char+instance AttrValueEVENT a => AttrValueEVENT [a]+instance AttrValueFACE Char+instance AttrValueFACE a => AttrValueFACE [a]+instance AttrValueFOR Char+instance AttrValueFOR a => AttrValueFOR [a]+instance AttrValueFRAME FRAME_above+instance AttrValueFRAME FRAME_below+instance AttrValueFRAME FRAME_border+instance AttrValueFRAME FRAME_box+instance AttrValueFRAME FRAME_hsides+instance AttrValueFRAME FRAME_lhs+instance AttrValueFRAME FRAME_rhs+instance AttrValueFRAME FRAME_void+instance AttrValueFRAME FRAME_vsides+instance AttrValueFRAMEBORDER Int+instance AttrValueHEADERS Char+instance AttrValueHEADERS a => AttrValueHEADERS [a]+instance AttrValueHEIGHT Char+instance AttrValueHEIGHT a => AttrValueHEIGHT [a]+instance AttrValueHREF Char+instance AttrValueHREF a => AttrValueHREF [a]+instance AttrValueHREFLANG Char+instance AttrValueHREFLANG a => AttrValueHREFLANG [a]+instance AttrValueHSPACE Char+instance AttrValueHSPACE a => AttrValueHSPACE [a]+instance AttrValueHTTP_EQUIV Char+instance AttrValueHTTP_EQUIV a => AttrValueHTTP_EQUIV [a]+instance AttrValueID Char+instance AttrValueID a => AttrValueID [a]+instance AttrValueISMAP ISMAP_ismap+instance AttrValueLABEL Char+instance AttrValueLABEL a => AttrValueLABEL [a]+instance AttrValueLANG Char+instance AttrValueLANG a => AttrValueLANG [a]+instance AttrValueLANGUAGE Char+instance AttrValueLANGUAGE a => AttrValueLANGUAGE [a]+instance AttrValueLINK Char+instance AttrValueLINK a => AttrValueLINK [a]+instance AttrValueLONGDESC Char+instance AttrValueLONGDESC a => AttrValueLONGDESC [a]+instance AttrValueMARGINHEIGHT Char+instance AttrValueMARGINHEIGHT a => AttrValueMARGINHEIGHT [a]+instance AttrValueMARGINWIDTH Char+instance AttrValueMARGINWIDTH a => AttrValueMARGINWIDTH [a]+instance AttrValueMAXLENGTH Int+instance AttrValueMEDIA Char+instance AttrValueMEDIA a => AttrValueMEDIA [a]+instance AttrValueMETHOD METHOD_GET+instance AttrValueMETHOD METHOD_POST+instance AttrValueMULTIPLE MULTIPLE_multiple+instance AttrValueNAME Char+instance AttrValueNAME a => AttrValueNAME [a]+instance AttrValueNOHREF NOHREF_nohref+instance AttrValueNORESIZE NORESIZE_noresize+instance AttrValueNOSHADE NOSHADE_noshade+instance AttrValueNOWRAP NOWRAP_nowrap+instance AttrValueOBJECT Char+instance AttrValueOBJECT a => AttrValueOBJECT [a]+instance AttrValueONBLUR Char+instance AttrValueONBLUR a => AttrValueONBLUR [a]+instance AttrValueONCHANGE Char+instance AttrValueONCHANGE a => AttrValueONCHANGE [a]+instance AttrValueONCLICK Char+instance AttrValueONCLICK a => AttrValueONCLICK [a]+instance AttrValueONDBLCLICK Char+instance AttrValueONDBLCLICK a => AttrValueONDBLCLICK [a]+instance AttrValueONFOCUS Char+instance AttrValueONFOCUS a => AttrValueONFOCUS [a]+instance AttrValueONKEYDOWN Char+instance AttrValueONKEYDOWN a => AttrValueONKEYDOWN [a]+instance AttrValueONKEYPRESS Char+instance AttrValueONKEYPRESS a => AttrValueONKEYPRESS [a]+instance AttrValueONKEYUP Char+instance AttrValueONKEYUP a => AttrValueONKEYUP [a]+instance AttrValueONLOAD Char+instance AttrValueONLOAD a => AttrValueONLOAD [a]+instance AttrValueONMOUSEDOWN Char+instance AttrValueONMOUSEDOWN a => AttrValueONMOUSEDOWN [a]+instance AttrValueONMOUSEMOVE Char+instance AttrValueONMOUSEMOVE a => AttrValueONMOUSEMOVE [a]+instance AttrValueONMOUSEOUT Char+instance AttrValueONMOUSEOUT a => AttrValueONMOUSEOUT [a]+instance AttrValueONMOUSEOVER Char+instance AttrValueONMOUSEOVER a => AttrValueONMOUSEOVER [a]+instance AttrValueONMOUSEUP Char+instance AttrValueONMOUSEUP a => AttrValueONMOUSEUP [a]+instance AttrValueONRESET Char+instance AttrValueONRESET a => AttrValueONRESET [a]+instance AttrValueONSELECT Char+instance AttrValueONSELECT a => AttrValueONSELECT [a]+instance AttrValueONSUBMIT Char+instance AttrValueONSUBMIT a => AttrValueONSUBMIT [a]+instance AttrValueONUNLOAD Char+instance AttrValueONUNLOAD a => AttrValueONUNLOAD [a]+instance AttrValuePROFILE Char+instance AttrValuePROFILE a => AttrValuePROFILE [a]+instance AttrValuePROMPT Char+instance AttrValuePROMPT a => AttrValuePROMPT [a]+instance AttrValueREADONLY READONLY_readonly+instance AttrValueREL Char+instance AttrValueREL a => AttrValueREL [a]+instance AttrValueREV Char+instance AttrValueREV a => AttrValueREV [a]+instance AttrValueROWS Char+instance AttrValueROWS Int+instance AttrValueROWS a => AttrValueROWS [a]+instance AttrValueROWSPAN Int+instance AttrValueRULES RULES_all+instance AttrValueRULES RULES_cols+instance AttrValueRULES RULES_groups+instance AttrValueRULES RULES_none+instance AttrValueRULES RULES_rows+instance AttrValueSCHEME Char+instance AttrValueSCHEME a => AttrValueSCHEME [a]+instance AttrValueSCOPE SCOPE_col+instance AttrValueSCOPE SCOPE_colgroup+instance AttrValueSCOPE SCOPE_row+instance AttrValueSCOPE SCOPE_rowgroup+instance AttrValueSCROLLING SCROLLING_auto+instance AttrValueSCROLLING SCROLLING_no+instance AttrValueSCROLLING SCROLLING_yes+instance AttrValueSELECTED SELECTED_selected+instance AttrValueSHAPE SHAPE_circle+instance AttrValueSHAPE SHAPE_default'+instance AttrValueSHAPE SHAPE_poly+instance AttrValueSHAPE SHAPE_rect+instance AttrValueSIZE Char+instance AttrValueSIZE Int+instance AttrValueSIZE a => AttrValueSIZE [a]+instance AttrValueSPAN Int+instance AttrValueSRC Char+instance AttrValueSRC a => AttrValueSRC [a]+instance AttrValueSTANDBY Char+instance AttrValueSTANDBY a => AttrValueSTANDBY [a]+instance AttrValueSTART Int+instance AttrValueSTYLE Char+instance AttrValueSTYLE a => AttrValueSTYLE [a]+instance AttrValueSUMMARY Char+instance AttrValueSUMMARY a => AttrValueSUMMARY [a]+instance AttrValueTABINDEX Int+instance AttrValueTARGET Char+instance AttrValueTARGET a => AttrValueTARGET [a]+instance AttrValueTEXT Char+instance AttrValueTEXT a => AttrValueTEXT [a]+instance AttrValueTITLE Char+instance AttrValueTITLE a => AttrValueTITLE [a]+instance AttrValueTYPE Char+instance AttrValueTYPE TYPE_BUTTON+instance AttrValueTYPE TYPE_CHECKBOX+instance AttrValueTYPE TYPE_FILE+instance AttrValueTYPE TYPE_HIDDEN+instance AttrValueTYPE TYPE_IMAGE+instance AttrValueTYPE TYPE_PASSWORD+instance AttrValueTYPE TYPE_RADIO+instance AttrValueTYPE TYPE_RESET+instance AttrValueTYPE TYPE_SUBMIT+instance AttrValueTYPE TYPE_TEXT+instance AttrValueTYPE TYPE_button+instance AttrValueTYPE TYPE_circle+instance AttrValueTYPE TYPE_disc+instance AttrValueTYPE TYPE_reset+instance AttrValueTYPE TYPE_square+instance AttrValueTYPE TYPE_submit+instance AttrValueTYPE a => AttrValueTYPE [a]+instance AttrValueUSEMAP Char+instance AttrValueUSEMAP a => AttrValueUSEMAP [a]+instance AttrValueVALIGN VALIGN_baseline+instance AttrValueVALIGN VALIGN_bottom+instance AttrValueVALIGN VALIGN_middle+instance AttrValueVALIGN VALIGN_top+instance AttrValueVALUE Char+instance AttrValueVALUE Int+instance AttrValueVALUE a => AttrValueVALUE [a]+instance AttrValueVALUETYPE VALUETYPE_DATA+instance AttrValueVALUETYPE VALUETYPE_OBJECT+instance AttrValueVALUETYPE VALUETYPE_REF+instance AttrValueVERSION Char+instance AttrValueVERSION a => AttrValueVERSION [a]+instance AttrValueVLINK Char+instance AttrValueVLINK a => AttrValueVLINK [a]+instance AttrValueVSPACE Char+instance AttrValueVSPACE a => AttrValueVSPACE [a]+instance AttrValueWIDTH Char+instance AttrValueWIDTH Int+instance AttrValueWIDTH a => AttrValueWIDTH [a]+instance Show ALIGN_bottom where show ALIGN_bottom = "bottom"+instance Show ALIGN_center where show ALIGN_center = "center"+instance Show ALIGN_char where show ALIGN_char = "char"+instance Show ALIGN_justify where show ALIGN_justify = "justify"+instance Show ALIGN_left where show ALIGN_left = "left"+instance Show ALIGN_middle where show ALIGN_middle = "middle"+instance Show ALIGN_right where show ALIGN_right = "right"+instance Show ALIGN_top where show ALIGN_top = "top"+instance Show CHECKED_checked where show CHECKED_checked = "checked"+instance Show CLEAR_all where show CLEAR_all = "all"+instance Show CLEAR_left where show CLEAR_left = "left"+instance Show CLEAR_none where show CLEAR_none = "none"+instance Show CLEAR_right where show CLEAR_right = "right"+instance Show COMPACT_compact where show COMPACT_compact = "compact"+instance Show DECLARE_declare where show DECLARE_declare = "declare"+instance Show DEFER_defer where show DEFER_defer = "defer"+instance Show DIR_ltr where show DIR_ltr = "ltr"+instance Show DIR_rtl where show DIR_rtl = "rtl"+instance Show DISABLED_disabled where show DISABLED_disabled = "disabled"+instance Show FRAME_above where show FRAME_above = "above"+instance Show FRAME_below where show FRAME_below = "below"+instance Show FRAME_border where show FRAME_border = "border"+instance Show FRAME_box where show FRAME_box = "box"+instance Show FRAME_hsides where show FRAME_hsides = "hsides"+instance Show FRAME_lhs where show FRAME_lhs = "lhs"+instance Show FRAME_rhs where show FRAME_rhs = "rhs"+instance Show FRAME_void where show FRAME_void = "void"+instance Show FRAME_vsides where show FRAME_vsides = "vsides"+instance Show ISMAP_ismap where show ISMAP_ismap = "ismap"+instance Show METHOD_GET where show METHOD_GET = "GET"+instance Show METHOD_POST where show METHOD_POST = "POST"+instance Show MULTIPLE_multiple where show MULTIPLE_multiple = "multiple"+instance Show NOHREF_nohref where show NOHREF_nohref = "nohref"+instance Show NORESIZE_noresize where show NORESIZE_noresize = "noresize"+instance Show NOSHADE_noshade where show NOSHADE_noshade = "noshade"+instance Show NOWRAP_nowrap where show NOWRAP_nowrap = "nowrap"+instance Show READONLY_readonly where show READONLY_readonly = "readonly"+instance Show RULES_all where show RULES_all = "all"+instance Show RULES_cols where show RULES_cols = "cols"+instance Show RULES_groups where show RULES_groups = "groups"+instance Show RULES_none where show RULES_none = "none"+instance Show RULES_rows where show RULES_rows = "rows"+instance Show SCOPE_col where show SCOPE_col = "col"+instance Show SCOPE_colgroup where show SCOPE_colgroup = "colgroup"+instance Show SCOPE_row where show SCOPE_row = "row"+instance Show SCOPE_rowgroup where show SCOPE_rowgroup = "rowgroup"+instance Show SCROLLING_auto where show SCROLLING_auto = "auto"+instance Show SCROLLING_no where show SCROLLING_no = "no"+instance Show SCROLLING_yes where show SCROLLING_yes = "yes"+instance Show SELECTED_selected where show SELECTED_selected = "selected"+instance Show SHAPE_circle where show SHAPE_circle = "circle"+instance Show SHAPE_default' where show SHAPE_default' = "default"+instance Show SHAPE_poly where show SHAPE_poly = "poly"+instance Show SHAPE_rect where show SHAPE_rect = "rect"+instance Show TYPE_BUTTON where show TYPE_BUTTON = "BUTTON"+instance Show TYPE_CHECKBOX where show TYPE_CHECKBOX = "CHECKBOX"+instance Show TYPE_FILE where show TYPE_FILE = "FILE"+instance Show TYPE_HIDDEN where show TYPE_HIDDEN = "HIDDEN"+instance Show TYPE_IMAGE where show TYPE_IMAGE = "IMAGE"+instance Show TYPE_PASSWORD where show TYPE_PASSWORD = "PASSWORD"+instance Show TYPE_RADIO where show TYPE_RADIO = "RADIO"+instance Show TYPE_RESET where show TYPE_RESET = "RESET"+instance Show TYPE_SUBMIT where show TYPE_SUBMIT = "SUBMIT"+instance Show TYPE_TEXT where show TYPE_TEXT = "TEXT"+instance Show TYPE_button where show TYPE_button = "button"+instance Show TYPE_circle where show TYPE_circle = "circle"+instance Show TYPE_disc where show TYPE_disc = "disc"+instance Show TYPE_reset where show TYPE_reset = "reset"+instance Show TYPE_square where show TYPE_square = "square"+instance Show TYPE_submit where show TYPE_submit = "submit"+instance Show VALIGN_baseline where show VALIGN_baseline = "baseline"+instance Show VALIGN_bottom where show VALIGN_bottom = "bottom"+instance Show VALIGN_middle where show VALIGN_middle = "middle"+instance Show VALIGN_top where show VALIGN_top = "top"+instance Show VALUETYPE_DATA where show VALUETYPE_DATA = "DATA"+instance Show VALUETYPE_OBJECT where show VALUETYPE_OBJECT = "OBJECT"+instance Show VALUETYPE_REF where show VALUETYPE_REF = "REF"+instance AdmitAttrABBR TD+instance AdmitAttrABBR TH+instance AdmitAttrACCEPT INPUT+instance AdmitAttrACCEPT_CHARSET FORM+instance AdmitAttrACCESSKEY A+instance AdmitAttrACCESSKEY AREA+instance AdmitAttrACCESSKEY BUTTON+instance AdmitAttrACCESSKEY INPUT+instance AdmitAttrACCESSKEY LABEL+instance AdmitAttrACCESSKEY LEGEND+instance AdmitAttrACCESSKEY TEXTAREA+instance AdmitAttrACTION FORM+instance AdmitAttrALIGN APPLET+instance AdmitAttrALIGN CAPTION+instance AdmitAttrALIGN COL+instance AdmitAttrALIGN COLGROUP+instance AdmitAttrALIGN DIV+instance AdmitAttrALIGN H1+instance AdmitAttrALIGN H2+instance AdmitAttrALIGN H3+instance AdmitAttrALIGN H4+instance AdmitAttrALIGN H5+instance AdmitAttrALIGN H6+instance AdmitAttrALIGN HR+instance AdmitAttrALIGN IFRAME+instance AdmitAttrALIGN IMG+instance AdmitAttrALIGN INPUT+instance AdmitAttrALIGN LEGEND+instance AdmitAttrALIGN OBJECT+instance AdmitAttrALIGN P+instance AdmitAttrALIGN TABLE+instance AdmitAttrALIGN TBODY+instance AdmitAttrALIGN TD+instance AdmitAttrALIGN TFOOT+instance AdmitAttrALIGN TH+instance AdmitAttrALIGN THEAD+instance AdmitAttrALIGN TR+instance AdmitAttrALINK BODY+instance AdmitAttrALT APPLET+instance AdmitAttrALT AREA+instance AdmitAttrALT IMG+instance AdmitAttrALT INPUT+instance AdmitAttrARCHIVE APPLET+instance AdmitAttrARCHIVE OBJECT+instance AdmitAttrAXIS TD+instance AdmitAttrAXIS TH+instance AdmitAttrBACKGROUND BODY+instance AdmitAttrBGCOLOR BODY+instance AdmitAttrBGCOLOR TABLE+instance AdmitAttrBGCOLOR TD+instance AdmitAttrBGCOLOR TH+instance AdmitAttrBGCOLOR TR+instance AdmitAttrBORDER IMG+instance AdmitAttrBORDER OBJECT+instance AdmitAttrBORDER TABLE+instance AdmitAttrCELLPADDING TABLE+instance AdmitAttrCELLSPACING TABLE+instance AdmitAttrCHAR COL+instance AdmitAttrCHAR COLGROUP+instance AdmitAttrCHAR TBODY+instance AdmitAttrCHAR TD+instance AdmitAttrCHAR TFOOT+instance AdmitAttrCHAR TH+instance AdmitAttrCHAR THEAD+instance AdmitAttrCHAR TR+instance AdmitAttrCHAROFF COL+instance AdmitAttrCHAROFF COLGROUP+instance AdmitAttrCHAROFF TBODY+instance AdmitAttrCHAROFF TD+instance AdmitAttrCHAROFF TFOOT+instance AdmitAttrCHAROFF TH+instance AdmitAttrCHAROFF THEAD+instance AdmitAttrCHAROFF TR+instance AdmitAttrCHARSET A+instance AdmitAttrCHARSET LINK+instance AdmitAttrCHARSET SCRIPT+instance AdmitAttrCHECKED INPUT+instance AdmitAttrCITE BLOCKQUOTE+instance AdmitAttrCITE DEL+instance AdmitAttrCITE INS+instance AdmitAttrCITE Q+instance AdmitAttrCLASS A+instance AdmitAttrCLASS ABBR+instance AdmitAttrCLASS ACRONYM+instance AdmitAttrCLASS ADDRESS+instance AdmitAttrCLASS APPLET+instance AdmitAttrCLASS AREA+instance AdmitAttrCLASS B+instance AdmitAttrCLASS BDO+instance AdmitAttrCLASS BIG+instance AdmitAttrCLASS BLOCKQUOTE+instance AdmitAttrCLASS BODY+instance AdmitAttrCLASS BR+instance AdmitAttrCLASS BUTTON+instance AdmitAttrCLASS CAPTION+instance AdmitAttrCLASS CENTER+instance AdmitAttrCLASS CITE+instance AdmitAttrCLASS CODE+instance AdmitAttrCLASS COL+instance AdmitAttrCLASS COLGROUP+instance AdmitAttrCLASS DD+instance AdmitAttrCLASS DEL+instance AdmitAttrCLASS DFN+instance AdmitAttrCLASS DIR+instance AdmitAttrCLASS DIV+instance AdmitAttrCLASS DL+instance AdmitAttrCLASS DT+instance AdmitAttrCLASS EM+instance AdmitAttrCLASS FIELDSET+instance AdmitAttrCLASS FONT+instance AdmitAttrCLASS FORM+instance AdmitAttrCLASS FRAME+instance AdmitAttrCLASS FRAMESET+instance AdmitAttrCLASS H1+instance AdmitAttrCLASS H2+instance AdmitAttrCLASS H3+instance AdmitAttrCLASS H4+instance AdmitAttrCLASS H5+instance AdmitAttrCLASS H6+instance AdmitAttrCLASS HR+instance AdmitAttrCLASS I+instance AdmitAttrCLASS IFRAME+instance AdmitAttrCLASS IMG+instance AdmitAttrCLASS INPUT+instance AdmitAttrCLASS INS+instance AdmitAttrCLASS ISINDEX+instance AdmitAttrCLASS KBD+instance AdmitAttrCLASS LABEL+instance AdmitAttrCLASS LEGEND+instance AdmitAttrCLASS LI+instance AdmitAttrCLASS LINK+instance AdmitAttrCLASS MAP+instance AdmitAttrCLASS MENU+instance AdmitAttrCLASS NOFRAMES+instance AdmitAttrCLASS NOSCRIPT+instance AdmitAttrCLASS OBJECT+instance AdmitAttrCLASS OL+instance AdmitAttrCLASS OPTGROUP+instance AdmitAttrCLASS OPTION+instance AdmitAttrCLASS P+instance AdmitAttrCLASS PRE+instance AdmitAttrCLASS Q+instance AdmitAttrCLASS S+instance AdmitAttrCLASS SAMP+instance AdmitAttrCLASS SELECT+instance AdmitAttrCLASS SMALL+instance AdmitAttrCLASS SPAN+instance AdmitAttrCLASS STRIKE+instance AdmitAttrCLASS STRONG+instance AdmitAttrCLASS SUB+instance AdmitAttrCLASS SUP+instance AdmitAttrCLASS TABLE+instance AdmitAttrCLASS TBODY+instance AdmitAttrCLASS TD+instance AdmitAttrCLASS TEXTAREA+instance AdmitAttrCLASS TFOOT+instance AdmitAttrCLASS TH+instance AdmitAttrCLASS THEAD+instance AdmitAttrCLASS TR+instance AdmitAttrCLASS TT+instance AdmitAttrCLASS U+instance AdmitAttrCLASS UL+instance AdmitAttrCLASS VAR+instance AdmitAttrCLASSID OBJECT+instance AdmitAttrCLEAR BR+instance AdmitAttrCODE APPLET+instance AdmitAttrCODEBASE APPLET+instance AdmitAttrCODEBASE OBJECT+instance AdmitAttrCODETYPE OBJECT+instance AdmitAttrCOLOR BASEFONT+instance AdmitAttrCOLOR FONT+instance AdmitAttrCOLS FRAMESET+instance AdmitAttrCOLS TEXTAREA+instance AdmitAttrCOLSPAN TD+instance AdmitAttrCOLSPAN TH+instance AdmitAttrCOMPACT DIR+instance AdmitAttrCOMPACT DL+instance AdmitAttrCOMPACT MENU+instance AdmitAttrCOMPACT OL+instance AdmitAttrCOMPACT UL+instance AdmitAttrCONTENT META+instance AdmitAttrCOORDS A+instance AdmitAttrCOORDS AREA+instance AdmitAttrDATA OBJECT+instance AdmitAttrDATAPAGESIZE TABLE+instance AdmitAttrDATETIME DEL+instance AdmitAttrDATETIME INS+instance AdmitAttrDECLARE OBJECT+instance AdmitAttrDEFER SCRIPT+instance AdmitAttrDIR A+instance AdmitAttrDIR ABBR+instance AdmitAttrDIR ACRONYM+instance AdmitAttrDIR ADDRESS+instance AdmitAttrDIR AREA+instance AdmitAttrDIR B+instance AdmitAttrDIR BDO+instance AdmitAttrDIR BIG+instance AdmitAttrDIR BLOCKQUOTE+instance AdmitAttrDIR BODY+instance AdmitAttrDIR BUTTON+instance AdmitAttrDIR CAPTION+instance AdmitAttrDIR CENTER+instance AdmitAttrDIR CITE+instance AdmitAttrDIR CODE+instance AdmitAttrDIR COL+instance AdmitAttrDIR COLGROUP+instance AdmitAttrDIR DD+instance AdmitAttrDIR DEL+instance AdmitAttrDIR DFN+instance AdmitAttrDIR DIR+instance AdmitAttrDIR DIV+instance AdmitAttrDIR DL+instance AdmitAttrDIR DT+instance AdmitAttrDIR EM+instance AdmitAttrDIR FIELDSET+instance AdmitAttrDIR FONT+instance AdmitAttrDIR FORM+instance AdmitAttrDIR H1+instance AdmitAttrDIR H2+instance AdmitAttrDIR H3+instance AdmitAttrDIR H4+instance AdmitAttrDIR H5+instance AdmitAttrDIR H6+instance AdmitAttrDIR HEAD+instance AdmitAttrDIR HR+instance AdmitAttrDIR HTML+instance AdmitAttrDIR I+instance AdmitAttrDIR IMG+instance AdmitAttrDIR INPUT+instance AdmitAttrDIR INS+instance AdmitAttrDIR ISINDEX+instance AdmitAttrDIR KBD+instance AdmitAttrDIR LABEL+instance AdmitAttrDIR LEGEND+instance AdmitAttrDIR LI+instance AdmitAttrDIR LINK+instance AdmitAttrDIR MAP+instance AdmitAttrDIR MENU+instance AdmitAttrDIR META+instance AdmitAttrDIR NOFRAMES+instance AdmitAttrDIR NOSCRIPT+instance AdmitAttrDIR OBJECT+instance AdmitAttrDIR OL+instance AdmitAttrDIR OPTGROUP+instance AdmitAttrDIR OPTION+instance AdmitAttrDIR P+instance AdmitAttrDIR PRE+instance AdmitAttrDIR Q+instance AdmitAttrDIR S+instance AdmitAttrDIR SAMP+instance AdmitAttrDIR SELECT+instance AdmitAttrDIR SMALL+instance AdmitAttrDIR SPAN+instance AdmitAttrDIR STRIKE+instance AdmitAttrDIR STRONG+instance AdmitAttrDIR STYLE+instance AdmitAttrDIR SUB+instance AdmitAttrDIR SUP+instance AdmitAttrDIR TABLE+instance AdmitAttrDIR TBODY+instance AdmitAttrDIR TD+instance AdmitAttrDIR TEXTAREA+instance AdmitAttrDIR TFOOT+instance AdmitAttrDIR TH+instance AdmitAttrDIR THEAD+instance AdmitAttrDIR TITLE+instance AdmitAttrDIR TR+instance AdmitAttrDIR TT+instance AdmitAttrDIR U+instance AdmitAttrDIR UL+instance AdmitAttrDIR VAR+instance AdmitAttrDISABLED BUTTON+instance AdmitAttrDISABLED INPUT+instance AdmitAttrDISABLED OPTGROUP+instance AdmitAttrDISABLED OPTION+instance AdmitAttrDISABLED SELECT+instance AdmitAttrDISABLED TEXTAREA+instance AdmitAttrENCTYPE FORM+instance AdmitAttrEVENT SCRIPT+instance AdmitAttrFACE BASEFONT+instance AdmitAttrFACE FONT+instance AdmitAttrFOR LABEL+instance AdmitAttrFOR SCRIPT+instance AdmitAttrFRAME TABLE+instance AdmitAttrFRAMEBORDER FRAME+instance AdmitAttrFRAMEBORDER IFRAME+instance AdmitAttrHEADERS TD+instance AdmitAttrHEADERS TH+instance AdmitAttrHEIGHT APPLET+instance AdmitAttrHEIGHT IFRAME+instance AdmitAttrHEIGHT IMG+instance AdmitAttrHEIGHT OBJECT+instance AdmitAttrHEIGHT TD+instance AdmitAttrHEIGHT TH+instance AdmitAttrHREF A+instance AdmitAttrHREF AREA+instance AdmitAttrHREF BASE+instance AdmitAttrHREF LINK+instance AdmitAttrHREFLANG A+instance AdmitAttrHREFLANG LINK+instance AdmitAttrHSPACE APPLET+instance AdmitAttrHSPACE IMG+instance AdmitAttrHSPACE OBJECT+instance AdmitAttrHTTP_EQUIV META+instance AdmitAttrID A+instance AdmitAttrID ABBR+instance AdmitAttrID ACRONYM+instance AdmitAttrID ADDRESS+instance AdmitAttrID APPLET+instance AdmitAttrID AREA+instance AdmitAttrID B+instance AdmitAttrID BASEFONT+instance AdmitAttrID BDO+instance AdmitAttrID BIG+instance AdmitAttrID BLOCKQUOTE+instance AdmitAttrID BODY+instance AdmitAttrID BR+instance AdmitAttrID BUTTON+instance AdmitAttrID CAPTION+instance AdmitAttrID CENTER+instance AdmitAttrID CITE+instance AdmitAttrID CODE+instance AdmitAttrID COL+instance AdmitAttrID COLGROUP+instance AdmitAttrID DD+instance AdmitAttrID DEL+instance AdmitAttrID DFN+instance AdmitAttrID DIR+instance AdmitAttrID DIV+instance AdmitAttrID DL+instance AdmitAttrID DT+instance AdmitAttrID EM+instance AdmitAttrID FIELDSET+instance AdmitAttrID FONT+instance AdmitAttrID FORM+instance AdmitAttrID FRAME+instance AdmitAttrID FRAMESET+instance AdmitAttrID H1+instance AdmitAttrID H2+instance AdmitAttrID H3+instance AdmitAttrID H4+instance AdmitAttrID H5+instance AdmitAttrID H6+instance AdmitAttrID HR+instance AdmitAttrID I+instance AdmitAttrID IFRAME+instance AdmitAttrID IMG+instance AdmitAttrID INPUT+instance AdmitAttrID INS+instance AdmitAttrID ISINDEX+instance AdmitAttrID KBD+instance AdmitAttrID LABEL+instance AdmitAttrID LEGEND+instance AdmitAttrID LI+instance AdmitAttrID LINK+instance AdmitAttrID MAP+instance AdmitAttrID MENU+instance AdmitAttrID NOFRAMES+instance AdmitAttrID NOSCRIPT+instance AdmitAttrID OBJECT+instance AdmitAttrID OL+instance AdmitAttrID OPTGROUP+instance AdmitAttrID OPTION+instance AdmitAttrID P+instance AdmitAttrID PARAM+instance AdmitAttrID PRE+instance AdmitAttrID Q+instance AdmitAttrID S+instance AdmitAttrID SAMP+instance AdmitAttrID SELECT+instance AdmitAttrID SMALL+instance AdmitAttrID SPAN+instance AdmitAttrID STRIKE+instance AdmitAttrID STRONG+instance AdmitAttrID SUB+instance AdmitAttrID SUP+instance AdmitAttrID TABLE+instance AdmitAttrID TBODY+instance AdmitAttrID TD+instance AdmitAttrID TEXTAREA+instance AdmitAttrID TFOOT+instance AdmitAttrID TH+instance AdmitAttrID THEAD+instance AdmitAttrID TR+instance AdmitAttrID TT+instance AdmitAttrID U+instance AdmitAttrID UL+instance AdmitAttrID VAR+instance AdmitAttrISMAP IMG+instance AdmitAttrISMAP INPUT+instance AdmitAttrLABEL OPTGROUP+instance AdmitAttrLABEL OPTION+instance AdmitAttrLANG A+instance AdmitAttrLANG ABBR+instance AdmitAttrLANG ACRONYM+instance AdmitAttrLANG ADDRESS+instance AdmitAttrLANG AREA+instance AdmitAttrLANG B+instance AdmitAttrLANG BDO+instance AdmitAttrLANG BIG+instance AdmitAttrLANG BLOCKQUOTE+instance AdmitAttrLANG BODY+instance AdmitAttrLANG BUTTON+instance AdmitAttrLANG CAPTION+instance AdmitAttrLANG CENTER+instance AdmitAttrLANG CITE+instance AdmitAttrLANG CODE+instance AdmitAttrLANG COL+instance AdmitAttrLANG COLGROUP+instance AdmitAttrLANG DD+instance AdmitAttrLANG DEL+instance AdmitAttrLANG DFN+instance AdmitAttrLANG DIR+instance AdmitAttrLANG DIV+instance AdmitAttrLANG DL+instance AdmitAttrLANG DT+instance AdmitAttrLANG EM+instance AdmitAttrLANG FIELDSET+instance AdmitAttrLANG FONT+instance AdmitAttrLANG FORM+instance AdmitAttrLANG H1+instance AdmitAttrLANG H2+instance AdmitAttrLANG H3+instance AdmitAttrLANG H4+instance AdmitAttrLANG H5+instance AdmitAttrLANG H6+instance AdmitAttrLANG HEAD+instance AdmitAttrLANG HR+instance AdmitAttrLANG HTML+instance AdmitAttrLANG I+instance AdmitAttrLANG IMG+instance AdmitAttrLANG INPUT+instance AdmitAttrLANG INS+instance AdmitAttrLANG ISINDEX+instance AdmitAttrLANG KBD+instance AdmitAttrLANG LABEL+instance AdmitAttrLANG LEGEND+instance AdmitAttrLANG LI+instance AdmitAttrLANG LINK+instance AdmitAttrLANG MAP+instance AdmitAttrLANG MENU+instance AdmitAttrLANG META+instance AdmitAttrLANG NOFRAMES+instance AdmitAttrLANG NOSCRIPT+instance AdmitAttrLANG OBJECT+instance AdmitAttrLANG OL+instance AdmitAttrLANG OPTGROUP+instance AdmitAttrLANG OPTION+instance AdmitAttrLANG P+instance AdmitAttrLANG PRE+instance AdmitAttrLANG Q+instance AdmitAttrLANG S+instance AdmitAttrLANG SAMP+instance AdmitAttrLANG SELECT+instance AdmitAttrLANG SMALL+instance AdmitAttrLANG SPAN+instance AdmitAttrLANG STRIKE+instance AdmitAttrLANG STRONG+instance AdmitAttrLANG STYLE+instance AdmitAttrLANG SUB+instance AdmitAttrLANG SUP+instance AdmitAttrLANG TABLE+instance AdmitAttrLANG TBODY+instance AdmitAttrLANG TD+instance AdmitAttrLANG TEXTAREA+instance AdmitAttrLANG TFOOT+instance AdmitAttrLANG TH+instance AdmitAttrLANG THEAD+instance AdmitAttrLANG TITLE+instance AdmitAttrLANG TR+instance AdmitAttrLANG TT+instance AdmitAttrLANG U+instance AdmitAttrLANG UL+instance AdmitAttrLANG VAR+instance AdmitAttrLANGUAGE SCRIPT+instance AdmitAttrLINK BODY+instance AdmitAttrLONGDESC FRAME+instance AdmitAttrLONGDESC IFRAME+instance AdmitAttrLONGDESC IMG+instance AdmitAttrMARGINHEIGHT FRAME+instance AdmitAttrMARGINHEIGHT IFRAME+instance AdmitAttrMARGINWIDTH FRAME+instance AdmitAttrMARGINWIDTH IFRAME+instance AdmitAttrMAXLENGTH INPUT+instance AdmitAttrMEDIA LINK+instance AdmitAttrMEDIA STYLE+instance AdmitAttrMETHOD FORM+instance AdmitAttrMULTIPLE SELECT+instance AdmitAttrNAME A+instance AdmitAttrNAME APPLET+instance AdmitAttrNAME BUTTON+instance AdmitAttrNAME FORM+instance AdmitAttrNAME FRAME+instance AdmitAttrNAME IFRAME+instance AdmitAttrNAME IMG+instance AdmitAttrNAME INPUT+instance AdmitAttrNAME MAP+instance AdmitAttrNAME META+instance AdmitAttrNAME OBJECT+instance AdmitAttrNAME PARAM+instance AdmitAttrNAME SELECT+instance AdmitAttrNAME TEXTAREA+instance AdmitAttrNOHREF AREA+instance AdmitAttrNORESIZE FRAME+instance AdmitAttrNOSHADE HR+instance AdmitAttrNOWRAP TD+instance AdmitAttrNOWRAP TH+instance AdmitAttrOBJECT APPLET+instance AdmitAttrONBLUR A+instance AdmitAttrONBLUR AREA+instance AdmitAttrONBLUR BUTTON+instance AdmitAttrONBLUR INPUT+instance AdmitAttrONBLUR LABEL+instance AdmitAttrONBLUR SELECT+instance AdmitAttrONBLUR TEXTAREA+instance AdmitAttrONCHANGE INPUT+instance AdmitAttrONCHANGE SELECT+instance AdmitAttrONCHANGE TEXTAREA+instance AdmitAttrONCLICK A+instance AdmitAttrONCLICK ABBR+instance AdmitAttrONCLICK ACRONYM+instance AdmitAttrONCLICK ADDRESS+instance AdmitAttrONCLICK AREA+instance AdmitAttrONCLICK B+instance AdmitAttrONCLICK BIG+instance AdmitAttrONCLICK BLOCKQUOTE+instance AdmitAttrONCLICK BODY+instance AdmitAttrONCLICK BUTTON+instance AdmitAttrONCLICK CAPTION+instance AdmitAttrONCLICK CENTER+instance AdmitAttrONCLICK CITE+instance AdmitAttrONCLICK CODE+instance AdmitAttrONCLICK COL+instance AdmitAttrONCLICK COLGROUP+instance AdmitAttrONCLICK DD+instance AdmitAttrONCLICK DEL+instance AdmitAttrONCLICK DFN+instance AdmitAttrONCLICK DIR+instance AdmitAttrONCLICK DIV+instance AdmitAttrONCLICK DL+instance AdmitAttrONCLICK DT+instance AdmitAttrONCLICK EM+instance AdmitAttrONCLICK FIELDSET+instance AdmitAttrONCLICK FORM+instance AdmitAttrONCLICK H1+instance AdmitAttrONCLICK H2+instance AdmitAttrONCLICK H3+instance AdmitAttrONCLICK H4+instance AdmitAttrONCLICK H5+instance AdmitAttrONCLICK H6+instance AdmitAttrONCLICK HR+instance AdmitAttrONCLICK I+instance AdmitAttrONCLICK IMG+instance AdmitAttrONCLICK INPUT+instance AdmitAttrONCLICK INS+instance AdmitAttrONCLICK KBD+instance AdmitAttrONCLICK LABEL+instance AdmitAttrONCLICK LEGEND+instance AdmitAttrONCLICK LI+instance AdmitAttrONCLICK LINK+instance AdmitAttrONCLICK MAP+instance AdmitAttrONCLICK MENU+instance AdmitAttrONCLICK NOFRAMES+instance AdmitAttrONCLICK NOSCRIPT+instance AdmitAttrONCLICK OBJECT+instance AdmitAttrONCLICK OL+instance AdmitAttrONCLICK OPTGROUP+instance AdmitAttrONCLICK OPTION+instance AdmitAttrONCLICK P+instance AdmitAttrONCLICK PRE+instance AdmitAttrONCLICK Q+instance AdmitAttrONCLICK S+instance AdmitAttrONCLICK SAMP+instance AdmitAttrONCLICK SELECT+instance AdmitAttrONCLICK SMALL+instance AdmitAttrONCLICK SPAN+instance AdmitAttrONCLICK STRIKE+instance AdmitAttrONCLICK STRONG+instance AdmitAttrONCLICK SUB+instance AdmitAttrONCLICK SUP+instance AdmitAttrONCLICK TABLE+instance AdmitAttrONCLICK TBODY+instance AdmitAttrONCLICK TD+instance AdmitAttrONCLICK TEXTAREA+instance AdmitAttrONCLICK TFOOT+instance AdmitAttrONCLICK TH+instance AdmitAttrONCLICK THEAD+instance AdmitAttrONCLICK TR+instance AdmitAttrONCLICK TT+instance AdmitAttrONCLICK U+instance AdmitAttrONCLICK UL+instance AdmitAttrONCLICK VAR+instance AdmitAttrONDBLCLICK A+instance AdmitAttrONDBLCLICK ABBR+instance AdmitAttrONDBLCLICK ACRONYM+instance AdmitAttrONDBLCLICK ADDRESS+instance AdmitAttrONDBLCLICK AREA+instance AdmitAttrONDBLCLICK B+instance AdmitAttrONDBLCLICK BIG+instance AdmitAttrONDBLCLICK BLOCKQUOTE+instance AdmitAttrONDBLCLICK BODY+instance AdmitAttrONDBLCLICK BUTTON+instance AdmitAttrONDBLCLICK CAPTION+instance AdmitAttrONDBLCLICK CENTER+instance AdmitAttrONDBLCLICK CITE+instance AdmitAttrONDBLCLICK CODE+instance AdmitAttrONDBLCLICK COL+instance AdmitAttrONDBLCLICK COLGROUP+instance AdmitAttrONDBLCLICK DD+instance AdmitAttrONDBLCLICK DEL+instance AdmitAttrONDBLCLICK DFN+instance AdmitAttrONDBLCLICK DIR+instance AdmitAttrONDBLCLICK DIV+instance AdmitAttrONDBLCLICK DL+instance AdmitAttrONDBLCLICK DT+instance AdmitAttrONDBLCLICK EM+instance AdmitAttrONDBLCLICK FIELDSET+instance AdmitAttrONDBLCLICK FORM+instance AdmitAttrONDBLCLICK H1+instance AdmitAttrONDBLCLICK H2+instance AdmitAttrONDBLCLICK H3+instance AdmitAttrONDBLCLICK H4+instance AdmitAttrONDBLCLICK H5+instance AdmitAttrONDBLCLICK H6+instance AdmitAttrONDBLCLICK HR+instance AdmitAttrONDBLCLICK I+instance AdmitAttrONDBLCLICK IMG+instance AdmitAttrONDBLCLICK INPUT+instance AdmitAttrONDBLCLICK INS+instance AdmitAttrONDBLCLICK KBD+instance AdmitAttrONDBLCLICK LABEL+instance AdmitAttrONDBLCLICK LEGEND+instance AdmitAttrONDBLCLICK LI+instance AdmitAttrONDBLCLICK LINK+instance AdmitAttrONDBLCLICK MAP+instance AdmitAttrONDBLCLICK MENU+instance AdmitAttrONDBLCLICK NOFRAMES+instance AdmitAttrONDBLCLICK NOSCRIPT+instance AdmitAttrONDBLCLICK OBJECT+instance AdmitAttrONDBLCLICK OL+instance AdmitAttrONDBLCLICK OPTGROUP+instance AdmitAttrONDBLCLICK OPTION+instance AdmitAttrONDBLCLICK P+instance AdmitAttrONDBLCLICK PRE+instance AdmitAttrONDBLCLICK Q+instance AdmitAttrONDBLCLICK S+instance AdmitAttrONDBLCLICK SAMP+instance AdmitAttrONDBLCLICK SELECT+instance AdmitAttrONDBLCLICK SMALL+instance AdmitAttrONDBLCLICK SPAN+instance AdmitAttrONDBLCLICK STRIKE+instance AdmitAttrONDBLCLICK STRONG+instance AdmitAttrONDBLCLICK SUB+instance AdmitAttrONDBLCLICK SUP+instance AdmitAttrONDBLCLICK TABLE+instance AdmitAttrONDBLCLICK TBODY+instance AdmitAttrONDBLCLICK TD+instance AdmitAttrONDBLCLICK TEXTAREA+instance AdmitAttrONDBLCLICK TFOOT+instance AdmitAttrONDBLCLICK TH+instance AdmitAttrONDBLCLICK THEAD+instance AdmitAttrONDBLCLICK TR+instance AdmitAttrONDBLCLICK TT+instance AdmitAttrONDBLCLICK U+instance AdmitAttrONDBLCLICK UL+instance AdmitAttrONDBLCLICK VAR+instance AdmitAttrONFOCUS A+instance AdmitAttrONFOCUS AREA+instance AdmitAttrONFOCUS BUTTON+instance AdmitAttrONFOCUS INPUT+instance AdmitAttrONFOCUS LABEL+instance AdmitAttrONFOCUS SELECT+instance AdmitAttrONFOCUS TEXTAREA+instance AdmitAttrONKEYDOWN A+instance AdmitAttrONKEYDOWN ABBR+instance AdmitAttrONKEYDOWN ACRONYM+instance AdmitAttrONKEYDOWN ADDRESS+instance AdmitAttrONKEYDOWN AREA+instance AdmitAttrONKEYDOWN B+instance AdmitAttrONKEYDOWN BIG+instance AdmitAttrONKEYDOWN BLOCKQUOTE+instance AdmitAttrONKEYDOWN BODY+instance AdmitAttrONKEYDOWN BUTTON+instance AdmitAttrONKEYDOWN CAPTION+instance AdmitAttrONKEYDOWN CENTER+instance AdmitAttrONKEYDOWN CITE+instance AdmitAttrONKEYDOWN CODE+instance AdmitAttrONKEYDOWN COL+instance AdmitAttrONKEYDOWN COLGROUP+instance AdmitAttrONKEYDOWN DD+instance AdmitAttrONKEYDOWN DEL+instance AdmitAttrONKEYDOWN DFN+instance AdmitAttrONKEYDOWN DIR+instance AdmitAttrONKEYDOWN DIV+instance AdmitAttrONKEYDOWN DL+instance AdmitAttrONKEYDOWN DT+instance AdmitAttrONKEYDOWN EM+instance AdmitAttrONKEYDOWN FIELDSET+instance AdmitAttrONKEYDOWN FORM+instance AdmitAttrONKEYDOWN H1+instance AdmitAttrONKEYDOWN H2+instance AdmitAttrONKEYDOWN H3+instance AdmitAttrONKEYDOWN H4+instance AdmitAttrONKEYDOWN H5+instance AdmitAttrONKEYDOWN H6+instance AdmitAttrONKEYDOWN HR+instance AdmitAttrONKEYDOWN I+instance AdmitAttrONKEYDOWN IMG+instance AdmitAttrONKEYDOWN INPUT+instance AdmitAttrONKEYDOWN INS+instance AdmitAttrONKEYDOWN KBD+instance AdmitAttrONKEYDOWN LABEL+instance AdmitAttrONKEYDOWN LEGEND+instance AdmitAttrONKEYDOWN LI+instance AdmitAttrONKEYDOWN LINK+instance AdmitAttrONKEYDOWN MAP+instance AdmitAttrONKEYDOWN MENU+instance AdmitAttrONKEYDOWN NOFRAMES+instance AdmitAttrONKEYDOWN NOSCRIPT+instance AdmitAttrONKEYDOWN OBJECT+instance AdmitAttrONKEYDOWN OL+instance AdmitAttrONKEYDOWN OPTGROUP+instance AdmitAttrONKEYDOWN OPTION+instance AdmitAttrONKEYDOWN P+instance AdmitAttrONKEYDOWN PRE+instance AdmitAttrONKEYDOWN Q+instance AdmitAttrONKEYDOWN S+instance AdmitAttrONKEYDOWN SAMP+instance AdmitAttrONKEYDOWN SELECT+instance AdmitAttrONKEYDOWN SMALL+instance AdmitAttrONKEYDOWN SPAN+instance AdmitAttrONKEYDOWN STRIKE+instance AdmitAttrONKEYDOWN STRONG+instance AdmitAttrONKEYDOWN SUB+instance AdmitAttrONKEYDOWN SUP+instance AdmitAttrONKEYDOWN TABLE+instance AdmitAttrONKEYDOWN TBODY+instance AdmitAttrONKEYDOWN TD+instance AdmitAttrONKEYDOWN TEXTAREA+instance AdmitAttrONKEYDOWN TFOOT+instance AdmitAttrONKEYDOWN TH+instance AdmitAttrONKEYDOWN THEAD+instance AdmitAttrONKEYDOWN TR+instance AdmitAttrONKEYDOWN TT+instance AdmitAttrONKEYDOWN U+instance AdmitAttrONKEYDOWN UL+instance AdmitAttrONKEYDOWN VAR+instance AdmitAttrONKEYPRESS A+instance AdmitAttrONKEYPRESS ABBR+instance AdmitAttrONKEYPRESS ACRONYM+instance AdmitAttrONKEYPRESS ADDRESS+instance AdmitAttrONKEYPRESS AREA+instance AdmitAttrONKEYPRESS B+instance AdmitAttrONKEYPRESS BIG+instance AdmitAttrONKEYPRESS BLOCKQUOTE+instance AdmitAttrONKEYPRESS BODY+instance AdmitAttrONKEYPRESS BUTTON+instance AdmitAttrONKEYPRESS CAPTION+instance AdmitAttrONKEYPRESS CENTER+instance AdmitAttrONKEYPRESS CITE+instance AdmitAttrONKEYPRESS CODE+instance AdmitAttrONKEYPRESS COL+instance AdmitAttrONKEYPRESS COLGROUP+instance AdmitAttrONKEYPRESS DD+instance AdmitAttrONKEYPRESS DEL+instance AdmitAttrONKEYPRESS DFN+instance AdmitAttrONKEYPRESS DIR+instance AdmitAttrONKEYPRESS DIV+instance AdmitAttrONKEYPRESS DL+instance AdmitAttrONKEYPRESS DT+instance AdmitAttrONKEYPRESS EM+instance AdmitAttrONKEYPRESS FIELDSET+instance AdmitAttrONKEYPRESS FORM+instance AdmitAttrONKEYPRESS H1+instance AdmitAttrONKEYPRESS H2+instance AdmitAttrONKEYPRESS H3+instance AdmitAttrONKEYPRESS H4+instance AdmitAttrONKEYPRESS H5+instance AdmitAttrONKEYPRESS H6+instance AdmitAttrONKEYPRESS HR+instance AdmitAttrONKEYPRESS I+instance AdmitAttrONKEYPRESS IMG+instance AdmitAttrONKEYPRESS INPUT+instance AdmitAttrONKEYPRESS INS+instance AdmitAttrONKEYPRESS KBD+instance AdmitAttrONKEYPRESS LABEL+instance AdmitAttrONKEYPRESS LEGEND+instance AdmitAttrONKEYPRESS LI+instance AdmitAttrONKEYPRESS LINK+instance AdmitAttrONKEYPRESS MAP+instance AdmitAttrONKEYPRESS MENU+instance AdmitAttrONKEYPRESS NOFRAMES+instance AdmitAttrONKEYPRESS NOSCRIPT+instance AdmitAttrONKEYPRESS OBJECT+instance AdmitAttrONKEYPRESS OL+instance AdmitAttrONKEYPRESS OPTGROUP+instance AdmitAttrONKEYPRESS OPTION+instance AdmitAttrONKEYPRESS P+instance AdmitAttrONKEYPRESS PRE+instance AdmitAttrONKEYPRESS Q+instance AdmitAttrONKEYPRESS S+instance AdmitAttrONKEYPRESS SAMP+instance AdmitAttrONKEYPRESS SELECT+instance AdmitAttrONKEYPRESS SMALL+instance AdmitAttrONKEYPRESS SPAN+instance AdmitAttrONKEYPRESS STRIKE+instance AdmitAttrONKEYPRESS STRONG+instance AdmitAttrONKEYPRESS SUB+instance AdmitAttrONKEYPRESS SUP+instance AdmitAttrONKEYPRESS TABLE+instance AdmitAttrONKEYPRESS TBODY+instance AdmitAttrONKEYPRESS TD+instance AdmitAttrONKEYPRESS TEXTAREA+instance AdmitAttrONKEYPRESS TFOOT+instance AdmitAttrONKEYPRESS TH+instance AdmitAttrONKEYPRESS THEAD+instance AdmitAttrONKEYPRESS TR+instance AdmitAttrONKEYPRESS TT+instance AdmitAttrONKEYPRESS U+instance AdmitAttrONKEYPRESS UL+instance AdmitAttrONKEYPRESS VAR+instance AdmitAttrONKEYUP A+instance AdmitAttrONKEYUP ABBR+instance AdmitAttrONKEYUP ACRONYM+instance AdmitAttrONKEYUP ADDRESS+instance AdmitAttrONKEYUP AREA+instance AdmitAttrONKEYUP B+instance AdmitAttrONKEYUP BIG+instance AdmitAttrONKEYUP BLOCKQUOTE+instance AdmitAttrONKEYUP BODY+instance AdmitAttrONKEYUP BUTTON+instance AdmitAttrONKEYUP CAPTION+instance AdmitAttrONKEYUP CENTER+instance AdmitAttrONKEYUP CITE+instance AdmitAttrONKEYUP CODE+instance AdmitAttrONKEYUP COL+instance AdmitAttrONKEYUP COLGROUP+instance AdmitAttrONKEYUP DD+instance AdmitAttrONKEYUP DEL+instance AdmitAttrONKEYUP DFN+instance AdmitAttrONKEYUP DIR+instance AdmitAttrONKEYUP DIV+instance AdmitAttrONKEYUP DL+instance AdmitAttrONKEYUP DT+instance AdmitAttrONKEYUP EM+instance AdmitAttrONKEYUP FIELDSET+instance AdmitAttrONKEYUP FORM+instance AdmitAttrONKEYUP H1+instance AdmitAttrONKEYUP H2+instance AdmitAttrONKEYUP H3+instance AdmitAttrONKEYUP H4+instance AdmitAttrONKEYUP H5+instance AdmitAttrONKEYUP H6+instance AdmitAttrONKEYUP HR+instance AdmitAttrONKEYUP I+instance AdmitAttrONKEYUP IMG+instance AdmitAttrONKEYUP INPUT+instance AdmitAttrONKEYUP INS+instance AdmitAttrONKEYUP KBD+instance AdmitAttrONKEYUP LABEL+instance AdmitAttrONKEYUP LEGEND+instance AdmitAttrONKEYUP LI+instance AdmitAttrONKEYUP LINK+instance AdmitAttrONKEYUP MAP+instance AdmitAttrONKEYUP MENU+instance AdmitAttrONKEYUP NOFRAMES+instance AdmitAttrONKEYUP NOSCRIPT+instance AdmitAttrONKEYUP OBJECT+instance AdmitAttrONKEYUP OL+instance AdmitAttrONKEYUP OPTGROUP+instance AdmitAttrONKEYUP OPTION+instance AdmitAttrONKEYUP P+instance AdmitAttrONKEYUP PRE+instance AdmitAttrONKEYUP Q+instance AdmitAttrONKEYUP S+instance AdmitAttrONKEYUP SAMP+instance AdmitAttrONKEYUP SELECT+instance AdmitAttrONKEYUP SMALL+instance AdmitAttrONKEYUP SPAN+instance AdmitAttrONKEYUP STRIKE+instance AdmitAttrONKEYUP STRONG+instance AdmitAttrONKEYUP SUB+instance AdmitAttrONKEYUP SUP+instance AdmitAttrONKEYUP TABLE+instance AdmitAttrONKEYUP TBODY+instance AdmitAttrONKEYUP TD+instance AdmitAttrONKEYUP TEXTAREA+instance AdmitAttrONKEYUP TFOOT+instance AdmitAttrONKEYUP TH+instance AdmitAttrONKEYUP THEAD+instance AdmitAttrONKEYUP TR+instance AdmitAttrONKEYUP TT+instance AdmitAttrONKEYUP U+instance AdmitAttrONKEYUP UL+instance AdmitAttrONKEYUP VAR+instance AdmitAttrONLOAD BODY+instance AdmitAttrONLOAD FRAMESET+instance AdmitAttrONMOUSEDOWN A+instance AdmitAttrONMOUSEDOWN ABBR+instance AdmitAttrONMOUSEDOWN ACRONYM+instance AdmitAttrONMOUSEDOWN ADDRESS+instance AdmitAttrONMOUSEDOWN AREA+instance AdmitAttrONMOUSEDOWN B+instance AdmitAttrONMOUSEDOWN BIG+instance AdmitAttrONMOUSEDOWN BLOCKQUOTE+instance AdmitAttrONMOUSEDOWN BODY+instance AdmitAttrONMOUSEDOWN BUTTON+instance AdmitAttrONMOUSEDOWN CAPTION+instance AdmitAttrONMOUSEDOWN CENTER+instance AdmitAttrONMOUSEDOWN CITE+instance AdmitAttrONMOUSEDOWN CODE+instance AdmitAttrONMOUSEDOWN COL+instance AdmitAttrONMOUSEDOWN COLGROUP+instance AdmitAttrONMOUSEDOWN DD+instance AdmitAttrONMOUSEDOWN DEL+instance AdmitAttrONMOUSEDOWN DFN+instance AdmitAttrONMOUSEDOWN DIR+instance AdmitAttrONMOUSEDOWN DIV+instance AdmitAttrONMOUSEDOWN DL+instance AdmitAttrONMOUSEDOWN DT+instance AdmitAttrONMOUSEDOWN EM+instance AdmitAttrONMOUSEDOWN FIELDSET+instance AdmitAttrONMOUSEDOWN FORM+instance AdmitAttrONMOUSEDOWN H1+instance AdmitAttrONMOUSEDOWN H2+instance AdmitAttrONMOUSEDOWN H3+instance AdmitAttrONMOUSEDOWN H4+instance AdmitAttrONMOUSEDOWN H5+instance AdmitAttrONMOUSEDOWN H6+instance AdmitAttrONMOUSEDOWN HR+instance AdmitAttrONMOUSEDOWN I+instance AdmitAttrONMOUSEDOWN IMG+instance AdmitAttrONMOUSEDOWN INPUT+instance AdmitAttrONMOUSEDOWN INS+instance AdmitAttrONMOUSEDOWN KBD+instance AdmitAttrONMOUSEDOWN LABEL+instance AdmitAttrONMOUSEDOWN LEGEND+instance AdmitAttrONMOUSEDOWN LI+instance AdmitAttrONMOUSEDOWN LINK+instance AdmitAttrONMOUSEDOWN MAP+instance AdmitAttrONMOUSEDOWN MENU+instance AdmitAttrONMOUSEDOWN NOFRAMES+instance AdmitAttrONMOUSEDOWN NOSCRIPT+instance AdmitAttrONMOUSEDOWN OBJECT+instance AdmitAttrONMOUSEDOWN OL+instance AdmitAttrONMOUSEDOWN OPTGROUP+instance AdmitAttrONMOUSEDOWN OPTION+instance AdmitAttrONMOUSEDOWN P+instance AdmitAttrONMOUSEDOWN PRE+instance AdmitAttrONMOUSEDOWN Q+instance AdmitAttrONMOUSEDOWN S+instance AdmitAttrONMOUSEDOWN SAMP+instance AdmitAttrONMOUSEDOWN SELECT+instance AdmitAttrONMOUSEDOWN SMALL+instance AdmitAttrONMOUSEDOWN SPAN+instance AdmitAttrONMOUSEDOWN STRIKE+instance AdmitAttrONMOUSEDOWN STRONG+instance AdmitAttrONMOUSEDOWN SUB+instance AdmitAttrONMOUSEDOWN SUP+instance AdmitAttrONMOUSEDOWN TABLE+instance AdmitAttrONMOUSEDOWN TBODY+instance AdmitAttrONMOUSEDOWN TD+instance AdmitAttrONMOUSEDOWN TEXTAREA+instance AdmitAttrONMOUSEDOWN TFOOT+instance AdmitAttrONMOUSEDOWN TH+instance AdmitAttrONMOUSEDOWN THEAD+instance AdmitAttrONMOUSEDOWN TR+instance AdmitAttrONMOUSEDOWN TT+instance AdmitAttrONMOUSEDOWN U+instance AdmitAttrONMOUSEDOWN UL+instance AdmitAttrONMOUSEDOWN VAR+instance AdmitAttrONMOUSEMOVE A+instance AdmitAttrONMOUSEMOVE ABBR+instance AdmitAttrONMOUSEMOVE ACRONYM+instance AdmitAttrONMOUSEMOVE ADDRESS+instance AdmitAttrONMOUSEMOVE AREA+instance AdmitAttrONMOUSEMOVE B+instance AdmitAttrONMOUSEMOVE BIG+instance AdmitAttrONMOUSEMOVE BLOCKQUOTE+instance AdmitAttrONMOUSEMOVE BODY+instance AdmitAttrONMOUSEMOVE BUTTON+instance AdmitAttrONMOUSEMOVE CAPTION+instance AdmitAttrONMOUSEMOVE CENTER+instance AdmitAttrONMOUSEMOVE CITE+instance AdmitAttrONMOUSEMOVE CODE+instance AdmitAttrONMOUSEMOVE COL+instance AdmitAttrONMOUSEMOVE COLGROUP+instance AdmitAttrONMOUSEMOVE DD+instance AdmitAttrONMOUSEMOVE DEL+instance AdmitAttrONMOUSEMOVE DFN+instance AdmitAttrONMOUSEMOVE DIR+instance AdmitAttrONMOUSEMOVE DIV+instance AdmitAttrONMOUSEMOVE DL+instance AdmitAttrONMOUSEMOVE DT+instance AdmitAttrONMOUSEMOVE EM+instance AdmitAttrONMOUSEMOVE FIELDSET+instance AdmitAttrONMOUSEMOVE FORM+instance AdmitAttrONMOUSEMOVE H1+instance AdmitAttrONMOUSEMOVE H2+instance AdmitAttrONMOUSEMOVE H3+instance AdmitAttrONMOUSEMOVE H4+instance AdmitAttrONMOUSEMOVE H5+instance AdmitAttrONMOUSEMOVE H6+instance AdmitAttrONMOUSEMOVE HR+instance AdmitAttrONMOUSEMOVE I+instance AdmitAttrONMOUSEMOVE IMG+instance AdmitAttrONMOUSEMOVE INPUT+instance AdmitAttrONMOUSEMOVE INS+instance AdmitAttrONMOUSEMOVE KBD+instance AdmitAttrONMOUSEMOVE LABEL+instance AdmitAttrONMOUSEMOVE LEGEND+instance AdmitAttrONMOUSEMOVE LI+instance AdmitAttrONMOUSEMOVE LINK+instance AdmitAttrONMOUSEMOVE MAP+instance AdmitAttrONMOUSEMOVE MENU+instance AdmitAttrONMOUSEMOVE NOFRAMES+instance AdmitAttrONMOUSEMOVE NOSCRIPT+instance AdmitAttrONMOUSEMOVE OBJECT+instance AdmitAttrONMOUSEMOVE OL+instance AdmitAttrONMOUSEMOVE OPTGROUP+instance AdmitAttrONMOUSEMOVE OPTION+instance AdmitAttrONMOUSEMOVE P+instance AdmitAttrONMOUSEMOVE PRE+instance AdmitAttrONMOUSEMOVE Q+instance AdmitAttrONMOUSEMOVE S+instance AdmitAttrONMOUSEMOVE SAMP+instance AdmitAttrONMOUSEMOVE SELECT+instance AdmitAttrONMOUSEMOVE SMALL+instance AdmitAttrONMOUSEMOVE SPAN+instance AdmitAttrONMOUSEMOVE STRIKE+instance AdmitAttrONMOUSEMOVE STRONG+instance AdmitAttrONMOUSEMOVE SUB+instance AdmitAttrONMOUSEMOVE SUP+instance AdmitAttrONMOUSEMOVE TABLE+instance AdmitAttrONMOUSEMOVE TBODY+instance AdmitAttrONMOUSEMOVE TD+instance AdmitAttrONMOUSEMOVE TEXTAREA+instance AdmitAttrONMOUSEMOVE TFOOT+instance AdmitAttrONMOUSEMOVE TH+instance AdmitAttrONMOUSEMOVE THEAD+instance AdmitAttrONMOUSEMOVE TR+instance AdmitAttrONMOUSEMOVE TT+instance AdmitAttrONMOUSEMOVE U+instance AdmitAttrONMOUSEMOVE UL+instance AdmitAttrONMOUSEMOVE VAR+instance AdmitAttrONMOUSEOUT A+instance AdmitAttrONMOUSEOUT ABBR+instance AdmitAttrONMOUSEOUT ACRONYM+instance AdmitAttrONMOUSEOUT ADDRESS+instance AdmitAttrONMOUSEOUT AREA+instance AdmitAttrONMOUSEOUT B+instance AdmitAttrONMOUSEOUT BIG+instance AdmitAttrONMOUSEOUT BLOCKQUOTE+instance AdmitAttrONMOUSEOUT BODY+instance AdmitAttrONMOUSEOUT BUTTON+instance AdmitAttrONMOUSEOUT CAPTION+instance AdmitAttrONMOUSEOUT CENTER+instance AdmitAttrONMOUSEOUT CITE+instance AdmitAttrONMOUSEOUT CODE+instance AdmitAttrONMOUSEOUT COL+instance AdmitAttrONMOUSEOUT COLGROUP+instance AdmitAttrONMOUSEOUT DD+instance AdmitAttrONMOUSEOUT DEL+instance AdmitAttrONMOUSEOUT DFN+instance AdmitAttrONMOUSEOUT DIR+instance AdmitAttrONMOUSEOUT DIV+instance AdmitAttrONMOUSEOUT DL+instance AdmitAttrONMOUSEOUT DT+instance AdmitAttrONMOUSEOUT EM+instance AdmitAttrONMOUSEOUT FIELDSET+instance AdmitAttrONMOUSEOUT FORM+instance AdmitAttrONMOUSEOUT H1+instance AdmitAttrONMOUSEOUT H2+instance AdmitAttrONMOUSEOUT H3+instance AdmitAttrONMOUSEOUT H4+instance AdmitAttrONMOUSEOUT H5+instance AdmitAttrONMOUSEOUT H6+instance AdmitAttrONMOUSEOUT HR+instance AdmitAttrONMOUSEOUT I+instance AdmitAttrONMOUSEOUT IMG+instance AdmitAttrONMOUSEOUT INPUT+instance AdmitAttrONMOUSEOUT INS+instance AdmitAttrONMOUSEOUT KBD+instance AdmitAttrONMOUSEOUT LABEL+instance AdmitAttrONMOUSEOUT LEGEND+instance AdmitAttrONMOUSEOUT LI+instance AdmitAttrONMOUSEOUT LINK+instance AdmitAttrONMOUSEOUT MAP+instance AdmitAttrONMOUSEOUT MENU+instance AdmitAttrONMOUSEOUT NOFRAMES+instance AdmitAttrONMOUSEOUT NOSCRIPT+instance AdmitAttrONMOUSEOUT OBJECT+instance AdmitAttrONMOUSEOUT OL+instance AdmitAttrONMOUSEOUT OPTGROUP+instance AdmitAttrONMOUSEOUT OPTION+instance AdmitAttrONMOUSEOUT P+instance AdmitAttrONMOUSEOUT PRE+instance AdmitAttrONMOUSEOUT Q+instance AdmitAttrONMOUSEOUT S+instance AdmitAttrONMOUSEOUT SAMP+instance AdmitAttrONMOUSEOUT SELECT+instance AdmitAttrONMOUSEOUT SMALL+instance AdmitAttrONMOUSEOUT SPAN+instance AdmitAttrONMOUSEOUT STRIKE+instance AdmitAttrONMOUSEOUT STRONG+instance AdmitAttrONMOUSEOUT SUB+instance AdmitAttrONMOUSEOUT SUP+instance AdmitAttrONMOUSEOUT TABLE+instance AdmitAttrONMOUSEOUT TBODY+instance AdmitAttrONMOUSEOUT TD+instance AdmitAttrONMOUSEOUT TEXTAREA+instance AdmitAttrONMOUSEOUT TFOOT+instance AdmitAttrONMOUSEOUT TH+instance AdmitAttrONMOUSEOUT THEAD+instance AdmitAttrONMOUSEOUT TR+instance AdmitAttrONMOUSEOUT TT+instance AdmitAttrONMOUSEOUT U+instance AdmitAttrONMOUSEOUT UL+instance AdmitAttrONMOUSEOUT VAR+instance AdmitAttrONMOUSEOVER A+instance AdmitAttrONMOUSEOVER ABBR+instance AdmitAttrONMOUSEOVER ACRONYM+instance AdmitAttrONMOUSEOVER ADDRESS+instance AdmitAttrONMOUSEOVER AREA+instance AdmitAttrONMOUSEOVER B+instance AdmitAttrONMOUSEOVER BIG+instance AdmitAttrONMOUSEOVER BLOCKQUOTE+instance AdmitAttrONMOUSEOVER BODY+instance AdmitAttrONMOUSEOVER BUTTON+instance AdmitAttrONMOUSEOVER CAPTION+instance AdmitAttrONMOUSEOVER CENTER+instance AdmitAttrONMOUSEOVER CITE+instance AdmitAttrONMOUSEOVER CODE+instance AdmitAttrONMOUSEOVER COL+instance AdmitAttrONMOUSEOVER COLGROUP+instance AdmitAttrONMOUSEOVER DD+instance AdmitAttrONMOUSEOVER DEL+instance AdmitAttrONMOUSEOVER DFN+instance AdmitAttrONMOUSEOVER DIR+instance AdmitAttrONMOUSEOVER DIV+instance AdmitAttrONMOUSEOVER DL+instance AdmitAttrONMOUSEOVER DT+instance AdmitAttrONMOUSEOVER EM+instance AdmitAttrONMOUSEOVER FIELDSET+instance AdmitAttrONMOUSEOVER FORM+instance AdmitAttrONMOUSEOVER H1+instance AdmitAttrONMOUSEOVER H2+instance AdmitAttrONMOUSEOVER H3+instance AdmitAttrONMOUSEOVER H4+instance AdmitAttrONMOUSEOVER H5+instance AdmitAttrONMOUSEOVER H6+instance AdmitAttrONMOUSEOVER HR+instance AdmitAttrONMOUSEOVER I+instance AdmitAttrONMOUSEOVER IMG+instance AdmitAttrONMOUSEOVER INPUT+instance AdmitAttrONMOUSEOVER INS+instance AdmitAttrONMOUSEOVER KBD+instance AdmitAttrONMOUSEOVER LABEL+instance AdmitAttrONMOUSEOVER LEGEND+instance AdmitAttrONMOUSEOVER LI+instance AdmitAttrONMOUSEOVER LINK+instance AdmitAttrONMOUSEOVER MAP+instance AdmitAttrONMOUSEOVER MENU+instance AdmitAttrONMOUSEOVER NOFRAMES+instance AdmitAttrONMOUSEOVER NOSCRIPT+instance AdmitAttrONMOUSEOVER OBJECT+instance AdmitAttrONMOUSEOVER OL+instance AdmitAttrONMOUSEOVER OPTGROUP+instance AdmitAttrONMOUSEOVER OPTION+instance AdmitAttrONMOUSEOVER P+instance AdmitAttrONMOUSEOVER PRE+instance AdmitAttrONMOUSEOVER Q+instance AdmitAttrONMOUSEOVER S+instance AdmitAttrONMOUSEOVER SAMP+instance AdmitAttrONMOUSEOVER SELECT+instance AdmitAttrONMOUSEOVER SMALL+instance AdmitAttrONMOUSEOVER SPAN+instance AdmitAttrONMOUSEOVER STRIKE+instance AdmitAttrONMOUSEOVER STRONG+instance AdmitAttrONMOUSEOVER SUB+instance AdmitAttrONMOUSEOVER SUP+instance AdmitAttrONMOUSEOVER TABLE+instance AdmitAttrONMOUSEOVER TBODY+instance AdmitAttrONMOUSEOVER TD+instance AdmitAttrONMOUSEOVER TEXTAREA+instance AdmitAttrONMOUSEOVER TFOOT+instance AdmitAttrONMOUSEOVER TH+instance AdmitAttrONMOUSEOVER THEAD+instance AdmitAttrONMOUSEOVER TR+instance AdmitAttrONMOUSEOVER TT+instance AdmitAttrONMOUSEOVER U+instance AdmitAttrONMOUSEOVER UL+instance AdmitAttrONMOUSEOVER VAR+instance AdmitAttrONMOUSEUP A+instance AdmitAttrONMOUSEUP ABBR+instance AdmitAttrONMOUSEUP ACRONYM+instance AdmitAttrONMOUSEUP ADDRESS+instance AdmitAttrONMOUSEUP AREA+instance AdmitAttrONMOUSEUP B+instance AdmitAttrONMOUSEUP BIG+instance AdmitAttrONMOUSEUP BLOCKQUOTE+instance AdmitAttrONMOUSEUP BODY+instance AdmitAttrONMOUSEUP BUTTON+instance AdmitAttrONMOUSEUP CAPTION+instance AdmitAttrONMOUSEUP CENTER+instance AdmitAttrONMOUSEUP CITE+instance AdmitAttrONMOUSEUP CODE+instance AdmitAttrONMOUSEUP COL+instance AdmitAttrONMOUSEUP COLGROUP+instance AdmitAttrONMOUSEUP DD+instance AdmitAttrONMOUSEUP DEL+instance AdmitAttrONMOUSEUP DFN+instance AdmitAttrONMOUSEUP DIR+instance AdmitAttrONMOUSEUP DIV+instance AdmitAttrONMOUSEUP DL+instance AdmitAttrONMOUSEUP DT+instance AdmitAttrONMOUSEUP EM+instance AdmitAttrONMOUSEUP FIELDSET+instance AdmitAttrONMOUSEUP FORM+instance AdmitAttrONMOUSEUP H1+instance AdmitAttrONMOUSEUP H2+instance AdmitAttrONMOUSEUP H3+instance AdmitAttrONMOUSEUP H4+instance AdmitAttrONMOUSEUP H5+instance AdmitAttrONMOUSEUP H6+instance AdmitAttrONMOUSEUP HR+instance AdmitAttrONMOUSEUP I+instance AdmitAttrONMOUSEUP IMG+instance AdmitAttrONMOUSEUP INPUT+instance AdmitAttrONMOUSEUP INS+instance AdmitAttrONMOUSEUP KBD+instance AdmitAttrONMOUSEUP LABEL+instance AdmitAttrONMOUSEUP LEGEND+instance AdmitAttrONMOUSEUP LI+instance AdmitAttrONMOUSEUP LINK+instance AdmitAttrONMOUSEUP MAP+instance AdmitAttrONMOUSEUP MENU+instance AdmitAttrONMOUSEUP NOFRAMES+instance AdmitAttrONMOUSEUP NOSCRIPT+instance AdmitAttrONMOUSEUP OBJECT+instance AdmitAttrONMOUSEUP OL+instance AdmitAttrONMOUSEUP OPTGROUP+instance AdmitAttrONMOUSEUP OPTION+instance AdmitAttrONMOUSEUP P+instance AdmitAttrONMOUSEUP PRE+instance AdmitAttrONMOUSEUP Q+instance AdmitAttrONMOUSEUP S+instance AdmitAttrONMOUSEUP SAMP+instance AdmitAttrONMOUSEUP SELECT+instance AdmitAttrONMOUSEUP SMALL+instance AdmitAttrONMOUSEUP SPAN+instance AdmitAttrONMOUSEUP STRIKE+instance AdmitAttrONMOUSEUP STRONG+instance AdmitAttrONMOUSEUP SUB+instance AdmitAttrONMOUSEUP SUP+instance AdmitAttrONMOUSEUP TABLE+instance AdmitAttrONMOUSEUP TBODY+instance AdmitAttrONMOUSEUP TD+instance AdmitAttrONMOUSEUP TEXTAREA+instance AdmitAttrONMOUSEUP TFOOT+instance AdmitAttrONMOUSEUP TH+instance AdmitAttrONMOUSEUP THEAD+instance AdmitAttrONMOUSEUP TR+instance AdmitAttrONMOUSEUP TT+instance AdmitAttrONMOUSEUP U+instance AdmitAttrONMOUSEUP UL+instance AdmitAttrONMOUSEUP VAR+instance AdmitAttrONRESET FORM+instance AdmitAttrONSELECT INPUT+instance AdmitAttrONSELECT TEXTAREA+instance AdmitAttrONSUBMIT FORM+instance AdmitAttrONUNLOAD BODY+instance AdmitAttrONUNLOAD FRAMESET+instance AdmitAttrPROFILE HEAD+instance AdmitAttrPROMPT ISINDEX+instance AdmitAttrREADONLY INPUT+instance AdmitAttrREADONLY TEXTAREA+instance AdmitAttrREL A+instance AdmitAttrREL LINK+instance AdmitAttrREV A+instance AdmitAttrREV LINK+instance AdmitAttrROWS FRAMESET+instance AdmitAttrROWS TEXTAREA+instance AdmitAttrROWSPAN TD+instance AdmitAttrROWSPAN TH+instance AdmitAttrRULES TABLE+instance AdmitAttrSCHEME META+instance AdmitAttrSCOPE TD+instance AdmitAttrSCOPE TH+instance AdmitAttrSCROLLING FRAME+instance AdmitAttrSCROLLING IFRAME+instance AdmitAttrSELECTED OPTION+instance AdmitAttrSHAPE A+instance AdmitAttrSHAPE AREA+instance AdmitAttrSIZE BASEFONT+instance AdmitAttrSIZE FONT+instance AdmitAttrSIZE HR+instance AdmitAttrSIZE INPUT+instance AdmitAttrSIZE SELECT+instance AdmitAttrSPAN COL+instance AdmitAttrSPAN COLGROUP+instance AdmitAttrSRC FRAME+instance AdmitAttrSRC IFRAME+instance AdmitAttrSRC IMG+instance AdmitAttrSRC INPUT+instance AdmitAttrSRC SCRIPT+instance AdmitAttrSTANDBY OBJECT+instance AdmitAttrSTART OL+instance AdmitAttrSTYLE A+instance AdmitAttrSTYLE ABBR+instance AdmitAttrSTYLE ACRONYM+instance AdmitAttrSTYLE ADDRESS+instance AdmitAttrSTYLE APPLET+instance AdmitAttrSTYLE AREA+instance AdmitAttrSTYLE B+instance AdmitAttrSTYLE BDO+instance AdmitAttrSTYLE BIG+instance AdmitAttrSTYLE BLOCKQUOTE+instance AdmitAttrSTYLE BODY+instance AdmitAttrSTYLE BR+instance AdmitAttrSTYLE BUTTON+instance AdmitAttrSTYLE CAPTION+instance AdmitAttrSTYLE CENTER+instance AdmitAttrSTYLE CITE+instance AdmitAttrSTYLE CODE+instance AdmitAttrSTYLE COL+instance AdmitAttrSTYLE COLGROUP+instance AdmitAttrSTYLE DD+instance AdmitAttrSTYLE DEL+instance AdmitAttrSTYLE DFN+instance AdmitAttrSTYLE DIR+instance AdmitAttrSTYLE DIV+instance AdmitAttrSTYLE DL+instance AdmitAttrSTYLE DT+instance AdmitAttrSTYLE EM+instance AdmitAttrSTYLE FIELDSET+instance AdmitAttrSTYLE FONT+instance AdmitAttrSTYLE FORM+instance AdmitAttrSTYLE FRAME+instance AdmitAttrSTYLE FRAMESET+instance AdmitAttrSTYLE H1+instance AdmitAttrSTYLE H2+instance AdmitAttrSTYLE H3+instance AdmitAttrSTYLE H4+instance AdmitAttrSTYLE H5+instance AdmitAttrSTYLE H6+instance AdmitAttrSTYLE HR+instance AdmitAttrSTYLE I+instance AdmitAttrSTYLE IFRAME+instance AdmitAttrSTYLE IMG+instance AdmitAttrSTYLE INPUT+instance AdmitAttrSTYLE INS+instance AdmitAttrSTYLE ISINDEX+instance AdmitAttrSTYLE KBD+instance AdmitAttrSTYLE LABEL+instance AdmitAttrSTYLE LEGEND+instance AdmitAttrSTYLE LI+instance AdmitAttrSTYLE LINK+instance AdmitAttrSTYLE MAP+instance AdmitAttrSTYLE MENU+instance AdmitAttrSTYLE NOFRAMES+instance AdmitAttrSTYLE NOSCRIPT+instance AdmitAttrSTYLE OBJECT+instance AdmitAttrSTYLE OL+instance AdmitAttrSTYLE OPTGROUP+instance AdmitAttrSTYLE OPTION+instance AdmitAttrSTYLE P+instance AdmitAttrSTYLE PRE+instance AdmitAttrSTYLE Q+instance AdmitAttrSTYLE S+instance AdmitAttrSTYLE SAMP+instance AdmitAttrSTYLE SELECT+instance AdmitAttrSTYLE SMALL+instance AdmitAttrSTYLE SPAN+instance AdmitAttrSTYLE STRIKE+instance AdmitAttrSTYLE STRONG+instance AdmitAttrSTYLE SUB+instance AdmitAttrSTYLE SUP+instance AdmitAttrSTYLE TABLE+instance AdmitAttrSTYLE TBODY+instance AdmitAttrSTYLE TD+instance AdmitAttrSTYLE TEXTAREA+instance AdmitAttrSTYLE TFOOT+instance AdmitAttrSTYLE TH+instance AdmitAttrSTYLE THEAD+instance AdmitAttrSTYLE TR+instance AdmitAttrSTYLE TT+instance AdmitAttrSTYLE U+instance AdmitAttrSTYLE UL+instance AdmitAttrSTYLE VAR+instance AdmitAttrSUMMARY TABLE+instance AdmitAttrTABINDEX A+instance AdmitAttrTABINDEX AREA+instance AdmitAttrTABINDEX BUTTON+instance AdmitAttrTABINDEX INPUT+instance AdmitAttrTABINDEX OBJECT+instance AdmitAttrTABINDEX SELECT+instance AdmitAttrTABINDEX TEXTAREA+instance AdmitAttrTARGET A+instance AdmitAttrTARGET AREA+instance AdmitAttrTARGET BASE+instance AdmitAttrTARGET FORM+instance AdmitAttrTARGET LINK+instance AdmitAttrTEXT BODY+instance AdmitAttrTITLE A+instance AdmitAttrTITLE ABBR+instance AdmitAttrTITLE ACRONYM+instance AdmitAttrTITLE ADDRESS+instance AdmitAttrTITLE APPLET+instance AdmitAttrTITLE AREA+instance AdmitAttrTITLE B+instance AdmitAttrTITLE BDO+instance AdmitAttrTITLE BIG+instance AdmitAttrTITLE BLOCKQUOTE+instance AdmitAttrTITLE BODY+instance AdmitAttrTITLE BR+instance AdmitAttrTITLE BUTTON+instance AdmitAttrTITLE CAPTION+instance AdmitAttrTITLE CENTER+instance AdmitAttrTITLE CITE+instance AdmitAttrTITLE CODE+instance AdmitAttrTITLE COL+instance AdmitAttrTITLE COLGROUP+instance AdmitAttrTITLE DD+instance AdmitAttrTITLE DEL+instance AdmitAttrTITLE DFN+instance AdmitAttrTITLE DIR+instance AdmitAttrTITLE DIV+instance AdmitAttrTITLE DL+instance AdmitAttrTITLE DT+instance AdmitAttrTITLE EM+instance AdmitAttrTITLE FIELDSET+instance AdmitAttrTITLE FONT+instance AdmitAttrTITLE FORM+instance AdmitAttrTITLE FRAME+instance AdmitAttrTITLE FRAMESET+instance AdmitAttrTITLE H1+instance AdmitAttrTITLE H2+instance AdmitAttrTITLE H3+instance AdmitAttrTITLE H4+instance AdmitAttrTITLE H5+instance AdmitAttrTITLE H6+instance AdmitAttrTITLE HR+instance AdmitAttrTITLE I+instance AdmitAttrTITLE IFRAME+instance AdmitAttrTITLE IMG+instance AdmitAttrTITLE INPUT+instance AdmitAttrTITLE INS+instance AdmitAttrTITLE ISINDEX+instance AdmitAttrTITLE KBD+instance AdmitAttrTITLE LABEL+instance AdmitAttrTITLE LEGEND+instance AdmitAttrTITLE LI+instance AdmitAttrTITLE LINK+instance AdmitAttrTITLE MAP+instance AdmitAttrTITLE MENU+instance AdmitAttrTITLE NOFRAMES+instance AdmitAttrTITLE NOSCRIPT+instance AdmitAttrTITLE OBJECT+instance AdmitAttrTITLE OL+instance AdmitAttrTITLE OPTGROUP+instance AdmitAttrTITLE OPTION+instance AdmitAttrTITLE P+instance AdmitAttrTITLE PRE+instance AdmitAttrTITLE Q+instance AdmitAttrTITLE S+instance AdmitAttrTITLE SAMP+instance AdmitAttrTITLE SELECT+instance AdmitAttrTITLE SMALL+instance AdmitAttrTITLE SPAN+instance AdmitAttrTITLE STRIKE+instance AdmitAttrTITLE STRONG+instance AdmitAttrTITLE STYLE+instance AdmitAttrTITLE SUB+instance AdmitAttrTITLE SUP+instance AdmitAttrTITLE TABLE+instance AdmitAttrTITLE TBODY+instance AdmitAttrTITLE TD+instance AdmitAttrTITLE TEXTAREA+instance AdmitAttrTITLE TFOOT+instance AdmitAttrTITLE TH+instance AdmitAttrTITLE THEAD+instance AdmitAttrTITLE TR+instance AdmitAttrTITLE TT+instance AdmitAttrTITLE U+instance AdmitAttrTITLE UL+instance AdmitAttrTITLE VAR+instance AdmitAttrTYPE A+instance AdmitAttrTYPE BUTTON+instance AdmitAttrTYPE INPUT+instance AdmitAttrTYPE LI+instance AdmitAttrTYPE LINK+instance AdmitAttrTYPE OBJECT+instance AdmitAttrTYPE OL+instance AdmitAttrTYPE PARAM+instance AdmitAttrTYPE SCRIPT+instance AdmitAttrTYPE STYLE+instance AdmitAttrTYPE UL+instance AdmitAttrUSEMAP IMG+instance AdmitAttrUSEMAP INPUT+instance AdmitAttrUSEMAP OBJECT+instance AdmitAttrVALIGN COL+instance AdmitAttrVALIGN COLGROUP+instance AdmitAttrVALIGN TBODY+instance AdmitAttrVALIGN TD+instance AdmitAttrVALIGN TFOOT+instance AdmitAttrVALIGN TH+instance AdmitAttrVALIGN THEAD+instance AdmitAttrVALIGN TR+instance AdmitAttrVALUE BUTTON+instance AdmitAttrVALUE INPUT+instance AdmitAttrVALUE LI+instance AdmitAttrVALUE OPTION+instance AdmitAttrVALUE PARAM+instance AdmitAttrVALUETYPE PARAM+instance AdmitAttrVERSION HTML+instance AdmitAttrVLINK BODY+instance AdmitAttrVSPACE APPLET+instance AdmitAttrVSPACE IMG+instance AdmitAttrVSPACE OBJECT+instance AdmitAttrWIDTH APPLET+instance AdmitAttrWIDTH COL+instance AdmitAttrWIDTH COLGROUP+instance AdmitAttrWIDTH HR+instance AdmitAttrWIDTH IFRAME+instance AdmitAttrWIDTH IMG+instance AdmitAttrWIDTH OBJECT+instance AdmitAttrWIDTH PRE+instance AdmitAttrWIDTH TABLE+instance AdmitAttrWIDTH TD+instance AdmitAttrWIDTH TH
+ WASH/HTML/HTMLMonadAttrs.hs view
@@ -0,0 +1,250 @@+-- © 2001-2003 Peter Thiemann+-- this file is generated -- do not edit+module WASH.HTML.HTMLMonadAttrs + (module WASH.HTML.HTMLMonadAttrs,module WASH.HTML.HTMLMonadBase)+ where+import Prelude hiding (id,span)+import WASH.HTML.HTMLMonadBase (attr, WithHTML)+-- end fixed prologue+abbr :: Monad m => String -> WithHTML x m ()+abbr = attr "abbr"+accept :: Monad m => String -> WithHTML x m ()+accept = attr "accept"+accept_charset :: Monad m => String -> WithHTML x m ()+accept_charset = attr "accept-charset"+accesskey :: Monad m => String -> WithHTML x m ()+accesskey = attr "accesskey"+action :: Monad m => String -> WithHTML x m ()+action = attr "action"+align :: Monad m => String -> WithHTML x m ()+align = attr "align"+alink :: Monad m => String -> WithHTML x m ()+alink = attr "alink"+alt :: Monad m => String -> WithHTML x m ()+alt = attr "alt"+archive :: Monad m => String -> WithHTML x m ()+archive = attr "archive"+axis :: Monad m => String -> WithHTML x m ()+axis = attr "axis"+background :: Monad m => String -> WithHTML x m ()+background = attr "background"+bgcolor :: Monad m => String -> WithHTML x m ()+bgcolor = attr "bgcolor"+border :: Monad m => String -> WithHTML x m ()+border = attr "border"+cellpadding :: Monad m => String -> WithHTML x m ()+cellpadding = attr "cellpadding"+cellspacing :: Monad m => String -> WithHTML x m ()+cellspacing = attr "cellspacing"+char :: Monad m => String -> WithHTML x m ()+char = attr "char"+charoff :: Monad m => String -> WithHTML x m ()+charoff = attr "charoff"+charset :: Monad m => String -> WithHTML x m ()+charset = attr "charset"+checked :: Monad m => String -> WithHTML x m ()+checked = attr "checked"+cite :: Monad m => String -> WithHTML x m ()+cite = attr "cite"+class' :: Monad m => String -> WithHTML x m ()+class' = attr "class"+classid :: Monad m => String -> WithHTML x m ()+classid = attr "classid"+clear :: Monad m => String -> WithHTML x m ()+clear = attr "clear"+code :: Monad m => String -> WithHTML x m ()+code = attr "code"+codebase :: Monad m => String -> WithHTML x m ()+codebase = attr "codebase"+codetype :: Monad m => String -> WithHTML x m ()+codetype = attr "codetype"+color :: Monad m => String -> WithHTML x m ()+color = attr "color"+cols :: Monad m => String -> WithHTML x m ()+cols = attr "cols"+colspan :: Monad m => String -> WithHTML x m ()+colspan = attr "colspan"+compact :: Monad m => String -> WithHTML x m ()+compact = attr "compact"+content :: Monad m => String -> WithHTML x m ()+content = attr "content"+coords :: Monad m => String -> WithHTML x m ()+coords = attr "coords"+data' :: Monad m => String -> WithHTML x m ()+data' = attr "data"+datapagesize :: Monad m => String -> WithHTML x m ()+datapagesize = attr "datapagesize"+datetime :: Monad m => String -> WithHTML x m ()+datetime = attr "datetime"+declare :: Monad m => String -> WithHTML x m ()+declare = attr "declare"+defer :: Monad m => String -> WithHTML x m ()+defer = attr "defer"+dir :: Monad m => String -> WithHTML x m ()+dir = attr "dir"+disabled :: Monad m => String -> WithHTML x m ()+disabled = attr "disabled"+enctype :: Monad m => String -> WithHTML x m ()+enctype = attr "enctype"+event :: Monad m => String -> WithHTML x m ()+event = attr "event"+face :: Monad m => String -> WithHTML x m ()+face = attr "face"+for :: Monad m => String -> WithHTML x m ()+for = attr "for"+frame :: Monad m => String -> WithHTML x m ()+frame = attr "frame"+frameborder :: Monad m => String -> WithHTML x m ()+frameborder = attr "frameborder"+headers :: Monad m => String -> WithHTML x m ()+headers = attr "headers"+height :: Monad m => String -> WithHTML x m ()+height = attr "height"+href :: Monad m => String -> WithHTML x m ()+href = attr "href"+hreflang :: Monad m => String -> WithHTML x m ()+hreflang = attr "hreflang"+hspace :: Monad m => String -> WithHTML x m ()+hspace = attr "hspace"+http_equiv :: Monad m => String -> WithHTML x m ()+http_equiv = attr "http-equiv"+id :: Monad m => String -> WithHTML x m ()+id = attr "id"+ismap :: Monad m => String -> WithHTML x m ()+ismap = attr "ismap"+label :: Monad m => String -> WithHTML x m ()+label = attr "label"+lang :: Monad m => String -> WithHTML x m ()+lang = attr "lang"+language :: Monad m => String -> WithHTML x m ()+language = attr "language"+link :: Monad m => String -> WithHTML x m ()+link = attr "link"+longdesc :: Monad m => String -> WithHTML x m ()+longdesc = attr "longdesc"+marginheight :: Monad m => String -> WithHTML x m ()+marginheight = attr "marginheight"+marginwidth :: Monad m => String -> WithHTML x m ()+marginwidth = attr "marginwidth"+maxlength :: Monad m => String -> WithHTML x m ()+maxlength = attr "maxlength"+media :: Monad m => String -> WithHTML x m ()+media = attr "media"+method :: Monad m => String -> WithHTML x m ()+method = attr "method"+multiple :: Monad m => String -> WithHTML x m ()+multiple = attr "multiple"+name :: Monad m => String -> WithHTML x m ()+name = attr "name"+nohref :: Monad m => String -> WithHTML x m ()+nohref = attr "nohref"+noresize :: Monad m => String -> WithHTML x m ()+noresize = attr "noresize"+noshade :: Monad m => String -> WithHTML x m ()+noshade = attr "noshade"+nowrap :: Monad m => String -> WithHTML x m ()+nowrap = attr "nowrap"+object :: Monad m => String -> WithHTML x m ()+object = attr "object"+onblur :: Monad m => String -> WithHTML x m ()+onblur = attr "onblur"+onchange :: Monad m => String -> WithHTML x m ()+onchange = attr "onchange"+onclick :: Monad m => String -> WithHTML x m ()+onclick = attr "onclick"+ondblclick :: Monad m => String -> WithHTML x m ()+ondblclick = attr "ondblclick"+onfocus :: Monad m => String -> WithHTML x m ()+onfocus = attr "onfocus"+onkeydown :: Monad m => String -> WithHTML x m ()+onkeydown = attr "onkeydown"+onkeypress :: Monad m => String -> WithHTML x m ()+onkeypress = attr "onkeypress"+onkeyup :: Monad m => String -> WithHTML x m ()+onkeyup = attr "onkeyup"+onload :: Monad m => String -> WithHTML x m ()+onload = attr "onload"+onmousedown :: Monad m => String -> WithHTML x m ()+onmousedown = attr "onmousedown"+onmousemove :: Monad m => String -> WithHTML x m ()+onmousemove = attr "onmousemove"+onmouseout :: Monad m => String -> WithHTML x m ()+onmouseout = attr "onmouseout"+onmouseover :: Monad m => String -> WithHTML x m ()+onmouseover = attr "onmouseover"+onmouseup :: Monad m => String -> WithHTML x m ()+onmouseup = attr "onmouseup"+onreset :: Monad m => String -> WithHTML x m ()+onreset = attr "onreset"+onselect :: Monad m => String -> WithHTML x m ()+onselect = attr "onselect"+onsubmit :: Monad m => String -> WithHTML x m ()+onsubmit = attr "onsubmit"+onunload :: Monad m => String -> WithHTML x m ()+onunload = attr "onunload"+profile :: Monad m => String -> WithHTML x m ()+profile = attr "profile"+prompt :: Monad m => String -> WithHTML x m ()+prompt = attr "prompt"+readonly :: Monad m => String -> WithHTML x m ()+readonly = attr "readonly"+rel :: Monad m => String -> WithHTML x m ()+rel = attr "rel"+rev :: Monad m => String -> WithHTML x m ()+rev = attr "rev"+rows :: Monad m => String -> WithHTML x m ()+rows = attr "rows"+rowspan :: Monad m => String -> WithHTML x m ()+rowspan = attr "rowspan"+rules :: Monad m => String -> WithHTML x m ()+rules = attr "rules"+scheme :: Monad m => String -> WithHTML x m ()+scheme = attr "scheme"+scope :: Monad m => String -> WithHTML x m ()+scope = attr "scope"+scrolling :: Monad m => String -> WithHTML x m ()+scrolling = attr "scrolling"+selected :: Monad m => String -> WithHTML x m ()+selected = attr "selected"+shape :: Monad m => String -> WithHTML x m ()+shape = attr "shape"+size :: Monad m => String -> WithHTML x m ()+size = attr "size"+span :: Monad m => String -> WithHTML x m ()+span = attr "span"+src :: Monad m => String -> WithHTML x m ()+src = attr "src"+standby :: Monad m => String -> WithHTML x m ()+standby = attr "standby"+start :: Monad m => String -> WithHTML x m ()+start = attr "start"+style :: Monad m => String -> WithHTML x m ()+style = attr "style"+summary :: Monad m => String -> WithHTML x m ()+summary = attr "summary"+tabindex :: Monad m => String -> WithHTML x m ()+tabindex = attr "tabindex"+target :: Monad m => String -> WithHTML x m ()+target = attr "target"+text :: Monad m => String -> WithHTML x m ()+text = attr "text"+title :: Monad m => String -> WithHTML x m ()+title = attr "title"+type' :: Monad m => String -> WithHTML x m ()+type' = attr "type"+usemap :: Monad m => String -> WithHTML x m ()+usemap = attr "usemap"+valign :: Monad m => String -> WithHTML x m ()+valign = attr "valign"+value :: Monad m => String -> WithHTML x m ()+value = attr "value"+valuetype :: Monad m => String -> WithHTML x m ()+valuetype = attr "valuetype"+version :: Monad m => String -> WithHTML x m ()+version = attr "version"+vlink :: Monad m => String -> WithHTML x m ()+vlink = attr "vlink"+vspace :: Monad m => String -> WithHTML x m ()+vspace = attr "vspace"+width :: Monad m => String -> WithHTML x m ()+width = attr "width"
+ WASH/HTML/HTMLMonadBase.hs view
@@ -0,0 +1,92 @@+-- © 2001, 2002, 2005 Peter Thiemann+module WASH.HTML.HTMLMonadBase+ (module WASH.HTML.HTMLMonadBase, B.ELEMENT_, B.ATTR_, B.attr_name, B.attr_value)+ where+import qualified WASH.HTML.HTMLBase as B+type Element = B.ELEMENT_+type Attributes = [Attribute]+type Attribute = B.ATTR_+data WithHTML x m a =+ WithHTML { unWithHTML :: Element -> m (a, Element) }+type HTMLCons x y m a = WithHTML x m a -> WithHTML y m a+instance Monad m => Monad (WithHTML x m) where+ return a = WithHTML (\elem -> return (a, elem))+ ma >>= f = WithHTML (\elem -> unWithHTML ma elem >>= \(a, elem') ->+ unWithHTML (f a) elem')+-- contributed by Frederik Eaton <frederik@ofb.net>+--instance MonadFix m => MonadFix (WithHTML x m) where+-- mfix f = WithHTML (\elem ->+-- mfix (\x -> (unWithHTML (f x)) elem >>= (return.fst))+-- >>= (\x -> return (x,elem)))+lift :: Monad m => m a -> WithHTML x m a+lift ma = WithHTML (\elem -> ma >>= \a -> return (a, elem))+get_attrs :: Monad m => WithHTML x m Attributes+get_attrs = WithHTML (\elem -> return (B.get_attrs_ elem, elem))+-- | empty node sequence+empty :: Monad m => WithHTML x m ()+empty = return ()+-- | concatenation of sequences+infixl 1 ##+x ## y = x >>= \a -> y >> return a+-- | cleanup of attribute values+av (str@('\"':_)) = let str1 = read str :: String in str1+av str = str+--+addNode add cdata =+ \s -> WithHTML (\elem -> return ((), add elem (cdata s)))+comment, comment_S, comment_T :: Monad m => String -> WithHTML x m ()+comment = addNode B.add_ B.comment_+comment_S = addNode B.add_ B.comment_S+comment_T = addNode B.add_ B.comment_T+-- | create a text node with all illegal characters properly escaped+text :: Monad m => String -> WithHTML x m ()+text = addNode B.add_ (B.cdata_ [])+-- | create a text node from any Showable type+showText :: (Monad m, Show a) => a -> WithHTML x m ()+showText x = text (av (show x))+-- | create a text node where the string is dropped into the webpage without+-- change, e.g., preserving entities +rawtext :: Monad m => String -> WithHTML x m ()+rawtext = addNode B.add_ (B.cdata_ [B.CDATA_ENCODED])+formattedtext :: Monad m => String -> WithHTML x m ()+formattedtext = addNode B.add_ (B.cdata_ [B.CDATA_FORMATTED])+text_S, rawtext_S, formattedtext_S :: Monad m => String -> WithHTML x m ()+text_S = addNode B.add_ (B.cdata_S [])+rawtext_S = addNode B.add_ (B.cdata_S [B.CDATA_ENCODED])+formattedtext_S = addNode B.add_ (B.cdata_S [B.CDATA_FORMATTED])+text_T, rawtext_T, formattedtext_T :: Monad m => String -> WithHTML x m ()+text_T = addNode B.add_ (B.cdata_T [])+rawtext_T = addNode B.add_ (B.cdata_T [B.CDATA_ENCODED])+formattedtext_T = addNode B.add_ (B.cdata_T [B.CDATA_FORMATTED])+attr :: Monad m => String -> String -> WithHTML x m ()+attr a = addNode B.add_attr_ (B.attr_ a)+attr_SS :: Monad m => String -> String -> WithHTML x m ()+attr_SS a = addNode B.add_attr_ (B.attr_SS a)+attr_TS :: Monad m => String -> String -> WithHTML x m ()+attr_TS a = addNode B.add_attr_ (B.attr_TS a)+attr_TD :: Monad m => String -> String -> WithHTML x m ()+attr_TD a = addNode B.add_attr_ (B.attr_TD a)+attr_SD :: Monad m => String -> String -> WithHTML x m ()+attr_SD a = addNode B.add_attr_ (B.attr_SD a)+(@@) :: Monad m => String -> String -> WithHTML x m ()+a @@ v = attr a v+addMaker subelem ma =+ WithHTML (\elem -> unWithHTML ma subelem >>= \(a, subelem') ->+ return (a, B.add_ elem subelem'))+mkElement, mkEmpty :: Monad m => String -> HTMLCons x y m a+mkElement tag = addMaker $ B.element_ tag [] []+mkEmpty tag = addMaker $ B.empty_ tag []+mkElement_S, mkEmpty_S :: Monad m => String -> HTMLCons x y m a+mkElement_S tag = addMaker $ B.element_S tag [] []+mkEmpty_S tag = addMaker $ B.empty_S tag []+mkElement_T, mkEmpty_T :: Monad m => String -> HTMLCons x y m a+mkElement_T tag = addMaker $ B.element_T tag [] []+mkEmpty_T tag = addMaker $ B.empty_T tag []+build_document :: Monad m => WithHTML x m a -> m Element+build_document ma = unWithHTML ma+ (B.doctype_T + [ "html"+ , "PUBLIC"+ , "\"-//W3C//DTD XHTML 1.0 Transitional//EN\""+ , "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""] [])+ >>= \ (a, elem) -> return elem
+ WASH/HTML/HTMLPrelude.hs view
@@ -0,0 +1,5209 @@+{-# OPTIONS -fglasgow-exts #-}+-- © 2001 Peter Thiemann+module WASH.HTML.HTMLPrelude + (module WASH.HTML.HTMLPrelude,module WASH.HTML.HTMLTypedBase)+ where+import Prelude hiding (div,head,map,span)+import WASH.HTML.HTMLTypedBase+-- identity function+empty x = x+-- reverse function application+( # ) = flip ($) -- DON'T REMOVE THE SPACES+-- reverse function composition+( ## ) = flip (.) -- DON'T REMOVE THE SPACES+-- +instance AddTo DOCUMENT HTML+build_document :: (ELT HTML -> ELT HTML) -> ELT DOCUMENT+build_document addToHTML = make DOCUMENT # html addToHTML+-- end fixed prologue+a f elt = elt `add` f (make A)+abbr f elt = elt `add` f (make ABBR)+acronym f elt = elt `add` f (make ACRONYM)+address f elt = elt `add` f (make ADDRESS)+applet f elt = elt `add` f (make APPLET)+area f elt = elt `add` f (make AREA)+b f elt = elt `add` f (make B)+base f elt = elt `add` f (make BASE)+basefont f elt = elt `add` f (make BASEFONT)+bdo f elt = elt `add` f (make BDO)+big f elt = elt `add` f (make BIG)+blockquote f elt = elt `add` f (make BLOCKQUOTE)+body f elt = elt `add` f (make BODY)+br f elt = elt `add` f (make BR)+button f elt = elt `add` f (make BUTTON)+caption f elt = elt `add` f (make CAPTION)+center f elt = elt `add` f (make CENTER)+cite f elt = elt `add` f (make CITE)+code f elt = elt `add` f (make CODE)+col f elt = elt `add` f (make COL)+colgroup f elt = elt `add` f (make COLGROUP)+dd f elt = elt `add` f (make DD)+del f elt = elt `add` f (make DEL)+dfn f elt = elt `add` f (make DFN)+dir f elt = elt `add` f (make DIR)+div f elt = elt `add` f (make DIV)+dl f elt = elt `add` f (make DL)+dt f elt = elt `add` f (make DT)+em f elt = elt `add` f (make EM)+fieldset f elt = elt `add` f (make FIELDSET)+font f elt = elt `add` f (make FONT)+form f elt = elt `add` f (make FORM)+h1 f elt = elt `add` f (make H1)+h2 f elt = elt `add` f (make H2)+h3 f elt = elt `add` f (make H3)+h4 f elt = elt `add` f (make H4)+h5 f elt = elt `add` f (make H5)+h6 f elt = elt `add` f (make H6)+head f elt = elt `add` f (make HEAD)+hr f elt = elt `add` f (make HR)+html f elt = elt `add` f (make HTML)+i f elt = elt `add` f (make I)+iframe f elt = elt `add` f (make IFRAME)+img f elt = elt `add` f (make IMG)+input f elt = elt `add` f (make INPUT)+ins f elt = elt `add` f (make INS)+isindex f elt = elt `add` f (make ISINDEX)+kbd f elt = elt `add` f (make KBD)+label f elt = elt `add` f (make LABEL)+legend f elt = elt `add` f (make LEGEND)+li f elt = elt `add` f (make LI)+link f elt = elt `add` f (make LINK)+map f elt = elt `add` f (make MAP)+menu f elt = elt `add` f (make MENU)+meta f elt = elt `add` f (make META)+noframes f elt = elt `add` f (make NOFRAMES)+noscript f elt = elt `add` f (make NOSCRIPT)+object f elt = elt `add` f (make OBJECT)+ol f elt = elt `add` f (make OL)+optgroup f elt = elt `add` f (make OPTGROUP)+option f elt = elt `add` f (make OPTION)+p f elt = elt `add` f (make P)+param f elt = elt `add` f (make PARAM)+pre f elt = elt `add` f (make PRE)+q f elt = elt `add` f (make Q)+s f elt = elt `add` f (make S)+samp f elt = elt `add` f (make SAMP)+script f elt = elt `add` f (make SCRIPT)+select f elt = elt `add` f (make SELECT)+small f elt = elt `add` f (make SMALL)+span f elt = elt `add` f (make SPAN)+strike f elt = elt `add` f (make STRIKE)+strong f elt = elt `add` f (make STRONG)+style f elt = elt `add` f (make STYLE)+sub f elt = elt `add` f (make SUB)+sup f elt = elt `add` f (make SUP)+table f elt = elt `add` f (make TABLE)+tbody f elt = elt `add` f (make TBODY)+td f elt = elt `add` f (make TD)+textarea f elt = elt `add` f (make TEXTAREA)+tfoot f elt = elt `add` f (make TFOOT)+th f elt = elt `add` f (make TH)+thead f elt = elt `add` f (make THEAD)+title f elt = elt `add` f (make TITLE)+tr f elt = elt `add` f (make TR)+tt f elt = elt `add` f (make TT)+u f elt = elt `add` f (make U)+ul f elt = elt `add` f (make UL)+var f elt = elt `add` f (make VAR)+data A = A+instance Show A where show A = "A"+data ABBR = ABBR+instance Show ABBR where show ABBR = "ABBR"+data ACRONYM = ACRONYM+instance Show ACRONYM where show ACRONYM = "ACRONYM"+data ADDRESS = ADDRESS+instance Show ADDRESS where show ADDRESS = "ADDRESS"+data APPLET = APPLET+instance Show APPLET where show APPLET = "APPLET"+data AREA = AREA+instance Show AREA where show AREA = "AREA"+data B = B+instance Show B where show B = "B"+data BASE = BASE+instance Show BASE where show BASE = "BASE"+data BASEFONT = BASEFONT+instance Show BASEFONT where show BASEFONT = "BASEFONT"+data BDO = BDO+instance Show BDO where show BDO = "BDO"+data BIG = BIG+instance Show BIG where show BIG = "BIG"+data BLOCKQUOTE = BLOCKQUOTE+instance Show BLOCKQUOTE where show BLOCKQUOTE = "BLOCKQUOTE"+data BODY = BODY+instance Show BODY where show BODY = "BODY"+data BR = BR+instance Show BR where show BR = "BR"+data BUTTON = BUTTON+instance Show BUTTON where show BUTTON = "BUTTON"+data CAPTION = CAPTION+instance Show CAPTION where show CAPTION = "CAPTION"+data CENTER = CENTER+instance Show CENTER where show CENTER = "CENTER"+data CITE = CITE+instance Show CITE where show CITE = "CITE"+data CODE = CODE+instance Show CODE where show CODE = "CODE"+data COL = COL+instance Show COL where show COL = "COL"+data COLGROUP = COLGROUP+instance Show COLGROUP where show COLGROUP = "COLGROUP"+data DD = DD+instance Show DD where show DD = "DD"+data DEL = DEL+instance Show DEL where show DEL = "DEL"+data DFN = DFN+instance Show DFN where show DFN = "DFN"+data DIR = DIR+instance Show DIR where show DIR = "DIR"+data DIV = DIV+instance Show DIV where show DIV = "DIV"+data DL = DL+instance Show DL where show DL = "DL"+data DT = DT+instance Show DT where show DT = "DT"+data EM = EM+instance Show EM where show EM = "EM"+data FIELDSET = FIELDSET+instance Show FIELDSET where show FIELDSET = "FIELDSET"+data FONT = FONT+instance Show FONT where show FONT = "FONT"+data FORM = FORM+instance Show FORM where show FORM = "FORM"+data H1 = H1+instance Show H1 where show H1 = "H1"+data H2 = H2+instance Show H2 where show H2 = "H2"+data H3 = H3+instance Show H3 where show H3 = "H3"+data H4 = H4+instance Show H4 where show H4 = "H4"+data H5 = H5+instance Show H5 where show H5 = "H5"+data H6 = H6+instance Show H6 where show H6 = "H6"+data HEAD = HEAD+instance Show HEAD where show HEAD = "HEAD"+data HR = HR+instance Show HR where show HR = "HR"+data HTML = HTML+instance Show HTML where show HTML = "HTML"+data I = I+instance Show I where show I = "I"+data IFRAME = IFRAME+instance Show IFRAME where show IFRAME = "IFRAME"+data IMG = IMG+instance Show IMG where show IMG = "IMG"+data INPUT = INPUT+instance Show INPUT where show INPUT = "INPUT"+data INS = INS+instance Show INS where show INS = "INS"+data ISINDEX = ISINDEX+instance Show ISINDEX where show ISINDEX = "ISINDEX"+data KBD = KBD+instance Show KBD where show KBD = "KBD"+data LABEL = LABEL+instance Show LABEL where show LABEL = "LABEL"+data LEGEND = LEGEND+instance Show LEGEND where show LEGEND = "LEGEND"+data LI = LI+instance Show LI where show LI = "LI"+data LINK = LINK+instance Show LINK where show LINK = "LINK"+data MAP = MAP+instance Show MAP where show MAP = "MAP"+data MENU = MENU+instance Show MENU where show MENU = "MENU"+data META = META+instance Show META where show META = "META"+data NOFRAMES = NOFRAMES+instance Show NOFRAMES where show NOFRAMES = "NOFRAMES"+data NOSCRIPT = NOSCRIPT+instance Show NOSCRIPT where show NOSCRIPT = "NOSCRIPT"+data OBJECT = OBJECT+instance Show OBJECT where show OBJECT = "OBJECT"+data OL = OL+instance Show OL where show OL = "OL"+data OPTGROUP = OPTGROUP+instance Show OPTGROUP where show OPTGROUP = "OPTGROUP"+data OPTION = OPTION+instance Show OPTION where show OPTION = "OPTION"+data P = P+instance Show P where show P = "P"+data PARAM = PARAM+instance Show PARAM where show PARAM = "PARAM"+data PRE = PRE+instance Show PRE where show PRE = "PRE"+data Q = Q+instance Show Q where show Q = "Q"+data S = S+instance Show S where show S = "S"+data SAMP = SAMP+instance Show SAMP where show SAMP = "SAMP"+data SCRIPT = SCRIPT+instance Show SCRIPT where show SCRIPT = "SCRIPT"+data SELECT = SELECT+instance Show SELECT where show SELECT = "SELECT"+data SMALL = SMALL+instance Show SMALL where show SMALL = "SMALL"+data SPAN = SPAN+instance Show SPAN where show SPAN = "SPAN"+data STRIKE = STRIKE+instance Show STRIKE where show STRIKE = "STRIKE"+data STRONG = STRONG+instance Show STRONG where show STRONG = "STRONG"+data STYLE = STYLE+instance Show STYLE where show STYLE = "STYLE"+data SUB = SUB+instance Show SUB where show SUB = "SUB"+data SUP = SUP+instance Show SUP where show SUP = "SUP"+data TABLE = TABLE+instance Show TABLE where show TABLE = "TABLE"+data TBODY = TBODY+instance Show TBODY where show TBODY = "TBODY"+data TD = TD+instance Show TD where show TD = "TD"+data TEXTAREA = TEXTAREA+instance Show TEXTAREA where show TEXTAREA = "TEXTAREA"+data TFOOT = TFOOT+instance Show TFOOT where show TFOOT = "TFOOT"+data TH = TH+instance Show TH where show TH = "TH"+data THEAD = THEAD+instance Show THEAD where show THEAD = "THEAD"+data TITLE = TITLE+instance Show TITLE where show TITLE = "TITLE"+data TR = TR+instance Show TR where show TR = "TR"+data TT = TT+instance Show TT where show TT = "TT"+data U = U+instance Show U where show U = "U"+data UL = UL+instance Show UL where show UL = "UL"+data VAR = VAR+instance Show VAR where show VAR = "VAR"+data VERSION = VERSION+instance Show VERSION where show VERSION = "VERSION"+data LANG = LANG+instance Show LANG where show LANG = "LANG"+data ONKEYUP = ONKEYUP+instance Show ONKEYUP where show ONKEYUP = "ONKEYUP"+data ONKEYDOWN = ONKEYDOWN+instance Show ONKEYDOWN where show ONKEYDOWN = "ONKEYDOWN"+data ONKEYPRESS = ONKEYPRESS+instance Show ONKEYPRESS where show ONKEYPRESS = "ONKEYPRESS"+data ONMOUSEOUT = ONMOUSEOUT+instance Show ONMOUSEOUT where show ONMOUSEOUT = "ONMOUSEOUT"+data ONMOUSEMOVE = ONMOUSEMOVE+instance Show ONMOUSEMOVE where show ONMOUSEMOVE = "ONMOUSEMOVE"+data ONMOUSEOVER = ONMOUSEOVER+instance Show ONMOUSEOVER where show ONMOUSEOVER = "ONMOUSEOVER"+data ONMOUSEUP = ONMOUSEUP+instance Show ONMOUSEUP where show ONMOUSEUP = "ONMOUSEUP"+data ONMOUSEDOWN = ONMOUSEDOWN+instance Show ONMOUSEDOWN where show ONMOUSEDOWN = "ONMOUSEDOWN"+data ONDBLCLICK = ONDBLCLICK+instance Show ONDBLCLICK where show ONDBLCLICK = "ONDBLCLICK"+data ONCLICK = ONCLICK+instance Show ONCLICK where show ONCLICK = "ONCLICK"+data CLASS = CLASS+instance Show CLASS where show CLASS = "CLASS"+data ID = ID+instance Show ID where show ID = "ID"+data FOR = FOR+instance Show FOR where show FOR = "FOR"+data EVENT = EVENT+instance Show EVENT where show EVENT = "EVENT"+data DEFER = DEFER+instance Show DEFER where show DEFER = "DEFER"+data SRC = SRC+instance Show SRC where show SRC = "SRC"+data LANGUAGE = LANGUAGE+instance Show LANGUAGE where show LANGUAGE = "LANGUAGE"+data TYPE = TYPE+instance Show TYPE where show TYPE = "TYPE"+data CHARSET = CHARSET+instance Show CHARSET where show CHARSET = "CHARSET"+data MEDIA = MEDIA+instance Show MEDIA where show MEDIA = "MEDIA"+data SCHEME = SCHEME+instance Show SCHEME where show SCHEME = "SCHEME"+data CONTENT = CONTENT+instance Show CONTENT where show CONTENT = "CONTENT"+data NAME = NAME+instance Show NAME where show NAME = "NAME"+data HTTP_EQUIV = HTTP_EQUIV+instance Show HTTP_EQUIV where show HTTP_EQUIV = "HTTP-EQUIV"+data TARGET = TARGET+instance Show TARGET where show TARGET = "TARGET"+data HREF = HREF+instance Show HREF where show HREF = "HREF"+data PROMPT = PROMPT+instance Show PROMPT where show PROMPT = "PROMPT"+data PROFILE = PROFILE+instance Show PROFILE where show PROFILE = "PROFILE"+data WIDTH = WIDTH+instance Show WIDTH where show WIDTH = "WIDTH"+data HEIGHT = HEIGHT+instance Show HEIGHT where show HEIGHT = "HEIGHT"+data ALIGN = ALIGN+instance Show ALIGN where show ALIGN = "ALIGN"+data SCROLLING = SCROLLING+instance Show SCROLLING where show SCROLLING = "SCROLLING"+data MARGINHEIGHT = MARGINHEIGHT+instance Show MARGINHEIGHT where show MARGINHEIGHT = "MARGINHEIGHT"+data MARGINWIDTH = MARGINWIDTH+instance Show MARGINWIDTH where show MARGINWIDTH = "MARGINWIDTH"+data FRAMEBORDER = FRAMEBORDER+instance Show FRAMEBORDER where show FRAMEBORDER = "FRAMEBORDER"+data LONGDESC = LONGDESC+instance Show LONGDESC where show LONGDESC = "LONGDESC"+data BGCOLOR = BGCOLOR+instance Show BGCOLOR where show BGCOLOR = "BGCOLOR"+data NOWRAP = NOWRAP+instance Show NOWRAP where show NOWRAP = "NOWRAP"+data VALIGN = VALIGN+instance Show VALIGN where show VALIGN = "VALIGN"+data CHAROFF = CHAROFF+instance Show CHAROFF where show CHAROFF = "CHAROFF"+data CHAR = CHAR+instance Show CHAR where show CHAR = "CHAR"+data COLSPAN = COLSPAN+instance Show COLSPAN where show COLSPAN = "COLSPAN"+data ROWSPAN = ROWSPAN+instance Show ROWSPAN where show ROWSPAN = "ROWSPAN"+data SCOPE = SCOPE+instance Show SCOPE where show SCOPE = "SCOPE"+data HEADERS = HEADERS+instance Show HEADERS where show HEADERS = "HEADERS"+data AXIS = AXIS+instance Show AXIS where show AXIS = "AXIS"+data DATAPAGESIZE = DATAPAGESIZE+instance Show DATAPAGESIZE where show DATAPAGESIZE = "DATAPAGESIZE"+data CELLPADDING = CELLPADDING+instance Show CELLPADDING where show CELLPADDING = "CELLPADDING"+data CELLSPACING = CELLSPACING+instance Show CELLSPACING where show CELLSPACING = "CELLSPACING"+data RULES = RULES+instance Show RULES where show RULES = "RULES"+data FRAME = FRAME+instance Show FRAME where show FRAME = "FRAME"+data BORDER = BORDER+instance Show BORDER where show BORDER = "BORDER"+data SUMMARY = SUMMARY+instance Show SUMMARY where show SUMMARY = "SUMMARY"+data ONBLUR = ONBLUR+instance Show ONBLUR where show ONBLUR = "ONBLUR"+data ONFOCUS = ONFOCUS+instance Show ONFOCUS where show ONFOCUS = "ONFOCUS"+data ACCESSKEY = ACCESSKEY+instance Show ACCESSKEY where show ACCESSKEY = "ACCESSKEY"+data TABINDEX = TABINDEX+instance Show TABINDEX where show TABINDEX = "TABINDEX"+data DISABLED = DISABLED+instance Show DISABLED where show DISABLED = "DISABLED"+data VALUE = VALUE+instance Show VALUE where show VALUE = "VALUE"+data ONCHANGE = ONCHANGE+instance Show ONCHANGE where show ONCHANGE = "ONCHANGE"+data ONSELECT = ONSELECT+instance Show ONSELECT where show ONSELECT = "ONSELECT"+data READONLY = READONLY+instance Show READONLY where show READONLY = "READONLY"+data COLS = COLS+instance Show COLS where show COLS = "COLS"+data ROWS = ROWS+instance Show ROWS where show ROWS = "ROWS"+data SELECTED = SELECTED+instance Show SELECTED where show SELECTED = "SELECTED"+data MULTIPLE = MULTIPLE+instance Show MULTIPLE where show MULTIPLE = "MULTIPLE"+data SIZE = SIZE+instance Show SIZE where show SIZE = "SIZE"+data ACCEPT = ACCEPT+instance Show ACCEPT where show ACCEPT = "ACCEPT"+data USEMAP = USEMAP+instance Show USEMAP where show USEMAP = "USEMAP"+data ALT = ALT+instance Show ALT where show ALT = "ALT"+data MAXLENGTH = MAXLENGTH+instance Show MAXLENGTH where show MAXLENGTH = "MAXLENGTH"+data CHECKED = CHECKED+instance Show CHECKED where show CHECKED = "CHECKED"+data ACCEPT_CHARSET = ACCEPT_CHARSET+instance Show ACCEPT_CHARSET where show ACCEPT_CHARSET = "ACCEPT-CHARSET"+data ONRESET = ONRESET+instance Show ONRESET where show ONRESET = "ONRESET"+data ONSUBMIT = ONSUBMIT+instance Show ONSUBMIT where show ONSUBMIT = "ONSUBMIT"+data ENCTYPE = ENCTYPE+instance Show ENCTYPE where show ENCTYPE = "ENCTYPE"+data METHOD = METHOD+instance Show METHOD where show METHOD = "METHOD"+data ACTION = ACTION+instance Show ACTION where show ACTION = "ACTION"+data COMPACT = COMPACT+instance Show COMPACT where show COMPACT = "COMPACT"+data START = START+instance Show START where show START = "START"+data DATETIME = DATETIME+instance Show DATETIME where show DATETIME = "DATETIME"+data NOSHADE = NOSHADE+instance Show NOSHADE where show NOSHADE = "NOSHADE"+data VSPACE = VSPACE+instance Show VSPACE where show VSPACE = "VSPACE"+data HSPACE = HSPACE+instance Show HSPACE where show HSPACE = "HSPACE"+data ARCHIVE = ARCHIVE+instance Show ARCHIVE where show ARCHIVE = "ARCHIVE"+data CODEBASE = CODEBASE+instance Show CODEBASE where show CODEBASE = "CODEBASE"+data VALUETYPE = VALUETYPE+instance Show VALUETYPE where show VALUETYPE = "VALUETYPE"+data STANDBY = STANDBY+instance Show STANDBY where show STANDBY = "STANDBY"+data CODETYPE = CODETYPE+instance Show CODETYPE where show CODETYPE = "CODETYPE"+data DATA = DATA+instance Show DATA where show DATA = "DATA"+data CLASSID = CLASSID+instance Show CLASSID where show CLASSID = "CLASSID"+data DECLARE = DECLARE+instance Show DECLARE where show DECLARE = "DECLARE"+data ISMAP = ISMAP+instance Show ISMAP where show ISMAP = "ISMAP"+data REV = REV+instance Show REV where show REV = "REV"+data REL = REL+instance Show REL where show REL = "REL"+data HREFLANG = HREFLANG+instance Show HREFLANG where show HREFLANG = "HREFLANG"+data NOHREF = NOHREF+instance Show NOHREF where show NOHREF = "NOHREF"+data COORDS = COORDS+instance Show COORDS where show COORDS = "COORDS"+data SHAPE = SHAPE+instance Show SHAPE where show SHAPE = "SHAPE"+data ALINK = ALINK+instance Show ALINK where show ALINK = "ALINK"+data VLINK = VLINK+instance Show VLINK where show VLINK = "VLINK"+data TEXT = TEXT+instance Show TEXT where show TEXT = "TEXT"+data BACKGROUND = BACKGROUND+instance Show BACKGROUND where show BACKGROUND = "BACKGROUND"+data ONUNLOAD = ONUNLOAD+instance Show ONUNLOAD where show ONUNLOAD = "ONUNLOAD"+data ONLOAD = ONLOAD+instance Show ONLOAD where show ONLOAD = "ONLOAD"+data CLEAR = CLEAR+instance Show CLEAR where show CLEAR = "CLEAR"+data FACE = FACE+instance Show FACE where show FACE = "FACE"+data COLOR = COLOR+instance Show COLOR where show COLOR = "COLOR"+instance TAG HTML+instance AddTo HTML HEAD+instance AddTo HTML BODY+instance TAG NOSCRIPT+instance AddTo NOSCRIPT P+instance AddTo NOSCRIPT H1+instance AddTo NOSCRIPT H2+instance AddTo NOSCRIPT H3+instance AddTo NOSCRIPT H4+instance AddTo NOSCRIPT H5+instance AddTo NOSCRIPT H6+instance AddTo NOSCRIPT UL+instance AddTo NOSCRIPT OL+instance AddTo NOSCRIPT DIR+instance AddTo NOSCRIPT MENU+instance AddTo NOSCRIPT PRE+instance AddTo NOSCRIPT DL+instance AddTo NOSCRIPT DIV+instance AddTo NOSCRIPT CENTER+instance AddTo NOSCRIPT NOSCRIPT+instance AddTo NOSCRIPT NOFRAMES+instance AddTo NOSCRIPT BLOCKQUOTE+instance AddTo NOSCRIPT FORM+instance AddTo NOSCRIPT ISINDEX+instance AddTo NOSCRIPT HR+instance AddTo NOSCRIPT TABLE+instance AddTo NOSCRIPT FIELDSET+instance AddTo NOSCRIPT ADDRESS+instance AddTo NOSCRIPT CDATA+instance AddTo NOSCRIPT TT+instance AddTo NOSCRIPT I+instance AddTo NOSCRIPT B+instance AddTo NOSCRIPT U+instance AddTo NOSCRIPT S+instance AddTo NOSCRIPT STRIKE+instance AddTo NOSCRIPT BIG+instance AddTo NOSCRIPT SMALL+instance AddTo NOSCRIPT EM+instance AddTo NOSCRIPT STRONG+instance AddTo NOSCRIPT DFN+instance AddTo NOSCRIPT CODE+instance AddTo NOSCRIPT SAMP+instance AddTo NOSCRIPT KBD+instance AddTo NOSCRIPT VAR+instance AddTo NOSCRIPT CITE+instance AddTo NOSCRIPT ABBR+instance AddTo NOSCRIPT ACRONYM+instance AddTo NOSCRIPT A+instance AddTo NOSCRIPT IMG+instance AddTo NOSCRIPT APPLET+instance AddTo NOSCRIPT OBJECT+instance AddTo NOSCRIPT FONT+instance AddTo NOSCRIPT BASEFONT+instance AddTo NOSCRIPT BR+instance AddTo NOSCRIPT SCRIPT+instance AddTo NOSCRIPT MAP+instance AddTo NOSCRIPT Q+instance AddTo NOSCRIPT SUB+instance AddTo NOSCRIPT SUP+instance AddTo NOSCRIPT SPAN+instance AddTo NOSCRIPT BDO+instance AddTo NOSCRIPT IFRAME+instance AddTo NOSCRIPT INPUT+instance AddTo NOSCRIPT SELECT+instance AddTo NOSCRIPT TEXTAREA+instance AddTo NOSCRIPT LABEL+instance AddTo NOSCRIPT BUTTON+instance TAG SCRIPT+instance AddTo SCRIPT CDATA+instance TAG STYLE+instance AddTo STYLE CDATA+instance TAG META where make = make_empty+instance TAG BASE where make = make_empty+instance TAG ISINDEX where make = make_empty+instance TAG TITLE+instance AddTo TITLE CDATA+instance TAG HEAD+instance AddTo HEAD TITLE+instance AddTo HEAD ISINDEX+instance AddTo HEAD BASE+instance AddTo HEAD SCRIPT+instance AddTo HEAD STYLE+instance AddTo HEAD META+instance AddTo HEAD LINK+instance AddTo HEAD OBJECT+instance TAG NOFRAMES+instance AddTo NOFRAMES P+instance AddTo NOFRAMES H1+instance AddTo NOFRAMES H2+instance AddTo NOFRAMES H3+instance AddTo NOFRAMES H4+instance AddTo NOFRAMES H5+instance AddTo NOFRAMES H6+instance AddTo NOFRAMES UL+instance AddTo NOFRAMES OL+instance AddTo NOFRAMES DIR+instance AddTo NOFRAMES MENU+instance AddTo NOFRAMES PRE+instance AddTo NOFRAMES DL+instance AddTo NOFRAMES DIV+instance AddTo NOFRAMES CENTER+instance AddTo NOFRAMES NOSCRIPT+instance AddTo NOFRAMES NOFRAMES+instance AddTo NOFRAMES BLOCKQUOTE+instance AddTo NOFRAMES FORM+instance AddTo NOFRAMES ISINDEX+instance AddTo NOFRAMES HR+instance AddTo NOFRAMES TABLE+instance AddTo NOFRAMES FIELDSET+instance AddTo NOFRAMES ADDRESS+instance AddTo NOFRAMES CDATA+instance AddTo NOFRAMES TT+instance AddTo NOFRAMES I+instance AddTo NOFRAMES B+instance AddTo NOFRAMES U+instance AddTo NOFRAMES S+instance AddTo NOFRAMES STRIKE+instance AddTo NOFRAMES BIG+instance AddTo NOFRAMES SMALL+instance AddTo NOFRAMES EM+instance AddTo NOFRAMES STRONG+instance AddTo NOFRAMES DFN+instance AddTo NOFRAMES CODE+instance AddTo NOFRAMES SAMP+instance AddTo NOFRAMES KBD+instance AddTo NOFRAMES VAR+instance AddTo NOFRAMES CITE+instance AddTo NOFRAMES ABBR+instance AddTo NOFRAMES ACRONYM+instance AddTo NOFRAMES A+instance AddTo NOFRAMES IMG+instance AddTo NOFRAMES APPLET+instance AddTo NOFRAMES OBJECT+instance AddTo NOFRAMES FONT+instance AddTo NOFRAMES BASEFONT+instance AddTo NOFRAMES BR+instance AddTo NOFRAMES SCRIPT+instance AddTo NOFRAMES MAP+instance AddTo NOFRAMES Q+instance AddTo NOFRAMES SUB+instance AddTo NOFRAMES SUP+instance AddTo NOFRAMES SPAN+instance AddTo NOFRAMES BDO+instance AddTo NOFRAMES IFRAME+instance AddTo NOFRAMES INPUT+instance AddTo NOFRAMES SELECT+instance AddTo NOFRAMES TEXTAREA+instance AddTo NOFRAMES LABEL+instance AddTo NOFRAMES BUTTON+instance TAG IFRAME+instance AddTo IFRAME P+instance AddTo IFRAME H1+instance AddTo IFRAME H2+instance AddTo IFRAME H3+instance AddTo IFRAME H4+instance AddTo IFRAME H5+instance AddTo IFRAME H6+instance AddTo IFRAME UL+instance AddTo IFRAME OL+instance AddTo IFRAME DIR+instance AddTo IFRAME MENU+instance AddTo IFRAME PRE+instance AddTo IFRAME DL+instance AddTo IFRAME DIV+instance AddTo IFRAME CENTER+instance AddTo IFRAME NOSCRIPT+instance AddTo IFRAME NOFRAMES+instance AddTo IFRAME BLOCKQUOTE+instance AddTo IFRAME FORM+instance AddTo IFRAME ISINDEX+instance AddTo IFRAME HR+instance AddTo IFRAME TABLE+instance AddTo IFRAME FIELDSET+instance AddTo IFRAME ADDRESS+instance AddTo IFRAME CDATA+instance AddTo IFRAME TT+instance AddTo IFRAME I+instance AddTo IFRAME B+instance AddTo IFRAME U+instance AddTo IFRAME S+instance AddTo IFRAME STRIKE+instance AddTo IFRAME BIG+instance AddTo IFRAME SMALL+instance AddTo IFRAME EM+instance AddTo IFRAME STRONG+instance AddTo IFRAME DFN+instance AddTo IFRAME CODE+instance AddTo IFRAME SAMP+instance AddTo IFRAME KBD+instance AddTo IFRAME VAR+instance AddTo IFRAME CITE+instance AddTo IFRAME ABBR+instance AddTo IFRAME ACRONYM+instance AddTo IFRAME A+instance AddTo IFRAME IMG+instance AddTo IFRAME APPLET+instance AddTo IFRAME OBJECT+instance AddTo IFRAME FONT+instance AddTo IFRAME BASEFONT+instance AddTo IFRAME BR+instance AddTo IFRAME SCRIPT+instance AddTo IFRAME MAP+instance AddTo IFRAME Q+instance AddTo IFRAME SUB+instance AddTo IFRAME SUP+instance AddTo IFRAME SPAN+instance AddTo IFRAME BDO+instance AddTo IFRAME IFRAME+instance AddTo IFRAME INPUT+instance AddTo IFRAME SELECT+instance AddTo IFRAME TEXTAREA+instance AddTo IFRAME LABEL+instance AddTo IFRAME BUTTON+instance TAG TH+instance AddTo TH P+instance AddTo TH H1+instance AddTo TH H2+instance AddTo TH H3+instance AddTo TH H4+instance AddTo TH H5+instance AddTo TH H6+instance AddTo TH UL+instance AddTo TH OL+instance AddTo TH DIR+instance AddTo TH MENU+instance AddTo TH PRE+instance AddTo TH DL+instance AddTo TH DIV+instance AddTo TH CENTER+instance AddTo TH NOSCRIPT+instance AddTo TH NOFRAMES+instance AddTo TH BLOCKQUOTE+instance AddTo TH FORM+instance AddTo TH ISINDEX+instance AddTo TH HR+instance AddTo TH TABLE+instance AddTo TH FIELDSET+instance AddTo TH ADDRESS+instance AddTo TH CDATA+instance AddTo TH TT+instance AddTo TH I+instance AddTo TH B+instance AddTo TH U+instance AddTo TH S+instance AddTo TH STRIKE+instance AddTo TH BIG+instance AddTo TH SMALL+instance AddTo TH EM+instance AddTo TH STRONG+instance AddTo TH DFN+instance AddTo TH CODE+instance AddTo TH SAMP+instance AddTo TH KBD+instance AddTo TH VAR+instance AddTo TH CITE+instance AddTo TH ABBR+instance AddTo TH ACRONYM+instance AddTo TH A+instance AddTo TH IMG+instance AddTo TH APPLET+instance AddTo TH OBJECT+instance AddTo TH FONT+instance AddTo TH BASEFONT+instance AddTo TH BR+instance AddTo TH SCRIPT+instance AddTo TH MAP+instance AddTo TH Q+instance AddTo TH SUB+instance AddTo TH SUP+instance AddTo TH SPAN+instance AddTo TH BDO+instance AddTo TH IFRAME+instance AddTo TH INPUT+instance AddTo TH SELECT+instance AddTo TH TEXTAREA+instance AddTo TH LABEL+instance AddTo TH BUTTON+instance TAG TD+instance AddTo TD P+instance AddTo TD H1+instance AddTo TD H2+instance AddTo TD H3+instance AddTo TD H4+instance AddTo TD H5+instance AddTo TD H6+instance AddTo TD UL+instance AddTo TD OL+instance AddTo TD DIR+instance AddTo TD MENU+instance AddTo TD PRE+instance AddTo TD DL+instance AddTo TD DIV+instance AddTo TD CENTER+instance AddTo TD NOSCRIPT+instance AddTo TD NOFRAMES+instance AddTo TD BLOCKQUOTE+instance AddTo TD FORM+instance AddTo TD ISINDEX+instance AddTo TD HR+instance AddTo TD TABLE+instance AddTo TD FIELDSET+instance AddTo TD ADDRESS+instance AddTo TD CDATA+instance AddTo TD TT+instance AddTo TD I+instance AddTo TD B+instance AddTo TD U+instance AddTo TD S+instance AddTo TD STRIKE+instance AddTo TD BIG+instance AddTo TD SMALL+instance AddTo TD EM+instance AddTo TD STRONG+instance AddTo TD DFN+instance AddTo TD CODE+instance AddTo TD SAMP+instance AddTo TD KBD+instance AddTo TD VAR+instance AddTo TD CITE+instance AddTo TD ABBR+instance AddTo TD ACRONYM+instance AddTo TD A+instance AddTo TD IMG+instance AddTo TD APPLET+instance AddTo TD OBJECT+instance AddTo TD FONT+instance AddTo TD BASEFONT+instance AddTo TD BR+instance AddTo TD SCRIPT+instance AddTo TD MAP+instance AddTo TD Q+instance AddTo TD SUB+instance AddTo TD SUP+instance AddTo TD SPAN+instance AddTo TD BDO+instance AddTo TD IFRAME+instance AddTo TD INPUT+instance AddTo TD SELECT+instance AddTo TD TEXTAREA+instance AddTo TD LABEL+instance AddTo TD BUTTON+instance TAG TR+instance AddTo TR TH+instance AddTo TR TD+instance TAG COL where make = make_empty+instance TAG COLGROUP+instance AddTo COLGROUP COL+instance TAG TBODY+instance AddTo TBODY TR+instance TAG TFOOT+instance AddTo TFOOT TR+instance TAG THEAD+instance AddTo THEAD TR+instance TAG CAPTION+instance AddTo CAPTION CDATA+instance AddTo CAPTION TT+instance AddTo CAPTION I+instance AddTo CAPTION B+instance AddTo CAPTION U+instance AddTo CAPTION S+instance AddTo CAPTION STRIKE+instance AddTo CAPTION BIG+instance AddTo CAPTION SMALL+instance AddTo CAPTION EM+instance AddTo CAPTION STRONG+instance AddTo CAPTION DFN+instance AddTo CAPTION CODE+instance AddTo CAPTION SAMP+instance AddTo CAPTION KBD+instance AddTo CAPTION VAR+instance AddTo CAPTION CITE+instance AddTo CAPTION ABBR+instance AddTo CAPTION ACRONYM+instance AddTo CAPTION A+instance AddTo CAPTION IMG+instance AddTo CAPTION APPLET+instance AddTo CAPTION OBJECT+instance AddTo CAPTION FONT+instance AddTo CAPTION BASEFONT+instance AddTo CAPTION BR+instance AddTo CAPTION SCRIPT+instance AddTo CAPTION MAP+instance AddTo CAPTION Q+instance AddTo CAPTION SUB+instance AddTo CAPTION SUP+instance AddTo CAPTION SPAN+instance AddTo CAPTION BDO+instance AddTo CAPTION IFRAME+instance AddTo CAPTION INPUT+instance AddTo CAPTION SELECT+instance AddTo CAPTION TEXTAREA+instance AddTo CAPTION LABEL+instance AddTo CAPTION BUTTON+instance TAG TABLE+instance AddTo TABLE CAPTION+instance AddTo TABLE COL+instance AddTo TABLE COLGROUP+instance AddTo TABLE THEAD+instance AddTo TABLE TFOOT+instance AddTo TABLE TBODY+instance TAG BUTTON+instance AddTo BUTTON P+instance AddTo BUTTON H1+instance AddTo BUTTON H2+instance AddTo BUTTON H3+instance AddTo BUTTON H4+instance AddTo BUTTON H5+instance AddTo BUTTON H6+instance AddTo BUTTON UL+instance AddTo BUTTON OL+instance AddTo BUTTON DIR+instance AddTo BUTTON MENU+instance AddTo BUTTON PRE+instance AddTo BUTTON DL+instance AddTo BUTTON DIV+instance AddTo BUTTON CENTER+instance AddTo BUTTON NOSCRIPT+instance AddTo BUTTON NOFRAMES+instance AddTo BUTTON BLOCKQUOTE+instance AddTo BUTTON HR+instance AddTo BUTTON TABLE+instance AddTo BUTTON ADDRESS+instance AddTo BUTTON CDATA+instance AddTo BUTTON TT+instance AddTo BUTTON I+instance AddTo BUTTON B+instance AddTo BUTTON U+instance AddTo BUTTON S+instance AddTo BUTTON STRIKE+instance AddTo BUTTON BIG+instance AddTo BUTTON SMALL+instance AddTo BUTTON EM+instance AddTo BUTTON STRONG+instance AddTo BUTTON DFN+instance AddTo BUTTON CODE+instance AddTo BUTTON SAMP+instance AddTo BUTTON KBD+instance AddTo BUTTON VAR+instance AddTo BUTTON CITE+instance AddTo BUTTON ABBR+instance AddTo BUTTON ACRONYM+instance AddTo BUTTON IMG+instance AddTo BUTTON APPLET+instance AddTo BUTTON OBJECT+instance AddTo BUTTON FONT+instance AddTo BUTTON BASEFONT+instance AddTo BUTTON BR+instance AddTo BUTTON SCRIPT+instance AddTo BUTTON MAP+instance AddTo BUTTON Q+instance AddTo BUTTON SUB+instance AddTo BUTTON SUP+instance AddTo BUTTON SPAN+instance AddTo BUTTON BDO+instance TAG LEGEND+instance AddTo LEGEND CDATA+instance AddTo LEGEND TT+instance AddTo LEGEND I+instance AddTo LEGEND B+instance AddTo LEGEND U+instance AddTo LEGEND S+instance AddTo LEGEND STRIKE+instance AddTo LEGEND BIG+instance AddTo LEGEND SMALL+instance AddTo LEGEND EM+instance AddTo LEGEND STRONG+instance AddTo LEGEND DFN+instance AddTo LEGEND CODE+instance AddTo LEGEND SAMP+instance AddTo LEGEND KBD+instance AddTo LEGEND VAR+instance AddTo LEGEND CITE+instance AddTo LEGEND ABBR+instance AddTo LEGEND ACRONYM+instance AddTo LEGEND A+instance AddTo LEGEND IMG+instance AddTo LEGEND APPLET+instance AddTo LEGEND OBJECT+instance AddTo LEGEND FONT+instance AddTo LEGEND BASEFONT+instance AddTo LEGEND BR+instance AddTo LEGEND SCRIPT+instance AddTo LEGEND MAP+instance AddTo LEGEND Q+instance AddTo LEGEND SUB+instance AddTo LEGEND SUP+instance AddTo LEGEND SPAN+instance AddTo LEGEND BDO+instance AddTo LEGEND IFRAME+instance AddTo LEGEND INPUT+instance AddTo LEGEND SELECT+instance AddTo LEGEND TEXTAREA+instance AddTo LEGEND LABEL+instance AddTo LEGEND BUTTON+instance TAG FIELDSET+instance AddTo FIELDSET CDATA+instance AddTo FIELDSET LEGEND+instance AddTo FIELDSET P+instance AddTo FIELDSET H1+instance AddTo FIELDSET H2+instance AddTo FIELDSET H3+instance AddTo FIELDSET H4+instance AddTo FIELDSET H5+instance AddTo FIELDSET H6+instance AddTo FIELDSET UL+instance AddTo FIELDSET OL+instance AddTo FIELDSET DIR+instance AddTo FIELDSET MENU+instance AddTo FIELDSET PRE+instance AddTo FIELDSET DL+instance AddTo FIELDSET DIV+instance AddTo FIELDSET CENTER+instance AddTo FIELDSET NOSCRIPT+instance AddTo FIELDSET NOFRAMES+instance AddTo FIELDSET BLOCKQUOTE+instance AddTo FIELDSET FORM+instance AddTo FIELDSET ISINDEX+instance AddTo FIELDSET HR+instance AddTo FIELDSET TABLE+instance AddTo FIELDSET FIELDSET+instance AddTo FIELDSET ADDRESS+instance AddTo FIELDSET TT+instance AddTo FIELDSET I+instance AddTo FIELDSET B+instance AddTo FIELDSET U+instance AddTo FIELDSET S+instance AddTo FIELDSET STRIKE+instance AddTo FIELDSET BIG+instance AddTo FIELDSET SMALL+instance AddTo FIELDSET EM+instance AddTo FIELDSET STRONG+instance AddTo FIELDSET DFN+instance AddTo FIELDSET CODE+instance AddTo FIELDSET SAMP+instance AddTo FIELDSET KBD+instance AddTo FIELDSET VAR+instance AddTo FIELDSET CITE+instance AddTo FIELDSET ABBR+instance AddTo FIELDSET ACRONYM+instance AddTo FIELDSET A+instance AddTo FIELDSET IMG+instance AddTo FIELDSET APPLET+instance AddTo FIELDSET OBJECT+instance AddTo FIELDSET FONT+instance AddTo FIELDSET BASEFONT+instance AddTo FIELDSET BR+instance AddTo FIELDSET SCRIPT+instance AddTo FIELDSET MAP+instance AddTo FIELDSET Q+instance AddTo FIELDSET SUB+instance AddTo FIELDSET SUP+instance AddTo FIELDSET SPAN+instance AddTo FIELDSET BDO+instance AddTo FIELDSET IFRAME+instance AddTo FIELDSET INPUT+instance AddTo FIELDSET SELECT+instance AddTo FIELDSET TEXTAREA+instance AddTo FIELDSET LABEL+instance AddTo FIELDSET BUTTON+instance TAG TEXTAREA+instance AddTo TEXTAREA CDATA+instance TAG OPTION+instance AddTo OPTION CDATA+instance TAG OPTGROUP+instance AddTo OPTGROUP OPTION+instance TAG SELECT+instance AddTo SELECT OPTGROUP+instance AddTo SELECT OPTION+instance TAG INPUT where make = make_empty+instance TAG LABEL+instance AddTo LABEL CDATA+instance AddTo LABEL TT+instance AddTo LABEL I+instance AddTo LABEL B+instance AddTo LABEL U+instance AddTo LABEL S+instance AddTo LABEL STRIKE+instance AddTo LABEL BIG+instance AddTo LABEL SMALL+instance AddTo LABEL EM+instance AddTo LABEL STRONG+instance AddTo LABEL DFN+instance AddTo LABEL CODE+instance AddTo LABEL SAMP+instance AddTo LABEL KBD+instance AddTo LABEL VAR+instance AddTo LABEL CITE+instance AddTo LABEL ABBR+instance AddTo LABEL ACRONYM+instance AddTo LABEL A+instance AddTo LABEL IMG+instance AddTo LABEL APPLET+instance AddTo LABEL OBJECT+instance AddTo LABEL FONT+instance AddTo LABEL BASEFONT+instance AddTo LABEL BR+instance AddTo LABEL SCRIPT+instance AddTo LABEL MAP+instance AddTo LABEL Q+instance AddTo LABEL SUB+instance AddTo LABEL SUP+instance AddTo LABEL SPAN+instance AddTo LABEL BDO+instance AddTo LABEL IFRAME+instance AddTo LABEL INPUT+instance AddTo LABEL SELECT+instance AddTo LABEL TEXTAREA+instance AddTo LABEL BUTTON+instance TAG FORM+instance AddTo FORM P+instance AddTo FORM H1+instance AddTo FORM H2+instance AddTo FORM H3+instance AddTo FORM H4+instance AddTo FORM H5+instance AddTo FORM H6+instance AddTo FORM UL+instance AddTo FORM OL+instance AddTo FORM DIR+instance AddTo FORM MENU+instance AddTo FORM PRE+instance AddTo FORM DL+instance AddTo FORM DIV+instance AddTo FORM CENTER+instance AddTo FORM NOSCRIPT+instance AddTo FORM NOFRAMES+instance AddTo FORM BLOCKQUOTE+instance AddTo FORM ISINDEX+instance AddTo FORM HR+instance AddTo FORM TABLE+instance AddTo FORM FIELDSET+instance AddTo FORM ADDRESS+instance AddTo FORM CDATA+instance AddTo FORM TT+instance AddTo FORM I+instance AddTo FORM B+instance AddTo FORM U+instance AddTo FORM S+instance AddTo FORM STRIKE+instance AddTo FORM BIG+instance AddTo FORM SMALL+instance AddTo FORM EM+instance AddTo FORM STRONG+instance AddTo FORM DFN+instance AddTo FORM CODE+instance AddTo FORM SAMP+instance AddTo FORM KBD+instance AddTo FORM VAR+instance AddTo FORM CITE+instance AddTo FORM ABBR+instance AddTo FORM ACRONYM+instance AddTo FORM A+instance AddTo FORM IMG+instance AddTo FORM APPLET+instance AddTo FORM OBJECT+instance AddTo FORM FONT+instance AddTo FORM BASEFONT+instance AddTo FORM BR+instance AddTo FORM SCRIPT+instance AddTo FORM MAP+instance AddTo FORM Q+instance AddTo FORM SUB+instance AddTo FORM SUP+instance AddTo FORM SPAN+instance AddTo FORM BDO+instance AddTo FORM IFRAME+instance AddTo FORM INPUT+instance AddTo FORM SELECT+instance AddTo FORM TEXTAREA+instance AddTo FORM LABEL+instance AddTo FORM BUTTON+instance TAG LI+instance AddTo LI P+instance AddTo LI H1+instance AddTo LI H2+instance AddTo LI H3+instance AddTo LI H4+instance AddTo LI H5+instance AddTo LI H6+instance AddTo LI UL+instance AddTo LI OL+instance AddTo LI DIR+instance AddTo LI MENU+instance AddTo LI PRE+instance AddTo LI DL+instance AddTo LI DIV+instance AddTo LI CENTER+instance AddTo LI NOSCRIPT+instance AddTo LI NOFRAMES+instance AddTo LI BLOCKQUOTE+instance AddTo LI FORM+instance AddTo LI ISINDEX+instance AddTo LI HR+instance AddTo LI TABLE+instance AddTo LI FIELDSET+instance AddTo LI ADDRESS+instance AddTo LI CDATA+instance AddTo LI TT+instance AddTo LI I+instance AddTo LI B+instance AddTo LI U+instance AddTo LI S+instance AddTo LI STRIKE+instance AddTo LI BIG+instance AddTo LI SMALL+instance AddTo LI EM+instance AddTo LI STRONG+instance AddTo LI DFN+instance AddTo LI CODE+instance AddTo LI SAMP+instance AddTo LI KBD+instance AddTo LI VAR+instance AddTo LI CITE+instance AddTo LI ABBR+instance AddTo LI ACRONYM+instance AddTo LI A+instance AddTo LI IMG+instance AddTo LI APPLET+instance AddTo LI OBJECT+instance AddTo LI FONT+instance AddTo LI BASEFONT+instance AddTo LI BR+instance AddTo LI SCRIPT+instance AddTo LI MAP+instance AddTo LI Q+instance AddTo LI SUB+instance AddTo LI SUP+instance AddTo LI SPAN+instance AddTo LI BDO+instance AddTo LI IFRAME+instance AddTo LI INPUT+instance AddTo LI SELECT+instance AddTo LI TEXTAREA+instance AddTo LI LABEL+instance AddTo LI BUTTON+instance TAG DIR+instance AddTo DIR LI+instance TAG MENU+instance AddTo MENU LI+instance TAG UL+instance AddTo UL LI+instance TAG OL+instance AddTo OL LI+instance TAG DD+instance AddTo DD P+instance AddTo DD H1+instance AddTo DD H2+instance AddTo DD H3+instance AddTo DD H4+instance AddTo DD H5+instance AddTo DD H6+instance AddTo DD UL+instance AddTo DD OL+instance AddTo DD DIR+instance AddTo DD MENU+instance AddTo DD PRE+instance AddTo DD DL+instance AddTo DD DIV+instance AddTo DD CENTER+instance AddTo DD NOSCRIPT+instance AddTo DD NOFRAMES+instance AddTo DD BLOCKQUOTE+instance AddTo DD FORM+instance AddTo DD ISINDEX+instance AddTo DD HR+instance AddTo DD TABLE+instance AddTo DD FIELDSET+instance AddTo DD ADDRESS+instance AddTo DD CDATA+instance AddTo DD TT+instance AddTo DD I+instance AddTo DD B+instance AddTo DD U+instance AddTo DD S+instance AddTo DD STRIKE+instance AddTo DD BIG+instance AddTo DD SMALL+instance AddTo DD EM+instance AddTo DD STRONG+instance AddTo DD DFN+instance AddTo DD CODE+instance AddTo DD SAMP+instance AddTo DD KBD+instance AddTo DD VAR+instance AddTo DD CITE+instance AddTo DD ABBR+instance AddTo DD ACRONYM+instance AddTo DD A+instance AddTo DD IMG+instance AddTo DD APPLET+instance AddTo DD OBJECT+instance AddTo DD FONT+instance AddTo DD BASEFONT+instance AddTo DD BR+instance AddTo DD SCRIPT+instance AddTo DD MAP+instance AddTo DD Q+instance AddTo DD SUB+instance AddTo DD SUP+instance AddTo DD SPAN+instance AddTo DD BDO+instance AddTo DD IFRAME+instance AddTo DD INPUT+instance AddTo DD SELECT+instance AddTo DD TEXTAREA+instance AddTo DD LABEL+instance AddTo DD BUTTON+instance TAG DT+instance AddTo DT CDATA+instance AddTo DT TT+instance AddTo DT I+instance AddTo DT B+instance AddTo DT U+instance AddTo DT S+instance AddTo DT STRIKE+instance AddTo DT BIG+instance AddTo DT SMALL+instance AddTo DT EM+instance AddTo DT STRONG+instance AddTo DT DFN+instance AddTo DT CODE+instance AddTo DT SAMP+instance AddTo DT KBD+instance AddTo DT VAR+instance AddTo DT CITE+instance AddTo DT ABBR+instance AddTo DT ACRONYM+instance AddTo DT A+instance AddTo DT IMG+instance AddTo DT APPLET+instance AddTo DT OBJECT+instance AddTo DT FONT+instance AddTo DT BASEFONT+instance AddTo DT BR+instance AddTo DT SCRIPT+instance AddTo DT MAP+instance AddTo DT Q+instance AddTo DT SUB+instance AddTo DT SUP+instance AddTo DT SPAN+instance AddTo DT BDO+instance AddTo DT IFRAME+instance AddTo DT INPUT+instance AddTo DT SELECT+instance AddTo DT TEXTAREA+instance AddTo DT LABEL+instance AddTo DT BUTTON+instance TAG DL+instance AddTo DL DT+instance AddTo DL DD+instance TAG INS+instance AddTo INS P+instance AddTo INS H1+instance AddTo INS H2+instance AddTo INS H3+instance AddTo INS H4+instance AddTo INS H5+instance AddTo INS H6+instance AddTo INS UL+instance AddTo INS OL+instance AddTo INS DIR+instance AddTo INS MENU+instance AddTo INS PRE+instance AddTo INS DL+instance AddTo INS DIV+instance AddTo INS CENTER+instance AddTo INS NOSCRIPT+instance AddTo INS NOFRAMES+instance AddTo INS BLOCKQUOTE+instance AddTo INS FORM+instance AddTo INS ISINDEX+instance AddTo INS HR+instance AddTo INS TABLE+instance AddTo INS FIELDSET+instance AddTo INS ADDRESS+instance AddTo INS CDATA+instance AddTo INS TT+instance AddTo INS I+instance AddTo INS B+instance AddTo INS U+instance AddTo INS S+instance AddTo INS STRIKE+instance AddTo INS BIG+instance AddTo INS SMALL+instance AddTo INS EM+instance AddTo INS STRONG+instance AddTo INS DFN+instance AddTo INS CODE+instance AddTo INS SAMP+instance AddTo INS KBD+instance AddTo INS VAR+instance AddTo INS CITE+instance AddTo INS ABBR+instance AddTo INS ACRONYM+instance AddTo INS A+instance AddTo INS IMG+instance AddTo INS APPLET+instance AddTo INS OBJECT+instance AddTo INS FONT+instance AddTo INS BASEFONT+instance AddTo INS BR+instance AddTo INS SCRIPT+instance AddTo INS MAP+instance AddTo INS Q+instance AddTo INS SUB+instance AddTo INS SUP+instance AddTo INS SPAN+instance AddTo INS BDO+instance AddTo INS IFRAME+instance AddTo INS INPUT+instance AddTo INS SELECT+instance AddTo INS TEXTAREA+instance AddTo INS LABEL+instance AddTo INS BUTTON+instance TAG DEL+instance AddTo DEL P+instance AddTo DEL H1+instance AddTo DEL H2+instance AddTo DEL H3+instance AddTo DEL H4+instance AddTo DEL H5+instance AddTo DEL H6+instance AddTo DEL UL+instance AddTo DEL OL+instance AddTo DEL DIR+instance AddTo DEL MENU+instance AddTo DEL PRE+instance AddTo DEL DL+instance AddTo DEL DIV+instance AddTo DEL CENTER+instance AddTo DEL NOSCRIPT+instance AddTo DEL NOFRAMES+instance AddTo DEL BLOCKQUOTE+instance AddTo DEL FORM+instance AddTo DEL ISINDEX+instance AddTo DEL HR+instance AddTo DEL TABLE+instance AddTo DEL FIELDSET+instance AddTo DEL ADDRESS+instance AddTo DEL CDATA+instance AddTo DEL TT+instance AddTo DEL I+instance AddTo DEL B+instance AddTo DEL U+instance AddTo DEL S+instance AddTo DEL STRIKE+instance AddTo DEL BIG+instance AddTo DEL SMALL+instance AddTo DEL EM+instance AddTo DEL STRONG+instance AddTo DEL DFN+instance AddTo DEL CODE+instance AddTo DEL SAMP+instance AddTo DEL KBD+instance AddTo DEL VAR+instance AddTo DEL CITE+instance AddTo DEL ABBR+instance AddTo DEL ACRONYM+instance AddTo DEL A+instance AddTo DEL IMG+instance AddTo DEL APPLET+instance AddTo DEL OBJECT+instance AddTo DEL FONT+instance AddTo DEL BASEFONT+instance AddTo DEL BR+instance AddTo DEL SCRIPT+instance AddTo DEL MAP+instance AddTo DEL Q+instance AddTo DEL SUB+instance AddTo DEL SUP+instance AddTo DEL SPAN+instance AddTo DEL BDO+instance AddTo DEL IFRAME+instance AddTo DEL INPUT+instance AddTo DEL SELECT+instance AddTo DEL TEXTAREA+instance AddTo DEL LABEL+instance AddTo DEL BUTTON+instance TAG BLOCKQUOTE+instance AddTo BLOCKQUOTE P+instance AddTo BLOCKQUOTE H1+instance AddTo BLOCKQUOTE H2+instance AddTo BLOCKQUOTE H3+instance AddTo BLOCKQUOTE H4+instance AddTo BLOCKQUOTE H5+instance AddTo BLOCKQUOTE H6+instance AddTo BLOCKQUOTE UL+instance AddTo BLOCKQUOTE OL+instance AddTo BLOCKQUOTE DIR+instance AddTo BLOCKQUOTE MENU+instance AddTo BLOCKQUOTE PRE+instance AddTo BLOCKQUOTE DL+instance AddTo BLOCKQUOTE DIV+instance AddTo BLOCKQUOTE CENTER+instance AddTo BLOCKQUOTE NOSCRIPT+instance AddTo BLOCKQUOTE NOFRAMES+instance AddTo BLOCKQUOTE BLOCKQUOTE+instance AddTo BLOCKQUOTE FORM+instance AddTo BLOCKQUOTE ISINDEX+instance AddTo BLOCKQUOTE HR+instance AddTo BLOCKQUOTE TABLE+instance AddTo BLOCKQUOTE FIELDSET+instance AddTo BLOCKQUOTE ADDRESS+instance AddTo BLOCKQUOTE CDATA+instance AddTo BLOCKQUOTE TT+instance AddTo BLOCKQUOTE I+instance AddTo BLOCKQUOTE B+instance AddTo BLOCKQUOTE U+instance AddTo BLOCKQUOTE S+instance AddTo BLOCKQUOTE STRIKE+instance AddTo BLOCKQUOTE BIG+instance AddTo BLOCKQUOTE SMALL+instance AddTo BLOCKQUOTE EM+instance AddTo BLOCKQUOTE STRONG+instance AddTo BLOCKQUOTE DFN+instance AddTo BLOCKQUOTE CODE+instance AddTo BLOCKQUOTE SAMP+instance AddTo BLOCKQUOTE KBD+instance AddTo BLOCKQUOTE VAR+instance AddTo BLOCKQUOTE CITE+instance AddTo BLOCKQUOTE ABBR+instance AddTo BLOCKQUOTE ACRONYM+instance AddTo BLOCKQUOTE A+instance AddTo BLOCKQUOTE IMG+instance AddTo BLOCKQUOTE APPLET+instance AddTo BLOCKQUOTE OBJECT+instance AddTo BLOCKQUOTE FONT+instance AddTo BLOCKQUOTE BASEFONT+instance AddTo BLOCKQUOTE BR+instance AddTo BLOCKQUOTE SCRIPT+instance AddTo BLOCKQUOTE MAP+instance AddTo BLOCKQUOTE Q+instance AddTo BLOCKQUOTE SUB+instance AddTo BLOCKQUOTE SUP+instance AddTo BLOCKQUOTE SPAN+instance AddTo BLOCKQUOTE BDO+instance AddTo BLOCKQUOTE IFRAME+instance AddTo BLOCKQUOTE INPUT+instance AddTo BLOCKQUOTE SELECT+instance AddTo BLOCKQUOTE TEXTAREA+instance AddTo BLOCKQUOTE LABEL+instance AddTo BLOCKQUOTE BUTTON+instance TAG Q+instance AddTo Q CDATA+instance AddTo Q TT+instance AddTo Q I+instance AddTo Q B+instance AddTo Q U+instance AddTo Q S+instance AddTo Q STRIKE+instance AddTo Q BIG+instance AddTo Q SMALL+instance AddTo Q EM+instance AddTo Q STRONG+instance AddTo Q DFN+instance AddTo Q CODE+instance AddTo Q SAMP+instance AddTo Q KBD+instance AddTo Q VAR+instance AddTo Q CITE+instance AddTo Q ABBR+instance AddTo Q ACRONYM+instance AddTo Q A+instance AddTo Q IMG+instance AddTo Q APPLET+instance AddTo Q OBJECT+instance AddTo Q FONT+instance AddTo Q BASEFONT+instance AddTo Q BR+instance AddTo Q SCRIPT+instance AddTo Q MAP+instance AddTo Q Q+instance AddTo Q SUB+instance AddTo Q SUP+instance AddTo Q SPAN+instance AddTo Q BDO+instance AddTo Q IFRAME+instance AddTo Q INPUT+instance AddTo Q SELECT+instance AddTo Q TEXTAREA+instance AddTo Q LABEL+instance AddTo Q BUTTON+instance TAG PRE+instance AddTo PRE CDATA+instance AddTo PRE TT+instance AddTo PRE I+instance AddTo PRE B+instance AddTo PRE U+instance AddTo PRE S+instance AddTo PRE STRIKE+instance AddTo PRE EM+instance AddTo PRE STRONG+instance AddTo PRE DFN+instance AddTo PRE CODE+instance AddTo PRE SAMP+instance AddTo PRE KBD+instance AddTo PRE VAR+instance AddTo PRE CITE+instance AddTo PRE ABBR+instance AddTo PRE ACRONYM+instance AddTo PRE A+instance AddTo PRE BR+instance AddTo PRE SCRIPT+instance AddTo PRE MAP+instance AddTo PRE Q+instance AddTo PRE SPAN+instance AddTo PRE BDO+instance AddTo PRE IFRAME+instance AddTo PRE INPUT+instance AddTo PRE SELECT+instance AddTo PRE TEXTAREA+instance AddTo PRE LABEL+instance AddTo PRE BUTTON+instance TAG H1+instance AddTo H1 CDATA+instance AddTo H1 TT+instance AddTo H1 I+instance AddTo H1 B+instance AddTo H1 U+instance AddTo H1 S+instance AddTo H1 STRIKE+instance AddTo H1 BIG+instance AddTo H1 SMALL+instance AddTo H1 EM+instance AddTo H1 STRONG+instance AddTo H1 DFN+instance AddTo H1 CODE+instance AddTo H1 SAMP+instance AddTo H1 KBD+instance AddTo H1 VAR+instance AddTo H1 CITE+instance AddTo H1 ABBR+instance AddTo H1 ACRONYM+instance AddTo H1 A+instance AddTo H1 IMG+instance AddTo H1 APPLET+instance AddTo H1 OBJECT+instance AddTo H1 FONT+instance AddTo H1 BASEFONT+instance AddTo H1 BR+instance AddTo H1 SCRIPT+instance AddTo H1 MAP+instance AddTo H1 Q+instance AddTo H1 SUB+instance AddTo H1 SUP+instance AddTo H1 SPAN+instance AddTo H1 BDO+instance AddTo H1 IFRAME+instance AddTo H1 INPUT+instance AddTo H1 SELECT+instance AddTo H1 TEXTAREA+instance AddTo H1 LABEL+instance AddTo H1 BUTTON+instance TAG H2+instance AddTo H2 CDATA+instance AddTo H2 TT+instance AddTo H2 I+instance AddTo H2 B+instance AddTo H2 U+instance AddTo H2 S+instance AddTo H2 STRIKE+instance AddTo H2 BIG+instance AddTo H2 SMALL+instance AddTo H2 EM+instance AddTo H2 STRONG+instance AddTo H2 DFN+instance AddTo H2 CODE+instance AddTo H2 SAMP+instance AddTo H2 KBD+instance AddTo H2 VAR+instance AddTo H2 CITE+instance AddTo H2 ABBR+instance AddTo H2 ACRONYM+instance AddTo H2 A+instance AddTo H2 IMG+instance AddTo H2 APPLET+instance AddTo H2 OBJECT+instance AddTo H2 FONT+instance AddTo H2 BASEFONT+instance AddTo H2 BR+instance AddTo H2 SCRIPT+instance AddTo H2 MAP+instance AddTo H2 Q+instance AddTo H2 SUB+instance AddTo H2 SUP+instance AddTo H2 SPAN+instance AddTo H2 BDO+instance AddTo H2 IFRAME+instance AddTo H2 INPUT+instance AddTo H2 SELECT+instance AddTo H2 TEXTAREA+instance AddTo H2 LABEL+instance AddTo H2 BUTTON+instance TAG H3+instance AddTo H3 CDATA+instance AddTo H3 TT+instance AddTo H3 I+instance AddTo H3 B+instance AddTo H3 U+instance AddTo H3 S+instance AddTo H3 STRIKE+instance AddTo H3 BIG+instance AddTo H3 SMALL+instance AddTo H3 EM+instance AddTo H3 STRONG+instance AddTo H3 DFN+instance AddTo H3 CODE+instance AddTo H3 SAMP+instance AddTo H3 KBD+instance AddTo H3 VAR+instance AddTo H3 CITE+instance AddTo H3 ABBR+instance AddTo H3 ACRONYM+instance AddTo H3 A+instance AddTo H3 IMG+instance AddTo H3 APPLET+instance AddTo H3 OBJECT+instance AddTo H3 FONT+instance AddTo H3 BASEFONT+instance AddTo H3 BR+instance AddTo H3 SCRIPT+instance AddTo H3 MAP+instance AddTo H3 Q+instance AddTo H3 SUB+instance AddTo H3 SUP+instance AddTo H3 SPAN+instance AddTo H3 BDO+instance AddTo H3 IFRAME+instance AddTo H3 INPUT+instance AddTo H3 SELECT+instance AddTo H3 TEXTAREA+instance AddTo H3 LABEL+instance AddTo H3 BUTTON+instance TAG H4+instance AddTo H4 CDATA+instance AddTo H4 TT+instance AddTo H4 I+instance AddTo H4 B+instance AddTo H4 U+instance AddTo H4 S+instance AddTo H4 STRIKE+instance AddTo H4 BIG+instance AddTo H4 SMALL+instance AddTo H4 EM+instance AddTo H4 STRONG+instance AddTo H4 DFN+instance AddTo H4 CODE+instance AddTo H4 SAMP+instance AddTo H4 KBD+instance AddTo H4 VAR+instance AddTo H4 CITE+instance AddTo H4 ABBR+instance AddTo H4 ACRONYM+instance AddTo H4 A+instance AddTo H4 IMG+instance AddTo H4 APPLET+instance AddTo H4 OBJECT+instance AddTo H4 FONT+instance AddTo H4 BASEFONT+instance AddTo H4 BR+instance AddTo H4 SCRIPT+instance AddTo H4 MAP+instance AddTo H4 Q+instance AddTo H4 SUB+instance AddTo H4 SUP+instance AddTo H4 SPAN+instance AddTo H4 BDO+instance AddTo H4 IFRAME+instance AddTo H4 INPUT+instance AddTo H4 SELECT+instance AddTo H4 TEXTAREA+instance AddTo H4 LABEL+instance AddTo H4 BUTTON+instance TAG H5+instance AddTo H5 CDATA+instance AddTo H5 TT+instance AddTo H5 I+instance AddTo H5 B+instance AddTo H5 U+instance AddTo H5 S+instance AddTo H5 STRIKE+instance AddTo H5 BIG+instance AddTo H5 SMALL+instance AddTo H5 EM+instance AddTo H5 STRONG+instance AddTo H5 DFN+instance AddTo H5 CODE+instance AddTo H5 SAMP+instance AddTo H5 KBD+instance AddTo H5 VAR+instance AddTo H5 CITE+instance AddTo H5 ABBR+instance AddTo H5 ACRONYM+instance AddTo H5 A+instance AddTo H5 IMG+instance AddTo H5 APPLET+instance AddTo H5 OBJECT+instance AddTo H5 FONT+instance AddTo H5 BASEFONT+instance AddTo H5 BR+instance AddTo H5 SCRIPT+instance AddTo H5 MAP+instance AddTo H5 Q+instance AddTo H5 SUB+instance AddTo H5 SUP+instance AddTo H5 SPAN+instance AddTo H5 BDO+instance AddTo H5 IFRAME+instance AddTo H5 INPUT+instance AddTo H5 SELECT+instance AddTo H5 TEXTAREA+instance AddTo H5 LABEL+instance AddTo H5 BUTTON+instance TAG H6+instance AddTo H6 CDATA+instance AddTo H6 TT+instance AddTo H6 I+instance AddTo H6 B+instance AddTo H6 U+instance AddTo H6 S+instance AddTo H6 STRIKE+instance AddTo H6 BIG+instance AddTo H6 SMALL+instance AddTo H6 EM+instance AddTo H6 STRONG+instance AddTo H6 DFN+instance AddTo H6 CODE+instance AddTo H6 SAMP+instance AddTo H6 KBD+instance AddTo H6 VAR+instance AddTo H6 CITE+instance AddTo H6 ABBR+instance AddTo H6 ACRONYM+instance AddTo H6 A+instance AddTo H6 IMG+instance AddTo H6 APPLET+instance AddTo H6 OBJECT+instance AddTo H6 FONT+instance AddTo H6 BASEFONT+instance AddTo H6 BR+instance AddTo H6 SCRIPT+instance AddTo H6 MAP+instance AddTo H6 Q+instance AddTo H6 SUB+instance AddTo H6 SUP+instance AddTo H6 SPAN+instance AddTo H6 BDO+instance AddTo H6 IFRAME+instance AddTo H6 INPUT+instance AddTo H6 SELECT+instance AddTo H6 TEXTAREA+instance AddTo H6 LABEL+instance AddTo H6 BUTTON+instance TAG P+instance AddTo P CDATA+instance AddTo P TT+instance AddTo P I+instance AddTo P B+instance AddTo P U+instance AddTo P S+instance AddTo P STRIKE+instance AddTo P BIG+instance AddTo P SMALL+instance AddTo P EM+instance AddTo P STRONG+instance AddTo P DFN+instance AddTo P CODE+instance AddTo P SAMP+instance AddTo P KBD+instance AddTo P VAR+instance AddTo P CITE+instance AddTo P ABBR+instance AddTo P ACRONYM+instance AddTo P A+instance AddTo P IMG+instance AddTo P APPLET+instance AddTo P OBJECT+instance AddTo P FONT+instance AddTo P BASEFONT+instance AddTo P BR+instance AddTo P SCRIPT+instance AddTo P MAP+instance AddTo P Q+instance AddTo P SUB+instance AddTo P SUP+instance AddTo P SPAN+instance AddTo P BDO+instance AddTo P IFRAME+instance AddTo P INPUT+instance AddTo P SELECT+instance AddTo P TEXTAREA+instance AddTo P LABEL+instance AddTo P BUTTON+instance TAG HR where make = make_empty+instance TAG APPLET+instance AddTo APPLET PARAM+instance AddTo APPLET P+instance AddTo APPLET H1+instance AddTo APPLET H2+instance AddTo APPLET H3+instance AddTo APPLET H4+instance AddTo APPLET H5+instance AddTo APPLET H6+instance AddTo APPLET UL+instance AddTo APPLET OL+instance AddTo APPLET DIR+instance AddTo APPLET MENU+instance AddTo APPLET PRE+instance AddTo APPLET DL+instance AddTo APPLET DIV+instance AddTo APPLET CENTER+instance AddTo APPLET NOSCRIPT+instance AddTo APPLET NOFRAMES+instance AddTo APPLET BLOCKQUOTE+instance AddTo APPLET FORM+instance AddTo APPLET ISINDEX+instance AddTo APPLET HR+instance AddTo APPLET TABLE+instance AddTo APPLET FIELDSET+instance AddTo APPLET ADDRESS+instance AddTo APPLET CDATA+instance AddTo APPLET TT+instance AddTo APPLET I+instance AddTo APPLET B+instance AddTo APPLET U+instance AddTo APPLET S+instance AddTo APPLET STRIKE+instance AddTo APPLET BIG+instance AddTo APPLET SMALL+instance AddTo APPLET EM+instance AddTo APPLET STRONG+instance AddTo APPLET DFN+instance AddTo APPLET CODE+instance AddTo APPLET SAMP+instance AddTo APPLET KBD+instance AddTo APPLET VAR+instance AddTo APPLET CITE+instance AddTo APPLET ABBR+instance AddTo APPLET ACRONYM+instance AddTo APPLET A+instance AddTo APPLET IMG+instance AddTo APPLET APPLET+instance AddTo APPLET OBJECT+instance AddTo APPLET FONT+instance AddTo APPLET BASEFONT+instance AddTo APPLET BR+instance AddTo APPLET SCRIPT+instance AddTo APPLET MAP+instance AddTo APPLET Q+instance AddTo APPLET SUB+instance AddTo APPLET SUP+instance AddTo APPLET SPAN+instance AddTo APPLET BDO+instance AddTo APPLET IFRAME+instance AddTo APPLET INPUT+instance AddTo APPLET SELECT+instance AddTo APPLET TEXTAREA+instance AddTo APPLET LABEL+instance AddTo APPLET BUTTON+instance TAG PARAM where make = make_empty+instance TAG OBJECT+instance AddTo OBJECT PARAM+instance AddTo OBJECT P+instance AddTo OBJECT H1+instance AddTo OBJECT H2+instance AddTo OBJECT H3+instance AddTo OBJECT H4+instance AddTo OBJECT H5+instance AddTo OBJECT H6+instance AddTo OBJECT UL+instance AddTo OBJECT OL+instance AddTo OBJECT DIR+instance AddTo OBJECT MENU+instance AddTo OBJECT PRE+instance AddTo OBJECT DL+instance AddTo OBJECT DIV+instance AddTo OBJECT CENTER+instance AddTo OBJECT NOSCRIPT+instance AddTo OBJECT NOFRAMES+instance AddTo OBJECT BLOCKQUOTE+instance AddTo OBJECT FORM+instance AddTo OBJECT ISINDEX+instance AddTo OBJECT HR+instance AddTo OBJECT TABLE+instance AddTo OBJECT FIELDSET+instance AddTo OBJECT ADDRESS+instance AddTo OBJECT CDATA+instance AddTo OBJECT TT+instance AddTo OBJECT I+instance AddTo OBJECT B+instance AddTo OBJECT U+instance AddTo OBJECT S+instance AddTo OBJECT STRIKE+instance AddTo OBJECT BIG+instance AddTo OBJECT SMALL+instance AddTo OBJECT EM+instance AddTo OBJECT STRONG+instance AddTo OBJECT DFN+instance AddTo OBJECT CODE+instance AddTo OBJECT SAMP+instance AddTo OBJECT KBD+instance AddTo OBJECT VAR+instance AddTo OBJECT CITE+instance AddTo OBJECT ABBR+instance AddTo OBJECT ACRONYM+instance AddTo OBJECT A+instance AddTo OBJECT IMG+instance AddTo OBJECT APPLET+instance AddTo OBJECT OBJECT+instance AddTo OBJECT FONT+instance AddTo OBJECT BASEFONT+instance AddTo OBJECT BR+instance AddTo OBJECT SCRIPT+instance AddTo OBJECT MAP+instance AddTo OBJECT Q+instance AddTo OBJECT SUB+instance AddTo OBJECT SUP+instance AddTo OBJECT SPAN+instance AddTo OBJECT BDO+instance AddTo OBJECT IFRAME+instance AddTo OBJECT INPUT+instance AddTo OBJECT SELECT+instance AddTo OBJECT TEXTAREA+instance AddTo OBJECT LABEL+instance AddTo OBJECT BUTTON+instance TAG IMG where make = make_empty+instance TAG LINK where make = make_empty+instance TAG AREA where make = make_empty+instance TAG MAP+instance AddTo MAP P+instance AddTo MAP H1+instance AddTo MAP H2+instance AddTo MAP H3+instance AddTo MAP H4+instance AddTo MAP H5+instance AddTo MAP H6+instance AddTo MAP UL+instance AddTo MAP OL+instance AddTo MAP DIR+instance AddTo MAP MENU+instance AddTo MAP PRE+instance AddTo MAP DL+instance AddTo MAP DIV+instance AddTo MAP CENTER+instance AddTo MAP NOSCRIPT+instance AddTo MAP NOFRAMES+instance AddTo MAP BLOCKQUOTE+instance AddTo MAP FORM+instance AddTo MAP ISINDEX+instance AddTo MAP HR+instance AddTo MAP TABLE+instance AddTo MAP FIELDSET+instance AddTo MAP ADDRESS+instance AddTo MAP AREA+instance TAG A+instance AddTo A CDATA+instance AddTo A TT+instance AddTo A I+instance AddTo A B+instance AddTo A U+instance AddTo A S+instance AddTo A STRIKE+instance AddTo A BIG+instance AddTo A SMALL+instance AddTo A EM+instance AddTo A STRONG+instance AddTo A DFN+instance AddTo A CODE+instance AddTo A SAMP+instance AddTo A KBD+instance AddTo A VAR+instance AddTo A CITE+instance AddTo A ABBR+instance AddTo A ACRONYM+instance AddTo A IMG+instance AddTo A APPLET+instance AddTo A OBJECT+instance AddTo A FONT+instance AddTo A BASEFONT+instance AddTo A BR+instance AddTo A SCRIPT+instance AddTo A MAP+instance AddTo A Q+instance AddTo A SUB+instance AddTo A SUP+instance AddTo A SPAN+instance AddTo A BDO+instance AddTo A IFRAME+instance AddTo A INPUT+instance AddTo A SELECT+instance AddTo A TEXTAREA+instance AddTo A LABEL+instance AddTo A BUTTON+instance TAG CENTER+instance AddTo CENTER P+instance AddTo CENTER H1+instance AddTo CENTER H2+instance AddTo CENTER H3+instance AddTo CENTER H4+instance AddTo CENTER H5+instance AddTo CENTER H6+instance AddTo CENTER UL+instance AddTo CENTER OL+instance AddTo CENTER DIR+instance AddTo CENTER MENU+instance AddTo CENTER PRE+instance AddTo CENTER DL+instance AddTo CENTER DIV+instance AddTo CENTER CENTER+instance AddTo CENTER NOSCRIPT+instance AddTo CENTER NOFRAMES+instance AddTo CENTER BLOCKQUOTE+instance AddTo CENTER FORM+instance AddTo CENTER ISINDEX+instance AddTo CENTER HR+instance AddTo CENTER TABLE+instance AddTo CENTER FIELDSET+instance AddTo CENTER ADDRESS+instance AddTo CENTER CDATA+instance AddTo CENTER TT+instance AddTo CENTER I+instance AddTo CENTER B+instance AddTo CENTER U+instance AddTo CENTER S+instance AddTo CENTER STRIKE+instance AddTo CENTER BIG+instance AddTo CENTER SMALL+instance AddTo CENTER EM+instance AddTo CENTER STRONG+instance AddTo CENTER DFN+instance AddTo CENTER CODE+instance AddTo CENTER SAMP+instance AddTo CENTER KBD+instance AddTo CENTER VAR+instance AddTo CENTER CITE+instance AddTo CENTER ABBR+instance AddTo CENTER ACRONYM+instance AddTo CENTER A+instance AddTo CENTER IMG+instance AddTo CENTER APPLET+instance AddTo CENTER OBJECT+instance AddTo CENTER FONT+instance AddTo CENTER BASEFONT+instance AddTo CENTER BR+instance AddTo CENTER SCRIPT+instance AddTo CENTER MAP+instance AddTo CENTER Q+instance AddTo CENTER SUB+instance AddTo CENTER SUP+instance AddTo CENTER SPAN+instance AddTo CENTER BDO+instance AddTo CENTER IFRAME+instance AddTo CENTER INPUT+instance AddTo CENTER SELECT+instance AddTo CENTER TEXTAREA+instance AddTo CENTER LABEL+instance AddTo CENTER BUTTON+instance TAG DIV+instance AddTo DIV P+instance AddTo DIV H1+instance AddTo DIV H2+instance AddTo DIV H3+instance AddTo DIV H4+instance AddTo DIV H5+instance AddTo DIV H6+instance AddTo DIV UL+instance AddTo DIV OL+instance AddTo DIV DIR+instance AddTo DIV MENU+instance AddTo DIV PRE+instance AddTo DIV DL+instance AddTo DIV DIV+instance AddTo DIV CENTER+instance AddTo DIV NOSCRIPT+instance AddTo DIV NOFRAMES+instance AddTo DIV BLOCKQUOTE+instance AddTo DIV FORM+instance AddTo DIV ISINDEX+instance AddTo DIV HR+instance AddTo DIV TABLE+instance AddTo DIV FIELDSET+instance AddTo DIV ADDRESS+instance AddTo DIV CDATA+instance AddTo DIV TT+instance AddTo DIV I+instance AddTo DIV B+instance AddTo DIV U+instance AddTo DIV S+instance AddTo DIV STRIKE+instance AddTo DIV BIG+instance AddTo DIV SMALL+instance AddTo DIV EM+instance AddTo DIV STRONG+instance AddTo DIV DFN+instance AddTo DIV CODE+instance AddTo DIV SAMP+instance AddTo DIV KBD+instance AddTo DIV VAR+instance AddTo DIV CITE+instance AddTo DIV ABBR+instance AddTo DIV ACRONYM+instance AddTo DIV A+instance AddTo DIV IMG+instance AddTo DIV APPLET+instance AddTo DIV OBJECT+instance AddTo DIV FONT+instance AddTo DIV BASEFONT+instance AddTo DIV BR+instance AddTo DIV SCRIPT+instance AddTo DIV MAP+instance AddTo DIV Q+instance AddTo DIV SUB+instance AddTo DIV SUP+instance AddTo DIV SPAN+instance AddTo DIV BDO+instance AddTo DIV IFRAME+instance AddTo DIV INPUT+instance AddTo DIV SELECT+instance AddTo DIV TEXTAREA+instance AddTo DIV LABEL+instance AddTo DIV BUTTON+instance TAG ADDRESS+instance AddTo ADDRESS CDATA+instance AddTo ADDRESS TT+instance AddTo ADDRESS I+instance AddTo ADDRESS B+instance AddTo ADDRESS U+instance AddTo ADDRESS S+instance AddTo ADDRESS STRIKE+instance AddTo ADDRESS BIG+instance AddTo ADDRESS SMALL+instance AddTo ADDRESS EM+instance AddTo ADDRESS STRONG+instance AddTo ADDRESS DFN+instance AddTo ADDRESS CODE+instance AddTo ADDRESS SAMP+instance AddTo ADDRESS KBD+instance AddTo ADDRESS VAR+instance AddTo ADDRESS CITE+instance AddTo ADDRESS ABBR+instance AddTo ADDRESS ACRONYM+instance AddTo ADDRESS A+instance AddTo ADDRESS IMG+instance AddTo ADDRESS APPLET+instance AddTo ADDRESS OBJECT+instance AddTo ADDRESS FONT+instance AddTo ADDRESS BASEFONT+instance AddTo ADDRESS BR+instance AddTo ADDRESS SCRIPT+instance AddTo ADDRESS MAP+instance AddTo ADDRESS Q+instance AddTo ADDRESS SUB+instance AddTo ADDRESS SUP+instance AddTo ADDRESS SPAN+instance AddTo ADDRESS BDO+instance AddTo ADDRESS IFRAME+instance AddTo ADDRESS INPUT+instance AddTo ADDRESS SELECT+instance AddTo ADDRESS TEXTAREA+instance AddTo ADDRESS LABEL+instance AddTo ADDRESS BUTTON+instance AddTo ADDRESS P+instance TAG BODY+instance AddTo BODY P+instance AddTo BODY H1+instance AddTo BODY H2+instance AddTo BODY H3+instance AddTo BODY H4+instance AddTo BODY H5+instance AddTo BODY H6+instance AddTo BODY UL+instance AddTo BODY OL+instance AddTo BODY DIR+instance AddTo BODY MENU+instance AddTo BODY PRE+instance AddTo BODY DL+instance AddTo BODY DIV+instance AddTo BODY CENTER+instance AddTo BODY NOSCRIPT+instance AddTo BODY NOFRAMES+instance AddTo BODY BLOCKQUOTE+instance AddTo BODY FORM+instance AddTo BODY ISINDEX+instance AddTo BODY HR+instance AddTo BODY TABLE+instance AddTo BODY FIELDSET+instance AddTo BODY ADDRESS+instance AddTo BODY CDATA+instance AddTo BODY TT+instance AddTo BODY I+instance AddTo BODY B+instance AddTo BODY U+instance AddTo BODY S+instance AddTo BODY STRIKE+instance AddTo BODY BIG+instance AddTo BODY SMALL+instance AddTo BODY EM+instance AddTo BODY STRONG+instance AddTo BODY DFN+instance AddTo BODY CODE+instance AddTo BODY SAMP+instance AddTo BODY KBD+instance AddTo BODY VAR+instance AddTo BODY CITE+instance AddTo BODY ABBR+instance AddTo BODY ACRONYM+instance AddTo BODY A+instance AddTo BODY IMG+instance AddTo BODY APPLET+instance AddTo BODY OBJECT+instance AddTo BODY FONT+instance AddTo BODY BASEFONT+instance AddTo BODY BR+instance AddTo BODY SCRIPT+instance AddTo BODY MAP+instance AddTo BODY Q+instance AddTo BODY SUB+instance AddTo BODY SUP+instance AddTo BODY SPAN+instance AddTo BODY BDO+instance AddTo BODY IFRAME+instance AddTo BODY INPUT+instance AddTo BODY SELECT+instance AddTo BODY TEXTAREA+instance AddTo BODY LABEL+instance AddTo BODY BUTTON+instance AddTo BODY INS+instance AddTo BODY DEL+instance TAG BR where make = make_empty+instance TAG FONT+instance AddTo FONT CDATA+instance AddTo FONT TT+instance AddTo FONT I+instance AddTo FONT B+instance AddTo FONT U+instance AddTo FONT S+instance AddTo FONT STRIKE+instance AddTo FONT BIG+instance AddTo FONT SMALL+instance AddTo FONT EM+instance AddTo FONT STRONG+instance AddTo FONT DFN+instance AddTo FONT CODE+instance AddTo FONT SAMP+instance AddTo FONT KBD+instance AddTo FONT VAR+instance AddTo FONT CITE+instance AddTo FONT ABBR+instance AddTo FONT ACRONYM+instance AddTo FONT A+instance AddTo FONT IMG+instance AddTo FONT APPLET+instance AddTo FONT OBJECT+instance AddTo FONT FONT+instance AddTo FONT BASEFONT+instance AddTo FONT BR+instance AddTo FONT SCRIPT+instance AddTo FONT MAP+instance AddTo FONT Q+instance AddTo FONT SUB+instance AddTo FONT SUP+instance AddTo FONT SPAN+instance AddTo FONT BDO+instance AddTo FONT IFRAME+instance AddTo FONT INPUT+instance AddTo FONT SELECT+instance AddTo FONT TEXTAREA+instance AddTo FONT LABEL+instance AddTo FONT BUTTON+instance TAG BASEFONT where make = make_empty+instance TAG BDO+instance AddTo BDO CDATA+instance AddTo BDO TT+instance AddTo BDO I+instance AddTo BDO B+instance AddTo BDO U+instance AddTo BDO S+instance AddTo BDO STRIKE+instance AddTo BDO BIG+instance AddTo BDO SMALL+instance AddTo BDO EM+instance AddTo BDO STRONG+instance AddTo BDO DFN+instance AddTo BDO CODE+instance AddTo BDO SAMP+instance AddTo BDO KBD+instance AddTo BDO VAR+instance AddTo BDO CITE+instance AddTo BDO ABBR+instance AddTo BDO ACRONYM+instance AddTo BDO A+instance AddTo BDO IMG+instance AddTo BDO APPLET+instance AddTo BDO OBJECT+instance AddTo BDO FONT+instance AddTo BDO BASEFONT+instance AddTo BDO BR+instance AddTo BDO SCRIPT+instance AddTo BDO MAP+instance AddTo BDO Q+instance AddTo BDO SUB+instance AddTo BDO SUP+instance AddTo BDO SPAN+instance AddTo BDO BDO+instance AddTo BDO IFRAME+instance AddTo BDO INPUT+instance AddTo BDO SELECT+instance AddTo BDO TEXTAREA+instance AddTo BDO LABEL+instance AddTo BDO BUTTON+instance TAG SPAN+instance AddTo SPAN CDATA+instance AddTo SPAN TT+instance AddTo SPAN I+instance AddTo SPAN B+instance AddTo SPAN U+instance AddTo SPAN S+instance AddTo SPAN STRIKE+instance AddTo SPAN BIG+instance AddTo SPAN SMALL+instance AddTo SPAN EM+instance AddTo SPAN STRONG+instance AddTo SPAN DFN+instance AddTo SPAN CODE+instance AddTo SPAN SAMP+instance AddTo SPAN KBD+instance AddTo SPAN VAR+instance AddTo SPAN CITE+instance AddTo SPAN ABBR+instance AddTo SPAN ACRONYM+instance AddTo SPAN A+instance AddTo SPAN IMG+instance AddTo SPAN APPLET+instance AddTo SPAN OBJECT+instance AddTo SPAN FONT+instance AddTo SPAN BASEFONT+instance AddTo SPAN BR+instance AddTo SPAN SCRIPT+instance AddTo SPAN MAP+instance AddTo SPAN Q+instance AddTo SPAN SUB+instance AddTo SPAN SUP+instance AddTo SPAN SPAN+instance AddTo SPAN BDO+instance AddTo SPAN IFRAME+instance AddTo SPAN INPUT+instance AddTo SPAN SELECT+instance AddTo SPAN TEXTAREA+instance AddTo SPAN LABEL+instance AddTo SPAN BUTTON+instance TAG SUB+instance AddTo SUB CDATA+instance AddTo SUB TT+instance AddTo SUB I+instance AddTo SUB B+instance AddTo SUB U+instance AddTo SUB S+instance AddTo SUB STRIKE+instance AddTo SUB BIG+instance AddTo SUB SMALL+instance AddTo SUB EM+instance AddTo SUB STRONG+instance AddTo SUB DFN+instance AddTo SUB CODE+instance AddTo SUB SAMP+instance AddTo SUB KBD+instance AddTo SUB VAR+instance AddTo SUB CITE+instance AddTo SUB ABBR+instance AddTo SUB ACRONYM+instance AddTo SUB A+instance AddTo SUB IMG+instance AddTo SUB APPLET+instance AddTo SUB OBJECT+instance AddTo SUB FONT+instance AddTo SUB BASEFONT+instance AddTo SUB BR+instance AddTo SUB SCRIPT+instance AddTo SUB MAP+instance AddTo SUB Q+instance AddTo SUB SUB+instance AddTo SUB SUP+instance AddTo SUB SPAN+instance AddTo SUB BDO+instance AddTo SUB IFRAME+instance AddTo SUB INPUT+instance AddTo SUB SELECT+instance AddTo SUB TEXTAREA+instance AddTo SUB LABEL+instance AddTo SUB BUTTON+instance TAG SUP+instance AddTo SUP CDATA+instance AddTo SUP TT+instance AddTo SUP I+instance AddTo SUP B+instance AddTo SUP U+instance AddTo SUP S+instance AddTo SUP STRIKE+instance AddTo SUP BIG+instance AddTo SUP SMALL+instance AddTo SUP EM+instance AddTo SUP STRONG+instance AddTo SUP DFN+instance AddTo SUP CODE+instance AddTo SUP SAMP+instance AddTo SUP KBD+instance AddTo SUP VAR+instance AddTo SUP CITE+instance AddTo SUP ABBR+instance AddTo SUP ACRONYM+instance AddTo SUP A+instance AddTo SUP IMG+instance AddTo SUP APPLET+instance AddTo SUP OBJECT+instance AddTo SUP FONT+instance AddTo SUP BASEFONT+instance AddTo SUP BR+instance AddTo SUP SCRIPT+instance AddTo SUP MAP+instance AddTo SUP Q+instance AddTo SUP SUB+instance AddTo SUP SUP+instance AddTo SUP SPAN+instance AddTo SUP BDO+instance AddTo SUP IFRAME+instance AddTo SUP INPUT+instance AddTo SUP SELECT+instance AddTo SUP TEXTAREA+instance AddTo SUP LABEL+instance AddTo SUP BUTTON+instance TAG TT+instance AddTo TT CDATA+instance AddTo TT TT+instance AddTo TT I+instance AddTo TT B+instance AddTo TT U+instance AddTo TT S+instance AddTo TT STRIKE+instance AddTo TT BIG+instance AddTo TT SMALL+instance AddTo TT EM+instance AddTo TT STRONG+instance AddTo TT DFN+instance AddTo TT CODE+instance AddTo TT SAMP+instance AddTo TT KBD+instance AddTo TT VAR+instance AddTo TT CITE+instance AddTo TT ABBR+instance AddTo TT ACRONYM+instance AddTo TT A+instance AddTo TT IMG+instance AddTo TT APPLET+instance AddTo TT OBJECT+instance AddTo TT FONT+instance AddTo TT BASEFONT+instance AddTo TT BR+instance AddTo TT SCRIPT+instance AddTo TT MAP+instance AddTo TT Q+instance AddTo TT SUB+instance AddTo TT SUP+instance AddTo TT SPAN+instance AddTo TT BDO+instance AddTo TT IFRAME+instance AddTo TT INPUT+instance AddTo TT SELECT+instance AddTo TT TEXTAREA+instance AddTo TT LABEL+instance AddTo TT BUTTON+instance TAG I+instance AddTo I CDATA+instance AddTo I TT+instance AddTo I I+instance AddTo I B+instance AddTo I U+instance AddTo I S+instance AddTo I STRIKE+instance AddTo I BIG+instance AddTo I SMALL+instance AddTo I EM+instance AddTo I STRONG+instance AddTo I DFN+instance AddTo I CODE+instance AddTo I SAMP+instance AddTo I KBD+instance AddTo I VAR+instance AddTo I CITE+instance AddTo I ABBR+instance AddTo I ACRONYM+instance AddTo I A+instance AddTo I IMG+instance AddTo I APPLET+instance AddTo I OBJECT+instance AddTo I FONT+instance AddTo I BASEFONT+instance AddTo I BR+instance AddTo I SCRIPT+instance AddTo I MAP+instance AddTo I Q+instance AddTo I SUB+instance AddTo I SUP+instance AddTo I SPAN+instance AddTo I BDO+instance AddTo I IFRAME+instance AddTo I INPUT+instance AddTo I SELECT+instance AddTo I TEXTAREA+instance AddTo I LABEL+instance AddTo I BUTTON+instance TAG B+instance AddTo B CDATA+instance AddTo B TT+instance AddTo B I+instance AddTo B B+instance AddTo B U+instance AddTo B S+instance AddTo B STRIKE+instance AddTo B BIG+instance AddTo B SMALL+instance AddTo B EM+instance AddTo B STRONG+instance AddTo B DFN+instance AddTo B CODE+instance AddTo B SAMP+instance AddTo B KBD+instance AddTo B VAR+instance AddTo B CITE+instance AddTo B ABBR+instance AddTo B ACRONYM+instance AddTo B A+instance AddTo B IMG+instance AddTo B APPLET+instance AddTo B OBJECT+instance AddTo B FONT+instance AddTo B BASEFONT+instance AddTo B BR+instance AddTo B SCRIPT+instance AddTo B MAP+instance AddTo B Q+instance AddTo B SUB+instance AddTo B SUP+instance AddTo B SPAN+instance AddTo B BDO+instance AddTo B IFRAME+instance AddTo B INPUT+instance AddTo B SELECT+instance AddTo B TEXTAREA+instance AddTo B LABEL+instance AddTo B BUTTON+instance TAG U+instance AddTo U CDATA+instance AddTo U TT+instance AddTo U I+instance AddTo U B+instance AddTo U U+instance AddTo U S+instance AddTo U STRIKE+instance AddTo U BIG+instance AddTo U SMALL+instance AddTo U EM+instance AddTo U STRONG+instance AddTo U DFN+instance AddTo U CODE+instance AddTo U SAMP+instance AddTo U KBD+instance AddTo U VAR+instance AddTo U CITE+instance AddTo U ABBR+instance AddTo U ACRONYM+instance AddTo U A+instance AddTo U IMG+instance AddTo U APPLET+instance AddTo U OBJECT+instance AddTo U FONT+instance AddTo U BASEFONT+instance AddTo U BR+instance AddTo U SCRIPT+instance AddTo U MAP+instance AddTo U Q+instance AddTo U SUB+instance AddTo U SUP+instance AddTo U SPAN+instance AddTo U BDO+instance AddTo U IFRAME+instance AddTo U INPUT+instance AddTo U SELECT+instance AddTo U TEXTAREA+instance AddTo U LABEL+instance AddTo U BUTTON+instance TAG S+instance AddTo S CDATA+instance AddTo S TT+instance AddTo S I+instance AddTo S B+instance AddTo S U+instance AddTo S S+instance AddTo S STRIKE+instance AddTo S BIG+instance AddTo S SMALL+instance AddTo S EM+instance AddTo S STRONG+instance AddTo S DFN+instance AddTo S CODE+instance AddTo S SAMP+instance AddTo S KBD+instance AddTo S VAR+instance AddTo S CITE+instance AddTo S ABBR+instance AddTo S ACRONYM+instance AddTo S A+instance AddTo S IMG+instance AddTo S APPLET+instance AddTo S OBJECT+instance AddTo S FONT+instance AddTo S BASEFONT+instance AddTo S BR+instance AddTo S SCRIPT+instance AddTo S MAP+instance AddTo S Q+instance AddTo S SUB+instance AddTo S SUP+instance AddTo S SPAN+instance AddTo S BDO+instance AddTo S IFRAME+instance AddTo S INPUT+instance AddTo S SELECT+instance AddTo S TEXTAREA+instance AddTo S LABEL+instance AddTo S BUTTON+instance TAG STRIKE+instance AddTo STRIKE CDATA+instance AddTo STRIKE TT+instance AddTo STRIKE I+instance AddTo STRIKE B+instance AddTo STRIKE U+instance AddTo STRIKE S+instance AddTo STRIKE STRIKE+instance AddTo STRIKE BIG+instance AddTo STRIKE SMALL+instance AddTo STRIKE EM+instance AddTo STRIKE STRONG+instance AddTo STRIKE DFN+instance AddTo STRIKE CODE+instance AddTo STRIKE SAMP+instance AddTo STRIKE KBD+instance AddTo STRIKE VAR+instance AddTo STRIKE CITE+instance AddTo STRIKE ABBR+instance AddTo STRIKE ACRONYM+instance AddTo STRIKE A+instance AddTo STRIKE IMG+instance AddTo STRIKE APPLET+instance AddTo STRIKE OBJECT+instance AddTo STRIKE FONT+instance AddTo STRIKE BASEFONT+instance AddTo STRIKE BR+instance AddTo STRIKE SCRIPT+instance AddTo STRIKE MAP+instance AddTo STRIKE Q+instance AddTo STRIKE SUB+instance AddTo STRIKE SUP+instance AddTo STRIKE SPAN+instance AddTo STRIKE BDO+instance AddTo STRIKE IFRAME+instance AddTo STRIKE INPUT+instance AddTo STRIKE SELECT+instance AddTo STRIKE TEXTAREA+instance AddTo STRIKE LABEL+instance AddTo STRIKE BUTTON+instance TAG BIG+instance AddTo BIG CDATA+instance AddTo BIG TT+instance AddTo BIG I+instance AddTo BIG B+instance AddTo BIG U+instance AddTo BIG S+instance AddTo BIG STRIKE+instance AddTo BIG BIG+instance AddTo BIG SMALL+instance AddTo BIG EM+instance AddTo BIG STRONG+instance AddTo BIG DFN+instance AddTo BIG CODE+instance AddTo BIG SAMP+instance AddTo BIG KBD+instance AddTo BIG VAR+instance AddTo BIG CITE+instance AddTo BIG ABBR+instance AddTo BIG ACRONYM+instance AddTo BIG A+instance AddTo BIG IMG+instance AddTo BIG APPLET+instance AddTo BIG OBJECT+instance AddTo BIG FONT+instance AddTo BIG BASEFONT+instance AddTo BIG BR+instance AddTo BIG SCRIPT+instance AddTo BIG MAP+instance AddTo BIG Q+instance AddTo BIG SUB+instance AddTo BIG SUP+instance AddTo BIG SPAN+instance AddTo BIG BDO+instance AddTo BIG IFRAME+instance AddTo BIG INPUT+instance AddTo BIG SELECT+instance AddTo BIG TEXTAREA+instance AddTo BIG LABEL+instance AddTo BIG BUTTON+instance TAG SMALL+instance AddTo SMALL CDATA+instance AddTo SMALL TT+instance AddTo SMALL I+instance AddTo SMALL B+instance AddTo SMALL U+instance AddTo SMALL S+instance AddTo SMALL STRIKE+instance AddTo SMALL BIG+instance AddTo SMALL SMALL+instance AddTo SMALL EM+instance AddTo SMALL STRONG+instance AddTo SMALL DFN+instance AddTo SMALL CODE+instance AddTo SMALL SAMP+instance AddTo SMALL KBD+instance AddTo SMALL VAR+instance AddTo SMALL CITE+instance AddTo SMALL ABBR+instance AddTo SMALL ACRONYM+instance AddTo SMALL A+instance AddTo SMALL IMG+instance AddTo SMALL APPLET+instance AddTo SMALL OBJECT+instance AddTo SMALL FONT+instance AddTo SMALL BASEFONT+instance AddTo SMALL BR+instance AddTo SMALL SCRIPT+instance AddTo SMALL MAP+instance AddTo SMALL Q+instance AddTo SMALL SUB+instance AddTo SMALL SUP+instance AddTo SMALL SPAN+instance AddTo SMALL BDO+instance AddTo SMALL IFRAME+instance AddTo SMALL INPUT+instance AddTo SMALL SELECT+instance AddTo SMALL TEXTAREA+instance AddTo SMALL LABEL+instance AddTo SMALL BUTTON+instance TAG EM+instance AddTo EM CDATA+instance AddTo EM TT+instance AddTo EM I+instance AddTo EM B+instance AddTo EM U+instance AddTo EM S+instance AddTo EM STRIKE+instance AddTo EM BIG+instance AddTo EM SMALL+instance AddTo EM EM+instance AddTo EM STRONG+instance AddTo EM DFN+instance AddTo EM CODE+instance AddTo EM SAMP+instance AddTo EM KBD+instance AddTo EM VAR+instance AddTo EM CITE+instance AddTo EM ABBR+instance AddTo EM ACRONYM+instance AddTo EM A+instance AddTo EM IMG+instance AddTo EM APPLET+instance AddTo EM OBJECT+instance AddTo EM FONT+instance AddTo EM BASEFONT+instance AddTo EM BR+instance AddTo EM SCRIPT+instance AddTo EM MAP+instance AddTo EM Q+instance AddTo EM SUB+instance AddTo EM SUP+instance AddTo EM SPAN+instance AddTo EM BDO+instance AddTo EM IFRAME+instance AddTo EM INPUT+instance AddTo EM SELECT+instance AddTo EM TEXTAREA+instance AddTo EM LABEL+instance AddTo EM BUTTON+instance TAG STRONG+instance AddTo STRONG CDATA+instance AddTo STRONG TT+instance AddTo STRONG I+instance AddTo STRONG B+instance AddTo STRONG U+instance AddTo STRONG S+instance AddTo STRONG STRIKE+instance AddTo STRONG BIG+instance AddTo STRONG SMALL+instance AddTo STRONG EM+instance AddTo STRONG STRONG+instance AddTo STRONG DFN+instance AddTo STRONG CODE+instance AddTo STRONG SAMP+instance AddTo STRONG KBD+instance AddTo STRONG VAR+instance AddTo STRONG CITE+instance AddTo STRONG ABBR+instance AddTo STRONG ACRONYM+instance AddTo STRONG A+instance AddTo STRONG IMG+instance AddTo STRONG APPLET+instance AddTo STRONG OBJECT+instance AddTo STRONG FONT+instance AddTo STRONG BASEFONT+instance AddTo STRONG BR+instance AddTo STRONG SCRIPT+instance AddTo STRONG MAP+instance AddTo STRONG Q+instance AddTo STRONG SUB+instance AddTo STRONG SUP+instance AddTo STRONG SPAN+instance AddTo STRONG BDO+instance AddTo STRONG IFRAME+instance AddTo STRONG INPUT+instance AddTo STRONG SELECT+instance AddTo STRONG TEXTAREA+instance AddTo STRONG LABEL+instance AddTo STRONG BUTTON+instance TAG DFN+instance AddTo DFN CDATA+instance AddTo DFN TT+instance AddTo DFN I+instance AddTo DFN B+instance AddTo DFN U+instance AddTo DFN S+instance AddTo DFN STRIKE+instance AddTo DFN BIG+instance AddTo DFN SMALL+instance AddTo DFN EM+instance AddTo DFN STRONG+instance AddTo DFN DFN+instance AddTo DFN CODE+instance AddTo DFN SAMP+instance AddTo DFN KBD+instance AddTo DFN VAR+instance AddTo DFN CITE+instance AddTo DFN ABBR+instance AddTo DFN ACRONYM+instance AddTo DFN A+instance AddTo DFN IMG+instance AddTo DFN APPLET+instance AddTo DFN OBJECT+instance AddTo DFN FONT+instance AddTo DFN BASEFONT+instance AddTo DFN BR+instance AddTo DFN SCRIPT+instance AddTo DFN MAP+instance AddTo DFN Q+instance AddTo DFN SUB+instance AddTo DFN SUP+instance AddTo DFN SPAN+instance AddTo DFN BDO+instance AddTo DFN IFRAME+instance AddTo DFN INPUT+instance AddTo DFN SELECT+instance AddTo DFN TEXTAREA+instance AddTo DFN LABEL+instance AddTo DFN BUTTON+instance TAG CODE+instance AddTo CODE CDATA+instance AddTo CODE TT+instance AddTo CODE I+instance AddTo CODE B+instance AddTo CODE U+instance AddTo CODE S+instance AddTo CODE STRIKE+instance AddTo CODE BIG+instance AddTo CODE SMALL+instance AddTo CODE EM+instance AddTo CODE STRONG+instance AddTo CODE DFN+instance AddTo CODE CODE+instance AddTo CODE SAMP+instance AddTo CODE KBD+instance AddTo CODE VAR+instance AddTo CODE CITE+instance AddTo CODE ABBR+instance AddTo CODE ACRONYM+instance AddTo CODE A+instance AddTo CODE IMG+instance AddTo CODE APPLET+instance AddTo CODE OBJECT+instance AddTo CODE FONT+instance AddTo CODE BASEFONT+instance AddTo CODE BR+instance AddTo CODE SCRIPT+instance AddTo CODE MAP+instance AddTo CODE Q+instance AddTo CODE SUB+instance AddTo CODE SUP+instance AddTo CODE SPAN+instance AddTo CODE BDO+instance AddTo CODE IFRAME+instance AddTo CODE INPUT+instance AddTo CODE SELECT+instance AddTo CODE TEXTAREA+instance AddTo CODE LABEL+instance AddTo CODE BUTTON+instance TAG SAMP+instance AddTo SAMP CDATA+instance AddTo SAMP TT+instance AddTo SAMP I+instance AddTo SAMP B+instance AddTo SAMP U+instance AddTo SAMP S+instance AddTo SAMP STRIKE+instance AddTo SAMP BIG+instance AddTo SAMP SMALL+instance AddTo SAMP EM+instance AddTo SAMP STRONG+instance AddTo SAMP DFN+instance AddTo SAMP CODE+instance AddTo SAMP SAMP+instance AddTo SAMP KBD+instance AddTo SAMP VAR+instance AddTo SAMP CITE+instance AddTo SAMP ABBR+instance AddTo SAMP ACRONYM+instance AddTo SAMP A+instance AddTo SAMP IMG+instance AddTo SAMP APPLET+instance AddTo SAMP OBJECT+instance AddTo SAMP FONT+instance AddTo SAMP BASEFONT+instance AddTo SAMP BR+instance AddTo SAMP SCRIPT+instance AddTo SAMP MAP+instance AddTo SAMP Q+instance AddTo SAMP SUB+instance AddTo SAMP SUP+instance AddTo SAMP SPAN+instance AddTo SAMP BDO+instance AddTo SAMP IFRAME+instance AddTo SAMP INPUT+instance AddTo SAMP SELECT+instance AddTo SAMP TEXTAREA+instance AddTo SAMP LABEL+instance AddTo SAMP BUTTON+instance TAG KBD+instance AddTo KBD CDATA+instance AddTo KBD TT+instance AddTo KBD I+instance AddTo KBD B+instance AddTo KBD U+instance AddTo KBD S+instance AddTo KBD STRIKE+instance AddTo KBD BIG+instance AddTo KBD SMALL+instance AddTo KBD EM+instance AddTo KBD STRONG+instance AddTo KBD DFN+instance AddTo KBD CODE+instance AddTo KBD SAMP+instance AddTo KBD KBD+instance AddTo KBD VAR+instance AddTo KBD CITE+instance AddTo KBD ABBR+instance AddTo KBD ACRONYM+instance AddTo KBD A+instance AddTo KBD IMG+instance AddTo KBD APPLET+instance AddTo KBD OBJECT+instance AddTo KBD FONT+instance AddTo KBD BASEFONT+instance AddTo KBD BR+instance AddTo KBD SCRIPT+instance AddTo KBD MAP+instance AddTo KBD Q+instance AddTo KBD SUB+instance AddTo KBD SUP+instance AddTo KBD SPAN+instance AddTo KBD BDO+instance AddTo KBD IFRAME+instance AddTo KBD INPUT+instance AddTo KBD SELECT+instance AddTo KBD TEXTAREA+instance AddTo KBD LABEL+instance AddTo KBD BUTTON+instance TAG VAR+instance AddTo VAR CDATA+instance AddTo VAR TT+instance AddTo VAR I+instance AddTo VAR B+instance AddTo VAR U+instance AddTo VAR S+instance AddTo VAR STRIKE+instance AddTo VAR BIG+instance AddTo VAR SMALL+instance AddTo VAR EM+instance AddTo VAR STRONG+instance AddTo VAR DFN+instance AddTo VAR CODE+instance AddTo VAR SAMP+instance AddTo VAR KBD+instance AddTo VAR VAR+instance AddTo VAR CITE+instance AddTo VAR ABBR+instance AddTo VAR ACRONYM+instance AddTo VAR A+instance AddTo VAR IMG+instance AddTo VAR APPLET+instance AddTo VAR OBJECT+instance AddTo VAR FONT+instance AddTo VAR BASEFONT+instance AddTo VAR BR+instance AddTo VAR SCRIPT+instance AddTo VAR MAP+instance AddTo VAR Q+instance AddTo VAR SUB+instance AddTo VAR SUP+instance AddTo VAR SPAN+instance AddTo VAR BDO+instance AddTo VAR IFRAME+instance AddTo VAR INPUT+instance AddTo VAR SELECT+instance AddTo VAR TEXTAREA+instance AddTo VAR LABEL+instance AddTo VAR BUTTON+instance TAG CITE+instance AddTo CITE CDATA+instance AddTo CITE TT+instance AddTo CITE I+instance AddTo CITE B+instance AddTo CITE U+instance AddTo CITE S+instance AddTo CITE STRIKE+instance AddTo CITE BIG+instance AddTo CITE SMALL+instance AddTo CITE EM+instance AddTo CITE STRONG+instance AddTo CITE DFN+instance AddTo CITE CODE+instance AddTo CITE SAMP+instance AddTo CITE KBD+instance AddTo CITE VAR+instance AddTo CITE CITE+instance AddTo CITE ABBR+instance AddTo CITE ACRONYM+instance AddTo CITE A+instance AddTo CITE IMG+instance AddTo CITE APPLET+instance AddTo CITE OBJECT+instance AddTo CITE FONT+instance AddTo CITE BASEFONT+instance AddTo CITE BR+instance AddTo CITE SCRIPT+instance AddTo CITE MAP+instance AddTo CITE Q+instance AddTo CITE SUB+instance AddTo CITE SUP+instance AddTo CITE SPAN+instance AddTo CITE BDO+instance AddTo CITE IFRAME+instance AddTo CITE INPUT+instance AddTo CITE SELECT+instance AddTo CITE TEXTAREA+instance AddTo CITE LABEL+instance AddTo CITE BUTTON+instance TAG ABBR+instance AddTo ABBR CDATA+instance AddTo ABBR TT+instance AddTo ABBR I+instance AddTo ABBR B+instance AddTo ABBR U+instance AddTo ABBR S+instance AddTo ABBR STRIKE+instance AddTo ABBR BIG+instance AddTo ABBR SMALL+instance AddTo ABBR EM+instance AddTo ABBR STRONG+instance AddTo ABBR DFN+instance AddTo ABBR CODE+instance AddTo ABBR SAMP+instance AddTo ABBR KBD+instance AddTo ABBR VAR+instance AddTo ABBR CITE+instance AddTo ABBR ABBR+instance AddTo ABBR ACRONYM+instance AddTo ABBR A+instance AddTo ABBR IMG+instance AddTo ABBR APPLET+instance AddTo ABBR OBJECT+instance AddTo ABBR FONT+instance AddTo ABBR BASEFONT+instance AddTo ABBR BR+instance AddTo ABBR SCRIPT+instance AddTo ABBR MAP+instance AddTo ABBR Q+instance AddTo ABBR SUB+instance AddTo ABBR SUP+instance AddTo ABBR SPAN+instance AddTo ABBR BDO+instance AddTo ABBR IFRAME+instance AddTo ABBR INPUT+instance AddTo ABBR SELECT+instance AddTo ABBR TEXTAREA+instance AddTo ABBR LABEL+instance AddTo ABBR BUTTON+instance TAG ACRONYM+instance AddTo ACRONYM CDATA+instance AddTo ACRONYM TT+instance AddTo ACRONYM I+instance AddTo ACRONYM B+instance AddTo ACRONYM U+instance AddTo ACRONYM S+instance AddTo ACRONYM STRIKE+instance AddTo ACRONYM BIG+instance AddTo ACRONYM SMALL+instance AddTo ACRONYM EM+instance AddTo ACRONYM STRONG+instance AddTo ACRONYM DFN+instance AddTo ACRONYM CODE+instance AddTo ACRONYM SAMP+instance AddTo ACRONYM KBD+instance AddTo ACRONYM VAR+instance AddTo ACRONYM CITE+instance AddTo ACRONYM ABBR+instance AddTo ACRONYM ACRONYM+instance AddTo ACRONYM A+instance AddTo ACRONYM IMG+instance AddTo ACRONYM APPLET+instance AddTo ACRONYM OBJECT+instance AddTo ACRONYM FONT+instance AddTo ACRONYM BASEFONT+instance AddTo ACRONYM BR+instance AddTo ACRONYM SCRIPT+instance AddTo ACRONYM MAP+instance AddTo ACRONYM Q+instance AddTo ACRONYM SUB+instance AddTo ACRONYM SUP+instance AddTo ACRONYM SPAN+instance AddTo ACRONYM BDO+instance AddTo ACRONYM IFRAME+instance AddTo ACRONYM INPUT+instance AddTo ACRONYM SELECT+instance AddTo ACRONYM TEXTAREA+instance AddTo ACRONYM LABEL+instance AddTo ACRONYM BUTTON+data ALIGN_bottom = ALIGN_bottom+data ALIGN_center = ALIGN_center+data ALIGN_char = ALIGN_char+data ALIGN_justify = ALIGN_justify+data ALIGN_left = ALIGN_left+data ALIGN_middle = ALIGN_middle+data ALIGN_right = ALIGN_right+data ALIGN_top = ALIGN_top+data CHECKED_checked = CHECKED_checked+data CLEAR_all = CLEAR_all+data CLEAR_left = CLEAR_left+data CLEAR_none = CLEAR_none+data CLEAR_right = CLEAR_right+data COMPACT_compact = COMPACT_compact+data DECLARE_declare = DECLARE_declare+data DEFER_defer = DEFER_defer+data DIR_ltr = DIR_ltr+data DIR_rtl = DIR_rtl+data DISABLED_disabled = DISABLED_disabled+data FRAME_above = FRAME_above+data FRAME_below = FRAME_below+data FRAME_border = FRAME_border+data FRAME_box = FRAME_box+data FRAME_hsides = FRAME_hsides+data FRAME_lhs = FRAME_lhs+data FRAME_rhs = FRAME_rhs+data FRAME_void = FRAME_void+data FRAME_vsides = FRAME_vsides+data ISMAP_ismap = ISMAP_ismap+data METHOD_GET = METHOD_GET+data METHOD_POST = METHOD_POST+data MULTIPLE_multiple = MULTIPLE_multiple+data NOHREF_nohref = NOHREF_nohref+data NOSHADE_noshade = NOSHADE_noshade+data NOWRAP_nowrap = NOWRAP_nowrap+data READONLY_readonly = READONLY_readonly+data RULES_all = RULES_all+data RULES_cols = RULES_cols+data RULES_groups = RULES_groups+data RULES_none = RULES_none+data RULES_rows = RULES_rows+data SCOPE_col = SCOPE_col+data SCOPE_colgroup = SCOPE_colgroup+data SCOPE_row = SCOPE_row+data SCOPE_rowgroup = SCOPE_rowgroup+data SCROLLING_auto = SCROLLING_auto+data SCROLLING_no = SCROLLING_no+data SCROLLING_yes = SCROLLING_yes+data SELECTED_selected = SELECTED_selected+data SHAPE_circle = SHAPE_circle+data SHAPE_default' = SHAPE_default'+data SHAPE_poly = SHAPE_poly+data SHAPE_rect = SHAPE_rect+data TYPE_BUTTON = TYPE_BUTTON+data TYPE_CHECKBOX = TYPE_CHECKBOX+data TYPE_FILE = TYPE_FILE+data TYPE_HIDDEN = TYPE_HIDDEN+data TYPE_IMAGE = TYPE_IMAGE+data TYPE_PASSWORD = TYPE_PASSWORD+data TYPE_RADIO = TYPE_RADIO+data TYPE_RESET = TYPE_RESET+data TYPE_SUBMIT = TYPE_SUBMIT+data TYPE_TEXT = TYPE_TEXT+data TYPE_button = TYPE_button+data TYPE_circle = TYPE_circle+data TYPE_disc = TYPE_disc+data TYPE_reset = TYPE_reset+data TYPE_square = TYPE_square+data TYPE_submit = TYPE_submit+data VALIGN_baseline = VALIGN_baseline+data VALIGN_bottom = VALIGN_bottom+data VALIGN_middle = VALIGN_middle+data VALIGN_top = VALIGN_top+data VALUETYPE_DATA = VALUETYPE_DATA+data VALUETYPE_OBJECT = VALUETYPE_OBJECT+data VALUETYPE_REF = VALUETYPE_REF+instance ATTRIBUTE ABBR+instance ATTRIBUTE ACCEPT+instance ATTRIBUTE ACCEPT_CHARSET+instance ATTRIBUTE ACCESSKEY+instance ATTRIBUTE ACTION+instance ATTRIBUTE ALIGN+instance ATTRIBUTE ALINK+instance ATTRIBUTE ALT+instance ATTRIBUTE ARCHIVE+instance ATTRIBUTE AXIS+instance ATTRIBUTE BACKGROUND+instance ATTRIBUTE BGCOLOR+instance ATTRIBUTE BORDER+instance ATTRIBUTE CELLPADDING+instance ATTRIBUTE CELLSPACING+instance ATTRIBUTE CHAR+instance ATTRIBUTE CHAROFF+instance ATTRIBUTE CHARSET+instance ATTRIBUTE CHECKED+instance ATTRIBUTE CITE+instance ATTRIBUTE CLASS+instance ATTRIBUTE CLASSID+instance ATTRIBUTE CLEAR+instance ATTRIBUTE CODE+instance ATTRIBUTE CODEBASE+instance ATTRIBUTE CODETYPE+instance ATTRIBUTE COLOR+instance ATTRIBUTE COLS+instance ATTRIBUTE COLSPAN+instance ATTRIBUTE COMPACT+instance ATTRIBUTE CONTENT+instance ATTRIBUTE COORDS+instance ATTRIBUTE DATA+instance ATTRIBUTE DATAPAGESIZE+instance ATTRIBUTE DATETIME+instance ATTRIBUTE DECLARE+instance ATTRIBUTE DEFER+instance ATTRIBUTE DIR+instance ATTRIBUTE DISABLED+instance ATTRIBUTE ENCTYPE+instance ATTRIBUTE EVENT+instance ATTRIBUTE FACE+instance ATTRIBUTE FOR+instance ATTRIBUTE FRAME+instance ATTRIBUTE FRAMEBORDER+instance ATTRIBUTE HEADERS+instance ATTRIBUTE HEIGHT+instance ATTRIBUTE HREF+instance ATTRIBUTE HREFLANG+instance ATTRIBUTE HSPACE+instance ATTRIBUTE HTTP_EQUIV+instance ATTRIBUTE ID+instance ATTRIBUTE ISMAP+instance ATTRIBUTE LABEL+instance ATTRIBUTE LANG+instance ATTRIBUTE LANGUAGE+instance ATTRIBUTE LINK+instance ATTRIBUTE LONGDESC+instance ATTRIBUTE MARGINHEIGHT+instance ATTRIBUTE MARGINWIDTH+instance ATTRIBUTE MAXLENGTH+instance ATTRIBUTE MEDIA+instance ATTRIBUTE METHOD+instance ATTRIBUTE MULTIPLE+instance ATTRIBUTE NAME+instance ATTRIBUTE NOHREF+instance ATTRIBUTE NOSHADE+instance ATTRIBUTE NOWRAP+instance ATTRIBUTE OBJECT+instance ATTRIBUTE ONBLUR+instance ATTRIBUTE ONCHANGE+instance ATTRIBUTE ONCLICK+instance ATTRIBUTE ONDBLCLICK+instance ATTRIBUTE ONFOCUS+instance ATTRIBUTE ONKEYDOWN+instance ATTRIBUTE ONKEYPRESS+instance ATTRIBUTE ONKEYUP+instance ATTRIBUTE ONLOAD+instance ATTRIBUTE ONMOUSEDOWN+instance ATTRIBUTE ONMOUSEMOVE+instance ATTRIBUTE ONMOUSEOUT+instance ATTRIBUTE ONMOUSEOVER+instance ATTRIBUTE ONMOUSEUP+instance ATTRIBUTE ONRESET+instance ATTRIBUTE ONSELECT+instance ATTRIBUTE ONSUBMIT+instance ATTRIBUTE ONUNLOAD+instance ATTRIBUTE PROFILE+instance ATTRIBUTE PROMPT+instance ATTRIBUTE READONLY+instance ATTRIBUTE REL+instance ATTRIBUTE REV+instance ATTRIBUTE ROWS+instance ATTRIBUTE ROWSPAN+instance ATTRIBUTE RULES+instance ATTRIBUTE SCHEME+instance ATTRIBUTE SCOPE+instance ATTRIBUTE SCROLLING+instance ATTRIBUTE SELECTED+instance ATTRIBUTE SHAPE+instance ATTRIBUTE SIZE+instance ATTRIBUTE SPAN+instance ATTRIBUTE SRC+instance ATTRIBUTE STANDBY+instance ATTRIBUTE START+instance ATTRIBUTE STYLE+instance ATTRIBUTE SUMMARY+instance ATTRIBUTE TABINDEX+instance ATTRIBUTE TARGET+instance ATTRIBUTE TEXT+instance ATTRIBUTE TITLE+instance ATTRIBUTE TYPE+instance ATTRIBUTE USEMAP+instance ATTRIBUTE VALIGN+instance ATTRIBUTE VALUE+instance ATTRIBUTE VALUETYPE+instance ATTRIBUTE VERSION+instance ATTRIBUTE VLINK+instance ATTRIBUTE VSPACE+instance ATTRIBUTE WIDTH+instance AttrValue ABBR String+instance AttrValue ACCEPT String+instance AttrValue ACCEPT_CHARSET String+instance AttrValue ACCESSKEY String+instance AttrValue ACTION String+instance AttrValue ALIGN ALIGN_bottom+instance AttrValue ALIGN ALIGN_center+instance AttrValue ALIGN ALIGN_char+instance AttrValue ALIGN ALIGN_justify+instance AttrValue ALIGN ALIGN_left+instance AttrValue ALIGN ALIGN_middle+instance AttrValue ALIGN ALIGN_right+instance AttrValue ALIGN ALIGN_top+instance AttrValue ALINK String+instance AttrValue ALT String+instance AttrValue ARCHIVE String+instance AttrValue AXIS String+instance AttrValue BACKGROUND String+instance AttrValue BGCOLOR String+instance AttrValue BORDER String+instance AttrValue CELLPADDING String+instance AttrValue CELLSPACING String+instance AttrValue CHAR String+instance AttrValue CHAROFF String+instance AttrValue CHARSET String+instance AttrValue CHECKED CHECKED_checked+instance AttrValue CITE String+instance AttrValue CLASS String+instance AttrValue CLASSID String+instance AttrValue CLEAR CLEAR_all+instance AttrValue CLEAR CLEAR_left+instance AttrValue CLEAR CLEAR_none+instance AttrValue CLEAR CLEAR_right+instance AttrValue CODE String+instance AttrValue CODEBASE String+instance AttrValue CODETYPE String+instance AttrValue COLOR String+instance AttrValue COLS Int+instance AttrValue COLSPAN Int+instance AttrValue COMPACT COMPACT_compact+instance AttrValue CONTENT String+instance AttrValue COORDS String+instance AttrValue DATA String+instance AttrValue DATAPAGESIZE String+instance AttrValue DATETIME String+instance AttrValue DECLARE DECLARE_declare+instance AttrValue DEFER DEFER_defer+instance AttrValue DIR DIR_ltr+instance AttrValue DIR DIR_rtl+instance AttrValue DISABLED DISABLED_disabled+instance AttrValue ENCTYPE String+instance AttrValue EVENT String+instance AttrValue FACE String+instance AttrValue FOR String+instance AttrValue FRAME FRAME_above+instance AttrValue FRAME FRAME_below+instance AttrValue FRAME FRAME_border+instance AttrValue FRAME FRAME_box+instance AttrValue FRAME FRAME_hsides+instance AttrValue FRAME FRAME_lhs+instance AttrValue FRAME FRAME_rhs+instance AttrValue FRAME FRAME_void+instance AttrValue FRAME FRAME_vsides+instance AttrValue FRAMEBORDER Int+instance AttrValue HEADERS [String]+instance AttrValue HEIGHT String+instance AttrValue HREF String+instance AttrValue HREFLANG String+instance AttrValue HSPACE String+instance AttrValue HTTP_EQUIV String+instance AttrValue ID String+instance AttrValue ISMAP ISMAP_ismap+instance AttrValue LABEL String+instance AttrValue LANG String+instance AttrValue LANGUAGE String+instance AttrValue LINK String+instance AttrValue LONGDESC String+instance AttrValue MARGINHEIGHT String+instance AttrValue MARGINWIDTH String+instance AttrValue MAXLENGTH Int+instance AttrValue MEDIA String+instance AttrValue METHOD METHOD_GET+instance AttrValue METHOD METHOD_POST+instance AttrValue MULTIPLE MULTIPLE_multiple+instance AttrValue NAME String+instance AttrValue NOHREF NOHREF_nohref+instance AttrValue NOSHADE NOSHADE_noshade+instance AttrValue NOWRAP NOWRAP_nowrap+instance AttrValue OBJECT String+instance AttrValue ONBLUR String+instance AttrValue ONCHANGE String+instance AttrValue ONCLICK String+instance AttrValue ONDBLCLICK String+instance AttrValue ONFOCUS String+instance AttrValue ONKEYDOWN String+instance AttrValue ONKEYPRESS String+instance AttrValue ONKEYUP String+instance AttrValue ONLOAD String+instance AttrValue ONMOUSEDOWN String+instance AttrValue ONMOUSEMOVE String+instance AttrValue ONMOUSEOUT String+instance AttrValue ONMOUSEOVER String+instance AttrValue ONMOUSEUP String+instance AttrValue ONRESET String+instance AttrValue ONSELECT String+instance AttrValue ONSUBMIT String+instance AttrValue ONUNLOAD String+instance AttrValue PROFILE String+instance AttrValue PROMPT String+instance AttrValue READONLY READONLY_readonly+instance AttrValue REL String+instance AttrValue REV String+instance AttrValue ROWS Int+instance AttrValue ROWSPAN Int+instance AttrValue RULES RULES_all+instance AttrValue RULES RULES_cols+instance AttrValue RULES RULES_groups+instance AttrValue RULES RULES_none+instance AttrValue RULES RULES_rows+instance AttrValue SCHEME String+instance AttrValue SCOPE SCOPE_col+instance AttrValue SCOPE SCOPE_colgroup+instance AttrValue SCOPE SCOPE_row+instance AttrValue SCOPE SCOPE_rowgroup+instance AttrValue SCROLLING SCROLLING_auto+instance AttrValue SCROLLING SCROLLING_no+instance AttrValue SCROLLING SCROLLING_yes+instance AttrValue SELECTED SELECTED_selected+instance AttrValue SHAPE SHAPE_circle+instance AttrValue SHAPE SHAPE_default'+instance AttrValue SHAPE SHAPE_poly+instance AttrValue SHAPE SHAPE_rect+instance AttrValue SIZE Int+instance AttrValue SIZE String+instance AttrValue SPAN Int+instance AttrValue SRC String+instance AttrValue STANDBY String+instance AttrValue START Int+instance AttrValue STYLE String+instance AttrValue SUMMARY String+instance AttrValue TABINDEX Int+instance AttrValue TARGET String+instance AttrValue TEXT String+instance AttrValue TITLE String+instance AttrValue TYPE String+instance AttrValue TYPE TYPE_BUTTON+instance AttrValue TYPE TYPE_CHECKBOX+instance AttrValue TYPE TYPE_FILE+instance AttrValue TYPE TYPE_HIDDEN+instance AttrValue TYPE TYPE_IMAGE+instance AttrValue TYPE TYPE_PASSWORD+instance AttrValue TYPE TYPE_RADIO+instance AttrValue TYPE TYPE_RESET+instance AttrValue TYPE TYPE_SUBMIT+instance AttrValue TYPE TYPE_TEXT+instance AttrValue TYPE TYPE_button+instance AttrValue TYPE TYPE_circle+instance AttrValue TYPE TYPE_disc+instance AttrValue TYPE TYPE_reset+instance AttrValue TYPE TYPE_square+instance AttrValue TYPE TYPE_submit+instance AttrValue USEMAP String+instance AttrValue VALIGN VALIGN_baseline+instance AttrValue VALIGN VALIGN_bottom+instance AttrValue VALIGN VALIGN_middle+instance AttrValue VALIGN VALIGN_top+instance AttrValue VALUE Int+instance AttrValue VALUE String+instance AttrValue VALUETYPE VALUETYPE_DATA+instance AttrValue VALUETYPE VALUETYPE_OBJECT+instance AttrValue VALUETYPE VALUETYPE_REF+instance AttrValue VERSION String+instance AttrValue VLINK String+instance AttrValue VSPACE String+instance AttrValue WIDTH Int+instance AttrValue WIDTH String+instance Show ALIGN_bottom where show ALIGN_bottom = "bottom"+instance Show ALIGN_center where show ALIGN_center = "center"+instance Show ALIGN_char where show ALIGN_char = "char"+instance Show ALIGN_justify where show ALIGN_justify = "justify"+instance Show ALIGN_left where show ALIGN_left = "left"+instance Show ALIGN_middle where show ALIGN_middle = "middle"+instance Show ALIGN_right where show ALIGN_right = "right"+instance Show ALIGN_top where show ALIGN_top = "top"+instance Show CHECKED_checked where show CHECKED_checked = "checked"+instance Show CLEAR_all where show CLEAR_all = "all"+instance Show CLEAR_left where show CLEAR_left = "left"+instance Show CLEAR_none where show CLEAR_none = "none"+instance Show CLEAR_right where show CLEAR_right = "right"+instance Show COMPACT_compact where show COMPACT_compact = "compact"+instance Show DECLARE_declare where show DECLARE_declare = "declare"+instance Show DEFER_defer where show DEFER_defer = "defer"+instance Show DIR_ltr where show DIR_ltr = "ltr"+instance Show DIR_rtl where show DIR_rtl = "rtl"+instance Show DISABLED_disabled where show DISABLED_disabled = "disabled"+instance Show FRAME_above where show FRAME_above = "above"+instance Show FRAME_below where show FRAME_below = "below"+instance Show FRAME_border where show FRAME_border = "border"+instance Show FRAME_box where show FRAME_box = "box"+instance Show FRAME_hsides where show FRAME_hsides = "hsides"+instance Show FRAME_lhs where show FRAME_lhs = "lhs"+instance Show FRAME_rhs where show FRAME_rhs = "rhs"+instance Show FRAME_void where show FRAME_void = "void"+instance Show FRAME_vsides where show FRAME_vsides = "vsides"+instance Show ISMAP_ismap where show ISMAP_ismap = "ismap"+instance Show METHOD_GET where show METHOD_GET = "GET"+instance Show METHOD_POST where show METHOD_POST = "POST"+instance Show MULTIPLE_multiple where show MULTIPLE_multiple = "multiple"+instance Show NOHREF_nohref where show NOHREF_nohref = "nohref"+instance Show NOSHADE_noshade where show NOSHADE_noshade = "noshade"+instance Show NOWRAP_nowrap where show NOWRAP_nowrap = "nowrap"+instance Show READONLY_readonly where show READONLY_readonly = "readonly"+instance Show RULES_all where show RULES_all = "all"+instance Show RULES_cols where show RULES_cols = "cols"+instance Show RULES_groups where show RULES_groups = "groups"+instance Show RULES_none where show RULES_none = "none"+instance Show RULES_rows where show RULES_rows = "rows"+instance Show SCOPE_col where show SCOPE_col = "col"+instance Show SCOPE_colgroup where show SCOPE_colgroup = "colgroup"+instance Show SCOPE_row where show SCOPE_row = "row"+instance Show SCOPE_rowgroup where show SCOPE_rowgroup = "rowgroup"+instance Show SCROLLING_auto where show SCROLLING_auto = "auto"+instance Show SCROLLING_no where show SCROLLING_no = "no"+instance Show SCROLLING_yes where show SCROLLING_yes = "yes"+instance Show SELECTED_selected where show SELECTED_selected = "selected"+instance Show SHAPE_circle where show SHAPE_circle = "circle"+instance Show SHAPE_default' where show SHAPE_default' = "default"+instance Show SHAPE_poly where show SHAPE_poly = "poly"+instance Show SHAPE_rect where show SHAPE_rect = "rect"+instance Show TYPE_BUTTON where show TYPE_BUTTON = "BUTTON"+instance Show TYPE_CHECKBOX where show TYPE_CHECKBOX = "CHECKBOX"+instance Show TYPE_FILE where show TYPE_FILE = "FILE"+instance Show TYPE_HIDDEN where show TYPE_HIDDEN = "HIDDEN"+instance Show TYPE_IMAGE where show TYPE_IMAGE = "IMAGE"+instance Show TYPE_PASSWORD where show TYPE_PASSWORD = "PASSWORD"+instance Show TYPE_RADIO where show TYPE_RADIO = "RADIO"+instance Show TYPE_RESET where show TYPE_RESET = "RESET"+instance Show TYPE_SUBMIT where show TYPE_SUBMIT = "SUBMIT"+instance Show TYPE_TEXT where show TYPE_TEXT = "TEXT"+instance Show TYPE_button where show TYPE_button = "button"+instance Show TYPE_circle where show TYPE_circle = "circle"+instance Show TYPE_disc where show TYPE_disc = "disc"+instance Show TYPE_reset where show TYPE_reset = "reset"+instance Show TYPE_square where show TYPE_square = "square"+instance Show TYPE_submit where show TYPE_submit = "submit"+instance Show VALIGN_baseline where show VALIGN_baseline = "baseline"+instance Show VALIGN_bottom where show VALIGN_bottom = "bottom"+instance Show VALIGN_middle where show VALIGN_middle = "middle"+instance Show VALIGN_top where show VALIGN_top = "top"+instance Show VALUETYPE_DATA where show VALUETYPE_DATA = "DATA"+instance Show VALUETYPE_OBJECT where show VALUETYPE_OBJECT = "OBJECT"+instance Show VALUETYPE_REF where show VALUETYPE_REF = "REF"+instance AddAttr A ACCESSKEY+instance AddAttr A CHARSET+instance AddAttr A CLASS+instance AddAttr A COORDS+instance AddAttr A DIR+instance AddAttr A HREF+instance AddAttr A HREFLANG+instance AddAttr A ID+instance AddAttr A LANG+instance AddAttr A NAME+instance AddAttr A ONBLUR+instance AddAttr A ONCLICK+instance AddAttr A ONDBLCLICK+instance AddAttr A ONFOCUS+instance AddAttr A ONKEYDOWN+instance AddAttr A ONKEYPRESS+instance AddAttr A ONKEYUP+instance AddAttr A ONMOUSEDOWN+instance AddAttr A ONMOUSEMOVE+instance AddAttr A ONMOUSEOUT+instance AddAttr A ONMOUSEOVER+instance AddAttr A ONMOUSEUP+instance AddAttr A REL+instance AddAttr A REV+instance AddAttr A SHAPE+instance AddAttr A STYLE+instance AddAttr A TABINDEX+instance AddAttr A TARGET+instance AddAttr A TITLE+instance AddAttr A TYPE+instance AddAttr ABBR CLASS+instance AddAttr ABBR DIR+instance AddAttr ABBR ID+instance AddAttr ABBR LANG+instance AddAttr ABBR ONCLICK+instance AddAttr ABBR ONDBLCLICK+instance AddAttr ABBR ONKEYDOWN+instance AddAttr ABBR ONKEYPRESS+instance AddAttr ABBR ONKEYUP+instance AddAttr ABBR ONMOUSEDOWN+instance AddAttr ABBR ONMOUSEMOVE+instance AddAttr ABBR ONMOUSEOUT+instance AddAttr ABBR ONMOUSEOVER+instance AddAttr ABBR ONMOUSEUP+instance AddAttr ABBR STYLE+instance AddAttr ABBR TITLE+instance AddAttr ACRONYM CLASS+instance AddAttr ACRONYM DIR+instance AddAttr ACRONYM ID+instance AddAttr ACRONYM LANG+instance AddAttr ACRONYM ONCLICK+instance AddAttr ACRONYM ONDBLCLICK+instance AddAttr ACRONYM ONKEYDOWN+instance AddAttr ACRONYM ONKEYPRESS+instance AddAttr ACRONYM ONKEYUP+instance AddAttr ACRONYM ONMOUSEDOWN+instance AddAttr ACRONYM ONMOUSEMOVE+instance AddAttr ACRONYM ONMOUSEOUT+instance AddAttr ACRONYM ONMOUSEOVER+instance AddAttr ACRONYM ONMOUSEUP+instance AddAttr ACRONYM STYLE+instance AddAttr ACRONYM TITLE+instance AddAttr ADDRESS CLASS+instance AddAttr ADDRESS DIR+instance AddAttr ADDRESS ID+instance AddAttr ADDRESS LANG+instance AddAttr ADDRESS ONCLICK+instance AddAttr ADDRESS ONDBLCLICK+instance AddAttr ADDRESS ONKEYDOWN+instance AddAttr ADDRESS ONKEYPRESS+instance AddAttr ADDRESS ONKEYUP+instance AddAttr ADDRESS ONMOUSEDOWN+instance AddAttr ADDRESS ONMOUSEMOVE+instance AddAttr ADDRESS ONMOUSEOUT+instance AddAttr ADDRESS ONMOUSEOVER+instance AddAttr ADDRESS ONMOUSEUP+instance AddAttr ADDRESS STYLE+instance AddAttr ADDRESS TITLE+instance AddAttr APPLET ALIGN+instance AddAttr APPLET ALT+instance AddAttr APPLET ARCHIVE+instance AddAttr APPLET CLASS+instance AddAttr APPLET CODE+instance AddAttr APPLET CODEBASE+instance AddAttr APPLET HEIGHT+instance AddAttr APPLET HSPACE+instance AddAttr APPLET ID+instance AddAttr APPLET NAME+instance AddAttr APPLET OBJECT+instance AddAttr APPLET STYLE+instance AddAttr APPLET TITLE+instance AddAttr APPLET VSPACE+instance AddAttr APPLET WIDTH+instance AddAttr AREA ACCESSKEY+instance AddAttr AREA ALT+instance AddAttr AREA CLASS+instance AddAttr AREA COORDS+instance AddAttr AREA DIR+instance AddAttr AREA HREF+instance AddAttr AREA ID+instance AddAttr AREA LANG+instance AddAttr AREA NOHREF+instance AddAttr AREA ONBLUR+instance AddAttr AREA ONCLICK+instance AddAttr AREA ONDBLCLICK+instance AddAttr AREA ONFOCUS+instance AddAttr AREA ONKEYDOWN+instance AddAttr AREA ONKEYPRESS+instance AddAttr AREA ONKEYUP+instance AddAttr AREA ONMOUSEDOWN+instance AddAttr AREA ONMOUSEMOVE+instance AddAttr AREA ONMOUSEOUT+instance AddAttr AREA ONMOUSEOVER+instance AddAttr AREA ONMOUSEUP+instance AddAttr AREA SHAPE+instance AddAttr AREA STYLE+instance AddAttr AREA TABINDEX+instance AddAttr AREA TARGET+instance AddAttr AREA TITLE+instance AddAttr B CLASS+instance AddAttr B DIR+instance AddAttr B ID+instance AddAttr B LANG+instance AddAttr B ONCLICK+instance AddAttr B ONDBLCLICK+instance AddAttr B ONKEYDOWN+instance AddAttr B ONKEYPRESS+instance AddAttr B ONKEYUP+instance AddAttr B ONMOUSEDOWN+instance AddAttr B ONMOUSEMOVE+instance AddAttr B ONMOUSEOUT+instance AddAttr B ONMOUSEOVER+instance AddAttr B ONMOUSEUP+instance AddAttr B STYLE+instance AddAttr B TITLE+instance AddAttr BASE HREF+instance AddAttr BASE TARGET+instance AddAttr BASEFONT COLOR+instance AddAttr BASEFONT FACE+instance AddAttr BASEFONT ID+instance AddAttr BASEFONT SIZE+instance AddAttr BDO CLASS+instance AddAttr BDO DIR+instance AddAttr BDO ID+instance AddAttr BDO LANG+instance AddAttr BDO STYLE+instance AddAttr BDO TITLE+instance AddAttr BIG CLASS+instance AddAttr BIG DIR+instance AddAttr BIG ID+instance AddAttr BIG LANG+instance AddAttr BIG ONCLICK+instance AddAttr BIG ONDBLCLICK+instance AddAttr BIG ONKEYDOWN+instance AddAttr BIG ONKEYPRESS+instance AddAttr BIG ONKEYUP+instance AddAttr BIG ONMOUSEDOWN+instance AddAttr BIG ONMOUSEMOVE+instance AddAttr BIG ONMOUSEOUT+instance AddAttr BIG ONMOUSEOVER+instance AddAttr BIG ONMOUSEUP+instance AddAttr BIG STYLE+instance AddAttr BIG TITLE+instance AddAttr BLOCKQUOTE CITE+instance AddAttr BLOCKQUOTE CLASS+instance AddAttr BLOCKQUOTE DIR+instance AddAttr BLOCKQUOTE ID+instance AddAttr BLOCKQUOTE LANG+instance AddAttr BLOCKQUOTE ONCLICK+instance AddAttr BLOCKQUOTE ONDBLCLICK+instance AddAttr BLOCKQUOTE ONKEYDOWN+instance AddAttr BLOCKQUOTE ONKEYPRESS+instance AddAttr BLOCKQUOTE ONKEYUP+instance AddAttr BLOCKQUOTE ONMOUSEDOWN+instance AddAttr BLOCKQUOTE ONMOUSEMOVE+instance AddAttr BLOCKQUOTE ONMOUSEOUT+instance AddAttr BLOCKQUOTE ONMOUSEOVER+instance AddAttr BLOCKQUOTE ONMOUSEUP+instance AddAttr BLOCKQUOTE STYLE+instance AddAttr BLOCKQUOTE TITLE+instance AddAttr BODY ALINK+instance AddAttr BODY BACKGROUND+instance AddAttr BODY BGCOLOR+instance AddAttr BODY CLASS+instance AddAttr BODY DIR+instance AddAttr BODY ID+instance AddAttr BODY LANG+instance AddAttr BODY LINK+instance AddAttr BODY ONCLICK+instance AddAttr BODY ONDBLCLICK+instance AddAttr BODY ONKEYDOWN+instance AddAttr BODY ONKEYPRESS+instance AddAttr BODY ONKEYUP+instance AddAttr BODY ONLOAD+instance AddAttr BODY ONMOUSEDOWN+instance AddAttr BODY ONMOUSEMOVE+instance AddAttr BODY ONMOUSEOUT+instance AddAttr BODY ONMOUSEOVER+instance AddAttr BODY ONMOUSEUP+instance AddAttr BODY ONUNLOAD+instance AddAttr BODY STYLE+instance AddAttr BODY TEXT+instance AddAttr BODY TITLE+instance AddAttr BODY VLINK+instance AddAttr BR CLASS+instance AddAttr BR CLEAR+instance AddAttr BR ID+instance AddAttr BR STYLE+instance AddAttr BR TITLE+instance AddAttr BUTTON ACCESSKEY+instance AddAttr BUTTON CLASS+instance AddAttr BUTTON DIR+instance AddAttr BUTTON DISABLED+instance AddAttr BUTTON ID+instance AddAttr BUTTON LANG+instance AddAttr BUTTON NAME+instance AddAttr BUTTON ONBLUR+instance AddAttr BUTTON ONCLICK+instance AddAttr BUTTON ONDBLCLICK+instance AddAttr BUTTON ONFOCUS+instance AddAttr BUTTON ONKEYDOWN+instance AddAttr BUTTON ONKEYPRESS+instance AddAttr BUTTON ONKEYUP+instance AddAttr BUTTON ONMOUSEDOWN+instance AddAttr BUTTON ONMOUSEMOVE+instance AddAttr BUTTON ONMOUSEOUT+instance AddAttr BUTTON ONMOUSEOVER+instance AddAttr BUTTON ONMOUSEUP+instance AddAttr BUTTON STYLE+instance AddAttr BUTTON TABINDEX+instance AddAttr BUTTON TITLE+instance AddAttr BUTTON TYPE+instance AddAttr BUTTON VALUE+instance AddAttr CAPTION ALIGN+instance AddAttr CAPTION CLASS+instance AddAttr CAPTION DIR+instance AddAttr CAPTION ID+instance AddAttr CAPTION LANG+instance AddAttr CAPTION ONCLICK+instance AddAttr CAPTION ONDBLCLICK+instance AddAttr CAPTION ONKEYDOWN+instance AddAttr CAPTION ONKEYPRESS+instance AddAttr CAPTION ONKEYUP+instance AddAttr CAPTION ONMOUSEDOWN+instance AddAttr CAPTION ONMOUSEMOVE+instance AddAttr CAPTION ONMOUSEOUT+instance AddAttr CAPTION ONMOUSEOVER+instance AddAttr CAPTION ONMOUSEUP+instance AddAttr CAPTION STYLE+instance AddAttr CAPTION TITLE+instance AddAttr CENTER CLASS+instance AddAttr CENTER DIR+instance AddAttr CENTER ID+instance AddAttr CENTER LANG+instance AddAttr CENTER ONCLICK+instance AddAttr CENTER ONDBLCLICK+instance AddAttr CENTER ONKEYDOWN+instance AddAttr CENTER ONKEYPRESS+instance AddAttr CENTER ONKEYUP+instance AddAttr CENTER ONMOUSEDOWN+instance AddAttr CENTER ONMOUSEMOVE+instance AddAttr CENTER ONMOUSEOUT+instance AddAttr CENTER ONMOUSEOVER+instance AddAttr CENTER ONMOUSEUP+instance AddAttr CENTER STYLE+instance AddAttr CENTER TITLE+instance AddAttr CITE CLASS+instance AddAttr CITE DIR+instance AddAttr CITE ID+instance AddAttr CITE LANG+instance AddAttr CITE ONCLICK+instance AddAttr CITE ONDBLCLICK+instance AddAttr CITE ONKEYDOWN+instance AddAttr CITE ONKEYPRESS+instance AddAttr CITE ONKEYUP+instance AddAttr CITE ONMOUSEDOWN+instance AddAttr CITE ONMOUSEMOVE+instance AddAttr CITE ONMOUSEOUT+instance AddAttr CITE ONMOUSEOVER+instance AddAttr CITE ONMOUSEUP+instance AddAttr CITE STYLE+instance AddAttr CITE TITLE+instance AddAttr CODE CLASS+instance AddAttr CODE DIR+instance AddAttr CODE ID+instance AddAttr CODE LANG+instance AddAttr CODE ONCLICK+instance AddAttr CODE ONDBLCLICK+instance AddAttr CODE ONKEYDOWN+instance AddAttr CODE ONKEYPRESS+instance AddAttr CODE ONKEYUP+instance AddAttr CODE ONMOUSEDOWN+instance AddAttr CODE ONMOUSEMOVE+instance AddAttr CODE ONMOUSEOUT+instance AddAttr CODE ONMOUSEOVER+instance AddAttr CODE ONMOUSEUP+instance AddAttr CODE STYLE+instance AddAttr CODE TITLE+instance AddAttr COL ALIGN+instance AddAttr COL CHAR+instance AddAttr COL CHAROFF+instance AddAttr COL CLASS+instance AddAttr COL DIR+instance AddAttr COL ID+instance AddAttr COL LANG+instance AddAttr COL ONCLICK+instance AddAttr COL ONDBLCLICK+instance AddAttr COL ONKEYDOWN+instance AddAttr COL ONKEYPRESS+instance AddAttr COL ONKEYUP+instance AddAttr COL ONMOUSEDOWN+instance AddAttr COL ONMOUSEMOVE+instance AddAttr COL ONMOUSEOUT+instance AddAttr COL ONMOUSEOVER+instance AddAttr COL ONMOUSEUP+instance AddAttr COL SPAN+instance AddAttr COL STYLE+instance AddAttr COL TITLE+instance AddAttr COL VALIGN+instance AddAttr COL WIDTH+instance AddAttr COLGROUP ALIGN+instance AddAttr COLGROUP CHAR+instance AddAttr COLGROUP CHAROFF+instance AddAttr COLGROUP CLASS+instance AddAttr COLGROUP DIR+instance AddAttr COLGROUP ID+instance AddAttr COLGROUP LANG+instance AddAttr COLGROUP ONCLICK+instance AddAttr COLGROUP ONDBLCLICK+instance AddAttr COLGROUP ONKEYDOWN+instance AddAttr COLGROUP ONKEYPRESS+instance AddAttr COLGROUP ONKEYUP+instance AddAttr COLGROUP ONMOUSEDOWN+instance AddAttr COLGROUP ONMOUSEMOVE+instance AddAttr COLGROUP ONMOUSEOUT+instance AddAttr COLGROUP ONMOUSEOVER+instance AddAttr COLGROUP ONMOUSEUP+instance AddAttr COLGROUP SPAN+instance AddAttr COLGROUP STYLE+instance AddAttr COLGROUP TITLE+instance AddAttr COLGROUP VALIGN+instance AddAttr COLGROUP WIDTH+instance AddAttr DD CLASS+instance AddAttr DD DIR+instance AddAttr DD ID+instance AddAttr DD LANG+instance AddAttr DD ONCLICK+instance AddAttr DD ONDBLCLICK+instance AddAttr DD ONKEYDOWN+instance AddAttr DD ONKEYPRESS+instance AddAttr DD ONKEYUP+instance AddAttr DD ONMOUSEDOWN+instance AddAttr DD ONMOUSEMOVE+instance AddAttr DD ONMOUSEOUT+instance AddAttr DD ONMOUSEOVER+instance AddAttr DD ONMOUSEUP+instance AddAttr DD STYLE+instance AddAttr DD TITLE+instance AddAttr DEL CITE+instance AddAttr DEL CLASS+instance AddAttr DEL DATETIME+instance AddAttr DEL DIR+instance AddAttr DEL ID+instance AddAttr DEL LANG+instance AddAttr DEL ONCLICK+instance AddAttr DEL ONDBLCLICK+instance AddAttr DEL ONKEYDOWN+instance AddAttr DEL ONKEYPRESS+instance AddAttr DEL ONKEYUP+instance AddAttr DEL ONMOUSEDOWN+instance AddAttr DEL ONMOUSEMOVE+instance AddAttr DEL ONMOUSEOUT+instance AddAttr DEL ONMOUSEOVER+instance AddAttr DEL ONMOUSEUP+instance AddAttr DEL STYLE+instance AddAttr DEL TITLE+instance AddAttr DFN CLASS+instance AddAttr DFN DIR+instance AddAttr DFN ID+instance AddAttr DFN LANG+instance AddAttr DFN ONCLICK+instance AddAttr DFN ONDBLCLICK+instance AddAttr DFN ONKEYDOWN+instance AddAttr DFN ONKEYPRESS+instance AddAttr DFN ONKEYUP+instance AddAttr DFN ONMOUSEDOWN+instance AddAttr DFN ONMOUSEMOVE+instance AddAttr DFN ONMOUSEOUT+instance AddAttr DFN ONMOUSEOVER+instance AddAttr DFN ONMOUSEUP+instance AddAttr DFN STYLE+instance AddAttr DFN TITLE+instance AddAttr DIR CLASS+instance AddAttr DIR COMPACT+instance AddAttr DIR DIR+instance AddAttr DIR ID+instance AddAttr DIR LANG+instance AddAttr DIR ONCLICK+instance AddAttr DIR ONDBLCLICK+instance AddAttr DIR ONKEYDOWN+instance AddAttr DIR ONKEYPRESS+instance AddAttr DIR ONKEYUP+instance AddAttr DIR ONMOUSEDOWN+instance AddAttr DIR ONMOUSEMOVE+instance AddAttr DIR ONMOUSEOUT+instance AddAttr DIR ONMOUSEOVER+instance AddAttr DIR ONMOUSEUP+instance AddAttr DIR STYLE+instance AddAttr DIR TITLE+instance AddAttr DIV ALIGN+instance AddAttr DIV CLASS+instance AddAttr DIV DIR+instance AddAttr DIV ID+instance AddAttr DIV LANG+instance AddAttr DIV ONCLICK+instance AddAttr DIV ONDBLCLICK+instance AddAttr DIV ONKEYDOWN+instance AddAttr DIV ONKEYPRESS+instance AddAttr DIV ONKEYUP+instance AddAttr DIV ONMOUSEDOWN+instance AddAttr DIV ONMOUSEMOVE+instance AddAttr DIV ONMOUSEOUT+instance AddAttr DIV ONMOUSEOVER+instance AddAttr DIV ONMOUSEUP+instance AddAttr DIV STYLE+instance AddAttr DIV TITLE+instance AddAttr DL CLASS+instance AddAttr DL COMPACT+instance AddAttr DL DIR+instance AddAttr DL ID+instance AddAttr DL LANG+instance AddAttr DL ONCLICK+instance AddAttr DL ONDBLCLICK+instance AddAttr DL ONKEYDOWN+instance AddAttr DL ONKEYPRESS+instance AddAttr DL ONKEYUP+instance AddAttr DL ONMOUSEDOWN+instance AddAttr DL ONMOUSEMOVE+instance AddAttr DL ONMOUSEOUT+instance AddAttr DL ONMOUSEOVER+instance AddAttr DL ONMOUSEUP+instance AddAttr DL STYLE+instance AddAttr DL TITLE+instance AddAttr DT CLASS+instance AddAttr DT DIR+instance AddAttr DT ID+instance AddAttr DT LANG+instance AddAttr DT ONCLICK+instance AddAttr DT ONDBLCLICK+instance AddAttr DT ONKEYDOWN+instance AddAttr DT ONKEYPRESS+instance AddAttr DT ONKEYUP+instance AddAttr DT ONMOUSEDOWN+instance AddAttr DT ONMOUSEMOVE+instance AddAttr DT ONMOUSEOUT+instance AddAttr DT ONMOUSEOVER+instance AddAttr DT ONMOUSEUP+instance AddAttr DT STYLE+instance AddAttr DT TITLE+instance AddAttr EM CLASS+instance AddAttr EM DIR+instance AddAttr EM ID+instance AddAttr EM LANG+instance AddAttr EM ONCLICK+instance AddAttr EM ONDBLCLICK+instance AddAttr EM ONKEYDOWN+instance AddAttr EM ONKEYPRESS+instance AddAttr EM ONKEYUP+instance AddAttr EM ONMOUSEDOWN+instance AddAttr EM ONMOUSEMOVE+instance AddAttr EM ONMOUSEOUT+instance AddAttr EM ONMOUSEOVER+instance AddAttr EM ONMOUSEUP+instance AddAttr EM STYLE+instance AddAttr EM TITLE+instance AddAttr FIELDSET CLASS+instance AddAttr FIELDSET DIR+instance AddAttr FIELDSET ID+instance AddAttr FIELDSET LANG+instance AddAttr FIELDSET ONCLICK+instance AddAttr FIELDSET ONDBLCLICK+instance AddAttr FIELDSET ONKEYDOWN+instance AddAttr FIELDSET ONKEYPRESS+instance AddAttr FIELDSET ONKEYUP+instance AddAttr FIELDSET ONMOUSEDOWN+instance AddAttr FIELDSET ONMOUSEMOVE+instance AddAttr FIELDSET ONMOUSEOUT+instance AddAttr FIELDSET ONMOUSEOVER+instance AddAttr FIELDSET ONMOUSEUP+instance AddAttr FIELDSET STYLE+instance AddAttr FIELDSET TITLE+instance AddAttr FONT CLASS+instance AddAttr FONT COLOR+instance AddAttr FONT DIR+instance AddAttr FONT FACE+instance AddAttr FONT ID+instance AddAttr FONT LANG+instance AddAttr FONT SIZE+instance AddAttr FONT STYLE+instance AddAttr FONT TITLE+instance AddAttr FORM ACCEPT_CHARSET+instance AddAttr FORM ACTION+instance AddAttr FORM CLASS+instance AddAttr FORM DIR+instance AddAttr FORM ENCTYPE+instance AddAttr FORM ID+instance AddAttr FORM LANG+instance AddAttr FORM METHOD+instance AddAttr FORM ONCLICK+instance AddAttr FORM ONDBLCLICK+instance AddAttr FORM ONKEYDOWN+instance AddAttr FORM ONKEYPRESS+instance AddAttr FORM ONKEYUP+instance AddAttr FORM ONMOUSEDOWN+instance AddAttr FORM ONMOUSEMOVE+instance AddAttr FORM ONMOUSEOUT+instance AddAttr FORM ONMOUSEOVER+instance AddAttr FORM ONMOUSEUP+instance AddAttr FORM ONRESET+instance AddAttr FORM ONSUBMIT+instance AddAttr FORM STYLE+instance AddAttr FORM TARGET+instance AddAttr FORM TITLE+instance AddAttr H1 ALIGN+instance AddAttr H1 CLASS+instance AddAttr H1 DIR+instance AddAttr H1 ID+instance AddAttr H1 LANG+instance AddAttr H1 ONCLICK+instance AddAttr H1 ONDBLCLICK+instance AddAttr H1 ONKEYDOWN+instance AddAttr H1 ONKEYPRESS+instance AddAttr H1 ONKEYUP+instance AddAttr H1 ONMOUSEDOWN+instance AddAttr H1 ONMOUSEMOVE+instance AddAttr H1 ONMOUSEOUT+instance AddAttr H1 ONMOUSEOVER+instance AddAttr H1 ONMOUSEUP+instance AddAttr H1 STYLE+instance AddAttr H1 TITLE+instance AddAttr H2 ALIGN+instance AddAttr H2 CLASS+instance AddAttr H2 DIR+instance AddAttr H2 ID+instance AddAttr H2 LANG+instance AddAttr H2 ONCLICK+instance AddAttr H2 ONDBLCLICK+instance AddAttr H2 ONKEYDOWN+instance AddAttr H2 ONKEYPRESS+instance AddAttr H2 ONKEYUP+instance AddAttr H2 ONMOUSEDOWN+instance AddAttr H2 ONMOUSEMOVE+instance AddAttr H2 ONMOUSEOUT+instance AddAttr H2 ONMOUSEOVER+instance AddAttr H2 ONMOUSEUP+instance AddAttr H2 STYLE+instance AddAttr H2 TITLE+instance AddAttr H3 ALIGN+instance AddAttr H3 CLASS+instance AddAttr H3 DIR+instance AddAttr H3 ID+instance AddAttr H3 LANG+instance AddAttr H3 ONCLICK+instance AddAttr H3 ONDBLCLICK+instance AddAttr H3 ONKEYDOWN+instance AddAttr H3 ONKEYPRESS+instance AddAttr H3 ONKEYUP+instance AddAttr H3 ONMOUSEDOWN+instance AddAttr H3 ONMOUSEMOVE+instance AddAttr H3 ONMOUSEOUT+instance AddAttr H3 ONMOUSEOVER+instance AddAttr H3 ONMOUSEUP+instance AddAttr H3 STYLE+instance AddAttr H3 TITLE+instance AddAttr H4 ALIGN+instance AddAttr H4 CLASS+instance AddAttr H4 DIR+instance AddAttr H4 ID+instance AddAttr H4 LANG+instance AddAttr H4 ONCLICK+instance AddAttr H4 ONDBLCLICK+instance AddAttr H4 ONKEYDOWN+instance AddAttr H4 ONKEYPRESS+instance AddAttr H4 ONKEYUP+instance AddAttr H4 ONMOUSEDOWN+instance AddAttr H4 ONMOUSEMOVE+instance AddAttr H4 ONMOUSEOUT+instance AddAttr H4 ONMOUSEOVER+instance AddAttr H4 ONMOUSEUP+instance AddAttr H4 STYLE+instance AddAttr H4 TITLE+instance AddAttr H5 ALIGN+instance AddAttr H5 CLASS+instance AddAttr H5 DIR+instance AddAttr H5 ID+instance AddAttr H5 LANG+instance AddAttr H5 ONCLICK+instance AddAttr H5 ONDBLCLICK+instance AddAttr H5 ONKEYDOWN+instance AddAttr H5 ONKEYPRESS+instance AddAttr H5 ONKEYUP+instance AddAttr H5 ONMOUSEDOWN+instance AddAttr H5 ONMOUSEMOVE+instance AddAttr H5 ONMOUSEOUT+instance AddAttr H5 ONMOUSEOVER+instance AddAttr H5 ONMOUSEUP+instance AddAttr H5 STYLE+instance AddAttr H5 TITLE+instance AddAttr H6 ALIGN+instance AddAttr H6 CLASS+instance AddAttr H6 DIR+instance AddAttr H6 ID+instance AddAttr H6 LANG+instance AddAttr H6 ONCLICK+instance AddAttr H6 ONDBLCLICK+instance AddAttr H6 ONKEYDOWN+instance AddAttr H6 ONKEYPRESS+instance AddAttr H6 ONKEYUP+instance AddAttr H6 ONMOUSEDOWN+instance AddAttr H6 ONMOUSEMOVE+instance AddAttr H6 ONMOUSEOUT+instance AddAttr H6 ONMOUSEOVER+instance AddAttr H6 ONMOUSEUP+instance AddAttr H6 STYLE+instance AddAttr H6 TITLE+instance AddAttr HEAD DIR+instance AddAttr HEAD LANG+instance AddAttr HEAD PROFILE+instance AddAttr HR ALIGN+instance AddAttr HR CLASS+instance AddAttr HR ID+instance AddAttr HR NOSHADE+instance AddAttr HR ONCLICK+instance AddAttr HR ONDBLCLICK+instance AddAttr HR ONKEYDOWN+instance AddAttr HR ONKEYPRESS+instance AddAttr HR ONKEYUP+instance AddAttr HR ONMOUSEDOWN+instance AddAttr HR ONMOUSEMOVE+instance AddAttr HR ONMOUSEOUT+instance AddAttr HR ONMOUSEOVER+instance AddAttr HR ONMOUSEUP+instance AddAttr HR SIZE+instance AddAttr HR STYLE+instance AddAttr HR TITLE+instance AddAttr HR WIDTH+instance AddAttr HTML DIR+instance AddAttr HTML LANG+instance AddAttr HTML VERSION+instance AddAttr I CLASS+instance AddAttr I DIR+instance AddAttr I ID+instance AddAttr I LANG+instance AddAttr I ONCLICK+instance AddAttr I ONDBLCLICK+instance AddAttr I ONKEYDOWN+instance AddAttr I ONKEYPRESS+instance AddAttr I ONKEYUP+instance AddAttr I ONMOUSEDOWN+instance AddAttr I ONMOUSEMOVE+instance AddAttr I ONMOUSEOUT+instance AddAttr I ONMOUSEOVER+instance AddAttr I ONMOUSEUP+instance AddAttr I STYLE+instance AddAttr I TITLE+instance AddAttr IFRAME ALIGN+instance AddAttr IFRAME CLASS+instance AddAttr IFRAME FRAMEBORDER+instance AddAttr IFRAME HEIGHT+instance AddAttr IFRAME ID+instance AddAttr IFRAME LONGDESC+instance AddAttr IFRAME MARGINHEIGHT+instance AddAttr IFRAME MARGINWIDTH+instance AddAttr IFRAME NAME+instance AddAttr IFRAME SCROLLING+instance AddAttr IFRAME SRC+instance AddAttr IFRAME STYLE+instance AddAttr IFRAME TITLE+instance AddAttr IFRAME WIDTH+instance AddAttr IMG ALIGN+instance AddAttr IMG ALT+instance AddAttr IMG BORDER+instance AddAttr IMG CLASS+instance AddAttr IMG DIR+instance AddAttr IMG HEIGHT+instance AddAttr IMG HSPACE+instance AddAttr IMG ID+instance AddAttr IMG ISMAP+instance AddAttr IMG LANG+instance AddAttr IMG LONGDESC+instance AddAttr IMG ONCLICK+instance AddAttr IMG ONDBLCLICK+instance AddAttr IMG ONKEYDOWN+instance AddAttr IMG ONKEYPRESS+instance AddAttr IMG ONKEYUP+instance AddAttr IMG ONMOUSEDOWN+instance AddAttr IMG ONMOUSEMOVE+instance AddAttr IMG ONMOUSEOUT+instance AddAttr IMG ONMOUSEOVER+instance AddAttr IMG ONMOUSEUP+instance AddAttr IMG SRC+instance AddAttr IMG STYLE+instance AddAttr IMG TITLE+instance AddAttr IMG USEMAP+instance AddAttr IMG VSPACE+instance AddAttr IMG WIDTH+instance AddAttr INPUT ACCEPT+instance AddAttr INPUT ACCESSKEY+instance AddAttr INPUT ALIGN+instance AddAttr INPUT ALT+instance AddAttr INPUT CHECKED+instance AddAttr INPUT CLASS+instance AddAttr INPUT DIR+instance AddAttr INPUT DISABLED+instance AddAttr INPUT ID+instance AddAttr INPUT LANG+instance AddAttr INPUT MAXLENGTH+instance AddAttr INPUT NAME+instance AddAttr INPUT ONBLUR+instance AddAttr INPUT ONCHANGE+instance AddAttr INPUT ONCLICK+instance AddAttr INPUT ONDBLCLICK+instance AddAttr INPUT ONFOCUS+instance AddAttr INPUT ONKEYDOWN+instance AddAttr INPUT ONKEYPRESS+instance AddAttr INPUT ONKEYUP+instance AddAttr INPUT ONMOUSEDOWN+instance AddAttr INPUT ONMOUSEMOVE+instance AddAttr INPUT ONMOUSEOUT+instance AddAttr INPUT ONMOUSEOVER+instance AddAttr INPUT ONMOUSEUP+instance AddAttr INPUT ONSELECT+instance AddAttr INPUT READONLY+instance AddAttr INPUT SIZE+instance AddAttr INPUT SRC+instance AddAttr INPUT STYLE+instance AddAttr INPUT TABINDEX+instance AddAttr INPUT TITLE+instance AddAttr INPUT TYPE+instance AddAttr INPUT USEMAP+instance AddAttr INPUT VALUE+instance AddAttr INS CITE+instance AddAttr INS CLASS+instance AddAttr INS DATETIME+instance AddAttr INS DIR+instance AddAttr INS ID+instance AddAttr INS LANG+instance AddAttr INS ONCLICK+instance AddAttr INS ONDBLCLICK+instance AddAttr INS ONKEYDOWN+instance AddAttr INS ONKEYPRESS+instance AddAttr INS ONKEYUP+instance AddAttr INS ONMOUSEDOWN+instance AddAttr INS ONMOUSEMOVE+instance AddAttr INS ONMOUSEOUT+instance AddAttr INS ONMOUSEOVER+instance AddAttr INS ONMOUSEUP+instance AddAttr INS STYLE+instance AddAttr INS TITLE+instance AddAttr ISINDEX CLASS+instance AddAttr ISINDEX DIR+instance AddAttr ISINDEX ID+instance AddAttr ISINDEX LANG+instance AddAttr ISINDEX PROMPT+instance AddAttr ISINDEX STYLE+instance AddAttr ISINDEX TITLE+instance AddAttr KBD CLASS+instance AddAttr KBD DIR+instance AddAttr KBD ID+instance AddAttr KBD LANG+instance AddAttr KBD ONCLICK+instance AddAttr KBD ONDBLCLICK+instance AddAttr KBD ONKEYDOWN+instance AddAttr KBD ONKEYPRESS+instance AddAttr KBD ONKEYUP+instance AddAttr KBD ONMOUSEDOWN+instance AddAttr KBD ONMOUSEMOVE+instance AddAttr KBD ONMOUSEOUT+instance AddAttr KBD ONMOUSEOVER+instance AddAttr KBD ONMOUSEUP+instance AddAttr KBD STYLE+instance AddAttr KBD TITLE+instance AddAttr LABEL ACCESSKEY+instance AddAttr LABEL CLASS+instance AddAttr LABEL DIR+instance AddAttr LABEL FOR+instance AddAttr LABEL ID+instance AddAttr LABEL LANG+instance AddAttr LABEL ONBLUR+instance AddAttr LABEL ONCLICK+instance AddAttr LABEL ONDBLCLICK+instance AddAttr LABEL ONFOCUS+instance AddAttr LABEL ONKEYDOWN+instance AddAttr LABEL ONKEYPRESS+instance AddAttr LABEL ONKEYUP+instance AddAttr LABEL ONMOUSEDOWN+instance AddAttr LABEL ONMOUSEMOVE+instance AddAttr LABEL ONMOUSEOUT+instance AddAttr LABEL ONMOUSEOVER+instance AddAttr LABEL ONMOUSEUP+instance AddAttr LABEL STYLE+instance AddAttr LABEL TITLE+instance AddAttr LEGEND ACCESSKEY+instance AddAttr LEGEND ALIGN+instance AddAttr LEGEND CLASS+instance AddAttr LEGEND DIR+instance AddAttr LEGEND ID+instance AddAttr LEGEND LANG+instance AddAttr LEGEND ONCLICK+instance AddAttr LEGEND ONDBLCLICK+instance AddAttr LEGEND ONKEYDOWN+instance AddAttr LEGEND ONKEYPRESS+instance AddAttr LEGEND ONKEYUP+instance AddAttr LEGEND ONMOUSEDOWN+instance AddAttr LEGEND ONMOUSEMOVE+instance AddAttr LEGEND ONMOUSEOUT+instance AddAttr LEGEND ONMOUSEOVER+instance AddAttr LEGEND ONMOUSEUP+instance AddAttr LEGEND STYLE+instance AddAttr LEGEND TITLE+instance AddAttr LI CLASS+instance AddAttr LI DIR+instance AddAttr LI ID+instance AddAttr LI LANG+instance AddAttr LI ONCLICK+instance AddAttr LI ONDBLCLICK+instance AddAttr LI ONKEYDOWN+instance AddAttr LI ONKEYPRESS+instance AddAttr LI ONKEYUP+instance AddAttr LI ONMOUSEDOWN+instance AddAttr LI ONMOUSEMOVE+instance AddAttr LI ONMOUSEOUT+instance AddAttr LI ONMOUSEOVER+instance AddAttr LI ONMOUSEUP+instance AddAttr LI STYLE+instance AddAttr LI TITLE+instance AddAttr LI TYPE+instance AddAttr LI VALUE+instance AddAttr LINK CHARSET+instance AddAttr LINK CLASS+instance AddAttr LINK DIR+instance AddAttr LINK HREF+instance AddAttr LINK HREFLANG+instance AddAttr LINK ID+instance AddAttr LINK LANG+instance AddAttr LINK MEDIA+instance AddAttr LINK ONCLICK+instance AddAttr LINK ONDBLCLICK+instance AddAttr LINK ONKEYDOWN+instance AddAttr LINK ONKEYPRESS+instance AddAttr LINK ONKEYUP+instance AddAttr LINK ONMOUSEDOWN+instance AddAttr LINK ONMOUSEMOVE+instance AddAttr LINK ONMOUSEOUT+instance AddAttr LINK ONMOUSEOVER+instance AddAttr LINK ONMOUSEUP+instance AddAttr LINK REL+instance AddAttr LINK REV+instance AddAttr LINK STYLE+instance AddAttr LINK TARGET+instance AddAttr LINK TITLE+instance AddAttr LINK TYPE+instance AddAttr MAP CLASS+instance AddAttr MAP DIR+instance AddAttr MAP ID+instance AddAttr MAP LANG+instance AddAttr MAP NAME+instance AddAttr MAP ONCLICK+instance AddAttr MAP ONDBLCLICK+instance AddAttr MAP ONKEYDOWN+instance AddAttr MAP ONKEYPRESS+instance AddAttr MAP ONKEYUP+instance AddAttr MAP ONMOUSEDOWN+instance AddAttr MAP ONMOUSEMOVE+instance AddAttr MAP ONMOUSEOUT+instance AddAttr MAP ONMOUSEOVER+instance AddAttr MAP ONMOUSEUP+instance AddAttr MAP STYLE+instance AddAttr MAP TITLE+instance AddAttr MENU CLASS+instance AddAttr MENU COMPACT+instance AddAttr MENU DIR+instance AddAttr MENU ID+instance AddAttr MENU LANG+instance AddAttr MENU ONCLICK+instance AddAttr MENU ONDBLCLICK+instance AddAttr MENU ONKEYDOWN+instance AddAttr MENU ONKEYPRESS+instance AddAttr MENU ONKEYUP+instance AddAttr MENU ONMOUSEDOWN+instance AddAttr MENU ONMOUSEMOVE+instance AddAttr MENU ONMOUSEOUT+instance AddAttr MENU ONMOUSEOVER+instance AddAttr MENU ONMOUSEUP+instance AddAttr MENU STYLE+instance AddAttr MENU TITLE+instance AddAttr META CONTENT+instance AddAttr META DIR+instance AddAttr META HTTP_EQUIV+instance AddAttr META LANG+instance AddAttr META NAME+instance AddAttr META SCHEME+instance AddAttr NOFRAMES CLASS+instance AddAttr NOFRAMES DIR+instance AddAttr NOFRAMES ID+instance AddAttr NOFRAMES LANG+instance AddAttr NOFRAMES ONCLICK+instance AddAttr NOFRAMES ONDBLCLICK+instance AddAttr NOFRAMES ONKEYDOWN+instance AddAttr NOFRAMES ONKEYPRESS+instance AddAttr NOFRAMES ONKEYUP+instance AddAttr NOFRAMES ONMOUSEDOWN+instance AddAttr NOFRAMES ONMOUSEMOVE+instance AddAttr NOFRAMES ONMOUSEOUT+instance AddAttr NOFRAMES ONMOUSEOVER+instance AddAttr NOFRAMES ONMOUSEUP+instance AddAttr NOFRAMES STYLE+instance AddAttr NOFRAMES TITLE+instance AddAttr NOSCRIPT CLASS+instance AddAttr NOSCRIPT DIR+instance AddAttr NOSCRIPT ID+instance AddAttr NOSCRIPT LANG+instance AddAttr NOSCRIPT ONCLICK+instance AddAttr NOSCRIPT ONDBLCLICK+instance AddAttr NOSCRIPT ONKEYDOWN+instance AddAttr NOSCRIPT ONKEYPRESS+instance AddAttr NOSCRIPT ONKEYUP+instance AddAttr NOSCRIPT ONMOUSEDOWN+instance AddAttr NOSCRIPT ONMOUSEMOVE+instance AddAttr NOSCRIPT ONMOUSEOUT+instance AddAttr NOSCRIPT ONMOUSEOVER+instance AddAttr NOSCRIPT ONMOUSEUP+instance AddAttr NOSCRIPT STYLE+instance AddAttr NOSCRIPT TITLE+instance AddAttr OBJECT ALIGN+instance AddAttr OBJECT ARCHIVE+instance AddAttr OBJECT BORDER+instance AddAttr OBJECT CLASS+instance AddAttr OBJECT CLASSID+instance AddAttr OBJECT CODEBASE+instance AddAttr OBJECT CODETYPE+instance AddAttr OBJECT DATA+instance AddAttr OBJECT DECLARE+instance AddAttr OBJECT DIR+instance AddAttr OBJECT HEIGHT+instance AddAttr OBJECT HSPACE+instance AddAttr OBJECT ID+instance AddAttr OBJECT LANG+instance AddAttr OBJECT NAME+instance AddAttr OBJECT ONCLICK+instance AddAttr OBJECT ONDBLCLICK+instance AddAttr OBJECT ONKEYDOWN+instance AddAttr OBJECT ONKEYPRESS+instance AddAttr OBJECT ONKEYUP+instance AddAttr OBJECT ONMOUSEDOWN+instance AddAttr OBJECT ONMOUSEMOVE+instance AddAttr OBJECT ONMOUSEOUT+instance AddAttr OBJECT ONMOUSEOVER+instance AddAttr OBJECT ONMOUSEUP+instance AddAttr OBJECT STANDBY+instance AddAttr OBJECT STYLE+instance AddAttr OBJECT TABINDEX+instance AddAttr OBJECT TITLE+instance AddAttr OBJECT TYPE+instance AddAttr OBJECT USEMAP+instance AddAttr OBJECT VSPACE+instance AddAttr OBJECT WIDTH+instance AddAttr OL CLASS+instance AddAttr OL COMPACT+instance AddAttr OL DIR+instance AddAttr OL ID+instance AddAttr OL LANG+instance AddAttr OL ONCLICK+instance AddAttr OL ONDBLCLICK+instance AddAttr OL ONKEYDOWN+instance AddAttr OL ONKEYPRESS+instance AddAttr OL ONKEYUP+instance AddAttr OL ONMOUSEDOWN+instance AddAttr OL ONMOUSEMOVE+instance AddAttr OL ONMOUSEOUT+instance AddAttr OL ONMOUSEOVER+instance AddAttr OL ONMOUSEUP+instance AddAttr OL START+instance AddAttr OL STYLE+instance AddAttr OL TITLE+instance AddAttr OL TYPE+instance AddAttr OPTGROUP CLASS+instance AddAttr OPTGROUP DIR+instance AddAttr OPTGROUP DISABLED+instance AddAttr OPTGROUP ID+instance AddAttr OPTGROUP LABEL+instance AddAttr OPTGROUP LANG+instance AddAttr OPTGROUP ONCLICK+instance AddAttr OPTGROUP ONDBLCLICK+instance AddAttr OPTGROUP ONKEYDOWN+instance AddAttr OPTGROUP ONKEYPRESS+instance AddAttr OPTGROUP ONKEYUP+instance AddAttr OPTGROUP ONMOUSEDOWN+instance AddAttr OPTGROUP ONMOUSEMOVE+instance AddAttr OPTGROUP ONMOUSEOUT+instance AddAttr OPTGROUP ONMOUSEOVER+instance AddAttr OPTGROUP ONMOUSEUP+instance AddAttr OPTGROUP STYLE+instance AddAttr OPTGROUP TITLE+instance AddAttr OPTION CLASS+instance AddAttr OPTION DIR+instance AddAttr OPTION DISABLED+instance AddAttr OPTION ID+instance AddAttr OPTION LABEL+instance AddAttr OPTION LANG+instance AddAttr OPTION ONCLICK+instance AddAttr OPTION ONDBLCLICK+instance AddAttr OPTION ONKEYDOWN+instance AddAttr OPTION ONKEYPRESS+instance AddAttr OPTION ONKEYUP+instance AddAttr OPTION ONMOUSEDOWN+instance AddAttr OPTION ONMOUSEMOVE+instance AddAttr OPTION ONMOUSEOUT+instance AddAttr OPTION ONMOUSEOVER+instance AddAttr OPTION ONMOUSEUP+instance AddAttr OPTION SELECTED+instance AddAttr OPTION STYLE+instance AddAttr OPTION TITLE+instance AddAttr OPTION VALUE+instance AddAttr P ALIGN+instance AddAttr P CLASS+instance AddAttr P DIR+instance AddAttr P ID+instance AddAttr P LANG+instance AddAttr P ONCLICK+instance AddAttr P ONDBLCLICK+instance AddAttr P ONKEYDOWN+instance AddAttr P ONKEYPRESS+instance AddAttr P ONKEYUP+instance AddAttr P ONMOUSEDOWN+instance AddAttr P ONMOUSEMOVE+instance AddAttr P ONMOUSEOUT+instance AddAttr P ONMOUSEOVER+instance AddAttr P ONMOUSEUP+instance AddAttr P STYLE+instance AddAttr P TITLE+instance AddAttr PARAM ID+instance AddAttr PARAM NAME+instance AddAttr PARAM TYPE+instance AddAttr PARAM VALUE+instance AddAttr PARAM VALUETYPE+instance AddAttr PRE CLASS+instance AddAttr PRE DIR+instance AddAttr PRE ID+instance AddAttr PRE LANG+instance AddAttr PRE ONCLICK+instance AddAttr PRE ONDBLCLICK+instance AddAttr PRE ONKEYDOWN+instance AddAttr PRE ONKEYPRESS+instance AddAttr PRE ONKEYUP+instance AddAttr PRE ONMOUSEDOWN+instance AddAttr PRE ONMOUSEMOVE+instance AddAttr PRE ONMOUSEOUT+instance AddAttr PRE ONMOUSEOVER+instance AddAttr PRE ONMOUSEUP+instance AddAttr PRE STYLE+instance AddAttr PRE TITLE+instance AddAttr PRE WIDTH+instance AddAttr Q CITE+instance AddAttr Q CLASS+instance AddAttr Q DIR+instance AddAttr Q ID+instance AddAttr Q LANG+instance AddAttr Q ONCLICK+instance AddAttr Q ONDBLCLICK+instance AddAttr Q ONKEYDOWN+instance AddAttr Q ONKEYPRESS+instance AddAttr Q ONKEYUP+instance AddAttr Q ONMOUSEDOWN+instance AddAttr Q ONMOUSEMOVE+instance AddAttr Q ONMOUSEOUT+instance AddAttr Q ONMOUSEOVER+instance AddAttr Q ONMOUSEUP+instance AddAttr Q STYLE+instance AddAttr Q TITLE+instance AddAttr S CLASS+instance AddAttr S DIR+instance AddAttr S ID+instance AddAttr S LANG+instance AddAttr S ONCLICK+instance AddAttr S ONDBLCLICK+instance AddAttr S ONKEYDOWN+instance AddAttr S ONKEYPRESS+instance AddAttr S ONKEYUP+instance AddAttr S ONMOUSEDOWN+instance AddAttr S ONMOUSEMOVE+instance AddAttr S ONMOUSEOUT+instance AddAttr S ONMOUSEOVER+instance AddAttr S ONMOUSEUP+instance AddAttr S STYLE+instance AddAttr S TITLE+instance AddAttr SAMP CLASS+instance AddAttr SAMP DIR+instance AddAttr SAMP ID+instance AddAttr SAMP LANG+instance AddAttr SAMP ONCLICK+instance AddAttr SAMP ONDBLCLICK+instance AddAttr SAMP ONKEYDOWN+instance AddAttr SAMP ONKEYPRESS+instance AddAttr SAMP ONKEYUP+instance AddAttr SAMP ONMOUSEDOWN+instance AddAttr SAMP ONMOUSEMOVE+instance AddAttr SAMP ONMOUSEOUT+instance AddAttr SAMP ONMOUSEOVER+instance AddAttr SAMP ONMOUSEUP+instance AddAttr SAMP STYLE+instance AddAttr SAMP TITLE+instance AddAttr SCRIPT CHARSET+instance AddAttr SCRIPT DEFER+instance AddAttr SCRIPT EVENT+instance AddAttr SCRIPT FOR+instance AddAttr SCRIPT LANGUAGE+instance AddAttr SCRIPT SRC+instance AddAttr SCRIPT TYPE+instance AddAttr SELECT CLASS+instance AddAttr SELECT DIR+instance AddAttr SELECT DISABLED+instance AddAttr SELECT ID+instance AddAttr SELECT LANG+instance AddAttr SELECT MULTIPLE+instance AddAttr SELECT NAME+instance AddAttr SELECT ONBLUR+instance AddAttr SELECT ONCHANGE+instance AddAttr SELECT ONCLICK+instance AddAttr SELECT ONDBLCLICK+instance AddAttr SELECT ONFOCUS+instance AddAttr SELECT ONKEYDOWN+instance AddAttr SELECT ONKEYPRESS+instance AddAttr SELECT ONKEYUP+instance AddAttr SELECT ONMOUSEDOWN+instance AddAttr SELECT ONMOUSEMOVE+instance AddAttr SELECT ONMOUSEOUT+instance AddAttr SELECT ONMOUSEOVER+instance AddAttr SELECT ONMOUSEUP+instance AddAttr SELECT SIZE+instance AddAttr SELECT STYLE+instance AddAttr SELECT TABINDEX+instance AddAttr SELECT TITLE+instance AddAttr SMALL CLASS+instance AddAttr SMALL DIR+instance AddAttr SMALL ID+instance AddAttr SMALL LANG+instance AddAttr SMALL ONCLICK+instance AddAttr SMALL ONDBLCLICK+instance AddAttr SMALL ONKEYDOWN+instance AddAttr SMALL ONKEYPRESS+instance AddAttr SMALL ONKEYUP+instance AddAttr SMALL ONMOUSEDOWN+instance AddAttr SMALL ONMOUSEMOVE+instance AddAttr SMALL ONMOUSEOUT+instance AddAttr SMALL ONMOUSEOVER+instance AddAttr SMALL ONMOUSEUP+instance AddAttr SMALL STYLE+instance AddAttr SMALL TITLE+instance AddAttr SPAN CLASS+instance AddAttr SPAN DIR+instance AddAttr SPAN ID+instance AddAttr SPAN LANG+instance AddAttr SPAN ONCLICK+instance AddAttr SPAN ONDBLCLICK+instance AddAttr SPAN ONKEYDOWN+instance AddAttr SPAN ONKEYPRESS+instance AddAttr SPAN ONKEYUP+instance AddAttr SPAN ONMOUSEDOWN+instance AddAttr SPAN ONMOUSEMOVE+instance AddAttr SPAN ONMOUSEOUT+instance AddAttr SPAN ONMOUSEOVER+instance AddAttr SPAN ONMOUSEUP+instance AddAttr SPAN STYLE+instance AddAttr SPAN TITLE+instance AddAttr STRIKE CLASS+instance AddAttr STRIKE DIR+instance AddAttr STRIKE ID+instance AddAttr STRIKE LANG+instance AddAttr STRIKE ONCLICK+instance AddAttr STRIKE ONDBLCLICK+instance AddAttr STRIKE ONKEYDOWN+instance AddAttr STRIKE ONKEYPRESS+instance AddAttr STRIKE ONKEYUP+instance AddAttr STRIKE ONMOUSEDOWN+instance AddAttr STRIKE ONMOUSEMOVE+instance AddAttr STRIKE ONMOUSEOUT+instance AddAttr STRIKE ONMOUSEOVER+instance AddAttr STRIKE ONMOUSEUP+instance AddAttr STRIKE STYLE+instance AddAttr STRIKE TITLE+instance AddAttr STRONG CLASS+instance AddAttr STRONG DIR+instance AddAttr STRONG ID+instance AddAttr STRONG LANG+instance AddAttr STRONG ONCLICK+instance AddAttr STRONG ONDBLCLICK+instance AddAttr STRONG ONKEYDOWN+instance AddAttr STRONG ONKEYPRESS+instance AddAttr STRONG ONKEYUP+instance AddAttr STRONG ONMOUSEDOWN+instance AddAttr STRONG ONMOUSEMOVE+instance AddAttr STRONG ONMOUSEOUT+instance AddAttr STRONG ONMOUSEOVER+instance AddAttr STRONG ONMOUSEUP+instance AddAttr STRONG STYLE+instance AddAttr STRONG TITLE+instance AddAttr STYLE DIR+instance AddAttr STYLE LANG+instance AddAttr STYLE MEDIA+instance AddAttr STYLE TITLE+instance AddAttr STYLE TYPE+instance AddAttr SUB CLASS+instance AddAttr SUB DIR+instance AddAttr SUB ID+instance AddAttr SUB LANG+instance AddAttr SUB ONCLICK+instance AddAttr SUB ONDBLCLICK+instance AddAttr SUB ONKEYDOWN+instance AddAttr SUB ONKEYPRESS+instance AddAttr SUB ONKEYUP+instance AddAttr SUB ONMOUSEDOWN+instance AddAttr SUB ONMOUSEMOVE+instance AddAttr SUB ONMOUSEOUT+instance AddAttr SUB ONMOUSEOVER+instance AddAttr SUB ONMOUSEUP+instance AddAttr SUB STYLE+instance AddAttr SUB TITLE+instance AddAttr SUP CLASS+instance AddAttr SUP DIR+instance AddAttr SUP ID+instance AddAttr SUP LANG+instance AddAttr SUP ONCLICK+instance AddAttr SUP ONDBLCLICK+instance AddAttr SUP ONKEYDOWN+instance AddAttr SUP ONKEYPRESS+instance AddAttr SUP ONKEYUP+instance AddAttr SUP ONMOUSEDOWN+instance AddAttr SUP ONMOUSEMOVE+instance AddAttr SUP ONMOUSEOUT+instance AddAttr SUP ONMOUSEOVER+instance AddAttr SUP ONMOUSEUP+instance AddAttr SUP STYLE+instance AddAttr SUP TITLE+instance AddAttr TABLE ALIGN+instance AddAttr TABLE BGCOLOR+instance AddAttr TABLE BORDER+instance AddAttr TABLE CELLPADDING+instance AddAttr TABLE CELLSPACING+instance AddAttr TABLE CLASS+instance AddAttr TABLE DATAPAGESIZE+instance AddAttr TABLE DIR+instance AddAttr TABLE FRAME+instance AddAttr TABLE ID+instance AddAttr TABLE LANG+instance AddAttr TABLE ONCLICK+instance AddAttr TABLE ONDBLCLICK+instance AddAttr TABLE ONKEYDOWN+instance AddAttr TABLE ONKEYPRESS+instance AddAttr TABLE ONKEYUP+instance AddAttr TABLE ONMOUSEDOWN+instance AddAttr TABLE ONMOUSEMOVE+instance AddAttr TABLE ONMOUSEOUT+instance AddAttr TABLE ONMOUSEOVER+instance AddAttr TABLE ONMOUSEUP+instance AddAttr TABLE RULES+instance AddAttr TABLE STYLE+instance AddAttr TABLE SUMMARY+instance AddAttr TABLE TITLE+instance AddAttr TABLE WIDTH+instance AddAttr TBODY ALIGN+instance AddAttr TBODY CHAR+instance AddAttr TBODY CHAROFF+instance AddAttr TBODY CLASS+instance AddAttr TBODY DIR+instance AddAttr TBODY ID+instance AddAttr TBODY LANG+instance AddAttr TBODY ONCLICK+instance AddAttr TBODY ONDBLCLICK+instance AddAttr TBODY ONKEYDOWN+instance AddAttr TBODY ONKEYPRESS+instance AddAttr TBODY ONKEYUP+instance AddAttr TBODY ONMOUSEDOWN+instance AddAttr TBODY ONMOUSEMOVE+instance AddAttr TBODY ONMOUSEOUT+instance AddAttr TBODY ONMOUSEOVER+instance AddAttr TBODY ONMOUSEUP+instance AddAttr TBODY STYLE+instance AddAttr TBODY TITLE+instance AddAttr TBODY VALIGN+instance AddAttr TD ABBR+instance AddAttr TD ALIGN+instance AddAttr TD AXIS+instance AddAttr TD BGCOLOR+instance AddAttr TD CHAR+instance AddAttr TD CHAROFF+instance AddAttr TD CLASS+instance AddAttr TD COLSPAN+instance AddAttr TD DIR+instance AddAttr TD HEADERS+instance AddAttr TD HEIGHT+instance AddAttr TD ID+instance AddAttr TD LANG+instance AddAttr TD NOWRAP+instance AddAttr TD ONCLICK+instance AddAttr TD ONDBLCLICK+instance AddAttr TD ONKEYDOWN+instance AddAttr TD ONKEYPRESS+instance AddAttr TD ONKEYUP+instance AddAttr TD ONMOUSEDOWN+instance AddAttr TD ONMOUSEMOVE+instance AddAttr TD ONMOUSEOUT+instance AddAttr TD ONMOUSEOVER+instance AddAttr TD ONMOUSEUP+instance AddAttr TD ROWSPAN+instance AddAttr TD SCOPE+instance AddAttr TD STYLE+instance AddAttr TD TITLE+instance AddAttr TD VALIGN+instance AddAttr TD WIDTH+instance AddAttr TEXTAREA ACCESSKEY+instance AddAttr TEXTAREA CLASS+instance AddAttr TEXTAREA COLS+instance AddAttr TEXTAREA DIR+instance AddAttr TEXTAREA DISABLED+instance AddAttr TEXTAREA ID+instance AddAttr TEXTAREA LANG+instance AddAttr TEXTAREA NAME+instance AddAttr TEXTAREA ONBLUR+instance AddAttr TEXTAREA ONCHANGE+instance AddAttr TEXTAREA ONCLICK+instance AddAttr TEXTAREA ONDBLCLICK+instance AddAttr TEXTAREA ONFOCUS+instance AddAttr TEXTAREA ONKEYDOWN+instance AddAttr TEXTAREA ONKEYPRESS+instance AddAttr TEXTAREA ONKEYUP+instance AddAttr TEXTAREA ONMOUSEDOWN+instance AddAttr TEXTAREA ONMOUSEMOVE+instance AddAttr TEXTAREA ONMOUSEOUT+instance AddAttr TEXTAREA ONMOUSEOVER+instance AddAttr TEXTAREA ONMOUSEUP+instance AddAttr TEXTAREA ONSELECT+instance AddAttr TEXTAREA READONLY+instance AddAttr TEXTAREA ROWS+instance AddAttr TEXTAREA STYLE+instance AddAttr TEXTAREA TABINDEX+instance AddAttr TEXTAREA TITLE+instance AddAttr TFOOT ALIGN+instance AddAttr TFOOT CHAR+instance AddAttr TFOOT CHAROFF+instance AddAttr TFOOT CLASS+instance AddAttr TFOOT DIR+instance AddAttr TFOOT ID+instance AddAttr TFOOT LANG+instance AddAttr TFOOT ONCLICK+instance AddAttr TFOOT ONDBLCLICK+instance AddAttr TFOOT ONKEYDOWN+instance AddAttr TFOOT ONKEYPRESS+instance AddAttr TFOOT ONKEYUP+instance AddAttr TFOOT ONMOUSEDOWN+instance AddAttr TFOOT ONMOUSEMOVE+instance AddAttr TFOOT ONMOUSEOUT+instance AddAttr TFOOT ONMOUSEOVER+instance AddAttr TFOOT ONMOUSEUP+instance AddAttr TFOOT STYLE+instance AddAttr TFOOT TITLE+instance AddAttr TFOOT VALIGN+instance AddAttr TH ABBR+instance AddAttr TH ALIGN+instance AddAttr TH AXIS+instance AddAttr TH BGCOLOR+instance AddAttr TH CHAR+instance AddAttr TH CHAROFF+instance AddAttr TH CLASS+instance AddAttr TH COLSPAN+instance AddAttr TH DIR+instance AddAttr TH HEADERS+instance AddAttr TH HEIGHT+instance AddAttr TH ID+instance AddAttr TH LANG+instance AddAttr TH NOWRAP+instance AddAttr TH ONCLICK+instance AddAttr TH ONDBLCLICK+instance AddAttr TH ONKEYDOWN+instance AddAttr TH ONKEYPRESS+instance AddAttr TH ONKEYUP+instance AddAttr TH ONMOUSEDOWN+instance AddAttr TH ONMOUSEMOVE+instance AddAttr TH ONMOUSEOUT+instance AddAttr TH ONMOUSEOVER+instance AddAttr TH ONMOUSEUP+instance AddAttr TH ROWSPAN+instance AddAttr TH SCOPE+instance AddAttr TH STYLE+instance AddAttr TH TITLE+instance AddAttr TH VALIGN+instance AddAttr TH WIDTH+instance AddAttr THEAD ALIGN+instance AddAttr THEAD CHAR+instance AddAttr THEAD CHAROFF+instance AddAttr THEAD CLASS+instance AddAttr THEAD DIR+instance AddAttr THEAD ID+instance AddAttr THEAD LANG+instance AddAttr THEAD ONCLICK+instance AddAttr THEAD ONDBLCLICK+instance AddAttr THEAD ONKEYDOWN+instance AddAttr THEAD ONKEYPRESS+instance AddAttr THEAD ONKEYUP+instance AddAttr THEAD ONMOUSEDOWN+instance AddAttr THEAD ONMOUSEMOVE+instance AddAttr THEAD ONMOUSEOUT+instance AddAttr THEAD ONMOUSEOVER+instance AddAttr THEAD ONMOUSEUP+instance AddAttr THEAD STYLE+instance AddAttr THEAD TITLE+instance AddAttr THEAD VALIGN+instance AddAttr TITLE DIR+instance AddAttr TITLE LANG+instance AddAttr TR ALIGN+instance AddAttr TR BGCOLOR+instance AddAttr TR CHAR+instance AddAttr TR CHAROFF+instance AddAttr TR CLASS+instance AddAttr TR DIR+instance AddAttr TR ID+instance AddAttr TR LANG+instance AddAttr TR ONCLICK+instance AddAttr TR ONDBLCLICK+instance AddAttr TR ONKEYDOWN+instance AddAttr TR ONKEYPRESS+instance AddAttr TR ONKEYUP+instance AddAttr TR ONMOUSEDOWN+instance AddAttr TR ONMOUSEMOVE+instance AddAttr TR ONMOUSEOUT+instance AddAttr TR ONMOUSEOVER+instance AddAttr TR ONMOUSEUP+instance AddAttr TR STYLE+instance AddAttr TR TITLE+instance AddAttr TR VALIGN+instance AddAttr TT CLASS+instance AddAttr TT DIR+instance AddAttr TT ID+instance AddAttr TT LANG+instance AddAttr TT ONCLICK+instance AddAttr TT ONDBLCLICK+instance AddAttr TT ONKEYDOWN+instance AddAttr TT ONKEYPRESS+instance AddAttr TT ONKEYUP+instance AddAttr TT ONMOUSEDOWN+instance AddAttr TT ONMOUSEMOVE+instance AddAttr TT ONMOUSEOUT+instance AddAttr TT ONMOUSEOVER+instance AddAttr TT ONMOUSEUP+instance AddAttr TT STYLE+instance AddAttr TT TITLE+instance AddAttr U CLASS+instance AddAttr U DIR+instance AddAttr U ID+instance AddAttr U LANG+instance AddAttr U ONCLICK+instance AddAttr U ONDBLCLICK+instance AddAttr U ONKEYDOWN+instance AddAttr U ONKEYPRESS+instance AddAttr U ONKEYUP+instance AddAttr U ONMOUSEDOWN+instance AddAttr U ONMOUSEMOVE+instance AddAttr U ONMOUSEOUT+instance AddAttr U ONMOUSEOVER+instance AddAttr U ONMOUSEUP+instance AddAttr U STYLE+instance AddAttr U TITLE+instance AddAttr UL CLASS+instance AddAttr UL COMPACT+instance AddAttr UL DIR+instance AddAttr UL ID+instance AddAttr UL LANG+instance AddAttr UL ONCLICK+instance AddAttr UL ONDBLCLICK+instance AddAttr UL ONKEYDOWN+instance AddAttr UL ONKEYPRESS+instance AddAttr UL ONKEYUP+instance AddAttr UL ONMOUSEDOWN+instance AddAttr UL ONMOUSEMOVE+instance AddAttr UL ONMOUSEOUT+instance AddAttr UL ONMOUSEOVER+instance AddAttr UL ONMOUSEUP+instance AddAttr UL STYLE+instance AddAttr UL TITLE+instance AddAttr UL TYPE+instance AddAttr VAR CLASS+instance AddAttr VAR DIR+instance AddAttr VAR ID+instance AddAttr VAR LANG+instance AddAttr VAR ONCLICK+instance AddAttr VAR ONDBLCLICK+instance AddAttr VAR ONKEYDOWN+instance AddAttr VAR ONKEYPRESS+instance AddAttr VAR ONKEYUP+instance AddAttr VAR ONMOUSEDOWN+instance AddAttr VAR ONMOUSEMOVE+instance AddAttr VAR ONMOUSEOUT+instance AddAttr VAR ONMOUSEOVER+instance AddAttr VAR ONMOUSEUP+instance AddAttr VAR STYLE+instance AddAttr VAR TITLE
+ WASH/HTML/HTMLPrelude98.hs view
@@ -0,0 +1,6195 @@+-- © 2001, 2002 Peter Thiemann+-- this file is generated -- do not edit+module WASH.HTML.HTMLPrelude98+ (module WASH.HTML.HTMLPrelude98,module WASH.HTML.HTMLTypedBase98)+ where+import Prelude hiding (div,head,map,span)+import WASH.HTML.HTMLTypedBase98+-- identity function+empty x = x+-- reverse function application+( # ) = flip ($) -- DON'T REMOVE THE SPACES+-- reverse function composition+( ## ) = flip (.) -- DON'T REMOVE THE SPACES+-- +instance AdmitChildHTML DOCUMENT+build_document :: (ELT HTML -> ELT HTML) -> ELT DOCUMENT+build_document addToHTML = make DOCUMENT # html addToHTML+-- end fixed prologue+class AdmitAttrVERSION e where+ uaVERSION :: String -> ELT e -> ELT e+ uaVERSION str into = add_attr into (mkUAttr VERSION str)+ atVERSION :: AttrValueVERSION v => v -> ELT e -> ELT e+ atVERSION v into = add_attr into (mkUAttr VERSION (av $ show v))+class AdmitAttrDIR e where+ uaDIR :: String -> ELT e -> ELT e+ uaDIR str into = add_attr into (mkUAttr DIR str)+ atDIR :: AttrValueDIR v => v -> ELT e -> ELT e+ atDIR v into = add_attr into (mkUAttr DIR (av $ show v))+class AdmitAttrLANG e where+ uaLANG :: String -> ELT e -> ELT e+ uaLANG str into = add_attr into (mkUAttr LANG str)+ atLANG :: AttrValueLANG v => v -> ELT e -> ELT e+ atLANG v into = add_attr into (mkUAttr LANG (av $ show v))+class AdmitAttrONKEYUP e where+ uaONKEYUP :: String -> ELT e -> ELT e+ uaONKEYUP str into = add_attr into (mkUAttr ONKEYUP str)+ atONKEYUP :: AttrValueONKEYUP v => v -> ELT e -> ELT e+ atONKEYUP v into = add_attr into (mkUAttr ONKEYUP (av $ show v))+class AdmitAttrONKEYDOWN e where+ uaONKEYDOWN :: String -> ELT e -> ELT e+ uaONKEYDOWN str into = add_attr into (mkUAttr ONKEYDOWN str)+ atONKEYDOWN :: AttrValueONKEYDOWN v => v -> ELT e -> ELT e+ atONKEYDOWN v into = add_attr into (mkUAttr ONKEYDOWN (av $ show v))+class AdmitAttrONKEYPRESS e where+ uaONKEYPRESS :: String -> ELT e -> ELT e+ uaONKEYPRESS str into = add_attr into (mkUAttr ONKEYPRESS str)+ atONKEYPRESS :: AttrValueONKEYPRESS v => v -> ELT e -> ELT e+ atONKEYPRESS v into = add_attr into (mkUAttr ONKEYPRESS (av $ show v))+class AdmitAttrONMOUSEOUT e where+ uaONMOUSEOUT :: String -> ELT e -> ELT e+ uaONMOUSEOUT str into = add_attr into (mkUAttr ONMOUSEOUT str)+ atONMOUSEOUT :: AttrValueONMOUSEOUT v => v -> ELT e -> ELT e+ atONMOUSEOUT v into = add_attr into (mkUAttr ONMOUSEOUT (av $ show v))+class AdmitAttrONMOUSEMOVE e where+ uaONMOUSEMOVE :: String -> ELT e -> ELT e+ uaONMOUSEMOVE str into = add_attr into (mkUAttr ONMOUSEMOVE str)+ atONMOUSEMOVE :: AttrValueONMOUSEMOVE v => v -> ELT e -> ELT e+ atONMOUSEMOVE v into = add_attr into (mkUAttr ONMOUSEMOVE (av $ show v))+class AdmitAttrONMOUSEOVER e where+ uaONMOUSEOVER :: String -> ELT e -> ELT e+ uaONMOUSEOVER str into = add_attr into (mkUAttr ONMOUSEOVER str)+ atONMOUSEOVER :: AttrValueONMOUSEOVER v => v -> ELT e -> ELT e+ atONMOUSEOVER v into = add_attr into (mkUAttr ONMOUSEOVER (av $ show v))+class AdmitAttrONMOUSEUP e where+ uaONMOUSEUP :: String -> ELT e -> ELT e+ uaONMOUSEUP str into = add_attr into (mkUAttr ONMOUSEUP str)+ atONMOUSEUP :: AttrValueONMOUSEUP v => v -> ELT e -> ELT e+ atONMOUSEUP v into = add_attr into (mkUAttr ONMOUSEUP (av $ show v))+class AdmitAttrONMOUSEDOWN e where+ uaONMOUSEDOWN :: String -> ELT e -> ELT e+ uaONMOUSEDOWN str into = add_attr into (mkUAttr ONMOUSEDOWN str)+ atONMOUSEDOWN :: AttrValueONMOUSEDOWN v => v -> ELT e -> ELT e+ atONMOUSEDOWN v into = add_attr into (mkUAttr ONMOUSEDOWN (av $ show v))+class AdmitAttrONDBLCLICK e where+ uaONDBLCLICK :: String -> ELT e -> ELT e+ uaONDBLCLICK str into = add_attr into (mkUAttr ONDBLCLICK str)+ atONDBLCLICK :: AttrValueONDBLCLICK v => v -> ELT e -> ELT e+ atONDBLCLICK v into = add_attr into (mkUAttr ONDBLCLICK (av $ show v))+class AdmitAttrONCLICK e where+ uaONCLICK :: String -> ELT e -> ELT e+ uaONCLICK str into = add_attr into (mkUAttr ONCLICK str)+ atONCLICK :: AttrValueONCLICK v => v -> ELT e -> ELT e+ atONCLICK v into = add_attr into (mkUAttr ONCLICK (av $ show v))+class AdmitAttrTITLE e where+ uaTITLE :: String -> ELT e -> ELT e+ uaTITLE str into = add_attr into (mkUAttr TITLE str)+ atTITLE :: AttrValueTITLE v => v -> ELT e -> ELT e+ atTITLE v into = add_attr into (mkUAttr TITLE (av $ show v))+class AdmitAttrSTYLE e where+ uaSTYLE :: String -> ELT e -> ELT e+ uaSTYLE str into = add_attr into (mkUAttr STYLE str)+ atSTYLE :: AttrValueSTYLE v => v -> ELT e -> ELT e+ atSTYLE v into = add_attr into (mkUAttr STYLE (av $ show v))+class AdmitAttrCLASS e where+ uaCLASS :: String -> ELT e -> ELT e+ uaCLASS str into = add_attr into (mkUAttr CLASS str)+ atCLASS :: AttrValueCLASS v => v -> ELT e -> ELT e+ atCLASS v into = add_attr into (mkUAttr CLASS (av $ show v))+class AdmitAttrID e where+ uaID :: String -> ELT e -> ELT e+ uaID str into = add_attr into (mkUAttr ID str)+ atID :: AttrValueID v => v -> ELT e -> ELT e+ atID v into = add_attr into (mkUAttr ID (av $ show v))+class AdmitAttrFOR e where+ uaFOR :: String -> ELT e -> ELT e+ uaFOR str into = add_attr into (mkUAttr FOR str)+ atFOR :: AttrValueFOR v => v -> ELT e -> ELT e+ atFOR v into = add_attr into (mkUAttr FOR (av $ show v))+class AdmitAttrEVENT e where+ uaEVENT :: String -> ELT e -> ELT e+ uaEVENT str into = add_attr into (mkUAttr EVENT str)+ atEVENT :: AttrValueEVENT v => v -> ELT e -> ELT e+ atEVENT v into = add_attr into (mkUAttr EVENT (av $ show v))+class AdmitAttrDEFER e where+ uaDEFER :: String -> ELT e -> ELT e+ uaDEFER str into = add_attr into (mkUAttr DEFER str)+ atDEFER :: AttrValueDEFER v => v -> ELT e -> ELT e+ atDEFER v into = add_attr into (mkUAttr DEFER (av $ show v))+class AdmitAttrSRC e where+ uaSRC :: String -> ELT e -> ELT e+ uaSRC str into = add_attr into (mkUAttr SRC str)+ atSRC :: AttrValueSRC v => v -> ELT e -> ELT e+ atSRC v into = add_attr into (mkUAttr SRC (av $ show v))+class AdmitAttrLANGUAGE e where+ uaLANGUAGE :: String -> ELT e -> ELT e+ uaLANGUAGE str into = add_attr into (mkUAttr LANGUAGE str)+ atLANGUAGE :: AttrValueLANGUAGE v => v -> ELT e -> ELT e+ atLANGUAGE v into = add_attr into (mkUAttr LANGUAGE (av $ show v))+class AdmitAttrTYPE e where+ uaTYPE :: String -> ELT e -> ELT e+ uaTYPE str into = add_attr into (mkUAttr TYPE str)+ atTYPE :: AttrValueTYPE v => v -> ELT e -> ELT e+ atTYPE v into = add_attr into (mkUAttr TYPE (av $ show v))+class AdmitAttrCHARSET e where+ uaCHARSET :: String -> ELT e -> ELT e+ uaCHARSET str into = add_attr into (mkUAttr CHARSET str)+ atCHARSET :: AttrValueCHARSET v => v -> ELT e -> ELT e+ atCHARSET v into = add_attr into (mkUAttr CHARSET (av $ show v))+class AdmitAttrMEDIA e where+ uaMEDIA :: String -> ELT e -> ELT e+ uaMEDIA str into = add_attr into (mkUAttr MEDIA str)+ atMEDIA :: AttrValueMEDIA v => v -> ELT e -> ELT e+ atMEDIA v into = add_attr into (mkUAttr MEDIA (av $ show v))+class AdmitAttrSCHEME e where+ uaSCHEME :: String -> ELT e -> ELT e+ uaSCHEME str into = add_attr into (mkUAttr SCHEME str)+ atSCHEME :: AttrValueSCHEME v => v -> ELT e -> ELT e+ atSCHEME v into = add_attr into (mkUAttr SCHEME (av $ show v))+class AdmitAttrCONTENT e where+ uaCONTENT :: String -> ELT e -> ELT e+ uaCONTENT str into = add_attr into (mkUAttr CONTENT str)+ atCONTENT :: AttrValueCONTENT v => v -> ELT e -> ELT e+ atCONTENT v into = add_attr into (mkUAttr CONTENT (av $ show v))+class AdmitAttrNAME e where+ uaNAME :: String -> ELT e -> ELT e+ uaNAME str into = add_attr into (mkUAttr NAME str)+ atNAME :: AttrValueNAME v => v -> ELT e -> ELT e+ atNAME v into = add_attr into (mkUAttr NAME (av $ show v))+class AdmitAttrHTTP_EQUIV e where+ uaHTTP_EQUIV :: String -> ELT e -> ELT e+ uaHTTP_EQUIV str into = add_attr into (mkUAttr HTTP_EQUIV str)+ atHTTP_EQUIV :: AttrValueHTTP_EQUIV v => v -> ELT e -> ELT e+ atHTTP_EQUIV v into = add_attr into (mkUAttr HTTP_EQUIV (av $ show v))+class AdmitAttrTARGET e where+ uaTARGET :: String -> ELT e -> ELT e+ uaTARGET str into = add_attr into (mkUAttr TARGET str)+ atTARGET :: AttrValueTARGET v => v -> ELT e -> ELT e+ atTARGET v into = add_attr into (mkUAttr TARGET (av $ show v))+class AdmitAttrHREF e where+ uaHREF :: String -> ELT e -> ELT e+ uaHREF str into = add_attr into (mkUAttr HREF str)+ atHREF :: AttrValueHREF v => v -> ELT e -> ELT e+ atHREF v into = add_attr into (mkUAttr HREF (av $ show v))+class AdmitAttrPROMPT e where+ uaPROMPT :: String -> ELT e -> ELT e+ uaPROMPT str into = add_attr into (mkUAttr PROMPT str)+ atPROMPT :: AttrValuePROMPT v => v -> ELT e -> ELT e+ atPROMPT v into = add_attr into (mkUAttr PROMPT (av $ show v))+class AdmitAttrPROFILE e where+ uaPROFILE :: String -> ELT e -> ELT e+ uaPROFILE str into = add_attr into (mkUAttr PROFILE str)+ atPROFILE :: AttrValuePROFILE v => v -> ELT e -> ELT e+ atPROFILE v into = add_attr into (mkUAttr PROFILE (av $ show v))+class AdmitAttrWIDTH e where+ uaWIDTH :: String -> ELT e -> ELT e+ uaWIDTH str into = add_attr into (mkUAttr WIDTH str)+ atWIDTH :: AttrValueWIDTH v => v -> ELT e -> ELT e+ atWIDTH v into = add_attr into (mkUAttr WIDTH (av $ show v))+class AdmitAttrHEIGHT e where+ uaHEIGHT :: String -> ELT e -> ELT e+ uaHEIGHT str into = add_attr into (mkUAttr HEIGHT str)+ atHEIGHT :: AttrValueHEIGHT v => v -> ELT e -> ELT e+ atHEIGHT v into = add_attr into (mkUAttr HEIGHT (av $ show v))+class AdmitAttrALIGN e where+ uaALIGN :: String -> ELT e -> ELT e+ uaALIGN str into = add_attr into (mkUAttr ALIGN str)+ atALIGN :: AttrValueALIGN v => v -> ELT e -> ELT e+ atALIGN v into = add_attr into (mkUAttr ALIGN (av $ show v))+class AdmitAttrSCROLLING e where+ uaSCROLLING :: String -> ELT e -> ELT e+ uaSCROLLING str into = add_attr into (mkUAttr SCROLLING str)+ atSCROLLING :: AttrValueSCROLLING v => v -> ELT e -> ELT e+ atSCROLLING v into = add_attr into (mkUAttr SCROLLING (av $ show v))+class AdmitAttrMARGINHEIGHT e where+ uaMARGINHEIGHT :: String -> ELT e -> ELT e+ uaMARGINHEIGHT str into = add_attr into (mkUAttr MARGINHEIGHT str)+ atMARGINHEIGHT :: AttrValueMARGINHEIGHT v => v -> ELT e -> ELT e+ atMARGINHEIGHT v into = add_attr into (mkUAttr MARGINHEIGHT (av $ show v))+class AdmitAttrMARGINWIDTH e where+ uaMARGINWIDTH :: String -> ELT e -> ELT e+ uaMARGINWIDTH str into = add_attr into (mkUAttr MARGINWIDTH str)+ atMARGINWIDTH :: AttrValueMARGINWIDTH v => v -> ELT e -> ELT e+ atMARGINWIDTH v into = add_attr into (mkUAttr MARGINWIDTH (av $ show v))+class AdmitAttrFRAMEBORDER e where+ uaFRAMEBORDER :: String -> ELT e -> ELT e+ uaFRAMEBORDER str into = add_attr into (mkUAttr FRAMEBORDER str)+ atFRAMEBORDER :: AttrValueFRAMEBORDER v => v -> ELT e -> ELT e+ atFRAMEBORDER v into = add_attr into (mkUAttr FRAMEBORDER (av $ show v))+class AdmitAttrLONGDESC e where+ uaLONGDESC :: String -> ELT e -> ELT e+ uaLONGDESC str into = add_attr into (mkUAttr LONGDESC str)+ atLONGDESC :: AttrValueLONGDESC v => v -> ELT e -> ELT e+ atLONGDESC v into = add_attr into (mkUAttr LONGDESC (av $ show v))+class AdmitAttrBGCOLOR e where+ uaBGCOLOR :: String -> ELT e -> ELT e+ uaBGCOLOR str into = add_attr into (mkUAttr BGCOLOR str)+ atBGCOLOR :: AttrValueBGCOLOR v => v -> ELT e -> ELT e+ atBGCOLOR v into = add_attr into (mkUAttr BGCOLOR (av $ show v))+class AdmitAttrNOWRAP e where+ uaNOWRAP :: String -> ELT e -> ELT e+ uaNOWRAP str into = add_attr into (mkUAttr NOWRAP str)+ atNOWRAP :: AttrValueNOWRAP v => v -> ELT e -> ELT e+ atNOWRAP v into = add_attr into (mkUAttr NOWRAP (av $ show v))+class AdmitAttrVALIGN e where+ uaVALIGN :: String -> ELT e -> ELT e+ uaVALIGN str into = add_attr into (mkUAttr VALIGN str)+ atVALIGN :: AttrValueVALIGN v => v -> ELT e -> ELT e+ atVALIGN v into = add_attr into (mkUAttr VALIGN (av $ show v))+class AdmitAttrCHAROFF e where+ uaCHAROFF :: String -> ELT e -> ELT e+ uaCHAROFF str into = add_attr into (mkUAttr CHAROFF str)+ atCHAROFF :: AttrValueCHAROFF v => v -> ELT e -> ELT e+ atCHAROFF v into = add_attr into (mkUAttr CHAROFF (av $ show v))+class AdmitAttrCHAR e where+ uaCHAR :: String -> ELT e -> ELT e+ uaCHAR str into = add_attr into (mkUAttr CHAR str)+ atCHAR :: AttrValueCHAR v => v -> ELT e -> ELT e+ atCHAR v into = add_attr into (mkUAttr CHAR (av $ show v))+class AdmitAttrCOLSPAN e where+ uaCOLSPAN :: String -> ELT e -> ELT e+ uaCOLSPAN str into = add_attr into (mkUAttr COLSPAN str)+ atCOLSPAN :: AttrValueCOLSPAN v => v -> ELT e -> ELT e+ atCOLSPAN v into = add_attr into (mkUAttr COLSPAN (av $ show v))+class AdmitAttrROWSPAN e where+ uaROWSPAN :: String -> ELT e -> ELT e+ uaROWSPAN str into = add_attr into (mkUAttr ROWSPAN str)+ atROWSPAN :: AttrValueROWSPAN v => v -> ELT e -> ELT e+ atROWSPAN v into = add_attr into (mkUAttr ROWSPAN (av $ show v))+class AdmitAttrSCOPE e where+ uaSCOPE :: String -> ELT e -> ELT e+ uaSCOPE str into = add_attr into (mkUAttr SCOPE str)+ atSCOPE :: AttrValueSCOPE v => v -> ELT e -> ELT e+ atSCOPE v into = add_attr into (mkUAttr SCOPE (av $ show v))+class AdmitAttrHEADERS e where+ uaHEADERS :: String -> ELT e -> ELT e+ uaHEADERS str into = add_attr into (mkUAttr HEADERS str)+ atHEADERS :: AttrValueHEADERS v => v -> ELT e -> ELT e+ atHEADERS v into = add_attr into (mkUAttr HEADERS (av $ show v))+class AdmitAttrAXIS e where+ uaAXIS :: String -> ELT e -> ELT e+ uaAXIS str into = add_attr into (mkUAttr AXIS str)+ atAXIS :: AttrValueAXIS v => v -> ELT e -> ELT e+ atAXIS v into = add_attr into (mkUAttr AXIS (av $ show v))+class AdmitAttrABBR e where+ uaABBR :: String -> ELT e -> ELT e+ uaABBR str into = add_attr into (mkUAttr ABBR str)+ atABBR :: AttrValueABBR v => v -> ELT e -> ELT e+ atABBR v into = add_attr into (mkUAttr ABBR (av $ show v))+class AdmitAttrSPAN e where+ uaSPAN :: String -> ELT e -> ELT e+ uaSPAN str into = add_attr into (mkUAttr SPAN str)+ atSPAN :: AttrValueSPAN v => v -> ELT e -> ELT e+ atSPAN v into = add_attr into (mkUAttr SPAN (av $ show v))+class AdmitAttrDATAPAGESIZE e where+ uaDATAPAGESIZE :: String -> ELT e -> ELT e+ uaDATAPAGESIZE str into = add_attr into (mkUAttr DATAPAGESIZE str)+ atDATAPAGESIZE :: AttrValueDATAPAGESIZE v => v -> ELT e -> ELT e+ atDATAPAGESIZE v into = add_attr into (mkUAttr DATAPAGESIZE (av $ show v))+class AdmitAttrCELLPADDING e where+ uaCELLPADDING :: String -> ELT e -> ELT e+ uaCELLPADDING str into = add_attr into (mkUAttr CELLPADDING str)+ atCELLPADDING :: AttrValueCELLPADDING v => v -> ELT e -> ELT e+ atCELLPADDING v into = add_attr into (mkUAttr CELLPADDING (av $ show v))+class AdmitAttrCELLSPACING e where+ uaCELLSPACING :: String -> ELT e -> ELT e+ uaCELLSPACING str into = add_attr into (mkUAttr CELLSPACING str)+ atCELLSPACING :: AttrValueCELLSPACING v => v -> ELT e -> ELT e+ atCELLSPACING v into = add_attr into (mkUAttr CELLSPACING (av $ show v))+class AdmitAttrRULES e where+ uaRULES :: String -> ELT e -> ELT e+ uaRULES str into = add_attr into (mkUAttr RULES str)+ atRULES :: AttrValueRULES v => v -> ELT e -> ELT e+ atRULES v into = add_attr into (mkUAttr RULES (av $ show v))+class AdmitAttrFRAME e where+ uaFRAME :: String -> ELT e -> ELT e+ uaFRAME str into = add_attr into (mkUAttr FRAME str)+ atFRAME :: AttrValueFRAME v => v -> ELT e -> ELT e+ atFRAME v into = add_attr into (mkUAttr FRAME (av $ show v))+class AdmitAttrBORDER e where+ uaBORDER :: String -> ELT e -> ELT e+ uaBORDER str into = add_attr into (mkUAttr BORDER str)+ atBORDER :: AttrValueBORDER v => v -> ELT e -> ELT e+ atBORDER v into = add_attr into (mkUAttr BORDER (av $ show v))+class AdmitAttrSUMMARY e where+ uaSUMMARY :: String -> ELT e -> ELT e+ uaSUMMARY str into = add_attr into (mkUAttr SUMMARY str)+ atSUMMARY :: AttrValueSUMMARY v => v -> ELT e -> ELT e+ atSUMMARY v into = add_attr into (mkUAttr SUMMARY (av $ show v))+class AdmitAttrONBLUR e where+ uaONBLUR :: String -> ELT e -> ELT e+ uaONBLUR str into = add_attr into (mkUAttr ONBLUR str)+ atONBLUR :: AttrValueONBLUR v => v -> ELT e -> ELT e+ atONBLUR v into = add_attr into (mkUAttr ONBLUR (av $ show v))+class AdmitAttrONFOCUS e where+ uaONFOCUS :: String -> ELT e -> ELT e+ uaONFOCUS str into = add_attr into (mkUAttr ONFOCUS str)+ atONFOCUS :: AttrValueONFOCUS v => v -> ELT e -> ELT e+ atONFOCUS v into = add_attr into (mkUAttr ONFOCUS (av $ show v))+class AdmitAttrACCESSKEY e where+ uaACCESSKEY :: String -> ELT e -> ELT e+ uaACCESSKEY str into = add_attr into (mkUAttr ACCESSKEY str)+ atACCESSKEY :: AttrValueACCESSKEY v => v -> ELT e -> ELT e+ atACCESSKEY v into = add_attr into (mkUAttr ACCESSKEY (av $ show v))+class AdmitAttrTABINDEX e where+ uaTABINDEX :: String -> ELT e -> ELT e+ uaTABINDEX str into = add_attr into (mkUAttr TABINDEX str)+ atTABINDEX :: AttrValueTABINDEX v => v -> ELT e -> ELT e+ atTABINDEX v into = add_attr into (mkUAttr TABINDEX (av $ show v))+class AdmitAttrDISABLED e where+ uaDISABLED :: String -> ELT e -> ELT e+ uaDISABLED str into = add_attr into (mkUAttr DISABLED str)+ atDISABLED :: AttrValueDISABLED v => v -> ELT e -> ELT e+ atDISABLED v into = add_attr into (mkUAttr DISABLED (av $ show v))+class AdmitAttrVALUE e where+ uaVALUE :: String -> ELT e -> ELT e+ uaVALUE str into = add_attr into (mkUAttr VALUE str)+ atVALUE :: AttrValueVALUE v => v -> ELT e -> ELT e+ atVALUE v into = add_attr into (mkUAttr VALUE (av $ show v))+class AdmitAttrONCHANGE e where+ uaONCHANGE :: String -> ELT e -> ELT e+ uaONCHANGE str into = add_attr into (mkUAttr ONCHANGE str)+ atONCHANGE :: AttrValueONCHANGE v => v -> ELT e -> ELT e+ atONCHANGE v into = add_attr into (mkUAttr ONCHANGE (av $ show v))+class AdmitAttrONSELECT e where+ uaONSELECT :: String -> ELT e -> ELT e+ uaONSELECT str into = add_attr into (mkUAttr ONSELECT str)+ atONSELECT :: AttrValueONSELECT v => v -> ELT e -> ELT e+ atONSELECT v into = add_attr into (mkUAttr ONSELECT (av $ show v))+class AdmitAttrREADONLY e where+ uaREADONLY :: String -> ELT e -> ELT e+ uaREADONLY str into = add_attr into (mkUAttr READONLY str)+ atREADONLY :: AttrValueREADONLY v => v -> ELT e -> ELT e+ atREADONLY v into = add_attr into (mkUAttr READONLY (av $ show v))+class AdmitAttrCOLS e where+ uaCOLS :: String -> ELT e -> ELT e+ uaCOLS str into = add_attr into (mkUAttr COLS str)+ atCOLS :: AttrValueCOLS v => v -> ELT e -> ELT e+ atCOLS v into = add_attr into (mkUAttr COLS (av $ show v))+class AdmitAttrROWS e where+ uaROWS :: String -> ELT e -> ELT e+ uaROWS str into = add_attr into (mkUAttr ROWS str)+ atROWS :: AttrValueROWS v => v -> ELT e -> ELT e+ atROWS v into = add_attr into (mkUAttr ROWS (av $ show v))+class AdmitAttrLABEL e where+ uaLABEL :: String -> ELT e -> ELT e+ uaLABEL str into = add_attr into (mkUAttr LABEL str)+ atLABEL :: AttrValueLABEL v => v -> ELT e -> ELT e+ atLABEL v into = add_attr into (mkUAttr LABEL (av $ show v))+class AdmitAttrSELECTED e where+ uaSELECTED :: String -> ELT e -> ELT e+ uaSELECTED str into = add_attr into (mkUAttr SELECTED str)+ atSELECTED :: AttrValueSELECTED v => v -> ELT e -> ELT e+ atSELECTED v into = add_attr into (mkUAttr SELECTED (av $ show v))+class AdmitAttrMULTIPLE e where+ uaMULTIPLE :: String -> ELT e -> ELT e+ uaMULTIPLE str into = add_attr into (mkUAttr MULTIPLE str)+ atMULTIPLE :: AttrValueMULTIPLE v => v -> ELT e -> ELT e+ atMULTIPLE v into = add_attr into (mkUAttr MULTIPLE (av $ show v))+class AdmitAttrSIZE e where+ uaSIZE :: String -> ELT e -> ELT e+ uaSIZE str into = add_attr into (mkUAttr SIZE str)+ atSIZE :: AttrValueSIZE v => v -> ELT e -> ELT e+ atSIZE v into = add_attr into (mkUAttr SIZE (av $ show v))+class AdmitAttrACCEPT e where+ uaACCEPT :: String -> ELT e -> ELT e+ uaACCEPT str into = add_attr into (mkUAttr ACCEPT str)+ atACCEPT :: AttrValueACCEPT v => v -> ELT e -> ELT e+ atACCEPT v into = add_attr into (mkUAttr ACCEPT (av $ show v))+class AdmitAttrUSEMAP e where+ uaUSEMAP :: String -> ELT e -> ELT e+ uaUSEMAP str into = add_attr into (mkUAttr USEMAP str)+ atUSEMAP :: AttrValueUSEMAP v => v -> ELT e -> ELT e+ atUSEMAP v into = add_attr into (mkUAttr USEMAP (av $ show v))+class AdmitAttrALT e where+ uaALT :: String -> ELT e -> ELT e+ uaALT str into = add_attr into (mkUAttr ALT str)+ atALT :: AttrValueALT v => v -> ELT e -> ELT e+ atALT v into = add_attr into (mkUAttr ALT (av $ show v))+class AdmitAttrMAXLENGTH e where+ uaMAXLENGTH :: String -> ELT e -> ELT e+ uaMAXLENGTH str into = add_attr into (mkUAttr MAXLENGTH str)+ atMAXLENGTH :: AttrValueMAXLENGTH v => v -> ELT e -> ELT e+ atMAXLENGTH v into = add_attr into (mkUAttr MAXLENGTH (av $ show v))+class AdmitAttrCHECKED e where+ uaCHECKED :: String -> ELT e -> ELT e+ uaCHECKED str into = add_attr into (mkUAttr CHECKED str)+ atCHECKED :: AttrValueCHECKED v => v -> ELT e -> ELT e+ atCHECKED v into = add_attr into (mkUAttr CHECKED (av $ show v))+class AdmitAttrACCEPT_CHARSET e where+ uaACCEPT_CHARSET :: String -> ELT e -> ELT e+ uaACCEPT_CHARSET str into = add_attr into (mkUAttr ACCEPT_CHARSET str)+ atACCEPT_CHARSET :: AttrValueACCEPT_CHARSET v => v -> ELT e -> ELT e+ atACCEPT_CHARSET v into = add_attr into (mkUAttr ACCEPT_CHARSET (av $ show v))+class AdmitAttrONRESET e where+ uaONRESET :: String -> ELT e -> ELT e+ uaONRESET str into = add_attr into (mkUAttr ONRESET str)+ atONRESET :: AttrValueONRESET v => v -> ELT e -> ELT e+ atONRESET v into = add_attr into (mkUAttr ONRESET (av $ show v))+class AdmitAttrONSUBMIT e where+ uaONSUBMIT :: String -> ELT e -> ELT e+ uaONSUBMIT str into = add_attr into (mkUAttr ONSUBMIT str)+ atONSUBMIT :: AttrValueONSUBMIT v => v -> ELT e -> ELT e+ atONSUBMIT v into = add_attr into (mkUAttr ONSUBMIT (av $ show v))+class AdmitAttrENCTYPE e where+ uaENCTYPE :: String -> ELT e -> ELT e+ uaENCTYPE str into = add_attr into (mkUAttr ENCTYPE str)+ atENCTYPE :: AttrValueENCTYPE v => v -> ELT e -> ELT e+ atENCTYPE v into = add_attr into (mkUAttr ENCTYPE (av $ show v))+class AdmitAttrMETHOD e where+ uaMETHOD :: String -> ELT e -> ELT e+ uaMETHOD str into = add_attr into (mkUAttr METHOD str)+ atMETHOD :: AttrValueMETHOD v => v -> ELT e -> ELT e+ atMETHOD v into = add_attr into (mkUAttr METHOD (av $ show v))+class AdmitAttrACTION e where+ uaACTION :: String -> ELT e -> ELT e+ uaACTION str into = add_attr into (mkUAttr ACTION str)+ atACTION :: AttrValueACTION v => v -> ELT e -> ELT e+ atACTION v into = add_attr into (mkUAttr ACTION (av $ show v))+class AdmitAttrCOMPACT e where+ uaCOMPACT :: String -> ELT e -> ELT e+ uaCOMPACT str into = add_attr into (mkUAttr COMPACT str)+ atCOMPACT :: AttrValueCOMPACT v => v -> ELT e -> ELT e+ atCOMPACT v into = add_attr into (mkUAttr COMPACT (av $ show v))+class AdmitAttrSTART e where+ uaSTART :: String -> ELT e -> ELT e+ uaSTART str into = add_attr into (mkUAttr START str)+ atSTART :: AttrValueSTART v => v -> ELT e -> ELT e+ atSTART v into = add_attr into (mkUAttr START (av $ show v))+class AdmitAttrDATETIME e where+ uaDATETIME :: String -> ELT e -> ELT e+ uaDATETIME str into = add_attr into (mkUAttr DATETIME str)+ atDATETIME :: AttrValueDATETIME v => v -> ELT e -> ELT e+ atDATETIME v into = add_attr into (mkUAttr DATETIME (av $ show v))+class AdmitAttrCITE e where+ uaCITE :: String -> ELT e -> ELT e+ uaCITE str into = add_attr into (mkUAttr CITE str)+ atCITE :: AttrValueCITE v => v -> ELT e -> ELT e+ atCITE v into = add_attr into (mkUAttr CITE (av $ show v))+class AdmitAttrNOSHADE e where+ uaNOSHADE :: String -> ELT e -> ELT e+ uaNOSHADE str into = add_attr into (mkUAttr NOSHADE str)+ atNOSHADE :: AttrValueNOSHADE v => v -> ELT e -> ELT e+ atNOSHADE v into = add_attr into (mkUAttr NOSHADE (av $ show v))+class AdmitAttrVSPACE e where+ uaVSPACE :: String -> ELT e -> ELT e+ uaVSPACE str into = add_attr into (mkUAttr VSPACE str)+ atVSPACE :: AttrValueVSPACE v => v -> ELT e -> ELT e+ atVSPACE v into = add_attr into (mkUAttr VSPACE (av $ show v))+class AdmitAttrHSPACE e where+ uaHSPACE :: String -> ELT e -> ELT e+ uaHSPACE str into = add_attr into (mkUAttr HSPACE str)+ atHSPACE :: AttrValueHSPACE v => v -> ELT e -> ELT e+ atHSPACE v into = add_attr into (mkUAttr HSPACE (av $ show v))+class AdmitAttrOBJECT e where+ uaOBJECT :: String -> ELT e -> ELT e+ uaOBJECT str into = add_attr into (mkUAttr OBJECT str)+ atOBJECT :: AttrValueOBJECT v => v -> ELT e -> ELT e+ atOBJECT v into = add_attr into (mkUAttr OBJECT (av $ show v))+class AdmitAttrCODE e where+ uaCODE :: String -> ELT e -> ELT e+ uaCODE str into = add_attr into (mkUAttr CODE str)+ atCODE :: AttrValueCODE v => v -> ELT e -> ELT e+ atCODE v into = add_attr into (mkUAttr CODE (av $ show v))+class AdmitAttrARCHIVE e where+ uaARCHIVE :: String -> ELT e -> ELT e+ uaARCHIVE str into = add_attr into (mkUAttr ARCHIVE str)+ atARCHIVE :: AttrValueARCHIVE v => v -> ELT e -> ELT e+ atARCHIVE v into = add_attr into (mkUAttr ARCHIVE (av $ show v))+class AdmitAttrCODEBASE e where+ uaCODEBASE :: String -> ELT e -> ELT e+ uaCODEBASE str into = add_attr into (mkUAttr CODEBASE str)+ atCODEBASE :: AttrValueCODEBASE v => v -> ELT e -> ELT e+ atCODEBASE v into = add_attr into (mkUAttr CODEBASE (av $ show v))+class AdmitAttrVALUETYPE e where+ uaVALUETYPE :: String -> ELT e -> ELT e+ uaVALUETYPE str into = add_attr into (mkUAttr VALUETYPE str)+ atVALUETYPE :: AttrValueVALUETYPE v => v -> ELT e -> ELT e+ atVALUETYPE v into = add_attr into (mkUAttr VALUETYPE (av $ show v))+class AdmitAttrSTANDBY e where+ uaSTANDBY :: String -> ELT e -> ELT e+ uaSTANDBY str into = add_attr into (mkUAttr STANDBY str)+ atSTANDBY :: AttrValueSTANDBY v => v -> ELT e -> ELT e+ atSTANDBY v into = add_attr into (mkUAttr STANDBY (av $ show v))+class AdmitAttrCODETYPE e where+ uaCODETYPE :: String -> ELT e -> ELT e+ uaCODETYPE str into = add_attr into (mkUAttr CODETYPE str)+ atCODETYPE :: AttrValueCODETYPE v => v -> ELT e -> ELT e+ atCODETYPE v into = add_attr into (mkUAttr CODETYPE (av $ show v))+class AdmitAttrDATA e where+ uaDATA :: String -> ELT e -> ELT e+ uaDATA str into = add_attr into (mkUAttr DATA str)+ atDATA :: AttrValueDATA v => v -> ELT e -> ELT e+ atDATA v into = add_attr into (mkUAttr DATA (av $ show v))+class AdmitAttrCLASSID e where+ uaCLASSID :: String -> ELT e -> ELT e+ uaCLASSID str into = add_attr into (mkUAttr CLASSID str)+ atCLASSID :: AttrValueCLASSID v => v -> ELT e -> ELT e+ atCLASSID v into = add_attr into (mkUAttr CLASSID (av $ show v))+class AdmitAttrDECLARE e where+ uaDECLARE :: String -> ELT e -> ELT e+ uaDECLARE str into = add_attr into (mkUAttr DECLARE str)+ atDECLARE :: AttrValueDECLARE v => v -> ELT e -> ELT e+ atDECLARE v into = add_attr into (mkUAttr DECLARE (av $ show v))+class AdmitAttrISMAP e where+ uaISMAP :: String -> ELT e -> ELT e+ uaISMAP str into = add_attr into (mkUAttr ISMAP str)+ atISMAP :: AttrValueISMAP v => v -> ELT e -> ELT e+ atISMAP v into = add_attr into (mkUAttr ISMAP (av $ show v))+class AdmitAttrREV e where+ uaREV :: String -> ELT e -> ELT e+ uaREV str into = add_attr into (mkUAttr REV str)+ atREV :: AttrValueREV v => v -> ELT e -> ELT e+ atREV v into = add_attr into (mkUAttr REV (av $ show v))+class AdmitAttrREL e where+ uaREL :: String -> ELT e -> ELT e+ uaREL str into = add_attr into (mkUAttr REL str)+ atREL :: AttrValueREL v => v -> ELT e -> ELT e+ atREL v into = add_attr into (mkUAttr REL (av $ show v))+class AdmitAttrHREFLANG e where+ uaHREFLANG :: String -> ELT e -> ELT e+ uaHREFLANG str into = add_attr into (mkUAttr HREFLANG str)+ atHREFLANG :: AttrValueHREFLANG v => v -> ELT e -> ELT e+ atHREFLANG v into = add_attr into (mkUAttr HREFLANG (av $ show v))+class AdmitAttrNOHREF e where+ uaNOHREF :: String -> ELT e -> ELT e+ uaNOHREF str into = add_attr into (mkUAttr NOHREF str)+ atNOHREF :: AttrValueNOHREF v => v -> ELT e -> ELT e+ atNOHREF v into = add_attr into (mkUAttr NOHREF (av $ show v))+class AdmitAttrCOORDS e where+ uaCOORDS :: String -> ELT e -> ELT e+ uaCOORDS str into = add_attr into (mkUAttr COORDS str)+ atCOORDS :: AttrValueCOORDS v => v -> ELT e -> ELT e+ atCOORDS v into = add_attr into (mkUAttr COORDS (av $ show v))+class AdmitAttrSHAPE e where+ uaSHAPE :: String -> ELT e -> ELT e+ uaSHAPE str into = add_attr into (mkUAttr SHAPE str)+ atSHAPE :: AttrValueSHAPE v => v -> ELT e -> ELT e+ atSHAPE v into = add_attr into (mkUAttr SHAPE (av $ show v))+class AdmitAttrALINK e where+ uaALINK :: String -> ELT e -> ELT e+ uaALINK str into = add_attr into (mkUAttr ALINK str)+ atALINK :: AttrValueALINK v => v -> ELT e -> ELT e+ atALINK v into = add_attr into (mkUAttr ALINK (av $ show v))+class AdmitAttrVLINK e where+ uaVLINK :: String -> ELT e -> ELT e+ uaVLINK str into = add_attr into (mkUAttr VLINK str)+ atVLINK :: AttrValueVLINK v => v -> ELT e -> ELT e+ atVLINK v into = add_attr into (mkUAttr VLINK (av $ show v))+class AdmitAttrLINK e where+ uaLINK :: String -> ELT e -> ELT e+ uaLINK str into = add_attr into (mkUAttr LINK str)+ atLINK :: AttrValueLINK v => v -> ELT e -> ELT e+ atLINK v into = add_attr into (mkUAttr LINK (av $ show v))+class AdmitAttrTEXT e where+ uaTEXT :: String -> ELT e -> ELT e+ uaTEXT str into = add_attr into (mkUAttr TEXT str)+ atTEXT :: AttrValueTEXT v => v -> ELT e -> ELT e+ atTEXT v into = add_attr into (mkUAttr TEXT (av $ show v))+class AdmitAttrBACKGROUND e where+ uaBACKGROUND :: String -> ELT e -> ELT e+ uaBACKGROUND str into = add_attr into (mkUAttr BACKGROUND str)+ atBACKGROUND :: AttrValueBACKGROUND v => v -> ELT e -> ELT e+ atBACKGROUND v into = add_attr into (mkUAttr BACKGROUND (av $ show v))+class AdmitAttrONUNLOAD e where+ uaONUNLOAD :: String -> ELT e -> ELT e+ uaONUNLOAD str into = add_attr into (mkUAttr ONUNLOAD str)+ atONUNLOAD :: AttrValueONUNLOAD v => v -> ELT e -> ELT e+ atONUNLOAD v into = add_attr into (mkUAttr ONUNLOAD (av $ show v))+class AdmitAttrONLOAD e where+ uaONLOAD :: String -> ELT e -> ELT e+ uaONLOAD str into = add_attr into (mkUAttr ONLOAD str)+ atONLOAD :: AttrValueONLOAD v => v -> ELT e -> ELT e+ atONLOAD v into = add_attr into (mkUAttr ONLOAD (av $ show v))+class AdmitAttrCLEAR e where+ uaCLEAR :: String -> ELT e -> ELT e+ uaCLEAR str into = add_attr into (mkUAttr CLEAR str)+ atCLEAR :: AttrValueCLEAR v => v -> ELT e -> ELT e+ atCLEAR v into = add_attr into (mkUAttr CLEAR (av $ show v))+class AdmitAttrFACE e where+ uaFACE :: String -> ELT e -> ELT e+ uaFACE str into = add_attr into (mkUAttr FACE str)+ atFACE :: AttrValueFACE v => v -> ELT e -> ELT e+ atFACE v into = add_attr into (mkUAttr FACE (av $ show v))+class AdmitAttrCOLOR e where+ uaCOLOR :: String -> ELT e -> ELT e+ uaCOLOR str into = add_attr into (mkUAttr COLOR str)+ atCOLOR :: AttrValueCOLOR v => v -> ELT e -> ELT e+ atCOLOR v into = add_attr into (mkUAttr COLOR (av $ show v))+class Show v => AttrValueABBR v+class Show v => AttrValueACCEPT v+class Show v => AttrValueACCEPT_CHARSET v+class Show v => AttrValueACCESSKEY v+class Show v => AttrValueACTION v+class Show v => AttrValueALIGN v+class Show v => AttrValueALINK v+class Show v => AttrValueALT v+class Show v => AttrValueARCHIVE v+class Show v => AttrValueAXIS v+class Show v => AttrValueBACKGROUND v+class Show v => AttrValueBGCOLOR v+class Show v => AttrValueBORDER v+class Show v => AttrValueCELLPADDING v+class Show v => AttrValueCELLSPACING v+class Show v => AttrValueCHAR v+class Show v => AttrValueCHAROFF v+class Show v => AttrValueCHARSET v+class Show v => AttrValueCHECKED v+class Show v => AttrValueCITE v+class Show v => AttrValueCLASS v+class Show v => AttrValueCLASSID v+class Show v => AttrValueCLEAR v+class Show v => AttrValueCODE v+class Show v => AttrValueCODEBASE v+class Show v => AttrValueCODETYPE v+class Show v => AttrValueCOLOR v+class Show v => AttrValueCOLS v+class Show v => AttrValueCOLSPAN v+class Show v => AttrValueCOMPACT v+class Show v => AttrValueCONTENT v+class Show v => AttrValueCOORDS v+class Show v => AttrValueDATA v+class Show v => AttrValueDATAPAGESIZE v+class Show v => AttrValueDATETIME v+class Show v => AttrValueDECLARE v+class Show v => AttrValueDEFER v+class Show v => AttrValueDIR v+class Show v => AttrValueDISABLED v+class Show v => AttrValueENCTYPE v+class Show v => AttrValueEVENT v+class Show v => AttrValueFACE v+class Show v => AttrValueFOR v+class Show v => AttrValueFRAME v+class Show v => AttrValueFRAMEBORDER v+class Show v => AttrValueHEADERS v+class Show v => AttrValueHEIGHT v+class Show v => AttrValueHREF v+class Show v => AttrValueHREFLANG v+class Show v => AttrValueHSPACE v+class Show v => AttrValueHTTP_EQUIV v+class Show v => AttrValueID v+class Show v => AttrValueISMAP v+class Show v => AttrValueLABEL v+class Show v => AttrValueLANG v+class Show v => AttrValueLANGUAGE v+class Show v => AttrValueLINK v+class Show v => AttrValueLONGDESC v+class Show v => AttrValueMARGINHEIGHT v+class Show v => AttrValueMARGINWIDTH v+class Show v => AttrValueMAXLENGTH v+class Show v => AttrValueMEDIA v+class Show v => AttrValueMETHOD v+class Show v => AttrValueMULTIPLE v+class Show v => AttrValueNAME v+class Show v => AttrValueNOHREF v+class Show v => AttrValueNOSHADE v+class Show v => AttrValueNOWRAP v+class Show v => AttrValueOBJECT v+class Show v => AttrValueONBLUR v+class Show v => AttrValueONCHANGE v+class Show v => AttrValueONCLICK v+class Show v => AttrValueONDBLCLICK v+class Show v => AttrValueONFOCUS v+class Show v => AttrValueONKEYDOWN v+class Show v => AttrValueONKEYPRESS v+class Show v => AttrValueONKEYUP v+class Show v => AttrValueONLOAD v+class Show v => AttrValueONMOUSEDOWN v+class Show v => AttrValueONMOUSEMOVE v+class Show v => AttrValueONMOUSEOUT v+class Show v => AttrValueONMOUSEOVER v+class Show v => AttrValueONMOUSEUP v+class Show v => AttrValueONRESET v+class Show v => AttrValueONSELECT v+class Show v => AttrValueONSUBMIT v+class Show v => AttrValueONUNLOAD v+class Show v => AttrValuePROFILE v+class Show v => AttrValuePROMPT v+class Show v => AttrValueREADONLY v+class Show v => AttrValueREL v+class Show v => AttrValueREV v+class Show v => AttrValueROWS v+class Show v => AttrValueROWSPAN v+class Show v => AttrValueRULES v+class Show v => AttrValueSCHEME v+class Show v => AttrValueSCOPE v+class Show v => AttrValueSCROLLING v+class Show v => AttrValueSELECTED v+class Show v => AttrValueSHAPE v+class Show v => AttrValueSIZE v+class Show v => AttrValueSPAN v+class Show v => AttrValueSRC v+class Show v => AttrValueSTANDBY v+class Show v => AttrValueSTART v+class Show v => AttrValueSTYLE v+class Show v => AttrValueSUMMARY v+class Show v => AttrValueTABINDEX v+class Show v => AttrValueTARGET v+class Show v => AttrValueTEXT v+class Show v => AttrValueTITLE v+class Show v => AttrValueTYPE v+class Show v => AttrValueUSEMAP v+class Show v => AttrValueVALIGN v+class Show v => AttrValueVALUE v+class Show v => AttrValueVALUETYPE v+class Show v => AttrValueVERSION v+class Show v => AttrValueVLINK v+class Show v => AttrValueVSPACE v+class Show v => AttrValueWIDTH v+class AdmitChildA e where+ a :: (ELT A -> ELT A) -> ELT e -> ELT e+ a f elt = elt `add` f (make A)+class AdmitChildABBR e where+ abbr :: (ELT ABBR -> ELT ABBR) -> ELT e -> ELT e+ abbr f elt = elt `add` f (make ABBR)+class AdmitChildACRONYM e where+ acronym :: (ELT ACRONYM -> ELT ACRONYM) -> ELT e -> ELT e+ acronym f elt = elt `add` f (make ACRONYM)+class AdmitChildADDRESS e where+ address :: (ELT ADDRESS -> ELT ADDRESS) -> ELT e -> ELT e+ address f elt = elt `add` f (make ADDRESS)+class AdmitChildAPPLET e where+ applet :: (ELT APPLET -> ELT APPLET) -> ELT e -> ELT e+ applet f elt = elt `add` f (make APPLET)+class AdmitChildAREA e where+ area :: (ELT AREA -> ELT AREA) -> ELT e -> ELT e+ area f elt = elt `add` f (make AREA)+class AdmitChildB e where+ b :: (ELT B -> ELT B) -> ELT e -> ELT e+ b f elt = elt `add` f (make B)+class AdmitChildBASE e where+ base :: (ELT BASE -> ELT BASE) -> ELT e -> ELT e+ base f elt = elt `add` f (make BASE)+class AdmitChildBASEFONT e where+ basefont :: (ELT BASEFONT -> ELT BASEFONT) -> ELT e -> ELT e+ basefont f elt = elt `add` f (make BASEFONT)+class AdmitChildBDO e where+ bdo :: (ELT BDO -> ELT BDO) -> ELT e -> ELT e+ bdo f elt = elt `add` f (make BDO)+class AdmitChildBIG e where+ big :: (ELT BIG -> ELT BIG) -> ELT e -> ELT e+ big f elt = elt `add` f (make BIG)+class AdmitChildBLOCKQUOTE e where+ blockquote :: (ELT BLOCKQUOTE -> ELT BLOCKQUOTE) -> ELT e -> ELT e+ blockquote f elt = elt `add` f (make BLOCKQUOTE)+class AdmitChildBODY e where+ body :: (ELT BODY -> ELT BODY) -> ELT e -> ELT e+ body f elt = elt `add` f (make BODY)+class AdmitChildBR e where+ br :: (ELT BR -> ELT BR) -> ELT e -> ELT e+ br f elt = elt `add` f (make BR)+class AdmitChildBUTTON e where+ button :: (ELT BUTTON -> ELT BUTTON) -> ELT e -> ELT e+ button f elt = elt `add` f (make BUTTON)+class AdmitChildCAPTION e where+ caption :: (ELT CAPTION -> ELT CAPTION) -> ELT e -> ELT e+ caption f elt = elt `add` f (make CAPTION)+class AdmitChildCENTER e where+ center :: (ELT CENTER -> ELT CENTER) -> ELT e -> ELT e+ center f elt = elt `add` f (make CENTER)+class AdmitChildCITE e where+ cite :: (ELT CITE -> ELT CITE) -> ELT e -> ELT e+ cite f elt = elt `add` f (make CITE)+class AdmitChildCODE e where+ code :: (ELT CODE -> ELT CODE) -> ELT e -> ELT e+ code f elt = elt `add` f (make CODE)+class AdmitChildCOL e where+ col :: (ELT COL -> ELT COL) -> ELT e -> ELT e+ col f elt = elt `add` f (make COL)+class AdmitChildCOLGROUP e where+ colgroup :: (ELT COLGROUP -> ELT COLGROUP) -> ELT e -> ELT e+ colgroup f elt = elt `add` f (make COLGROUP)+class AdmitChildDD e where+ dd :: (ELT DD -> ELT DD) -> ELT e -> ELT e+ dd f elt = elt `add` f (make DD)+class AdmitChildDEL e where+ del :: (ELT DEL -> ELT DEL) -> ELT e -> ELT e+ del f elt = elt `add` f (make DEL)+class AdmitChildDFN e where+ dfn :: (ELT DFN -> ELT DFN) -> ELT e -> ELT e+ dfn f elt = elt `add` f (make DFN)+class AdmitChildDIR e where+ dir :: (ELT DIR -> ELT DIR) -> ELT e -> ELT e+ dir f elt = elt `add` f (make DIR)+class AdmitChildDIV e where+ div :: (ELT DIV -> ELT DIV) -> ELT e -> ELT e+ div f elt = elt `add` f (make DIV)+class AdmitChildDL e where+ dl :: (ELT DL -> ELT DL) -> ELT e -> ELT e+ dl f elt = elt `add` f (make DL)+class AdmitChildDT e where+ dt :: (ELT DT -> ELT DT) -> ELT e -> ELT e+ dt f elt = elt `add` f (make DT)+class AdmitChildEM e where+ em :: (ELT EM -> ELT EM) -> ELT e -> ELT e+ em f elt = elt `add` f (make EM)+class AdmitChildFIELDSET e where+ fieldset :: (ELT FIELDSET -> ELT FIELDSET) -> ELT e -> ELT e+ fieldset f elt = elt `add` f (make FIELDSET)+class AdmitChildFONT e where+ font :: (ELT FONT -> ELT FONT) -> ELT e -> ELT e+ font f elt = elt `add` f (make FONT)+class AdmitChildFORM e where+ form :: (ELT FORM -> ELT FORM) -> ELT e -> ELT e+ form f elt = elt `add` f (make FORM)+class AdmitChildH1 e where+ h1 :: (ELT H1 -> ELT H1) -> ELT e -> ELT e+ h1 f elt = elt `add` f (make H1)+class AdmitChildH2 e where+ h2 :: (ELT H2 -> ELT H2) -> ELT e -> ELT e+ h2 f elt = elt `add` f (make H2)+class AdmitChildH3 e where+ h3 :: (ELT H3 -> ELT H3) -> ELT e -> ELT e+ h3 f elt = elt `add` f (make H3)+class AdmitChildH4 e where+ h4 :: (ELT H4 -> ELT H4) -> ELT e -> ELT e+ h4 f elt = elt `add` f (make H4)+class AdmitChildH5 e where+ h5 :: (ELT H5 -> ELT H5) -> ELT e -> ELT e+ h5 f elt = elt `add` f (make H5)+class AdmitChildH6 e where+ h6 :: (ELT H6 -> ELT H6) -> ELT e -> ELT e+ h6 f elt = elt `add` f (make H6)+class AdmitChildHEAD e where+ head :: (ELT HEAD -> ELT HEAD) -> ELT e -> ELT e+ head f elt = elt `add` f (make HEAD)+class AdmitChildHR e where+ hr :: (ELT HR -> ELT HR) -> ELT e -> ELT e+ hr f elt = elt `add` f (make HR)+class AdmitChildHTML e where+ html :: (ELT HTML -> ELT HTML) -> ELT e -> ELT e+ html f elt = elt `add` f (make HTML)+class AdmitChildI e where+ i :: (ELT I -> ELT I) -> ELT e -> ELT e+ i f elt = elt `add` f (make I)+class AdmitChildIFRAME e where+ iframe :: (ELT IFRAME -> ELT IFRAME) -> ELT e -> ELT e+ iframe f elt = elt `add` f (make IFRAME)+class AdmitChildIMG e where+ img :: (ELT IMG -> ELT IMG) -> ELT e -> ELT e+ img f elt = elt `add` f (make IMG)+class AdmitChildINPUT e where+ input :: (ELT INPUT -> ELT INPUT) -> ELT e -> ELT e+ input f elt = elt `add` f (make INPUT)+class AdmitChildINS e where+ ins :: (ELT INS -> ELT INS) -> ELT e -> ELT e+ ins f elt = elt `add` f (make INS)+class AdmitChildISINDEX e where+ isindex :: (ELT ISINDEX -> ELT ISINDEX) -> ELT e -> ELT e+ isindex f elt = elt `add` f (make ISINDEX)+class AdmitChildKBD e where+ kbd :: (ELT KBD -> ELT KBD) -> ELT e -> ELT e+ kbd f elt = elt `add` f (make KBD)+class AdmitChildLABEL e where+ label :: (ELT LABEL -> ELT LABEL) -> ELT e -> ELT e+ label f elt = elt `add` f (make LABEL)+class AdmitChildLEGEND e where+ legend :: (ELT LEGEND -> ELT LEGEND) -> ELT e -> ELT e+ legend f elt = elt `add` f (make LEGEND)+class AdmitChildLI e where+ li :: (ELT LI -> ELT LI) -> ELT e -> ELT e+ li f elt = elt `add` f (make LI)+class AdmitChildLINK e where+ link :: (ELT LINK -> ELT LINK) -> ELT e -> ELT e+ link f elt = elt `add` f (make LINK)+class AdmitChildMAP e where+ map :: (ELT MAP -> ELT MAP) -> ELT e -> ELT e+ map f elt = elt `add` f (make MAP)+class AdmitChildMENU e where+ menu :: (ELT MENU -> ELT MENU) -> ELT e -> ELT e+ menu f elt = elt `add` f (make MENU)+class AdmitChildMETA e where+ meta :: (ELT META -> ELT META) -> ELT e -> ELT e+ meta f elt = elt `add` f (make META)+class AdmitChildNOFRAMES e where+ noframes :: (ELT NOFRAMES -> ELT NOFRAMES) -> ELT e -> ELT e+ noframes f elt = elt `add` f (make NOFRAMES)+class AdmitChildNOSCRIPT e where+ noscript :: (ELT NOSCRIPT -> ELT NOSCRIPT) -> ELT e -> ELT e+ noscript f elt = elt `add` f (make NOSCRIPT)+class AdmitChildOBJECT e where+ object :: (ELT OBJECT -> ELT OBJECT) -> ELT e -> ELT e+ object f elt = elt `add` f (make OBJECT)+class AdmitChildOL e where+ ol :: (ELT OL -> ELT OL) -> ELT e -> ELT e+ ol f elt = elt `add` f (make OL)+class AdmitChildOPTGROUP e where+ optgroup :: (ELT OPTGROUP -> ELT OPTGROUP) -> ELT e -> ELT e+ optgroup f elt = elt `add` f (make OPTGROUP)+class AdmitChildOPTION e where+ option :: (ELT OPTION -> ELT OPTION) -> ELT e -> ELT e+ option f elt = elt `add` f (make OPTION)+class AdmitChildP e where+ p :: (ELT P -> ELT P) -> ELT e -> ELT e+ p f elt = elt `add` f (make P)+class AdmitChildPARAM e where+ param :: (ELT PARAM -> ELT PARAM) -> ELT e -> ELT e+ param f elt = elt `add` f (make PARAM)+class AdmitChildPRE e where+ pre :: (ELT PRE -> ELT PRE) -> ELT e -> ELT e+ pre f elt = elt `add` f (make PRE)+class AdmitChildQ e where+ q :: (ELT Q -> ELT Q) -> ELT e -> ELT e+ q f elt = elt `add` f (make Q)+class AdmitChildS e where+ s :: (ELT S -> ELT S) -> ELT e -> ELT e+ s f elt = elt `add` f (make S)+class AdmitChildSAMP e where+ samp :: (ELT SAMP -> ELT SAMP) -> ELT e -> ELT e+ samp f elt = elt `add` f (make SAMP)+class AdmitChildSCRIPT e where+ script :: (ELT SCRIPT -> ELT SCRIPT) -> ELT e -> ELT e+ script f elt = elt `add` f (make SCRIPT)+class AdmitChildSELECT e where+ select :: (ELT SELECT -> ELT SELECT) -> ELT e -> ELT e+ select f elt = elt `add` f (make SELECT)+class AdmitChildSMALL e where+ small :: (ELT SMALL -> ELT SMALL) -> ELT e -> ELT e+ small f elt = elt `add` f (make SMALL)+class AdmitChildSPAN e where+ span :: (ELT SPAN -> ELT SPAN) -> ELT e -> ELT e+ span f elt = elt `add` f (make SPAN)+class AdmitChildSTRIKE e where+ strike :: (ELT STRIKE -> ELT STRIKE) -> ELT e -> ELT e+ strike f elt = elt `add` f (make STRIKE)+class AdmitChildSTRONG e where+ strong :: (ELT STRONG -> ELT STRONG) -> ELT e -> ELT e+ strong f elt = elt `add` f (make STRONG)+class AdmitChildSTYLE e where+ style :: (ELT STYLE -> ELT STYLE) -> ELT e -> ELT e+ style f elt = elt `add` f (make STYLE)+class AdmitChildSUB e where+ sub :: (ELT SUB -> ELT SUB) -> ELT e -> ELT e+ sub f elt = elt `add` f (make SUB)+class AdmitChildSUP e where+ sup :: (ELT SUP -> ELT SUP) -> ELT e -> ELT e+ sup f elt = elt `add` f (make SUP)+class AdmitChildTABLE e where+ table :: (ELT TABLE -> ELT TABLE) -> ELT e -> ELT e+ table f elt = elt `add` f (make TABLE)+class AdmitChildTBODY e where+ tbody :: (ELT TBODY -> ELT TBODY) -> ELT e -> ELT e+ tbody f elt = elt `add` f (make TBODY)+class AdmitChildTD e where+ td :: (ELT TD -> ELT TD) -> ELT e -> ELT e+ td f elt = elt `add` f (make TD)+class AdmitChildTEXTAREA e where+ textarea :: (ELT TEXTAREA -> ELT TEXTAREA) -> ELT e -> ELT e+ textarea f elt = elt `add` f (make TEXTAREA)+class AdmitChildTFOOT e where+ tfoot :: (ELT TFOOT -> ELT TFOOT) -> ELT e -> ELT e+ tfoot f elt = elt `add` f (make TFOOT)+class AdmitChildTH e where+ th :: (ELT TH -> ELT TH) -> ELT e -> ELT e+ th f elt = elt `add` f (make TH)+class AdmitChildTHEAD e where+ thead :: (ELT THEAD -> ELT THEAD) -> ELT e -> ELT e+ thead f elt = elt `add` f (make THEAD)+class AdmitChildTITLE e where+ title :: (ELT TITLE -> ELT TITLE) -> ELT e -> ELT e+ title f elt = elt `add` f (make TITLE)+class AdmitChildTR e where+ tr :: (ELT TR -> ELT TR) -> ELT e -> ELT e+ tr f elt = elt `add` f (make TR)+class AdmitChildTT e where+ tt :: (ELT TT -> ELT TT) -> ELT e -> ELT e+ tt f elt = elt `add` f (make TT)+class AdmitChildU e where+ u :: (ELT U -> ELT U) -> ELT e -> ELT e+ u f elt = elt `add` f (make U)+class AdmitChildUL e where+ ul :: (ELT UL -> ELT UL) -> ELT e -> ELT e+ ul f elt = elt `add` f (make UL)+class AdmitChildVAR e where+ var :: (ELT VAR -> ELT VAR) -> ELT e -> ELT e+ var f elt = elt `add` f (make VAR)+data A = A+instance Show A where show A = "A"+data ABBR = ABBR+instance Show ABBR where show ABBR = "ABBR"+data ACRONYM = ACRONYM+instance Show ACRONYM where show ACRONYM = "ACRONYM"+data ADDRESS = ADDRESS+instance Show ADDRESS where show ADDRESS = "ADDRESS"+data APPLET = APPLET+instance Show APPLET where show APPLET = "APPLET"+data AREA = AREA+instance Show AREA where show AREA = "AREA"+data B = B+instance Show B where show B = "B"+data BASE = BASE+instance Show BASE where show BASE = "BASE"+data BASEFONT = BASEFONT+instance Show BASEFONT where show BASEFONT = "BASEFONT"+data BDO = BDO+instance Show BDO where show BDO = "BDO"+data BIG = BIG+instance Show BIG where show BIG = "BIG"+data BLOCKQUOTE = BLOCKQUOTE+instance Show BLOCKQUOTE where show BLOCKQUOTE = "BLOCKQUOTE"+data BODY = BODY+instance Show BODY where show BODY = "BODY"+data BR = BR+instance Show BR where show BR = "BR"+data BUTTON = BUTTON+instance Show BUTTON where show BUTTON = "BUTTON"+data CAPTION = CAPTION+instance Show CAPTION where show CAPTION = "CAPTION"+data CENTER = CENTER+instance Show CENTER where show CENTER = "CENTER"+data CITE = CITE+instance Show CITE where show CITE = "CITE"+data CODE = CODE+instance Show CODE where show CODE = "CODE"+data COL = COL+instance Show COL where show COL = "COL"+data COLGROUP = COLGROUP+instance Show COLGROUP where show COLGROUP = "COLGROUP"+data DD = DD+instance Show DD where show DD = "DD"+data DEL = DEL+instance Show DEL where show DEL = "DEL"+data DFN = DFN+instance Show DFN where show DFN = "DFN"+data DIR = DIR+instance Show DIR where show DIR = "DIR"+data DIV = DIV+instance Show DIV where show DIV = "DIV"+data DL = DL+instance Show DL where show DL = "DL"+data DT = DT+instance Show DT where show DT = "DT"+data EM = EM+instance Show EM where show EM = "EM"+data FIELDSET = FIELDSET+instance Show FIELDSET where show FIELDSET = "FIELDSET"+data FONT = FONT+instance Show FONT where show FONT = "FONT"+data FORM = FORM+instance Show FORM where show FORM = "FORM"+data H1 = H1+instance Show H1 where show H1 = "H1"+data H2 = H2+instance Show H2 where show H2 = "H2"+data H3 = H3+instance Show H3 where show H3 = "H3"+data H4 = H4+instance Show H4 where show H4 = "H4"+data H5 = H5+instance Show H5 where show H5 = "H5"+data H6 = H6+instance Show H6 where show H6 = "H6"+data HEAD = HEAD+instance Show HEAD where show HEAD = "HEAD"+data HR = HR+instance Show HR where show HR = "HR"+data HTML = HTML+instance Show HTML where show HTML = "HTML"+data I = I+instance Show I where show I = "I"+data IFRAME = IFRAME+instance Show IFRAME where show IFRAME = "IFRAME"+data IMG = IMG+instance Show IMG where show IMG = "IMG"+data INPUT = INPUT+instance Show INPUT where show INPUT = "INPUT"+data INS = INS+instance Show INS where show INS = "INS"+data ISINDEX = ISINDEX+instance Show ISINDEX where show ISINDEX = "ISINDEX"+data KBD = KBD+instance Show KBD where show KBD = "KBD"+data LABEL = LABEL+instance Show LABEL where show LABEL = "LABEL"+data LEGEND = LEGEND+instance Show LEGEND where show LEGEND = "LEGEND"+data LI = LI+instance Show LI where show LI = "LI"+data LINK = LINK+instance Show LINK where show LINK = "LINK"+data MAP = MAP+instance Show MAP where show MAP = "MAP"+data MENU = MENU+instance Show MENU where show MENU = "MENU"+data META = META+instance Show META where show META = "META"+data NOFRAMES = NOFRAMES+instance Show NOFRAMES where show NOFRAMES = "NOFRAMES"+data NOSCRIPT = NOSCRIPT+instance Show NOSCRIPT where show NOSCRIPT = "NOSCRIPT"+data OBJECT = OBJECT+instance Show OBJECT where show OBJECT = "OBJECT"+data OL = OL+instance Show OL where show OL = "OL"+data OPTGROUP = OPTGROUP+instance Show OPTGROUP where show OPTGROUP = "OPTGROUP"+data OPTION = OPTION+instance Show OPTION where show OPTION = "OPTION"+data P = P+instance Show P where show P = "P"+data PARAM = PARAM+instance Show PARAM where show PARAM = "PARAM"+data PRE = PRE+instance Show PRE where show PRE = "PRE"+data Q = Q+instance Show Q where show Q = "Q"+data S = S+instance Show S where show S = "S"+data SAMP = SAMP+instance Show SAMP where show SAMP = "SAMP"+data SCRIPT = SCRIPT+instance Show SCRIPT where show SCRIPT = "SCRIPT"+data SELECT = SELECT+instance Show SELECT where show SELECT = "SELECT"+data SMALL = SMALL+instance Show SMALL where show SMALL = "SMALL"+data SPAN = SPAN+instance Show SPAN where show SPAN = "SPAN"+data STRIKE = STRIKE+instance Show STRIKE where show STRIKE = "STRIKE"+data STRONG = STRONG+instance Show STRONG where show STRONG = "STRONG"+data STYLE = STYLE+instance Show STYLE where show STYLE = "STYLE"+data SUB = SUB+instance Show SUB where show SUB = "SUB"+data SUP = SUP+instance Show SUP where show SUP = "SUP"+data TABLE = TABLE+instance Show TABLE where show TABLE = "TABLE"+data TBODY = TBODY+instance Show TBODY where show TBODY = "TBODY"+data TD = TD+instance Show TD where show TD = "TD"+data TEXTAREA = TEXTAREA+instance Show TEXTAREA where show TEXTAREA = "TEXTAREA"+data TFOOT = TFOOT+instance Show TFOOT where show TFOOT = "TFOOT"+data TH = TH+instance Show TH where show TH = "TH"+data THEAD = THEAD+instance Show THEAD where show THEAD = "THEAD"+data TITLE = TITLE+instance Show TITLE where show TITLE = "TITLE"+data TR = TR+instance Show TR where show TR = "TR"+data TT = TT+instance Show TT where show TT = "TT"+data U = U+instance Show U where show U = "U"+data UL = UL+instance Show UL where show UL = "UL"+data VAR = VAR+instance Show VAR where show VAR = "VAR"+data VERSION = VERSION+instance Show VERSION where show VERSION = "VERSION"+data LANG = LANG+instance Show LANG where show LANG = "LANG"+data ONKEYUP = ONKEYUP+instance Show ONKEYUP where show ONKEYUP = "ONKEYUP"+data ONKEYDOWN = ONKEYDOWN+instance Show ONKEYDOWN where show ONKEYDOWN = "ONKEYDOWN"+data ONKEYPRESS = ONKEYPRESS+instance Show ONKEYPRESS where show ONKEYPRESS = "ONKEYPRESS"+data ONMOUSEOUT = ONMOUSEOUT+instance Show ONMOUSEOUT where show ONMOUSEOUT = "ONMOUSEOUT"+data ONMOUSEMOVE = ONMOUSEMOVE+instance Show ONMOUSEMOVE where show ONMOUSEMOVE = "ONMOUSEMOVE"+data ONMOUSEOVER = ONMOUSEOVER+instance Show ONMOUSEOVER where show ONMOUSEOVER = "ONMOUSEOVER"+data ONMOUSEUP = ONMOUSEUP+instance Show ONMOUSEUP where show ONMOUSEUP = "ONMOUSEUP"+data ONMOUSEDOWN = ONMOUSEDOWN+instance Show ONMOUSEDOWN where show ONMOUSEDOWN = "ONMOUSEDOWN"+data ONDBLCLICK = ONDBLCLICK+instance Show ONDBLCLICK where show ONDBLCLICK = "ONDBLCLICK"+data ONCLICK = ONCLICK+instance Show ONCLICK where show ONCLICK = "ONCLICK"+data CLASS = CLASS+instance Show CLASS where show CLASS = "CLASS"+data ID = ID+instance Show ID where show ID = "ID"+data FOR = FOR+instance Show FOR where show FOR = "FOR"+data EVENT = EVENT+instance Show EVENT where show EVENT = "EVENT"+data DEFER = DEFER+instance Show DEFER where show DEFER = "DEFER"+data SRC = SRC+instance Show SRC where show SRC = "SRC"+data LANGUAGE = LANGUAGE+instance Show LANGUAGE where show LANGUAGE = "LANGUAGE"+data TYPE = TYPE+instance Show TYPE where show TYPE = "TYPE"+data CHARSET = CHARSET+instance Show CHARSET where show CHARSET = "CHARSET"+data MEDIA = MEDIA+instance Show MEDIA where show MEDIA = "MEDIA"+data SCHEME = SCHEME+instance Show SCHEME where show SCHEME = "SCHEME"+data CONTENT = CONTENT+instance Show CONTENT where show CONTENT = "CONTENT"+data NAME = NAME+instance Show NAME where show NAME = "NAME"+data HTTP_EQUIV = HTTP_EQUIV+instance Show HTTP_EQUIV where show HTTP_EQUIV = "HTTP_EQUIV"+data TARGET = TARGET+instance Show TARGET where show TARGET = "TARGET"+data HREF = HREF+instance Show HREF where show HREF = "HREF"+data PROMPT = PROMPT+instance Show PROMPT where show PROMPT = "PROMPT"+data PROFILE = PROFILE+instance Show PROFILE where show PROFILE = "PROFILE"+data WIDTH = WIDTH+instance Show WIDTH where show WIDTH = "WIDTH"+data HEIGHT = HEIGHT+instance Show HEIGHT where show HEIGHT = "HEIGHT"+data ALIGN = ALIGN+instance Show ALIGN where show ALIGN = "ALIGN"+data SCROLLING = SCROLLING+instance Show SCROLLING where show SCROLLING = "SCROLLING"+data MARGINHEIGHT = MARGINHEIGHT+instance Show MARGINHEIGHT where show MARGINHEIGHT = "MARGINHEIGHT"+data MARGINWIDTH = MARGINWIDTH+instance Show MARGINWIDTH where show MARGINWIDTH = "MARGINWIDTH"+data FRAMEBORDER = FRAMEBORDER+instance Show FRAMEBORDER where show FRAMEBORDER = "FRAMEBORDER"+data LONGDESC = LONGDESC+instance Show LONGDESC where show LONGDESC = "LONGDESC"+data BGCOLOR = BGCOLOR+instance Show BGCOLOR where show BGCOLOR = "BGCOLOR"+data NOWRAP = NOWRAP+instance Show NOWRAP where show NOWRAP = "NOWRAP"+data VALIGN = VALIGN+instance Show VALIGN where show VALIGN = "VALIGN"+data CHAROFF = CHAROFF+instance Show CHAROFF where show CHAROFF = "CHAROFF"+data CHAR = CHAR+instance Show CHAR where show CHAR = "CHAR"+data COLSPAN = COLSPAN+instance Show COLSPAN where show COLSPAN = "COLSPAN"+data ROWSPAN = ROWSPAN+instance Show ROWSPAN where show ROWSPAN = "ROWSPAN"+data SCOPE = SCOPE+instance Show SCOPE where show SCOPE = "SCOPE"+data HEADERS = HEADERS+instance Show HEADERS where show HEADERS = "HEADERS"+data AXIS = AXIS+instance Show AXIS where show AXIS = "AXIS"+data DATAPAGESIZE = DATAPAGESIZE+instance Show DATAPAGESIZE where show DATAPAGESIZE = "DATAPAGESIZE"+data CELLPADDING = CELLPADDING+instance Show CELLPADDING where show CELLPADDING = "CELLPADDING"+data CELLSPACING = CELLSPACING+instance Show CELLSPACING where show CELLSPACING = "CELLSPACING"+data RULES = RULES+instance Show RULES where show RULES = "RULES"+data FRAME = FRAME+instance Show FRAME where show FRAME = "FRAME"+data BORDER = BORDER+instance Show BORDER where show BORDER = "BORDER"+data SUMMARY = SUMMARY+instance Show SUMMARY where show SUMMARY = "SUMMARY"+data ONBLUR = ONBLUR+instance Show ONBLUR where show ONBLUR = "ONBLUR"+data ONFOCUS = ONFOCUS+instance Show ONFOCUS where show ONFOCUS = "ONFOCUS"+data ACCESSKEY = ACCESSKEY+instance Show ACCESSKEY where show ACCESSKEY = "ACCESSKEY"+data TABINDEX = TABINDEX+instance Show TABINDEX where show TABINDEX = "TABINDEX"+data DISABLED = DISABLED+instance Show DISABLED where show DISABLED = "DISABLED"+data VALUE = VALUE+instance Show VALUE where show VALUE = "VALUE"+data ONCHANGE = ONCHANGE+instance Show ONCHANGE where show ONCHANGE = "ONCHANGE"+data ONSELECT = ONSELECT+instance Show ONSELECT where show ONSELECT = "ONSELECT"+data READONLY = READONLY+instance Show READONLY where show READONLY = "READONLY"+data COLS = COLS+instance Show COLS where show COLS = "COLS"+data ROWS = ROWS+instance Show ROWS where show ROWS = "ROWS"+data SELECTED = SELECTED+instance Show SELECTED where show SELECTED = "SELECTED"+data MULTIPLE = MULTIPLE+instance Show MULTIPLE where show MULTIPLE = "MULTIPLE"+data SIZE = SIZE+instance Show SIZE where show SIZE = "SIZE"+data ACCEPT = ACCEPT+instance Show ACCEPT where show ACCEPT = "ACCEPT"+data USEMAP = USEMAP+instance Show USEMAP where show USEMAP = "USEMAP"+data ALT = ALT+instance Show ALT where show ALT = "ALT"+data MAXLENGTH = MAXLENGTH+instance Show MAXLENGTH where show MAXLENGTH = "MAXLENGTH"+data CHECKED = CHECKED+instance Show CHECKED where show CHECKED = "CHECKED"+data ACCEPT_CHARSET = ACCEPT_CHARSET+instance Show ACCEPT_CHARSET where show ACCEPT_CHARSET = "ACCEPT_CHARSET"+data ONRESET = ONRESET+instance Show ONRESET where show ONRESET = "ONRESET"+data ONSUBMIT = ONSUBMIT+instance Show ONSUBMIT where show ONSUBMIT = "ONSUBMIT"+data ENCTYPE = ENCTYPE+instance Show ENCTYPE where show ENCTYPE = "ENCTYPE"+data METHOD = METHOD+instance Show METHOD where show METHOD = "METHOD"+data ACTION = ACTION+instance Show ACTION where show ACTION = "ACTION"+data COMPACT = COMPACT+instance Show COMPACT where show COMPACT = "COMPACT"+data START = START+instance Show START where show START = "START"+data DATETIME = DATETIME+instance Show DATETIME where show DATETIME = "DATETIME"+data NOSHADE = NOSHADE+instance Show NOSHADE where show NOSHADE = "NOSHADE"+data VSPACE = VSPACE+instance Show VSPACE where show VSPACE = "VSPACE"+data HSPACE = HSPACE+instance Show HSPACE where show HSPACE = "HSPACE"+data ARCHIVE = ARCHIVE+instance Show ARCHIVE where show ARCHIVE = "ARCHIVE"+data CODEBASE = CODEBASE+instance Show CODEBASE where show CODEBASE = "CODEBASE"+data VALUETYPE = VALUETYPE+instance Show VALUETYPE where show VALUETYPE = "VALUETYPE"+data STANDBY = STANDBY+instance Show STANDBY where show STANDBY = "STANDBY"+data CODETYPE = CODETYPE+instance Show CODETYPE where show CODETYPE = "CODETYPE"+data DATA = DATA+instance Show DATA where show DATA = "DATA"+data CLASSID = CLASSID+instance Show CLASSID where show CLASSID = "CLASSID"+data DECLARE = DECLARE+instance Show DECLARE where show DECLARE = "DECLARE"+data ISMAP = ISMAP+instance Show ISMAP where show ISMAP = "ISMAP"+data REV = REV+instance Show REV where show REV = "REV"+data REL = REL+instance Show REL where show REL = "REL"+data HREFLANG = HREFLANG+instance Show HREFLANG where show HREFLANG = "HREFLANG"+data NOHREF = NOHREF+instance Show NOHREF where show NOHREF = "NOHREF"+data COORDS = COORDS+instance Show COORDS where show COORDS = "COORDS"+data SHAPE = SHAPE+instance Show SHAPE where show SHAPE = "SHAPE"+data ALINK = ALINK+instance Show ALINK where show ALINK = "ALINK"+data VLINK = VLINK+instance Show VLINK where show VLINK = "VLINK"+data TEXT = TEXT+instance Show TEXT where show TEXT = "TEXT"+data BACKGROUND = BACKGROUND+instance Show BACKGROUND where show BACKGROUND = "BACKGROUND"+data ONUNLOAD = ONUNLOAD+instance Show ONUNLOAD where show ONUNLOAD = "ONUNLOAD"+data ONLOAD = ONLOAD+instance Show ONLOAD where show ONLOAD = "ONLOAD"+data CLEAR = CLEAR+instance Show CLEAR where show CLEAR = "CLEAR"+data FACE = FACE+instance Show FACE where show FACE = "FACE"+data COLOR = COLOR+instance Show COLOR where show COLOR = "COLOR"+instance TAG HTML+instance AdmitChildHEAD HTML+instance AdmitChildBODY HTML+instance TAG NOSCRIPT+instance AdmitChildP NOSCRIPT+instance AdmitChildH1 NOSCRIPT+instance AdmitChildH2 NOSCRIPT+instance AdmitChildH3 NOSCRIPT+instance AdmitChildH4 NOSCRIPT+instance AdmitChildH5 NOSCRIPT+instance AdmitChildH6 NOSCRIPT+instance AdmitChildUL NOSCRIPT+instance AdmitChildOL NOSCRIPT+instance AdmitChildDIR NOSCRIPT+instance AdmitChildMENU NOSCRIPT+instance AdmitChildPRE NOSCRIPT+instance AdmitChildDL NOSCRIPT+instance AdmitChildDIV NOSCRIPT+instance AdmitChildCENTER NOSCRIPT+instance AdmitChildNOSCRIPT NOSCRIPT+instance AdmitChildNOFRAMES NOSCRIPT+instance AdmitChildBLOCKQUOTE NOSCRIPT+instance AdmitChildFORM NOSCRIPT+instance AdmitChildISINDEX NOSCRIPT+instance AdmitChildHR NOSCRIPT+instance AdmitChildTABLE NOSCRIPT+instance AdmitChildFIELDSET NOSCRIPT+instance AdmitChildADDRESS NOSCRIPT+instance AdmitChildCDATA NOSCRIPT+instance AdmitChildTT NOSCRIPT+instance AdmitChildI NOSCRIPT+instance AdmitChildB NOSCRIPT+instance AdmitChildU NOSCRIPT+instance AdmitChildS NOSCRIPT+instance AdmitChildSTRIKE NOSCRIPT+instance AdmitChildBIG NOSCRIPT+instance AdmitChildSMALL NOSCRIPT+instance AdmitChildEM NOSCRIPT+instance AdmitChildSTRONG NOSCRIPT+instance AdmitChildDFN NOSCRIPT+instance AdmitChildCODE NOSCRIPT+instance AdmitChildSAMP NOSCRIPT+instance AdmitChildKBD NOSCRIPT+instance AdmitChildVAR NOSCRIPT+instance AdmitChildCITE NOSCRIPT+instance AdmitChildABBR NOSCRIPT+instance AdmitChildACRONYM NOSCRIPT+instance AdmitChildA NOSCRIPT+instance AdmitChildIMG NOSCRIPT+instance AdmitChildAPPLET NOSCRIPT+instance AdmitChildOBJECT NOSCRIPT+instance AdmitChildFONT NOSCRIPT+instance AdmitChildBASEFONT NOSCRIPT+instance AdmitChildBR NOSCRIPT+instance AdmitChildSCRIPT NOSCRIPT+instance AdmitChildMAP NOSCRIPT+instance AdmitChildQ NOSCRIPT+instance AdmitChildSUB NOSCRIPT+instance AdmitChildSUP NOSCRIPT+instance AdmitChildSPAN NOSCRIPT+instance AdmitChildBDO NOSCRIPT+instance AdmitChildIFRAME NOSCRIPT+instance AdmitChildINPUT NOSCRIPT+instance AdmitChildSELECT NOSCRIPT+instance AdmitChildTEXTAREA NOSCRIPT+instance AdmitChildLABEL NOSCRIPT+instance AdmitChildBUTTON NOSCRIPT+instance TAG SCRIPT+instance AdmitChildCDATA SCRIPT+instance TAG STYLE+instance AdmitChildCDATA STYLE+instance TAG META where make = make_empty+instance TAG BASE where make = make_empty+instance TAG ISINDEX where make = make_empty+instance TAG TITLE+instance AdmitChildCDATA TITLE+instance TAG HEAD+instance AdmitChildTITLE HEAD+instance AdmitChildISINDEX HEAD+instance AdmitChildBASE HEAD+instance AdmitChildSCRIPT HEAD+instance AdmitChildSTYLE HEAD+instance AdmitChildMETA HEAD+instance AdmitChildLINK HEAD+instance AdmitChildOBJECT HEAD+instance TAG NOFRAMES+instance AdmitChildP NOFRAMES+instance AdmitChildH1 NOFRAMES+instance AdmitChildH2 NOFRAMES+instance AdmitChildH3 NOFRAMES+instance AdmitChildH4 NOFRAMES+instance AdmitChildH5 NOFRAMES+instance AdmitChildH6 NOFRAMES+instance AdmitChildUL NOFRAMES+instance AdmitChildOL NOFRAMES+instance AdmitChildDIR NOFRAMES+instance AdmitChildMENU NOFRAMES+instance AdmitChildPRE NOFRAMES+instance AdmitChildDL NOFRAMES+instance AdmitChildDIV NOFRAMES+instance AdmitChildCENTER NOFRAMES+instance AdmitChildNOSCRIPT NOFRAMES+instance AdmitChildNOFRAMES NOFRAMES+instance AdmitChildBLOCKQUOTE NOFRAMES+instance AdmitChildFORM NOFRAMES+instance AdmitChildISINDEX NOFRAMES+instance AdmitChildHR NOFRAMES+instance AdmitChildTABLE NOFRAMES+instance AdmitChildFIELDSET NOFRAMES+instance AdmitChildADDRESS NOFRAMES+instance AdmitChildCDATA NOFRAMES+instance AdmitChildTT NOFRAMES+instance AdmitChildI NOFRAMES+instance AdmitChildB NOFRAMES+instance AdmitChildU NOFRAMES+instance AdmitChildS NOFRAMES+instance AdmitChildSTRIKE NOFRAMES+instance AdmitChildBIG NOFRAMES+instance AdmitChildSMALL NOFRAMES+instance AdmitChildEM NOFRAMES+instance AdmitChildSTRONG NOFRAMES+instance AdmitChildDFN NOFRAMES+instance AdmitChildCODE NOFRAMES+instance AdmitChildSAMP NOFRAMES+instance AdmitChildKBD NOFRAMES+instance AdmitChildVAR NOFRAMES+instance AdmitChildCITE NOFRAMES+instance AdmitChildABBR NOFRAMES+instance AdmitChildACRONYM NOFRAMES+instance AdmitChildA NOFRAMES+instance AdmitChildIMG NOFRAMES+instance AdmitChildAPPLET NOFRAMES+instance AdmitChildOBJECT NOFRAMES+instance AdmitChildFONT NOFRAMES+instance AdmitChildBASEFONT NOFRAMES+instance AdmitChildBR NOFRAMES+instance AdmitChildSCRIPT NOFRAMES+instance AdmitChildMAP NOFRAMES+instance AdmitChildQ NOFRAMES+instance AdmitChildSUB NOFRAMES+instance AdmitChildSUP NOFRAMES+instance AdmitChildSPAN NOFRAMES+instance AdmitChildBDO NOFRAMES+instance AdmitChildIFRAME NOFRAMES+instance AdmitChildINPUT NOFRAMES+instance AdmitChildSELECT NOFRAMES+instance AdmitChildTEXTAREA NOFRAMES+instance AdmitChildLABEL NOFRAMES+instance AdmitChildBUTTON NOFRAMES+instance TAG IFRAME+instance AdmitChildP IFRAME+instance AdmitChildH1 IFRAME+instance AdmitChildH2 IFRAME+instance AdmitChildH3 IFRAME+instance AdmitChildH4 IFRAME+instance AdmitChildH5 IFRAME+instance AdmitChildH6 IFRAME+instance AdmitChildUL IFRAME+instance AdmitChildOL IFRAME+instance AdmitChildDIR IFRAME+instance AdmitChildMENU IFRAME+instance AdmitChildPRE IFRAME+instance AdmitChildDL IFRAME+instance AdmitChildDIV IFRAME+instance AdmitChildCENTER IFRAME+instance AdmitChildNOSCRIPT IFRAME+instance AdmitChildNOFRAMES IFRAME+instance AdmitChildBLOCKQUOTE IFRAME+instance AdmitChildFORM IFRAME+instance AdmitChildISINDEX IFRAME+instance AdmitChildHR IFRAME+instance AdmitChildTABLE IFRAME+instance AdmitChildFIELDSET IFRAME+instance AdmitChildADDRESS IFRAME+instance AdmitChildCDATA IFRAME+instance AdmitChildTT IFRAME+instance AdmitChildI IFRAME+instance AdmitChildB IFRAME+instance AdmitChildU IFRAME+instance AdmitChildS IFRAME+instance AdmitChildSTRIKE IFRAME+instance AdmitChildBIG IFRAME+instance AdmitChildSMALL IFRAME+instance AdmitChildEM IFRAME+instance AdmitChildSTRONG IFRAME+instance AdmitChildDFN IFRAME+instance AdmitChildCODE IFRAME+instance AdmitChildSAMP IFRAME+instance AdmitChildKBD IFRAME+instance AdmitChildVAR IFRAME+instance AdmitChildCITE IFRAME+instance AdmitChildABBR IFRAME+instance AdmitChildACRONYM IFRAME+instance AdmitChildA IFRAME+instance AdmitChildIMG IFRAME+instance AdmitChildAPPLET IFRAME+instance AdmitChildOBJECT IFRAME+instance AdmitChildFONT IFRAME+instance AdmitChildBASEFONT IFRAME+instance AdmitChildBR IFRAME+instance AdmitChildSCRIPT IFRAME+instance AdmitChildMAP IFRAME+instance AdmitChildQ IFRAME+instance AdmitChildSUB IFRAME+instance AdmitChildSUP IFRAME+instance AdmitChildSPAN IFRAME+instance AdmitChildBDO IFRAME+instance AdmitChildIFRAME IFRAME+instance AdmitChildINPUT IFRAME+instance AdmitChildSELECT IFRAME+instance AdmitChildTEXTAREA IFRAME+instance AdmitChildLABEL IFRAME+instance AdmitChildBUTTON IFRAME+instance TAG TH+instance AdmitChildP TH+instance AdmitChildH1 TH+instance AdmitChildH2 TH+instance AdmitChildH3 TH+instance AdmitChildH4 TH+instance AdmitChildH5 TH+instance AdmitChildH6 TH+instance AdmitChildUL TH+instance AdmitChildOL TH+instance AdmitChildDIR TH+instance AdmitChildMENU TH+instance AdmitChildPRE TH+instance AdmitChildDL TH+instance AdmitChildDIV TH+instance AdmitChildCENTER TH+instance AdmitChildNOSCRIPT TH+instance AdmitChildNOFRAMES TH+instance AdmitChildBLOCKQUOTE TH+instance AdmitChildFORM TH+instance AdmitChildISINDEX TH+instance AdmitChildHR TH+instance AdmitChildTABLE TH+instance AdmitChildFIELDSET TH+instance AdmitChildADDRESS TH+instance AdmitChildCDATA TH+instance AdmitChildTT TH+instance AdmitChildI TH+instance AdmitChildB TH+instance AdmitChildU TH+instance AdmitChildS TH+instance AdmitChildSTRIKE TH+instance AdmitChildBIG TH+instance AdmitChildSMALL TH+instance AdmitChildEM TH+instance AdmitChildSTRONG TH+instance AdmitChildDFN TH+instance AdmitChildCODE TH+instance AdmitChildSAMP TH+instance AdmitChildKBD TH+instance AdmitChildVAR TH+instance AdmitChildCITE TH+instance AdmitChildABBR TH+instance AdmitChildACRONYM TH+instance AdmitChildA TH+instance AdmitChildIMG TH+instance AdmitChildAPPLET TH+instance AdmitChildOBJECT TH+instance AdmitChildFONT TH+instance AdmitChildBASEFONT TH+instance AdmitChildBR TH+instance AdmitChildSCRIPT TH+instance AdmitChildMAP TH+instance AdmitChildQ TH+instance AdmitChildSUB TH+instance AdmitChildSUP TH+instance AdmitChildSPAN TH+instance AdmitChildBDO TH+instance AdmitChildIFRAME TH+instance AdmitChildINPUT TH+instance AdmitChildSELECT TH+instance AdmitChildTEXTAREA TH+instance AdmitChildLABEL TH+instance AdmitChildBUTTON TH+instance TAG TD+instance AdmitChildP TD+instance AdmitChildH1 TD+instance AdmitChildH2 TD+instance AdmitChildH3 TD+instance AdmitChildH4 TD+instance AdmitChildH5 TD+instance AdmitChildH6 TD+instance AdmitChildUL TD+instance AdmitChildOL TD+instance AdmitChildDIR TD+instance AdmitChildMENU TD+instance AdmitChildPRE TD+instance AdmitChildDL TD+instance AdmitChildDIV TD+instance AdmitChildCENTER TD+instance AdmitChildNOSCRIPT TD+instance AdmitChildNOFRAMES TD+instance AdmitChildBLOCKQUOTE TD+instance AdmitChildFORM TD+instance AdmitChildISINDEX TD+instance AdmitChildHR TD+instance AdmitChildTABLE TD+instance AdmitChildFIELDSET TD+instance AdmitChildADDRESS TD+instance AdmitChildCDATA TD+instance AdmitChildTT TD+instance AdmitChildI TD+instance AdmitChildB TD+instance AdmitChildU TD+instance AdmitChildS TD+instance AdmitChildSTRIKE TD+instance AdmitChildBIG TD+instance AdmitChildSMALL TD+instance AdmitChildEM TD+instance AdmitChildSTRONG TD+instance AdmitChildDFN TD+instance AdmitChildCODE TD+instance AdmitChildSAMP TD+instance AdmitChildKBD TD+instance AdmitChildVAR TD+instance AdmitChildCITE TD+instance AdmitChildABBR TD+instance AdmitChildACRONYM TD+instance AdmitChildA TD+instance AdmitChildIMG TD+instance AdmitChildAPPLET TD+instance AdmitChildOBJECT TD+instance AdmitChildFONT TD+instance AdmitChildBASEFONT TD+instance AdmitChildBR TD+instance AdmitChildSCRIPT TD+instance AdmitChildMAP TD+instance AdmitChildQ TD+instance AdmitChildSUB TD+instance AdmitChildSUP TD+instance AdmitChildSPAN TD+instance AdmitChildBDO TD+instance AdmitChildIFRAME TD+instance AdmitChildINPUT TD+instance AdmitChildSELECT TD+instance AdmitChildTEXTAREA TD+instance AdmitChildLABEL TD+instance AdmitChildBUTTON TD+instance TAG TR+instance AdmitChildTH TR+instance AdmitChildTD TR+instance TAG COL where make = make_empty+instance TAG COLGROUP+instance AdmitChildCOL COLGROUP+instance TAG TBODY+instance AdmitChildTR TBODY+instance TAG TFOOT+instance AdmitChildTR TFOOT+instance TAG THEAD+instance AdmitChildTR THEAD+instance TAG CAPTION+instance AdmitChildCDATA CAPTION+instance AdmitChildTT CAPTION+instance AdmitChildI CAPTION+instance AdmitChildB CAPTION+instance AdmitChildU CAPTION+instance AdmitChildS CAPTION+instance AdmitChildSTRIKE CAPTION+instance AdmitChildBIG CAPTION+instance AdmitChildSMALL CAPTION+instance AdmitChildEM CAPTION+instance AdmitChildSTRONG CAPTION+instance AdmitChildDFN CAPTION+instance AdmitChildCODE CAPTION+instance AdmitChildSAMP CAPTION+instance AdmitChildKBD CAPTION+instance AdmitChildVAR CAPTION+instance AdmitChildCITE CAPTION+instance AdmitChildABBR CAPTION+instance AdmitChildACRONYM CAPTION+instance AdmitChildA CAPTION+instance AdmitChildIMG CAPTION+instance AdmitChildAPPLET CAPTION+instance AdmitChildOBJECT CAPTION+instance AdmitChildFONT CAPTION+instance AdmitChildBASEFONT CAPTION+instance AdmitChildBR CAPTION+instance AdmitChildSCRIPT CAPTION+instance AdmitChildMAP CAPTION+instance AdmitChildQ CAPTION+instance AdmitChildSUB CAPTION+instance AdmitChildSUP CAPTION+instance AdmitChildSPAN CAPTION+instance AdmitChildBDO CAPTION+instance AdmitChildIFRAME CAPTION+instance AdmitChildINPUT CAPTION+instance AdmitChildSELECT CAPTION+instance AdmitChildTEXTAREA CAPTION+instance AdmitChildLABEL CAPTION+instance AdmitChildBUTTON CAPTION+instance TAG TABLE+instance AdmitChildCAPTION TABLE+instance AdmitChildCOL TABLE+instance AdmitChildCOLGROUP TABLE+instance AdmitChildTHEAD TABLE+instance AdmitChildTFOOT TABLE+instance AdmitChildTBODY TABLE+instance TAG BUTTON+instance AdmitChildP BUTTON+instance AdmitChildH1 BUTTON+instance AdmitChildH2 BUTTON+instance AdmitChildH3 BUTTON+instance AdmitChildH4 BUTTON+instance AdmitChildH5 BUTTON+instance AdmitChildH6 BUTTON+instance AdmitChildUL BUTTON+instance AdmitChildOL BUTTON+instance AdmitChildDIR BUTTON+instance AdmitChildMENU BUTTON+instance AdmitChildPRE BUTTON+instance AdmitChildDL BUTTON+instance AdmitChildDIV BUTTON+instance AdmitChildCENTER BUTTON+instance AdmitChildNOSCRIPT BUTTON+instance AdmitChildNOFRAMES BUTTON+instance AdmitChildBLOCKQUOTE BUTTON+instance AdmitChildHR BUTTON+instance AdmitChildTABLE BUTTON+instance AdmitChildADDRESS BUTTON+instance AdmitChildCDATA BUTTON+instance AdmitChildTT BUTTON+instance AdmitChildI BUTTON+instance AdmitChildB BUTTON+instance AdmitChildU BUTTON+instance AdmitChildS BUTTON+instance AdmitChildSTRIKE BUTTON+instance AdmitChildBIG BUTTON+instance AdmitChildSMALL BUTTON+instance AdmitChildEM BUTTON+instance AdmitChildSTRONG BUTTON+instance AdmitChildDFN BUTTON+instance AdmitChildCODE BUTTON+instance AdmitChildSAMP BUTTON+instance AdmitChildKBD BUTTON+instance AdmitChildVAR BUTTON+instance AdmitChildCITE BUTTON+instance AdmitChildABBR BUTTON+instance AdmitChildACRONYM BUTTON+instance AdmitChildIMG BUTTON+instance AdmitChildAPPLET BUTTON+instance AdmitChildOBJECT BUTTON+instance AdmitChildFONT BUTTON+instance AdmitChildBASEFONT BUTTON+instance AdmitChildBR BUTTON+instance AdmitChildSCRIPT BUTTON+instance AdmitChildMAP BUTTON+instance AdmitChildQ BUTTON+instance AdmitChildSUB BUTTON+instance AdmitChildSUP BUTTON+instance AdmitChildSPAN BUTTON+instance AdmitChildBDO BUTTON+instance TAG LEGEND+instance AdmitChildCDATA LEGEND+instance AdmitChildTT LEGEND+instance AdmitChildI LEGEND+instance AdmitChildB LEGEND+instance AdmitChildU LEGEND+instance AdmitChildS LEGEND+instance AdmitChildSTRIKE LEGEND+instance AdmitChildBIG LEGEND+instance AdmitChildSMALL LEGEND+instance AdmitChildEM LEGEND+instance AdmitChildSTRONG LEGEND+instance AdmitChildDFN LEGEND+instance AdmitChildCODE LEGEND+instance AdmitChildSAMP LEGEND+instance AdmitChildKBD LEGEND+instance AdmitChildVAR LEGEND+instance AdmitChildCITE LEGEND+instance AdmitChildABBR LEGEND+instance AdmitChildACRONYM LEGEND+instance AdmitChildA LEGEND+instance AdmitChildIMG LEGEND+instance AdmitChildAPPLET LEGEND+instance AdmitChildOBJECT LEGEND+instance AdmitChildFONT LEGEND+instance AdmitChildBASEFONT LEGEND+instance AdmitChildBR LEGEND+instance AdmitChildSCRIPT LEGEND+instance AdmitChildMAP LEGEND+instance AdmitChildQ LEGEND+instance AdmitChildSUB LEGEND+instance AdmitChildSUP LEGEND+instance AdmitChildSPAN LEGEND+instance AdmitChildBDO LEGEND+instance AdmitChildIFRAME LEGEND+instance AdmitChildINPUT LEGEND+instance AdmitChildSELECT LEGEND+instance AdmitChildTEXTAREA LEGEND+instance AdmitChildLABEL LEGEND+instance AdmitChildBUTTON LEGEND+instance TAG FIELDSET+instance AdmitChildCDATA FIELDSET+instance AdmitChildLEGEND FIELDSET+instance AdmitChildP FIELDSET+instance AdmitChildH1 FIELDSET+instance AdmitChildH2 FIELDSET+instance AdmitChildH3 FIELDSET+instance AdmitChildH4 FIELDSET+instance AdmitChildH5 FIELDSET+instance AdmitChildH6 FIELDSET+instance AdmitChildUL FIELDSET+instance AdmitChildOL FIELDSET+instance AdmitChildDIR FIELDSET+instance AdmitChildMENU FIELDSET+instance AdmitChildPRE FIELDSET+instance AdmitChildDL FIELDSET+instance AdmitChildDIV FIELDSET+instance AdmitChildCENTER FIELDSET+instance AdmitChildNOSCRIPT FIELDSET+instance AdmitChildNOFRAMES FIELDSET+instance AdmitChildBLOCKQUOTE FIELDSET+instance AdmitChildFORM FIELDSET+instance AdmitChildISINDEX FIELDSET+instance AdmitChildHR FIELDSET+instance AdmitChildTABLE FIELDSET+instance AdmitChildFIELDSET FIELDSET+instance AdmitChildADDRESS FIELDSET+instance AdmitChildTT FIELDSET+instance AdmitChildI FIELDSET+instance AdmitChildB FIELDSET+instance AdmitChildU FIELDSET+instance AdmitChildS FIELDSET+instance AdmitChildSTRIKE FIELDSET+instance AdmitChildBIG FIELDSET+instance AdmitChildSMALL FIELDSET+instance AdmitChildEM FIELDSET+instance AdmitChildSTRONG FIELDSET+instance AdmitChildDFN FIELDSET+instance AdmitChildCODE FIELDSET+instance AdmitChildSAMP FIELDSET+instance AdmitChildKBD FIELDSET+instance AdmitChildVAR FIELDSET+instance AdmitChildCITE FIELDSET+instance AdmitChildABBR FIELDSET+instance AdmitChildACRONYM FIELDSET+instance AdmitChildA FIELDSET+instance AdmitChildIMG FIELDSET+instance AdmitChildAPPLET FIELDSET+instance AdmitChildOBJECT FIELDSET+instance AdmitChildFONT FIELDSET+instance AdmitChildBASEFONT FIELDSET+instance AdmitChildBR FIELDSET+instance AdmitChildSCRIPT FIELDSET+instance AdmitChildMAP FIELDSET+instance AdmitChildQ FIELDSET+instance AdmitChildSUB FIELDSET+instance AdmitChildSUP FIELDSET+instance AdmitChildSPAN FIELDSET+instance AdmitChildBDO FIELDSET+instance AdmitChildIFRAME FIELDSET+instance AdmitChildINPUT FIELDSET+instance AdmitChildSELECT FIELDSET+instance AdmitChildTEXTAREA FIELDSET+instance AdmitChildLABEL FIELDSET+instance AdmitChildBUTTON FIELDSET+instance TAG TEXTAREA+instance AdmitChildCDATA TEXTAREA+instance TAG OPTION+instance AdmitChildCDATA OPTION+instance TAG OPTGROUP+instance AdmitChildOPTION OPTGROUP+instance TAG SELECT+instance AdmitChildOPTGROUP SELECT+instance AdmitChildOPTION SELECT+instance TAG INPUT where make = make_empty+instance TAG LABEL+instance AdmitChildCDATA LABEL+instance AdmitChildTT LABEL+instance AdmitChildI LABEL+instance AdmitChildB LABEL+instance AdmitChildU LABEL+instance AdmitChildS LABEL+instance AdmitChildSTRIKE LABEL+instance AdmitChildBIG LABEL+instance AdmitChildSMALL LABEL+instance AdmitChildEM LABEL+instance AdmitChildSTRONG LABEL+instance AdmitChildDFN LABEL+instance AdmitChildCODE LABEL+instance AdmitChildSAMP LABEL+instance AdmitChildKBD LABEL+instance AdmitChildVAR LABEL+instance AdmitChildCITE LABEL+instance AdmitChildABBR LABEL+instance AdmitChildACRONYM LABEL+instance AdmitChildA LABEL+instance AdmitChildIMG LABEL+instance AdmitChildAPPLET LABEL+instance AdmitChildOBJECT LABEL+instance AdmitChildFONT LABEL+instance AdmitChildBASEFONT LABEL+instance AdmitChildBR LABEL+instance AdmitChildSCRIPT LABEL+instance AdmitChildMAP LABEL+instance AdmitChildQ LABEL+instance AdmitChildSUB LABEL+instance AdmitChildSUP LABEL+instance AdmitChildSPAN LABEL+instance AdmitChildBDO LABEL+instance AdmitChildIFRAME LABEL+instance AdmitChildINPUT LABEL+instance AdmitChildSELECT LABEL+instance AdmitChildTEXTAREA LABEL+instance AdmitChildBUTTON LABEL+instance TAG FORM+instance AdmitChildP FORM+instance AdmitChildH1 FORM+instance AdmitChildH2 FORM+instance AdmitChildH3 FORM+instance AdmitChildH4 FORM+instance AdmitChildH5 FORM+instance AdmitChildH6 FORM+instance AdmitChildUL FORM+instance AdmitChildOL FORM+instance AdmitChildDIR FORM+instance AdmitChildMENU FORM+instance AdmitChildPRE FORM+instance AdmitChildDL FORM+instance AdmitChildDIV FORM+instance AdmitChildCENTER FORM+instance AdmitChildNOSCRIPT FORM+instance AdmitChildNOFRAMES FORM+instance AdmitChildBLOCKQUOTE FORM+instance AdmitChildISINDEX FORM+instance AdmitChildHR FORM+instance AdmitChildTABLE FORM+instance AdmitChildFIELDSET FORM+instance AdmitChildADDRESS FORM+instance AdmitChildCDATA FORM+instance AdmitChildTT FORM+instance AdmitChildI FORM+instance AdmitChildB FORM+instance AdmitChildU FORM+instance AdmitChildS FORM+instance AdmitChildSTRIKE FORM+instance AdmitChildBIG FORM+instance AdmitChildSMALL FORM+instance AdmitChildEM FORM+instance AdmitChildSTRONG FORM+instance AdmitChildDFN FORM+instance AdmitChildCODE FORM+instance AdmitChildSAMP FORM+instance AdmitChildKBD FORM+instance AdmitChildVAR FORM+instance AdmitChildCITE FORM+instance AdmitChildABBR FORM+instance AdmitChildACRONYM FORM+instance AdmitChildA FORM+instance AdmitChildIMG FORM+instance AdmitChildAPPLET FORM+instance AdmitChildOBJECT FORM+instance AdmitChildFONT FORM+instance AdmitChildBASEFONT FORM+instance AdmitChildBR FORM+instance AdmitChildSCRIPT FORM+instance AdmitChildMAP FORM+instance AdmitChildQ FORM+instance AdmitChildSUB FORM+instance AdmitChildSUP FORM+instance AdmitChildSPAN FORM+instance AdmitChildBDO FORM+instance AdmitChildIFRAME FORM+instance AdmitChildINPUT FORM+instance AdmitChildSELECT FORM+instance AdmitChildTEXTAREA FORM+instance AdmitChildLABEL FORM+instance AdmitChildBUTTON FORM+instance TAG LI+instance AdmitChildP LI+instance AdmitChildH1 LI+instance AdmitChildH2 LI+instance AdmitChildH3 LI+instance AdmitChildH4 LI+instance AdmitChildH5 LI+instance AdmitChildH6 LI+instance AdmitChildUL LI+instance AdmitChildOL LI+instance AdmitChildDIR LI+instance AdmitChildMENU LI+instance AdmitChildPRE LI+instance AdmitChildDL LI+instance AdmitChildDIV LI+instance AdmitChildCENTER LI+instance AdmitChildNOSCRIPT LI+instance AdmitChildNOFRAMES LI+instance AdmitChildBLOCKQUOTE LI+instance AdmitChildFORM LI+instance AdmitChildISINDEX LI+instance AdmitChildHR LI+instance AdmitChildTABLE LI+instance AdmitChildFIELDSET LI+instance AdmitChildADDRESS LI+instance AdmitChildCDATA LI+instance AdmitChildTT LI+instance AdmitChildI LI+instance AdmitChildB LI+instance AdmitChildU LI+instance AdmitChildS LI+instance AdmitChildSTRIKE LI+instance AdmitChildBIG LI+instance AdmitChildSMALL LI+instance AdmitChildEM LI+instance AdmitChildSTRONG LI+instance AdmitChildDFN LI+instance AdmitChildCODE LI+instance AdmitChildSAMP LI+instance AdmitChildKBD LI+instance AdmitChildVAR LI+instance AdmitChildCITE LI+instance AdmitChildABBR LI+instance AdmitChildACRONYM LI+instance AdmitChildA LI+instance AdmitChildIMG LI+instance AdmitChildAPPLET LI+instance AdmitChildOBJECT LI+instance AdmitChildFONT LI+instance AdmitChildBASEFONT LI+instance AdmitChildBR LI+instance AdmitChildSCRIPT LI+instance AdmitChildMAP LI+instance AdmitChildQ LI+instance AdmitChildSUB LI+instance AdmitChildSUP LI+instance AdmitChildSPAN LI+instance AdmitChildBDO LI+instance AdmitChildIFRAME LI+instance AdmitChildINPUT LI+instance AdmitChildSELECT LI+instance AdmitChildTEXTAREA LI+instance AdmitChildLABEL LI+instance AdmitChildBUTTON LI+instance TAG DIR+instance AdmitChildLI DIR+instance TAG MENU+instance AdmitChildLI MENU+instance TAG UL+instance AdmitChildLI UL+instance TAG OL+instance AdmitChildLI OL+instance TAG DD+instance AdmitChildP DD+instance AdmitChildH1 DD+instance AdmitChildH2 DD+instance AdmitChildH3 DD+instance AdmitChildH4 DD+instance AdmitChildH5 DD+instance AdmitChildH6 DD+instance AdmitChildUL DD+instance AdmitChildOL DD+instance AdmitChildDIR DD+instance AdmitChildMENU DD+instance AdmitChildPRE DD+instance AdmitChildDL DD+instance AdmitChildDIV DD+instance AdmitChildCENTER DD+instance AdmitChildNOSCRIPT DD+instance AdmitChildNOFRAMES DD+instance AdmitChildBLOCKQUOTE DD+instance AdmitChildFORM DD+instance AdmitChildISINDEX DD+instance AdmitChildHR DD+instance AdmitChildTABLE DD+instance AdmitChildFIELDSET DD+instance AdmitChildADDRESS DD+instance AdmitChildCDATA DD+instance AdmitChildTT DD+instance AdmitChildI DD+instance AdmitChildB DD+instance AdmitChildU DD+instance AdmitChildS DD+instance AdmitChildSTRIKE DD+instance AdmitChildBIG DD+instance AdmitChildSMALL DD+instance AdmitChildEM DD+instance AdmitChildSTRONG DD+instance AdmitChildDFN DD+instance AdmitChildCODE DD+instance AdmitChildSAMP DD+instance AdmitChildKBD DD+instance AdmitChildVAR DD+instance AdmitChildCITE DD+instance AdmitChildABBR DD+instance AdmitChildACRONYM DD+instance AdmitChildA DD+instance AdmitChildIMG DD+instance AdmitChildAPPLET DD+instance AdmitChildOBJECT DD+instance AdmitChildFONT DD+instance AdmitChildBASEFONT DD+instance AdmitChildBR DD+instance AdmitChildSCRIPT DD+instance AdmitChildMAP DD+instance AdmitChildQ DD+instance AdmitChildSUB DD+instance AdmitChildSUP DD+instance AdmitChildSPAN DD+instance AdmitChildBDO DD+instance AdmitChildIFRAME DD+instance AdmitChildINPUT DD+instance AdmitChildSELECT DD+instance AdmitChildTEXTAREA DD+instance AdmitChildLABEL DD+instance AdmitChildBUTTON DD+instance TAG DT+instance AdmitChildCDATA DT+instance AdmitChildTT DT+instance AdmitChildI DT+instance AdmitChildB DT+instance AdmitChildU DT+instance AdmitChildS DT+instance AdmitChildSTRIKE DT+instance AdmitChildBIG DT+instance AdmitChildSMALL DT+instance AdmitChildEM DT+instance AdmitChildSTRONG DT+instance AdmitChildDFN DT+instance AdmitChildCODE DT+instance AdmitChildSAMP DT+instance AdmitChildKBD DT+instance AdmitChildVAR DT+instance AdmitChildCITE DT+instance AdmitChildABBR DT+instance AdmitChildACRONYM DT+instance AdmitChildA DT+instance AdmitChildIMG DT+instance AdmitChildAPPLET DT+instance AdmitChildOBJECT DT+instance AdmitChildFONT DT+instance AdmitChildBASEFONT DT+instance AdmitChildBR DT+instance AdmitChildSCRIPT DT+instance AdmitChildMAP DT+instance AdmitChildQ DT+instance AdmitChildSUB DT+instance AdmitChildSUP DT+instance AdmitChildSPAN DT+instance AdmitChildBDO DT+instance AdmitChildIFRAME DT+instance AdmitChildINPUT DT+instance AdmitChildSELECT DT+instance AdmitChildTEXTAREA DT+instance AdmitChildLABEL DT+instance AdmitChildBUTTON DT+instance TAG DL+instance AdmitChildDT DL+instance AdmitChildDD DL+instance TAG INS+instance AdmitChildP INS+instance AdmitChildH1 INS+instance AdmitChildH2 INS+instance AdmitChildH3 INS+instance AdmitChildH4 INS+instance AdmitChildH5 INS+instance AdmitChildH6 INS+instance AdmitChildUL INS+instance AdmitChildOL INS+instance AdmitChildDIR INS+instance AdmitChildMENU INS+instance AdmitChildPRE INS+instance AdmitChildDL INS+instance AdmitChildDIV INS+instance AdmitChildCENTER INS+instance AdmitChildNOSCRIPT INS+instance AdmitChildNOFRAMES INS+instance AdmitChildBLOCKQUOTE INS+instance AdmitChildFORM INS+instance AdmitChildISINDEX INS+instance AdmitChildHR INS+instance AdmitChildTABLE INS+instance AdmitChildFIELDSET INS+instance AdmitChildADDRESS INS+instance AdmitChildCDATA INS+instance AdmitChildTT INS+instance AdmitChildI INS+instance AdmitChildB INS+instance AdmitChildU INS+instance AdmitChildS INS+instance AdmitChildSTRIKE INS+instance AdmitChildBIG INS+instance AdmitChildSMALL INS+instance AdmitChildEM INS+instance AdmitChildSTRONG INS+instance AdmitChildDFN INS+instance AdmitChildCODE INS+instance AdmitChildSAMP INS+instance AdmitChildKBD INS+instance AdmitChildVAR INS+instance AdmitChildCITE INS+instance AdmitChildABBR INS+instance AdmitChildACRONYM INS+instance AdmitChildA INS+instance AdmitChildIMG INS+instance AdmitChildAPPLET INS+instance AdmitChildOBJECT INS+instance AdmitChildFONT INS+instance AdmitChildBASEFONT INS+instance AdmitChildBR INS+instance AdmitChildSCRIPT INS+instance AdmitChildMAP INS+instance AdmitChildQ INS+instance AdmitChildSUB INS+instance AdmitChildSUP INS+instance AdmitChildSPAN INS+instance AdmitChildBDO INS+instance AdmitChildIFRAME INS+instance AdmitChildINPUT INS+instance AdmitChildSELECT INS+instance AdmitChildTEXTAREA INS+instance AdmitChildLABEL INS+instance AdmitChildBUTTON INS+instance TAG DEL+instance AdmitChildP DEL+instance AdmitChildH1 DEL+instance AdmitChildH2 DEL+instance AdmitChildH3 DEL+instance AdmitChildH4 DEL+instance AdmitChildH5 DEL+instance AdmitChildH6 DEL+instance AdmitChildUL DEL+instance AdmitChildOL DEL+instance AdmitChildDIR DEL+instance AdmitChildMENU DEL+instance AdmitChildPRE DEL+instance AdmitChildDL DEL+instance AdmitChildDIV DEL+instance AdmitChildCENTER DEL+instance AdmitChildNOSCRIPT DEL+instance AdmitChildNOFRAMES DEL+instance AdmitChildBLOCKQUOTE DEL+instance AdmitChildFORM DEL+instance AdmitChildISINDEX DEL+instance AdmitChildHR DEL+instance AdmitChildTABLE DEL+instance AdmitChildFIELDSET DEL+instance AdmitChildADDRESS DEL+instance AdmitChildCDATA DEL+instance AdmitChildTT DEL+instance AdmitChildI DEL+instance AdmitChildB DEL+instance AdmitChildU DEL+instance AdmitChildS DEL+instance AdmitChildSTRIKE DEL+instance AdmitChildBIG DEL+instance AdmitChildSMALL DEL+instance AdmitChildEM DEL+instance AdmitChildSTRONG DEL+instance AdmitChildDFN DEL+instance AdmitChildCODE DEL+instance AdmitChildSAMP DEL+instance AdmitChildKBD DEL+instance AdmitChildVAR DEL+instance AdmitChildCITE DEL+instance AdmitChildABBR DEL+instance AdmitChildACRONYM DEL+instance AdmitChildA DEL+instance AdmitChildIMG DEL+instance AdmitChildAPPLET DEL+instance AdmitChildOBJECT DEL+instance AdmitChildFONT DEL+instance AdmitChildBASEFONT DEL+instance AdmitChildBR DEL+instance AdmitChildSCRIPT DEL+instance AdmitChildMAP DEL+instance AdmitChildQ DEL+instance AdmitChildSUB DEL+instance AdmitChildSUP DEL+instance AdmitChildSPAN DEL+instance AdmitChildBDO DEL+instance AdmitChildIFRAME DEL+instance AdmitChildINPUT DEL+instance AdmitChildSELECT DEL+instance AdmitChildTEXTAREA DEL+instance AdmitChildLABEL DEL+instance AdmitChildBUTTON DEL+instance TAG BLOCKQUOTE+instance AdmitChildP BLOCKQUOTE+instance AdmitChildH1 BLOCKQUOTE+instance AdmitChildH2 BLOCKQUOTE+instance AdmitChildH3 BLOCKQUOTE+instance AdmitChildH4 BLOCKQUOTE+instance AdmitChildH5 BLOCKQUOTE+instance AdmitChildH6 BLOCKQUOTE+instance AdmitChildUL BLOCKQUOTE+instance AdmitChildOL BLOCKQUOTE+instance AdmitChildDIR BLOCKQUOTE+instance AdmitChildMENU BLOCKQUOTE+instance AdmitChildPRE BLOCKQUOTE+instance AdmitChildDL BLOCKQUOTE+instance AdmitChildDIV BLOCKQUOTE+instance AdmitChildCENTER BLOCKQUOTE+instance AdmitChildNOSCRIPT BLOCKQUOTE+instance AdmitChildNOFRAMES BLOCKQUOTE+instance AdmitChildBLOCKQUOTE BLOCKQUOTE+instance AdmitChildFORM BLOCKQUOTE+instance AdmitChildISINDEX BLOCKQUOTE+instance AdmitChildHR BLOCKQUOTE+instance AdmitChildTABLE BLOCKQUOTE+instance AdmitChildFIELDSET BLOCKQUOTE+instance AdmitChildADDRESS BLOCKQUOTE+instance AdmitChildCDATA BLOCKQUOTE+instance AdmitChildTT BLOCKQUOTE+instance AdmitChildI BLOCKQUOTE+instance AdmitChildB BLOCKQUOTE+instance AdmitChildU BLOCKQUOTE+instance AdmitChildS BLOCKQUOTE+instance AdmitChildSTRIKE BLOCKQUOTE+instance AdmitChildBIG BLOCKQUOTE+instance AdmitChildSMALL BLOCKQUOTE+instance AdmitChildEM BLOCKQUOTE+instance AdmitChildSTRONG BLOCKQUOTE+instance AdmitChildDFN BLOCKQUOTE+instance AdmitChildCODE BLOCKQUOTE+instance AdmitChildSAMP BLOCKQUOTE+instance AdmitChildKBD BLOCKQUOTE+instance AdmitChildVAR BLOCKQUOTE+instance AdmitChildCITE BLOCKQUOTE+instance AdmitChildABBR BLOCKQUOTE+instance AdmitChildACRONYM BLOCKQUOTE+instance AdmitChildA BLOCKQUOTE+instance AdmitChildIMG BLOCKQUOTE+instance AdmitChildAPPLET BLOCKQUOTE+instance AdmitChildOBJECT BLOCKQUOTE+instance AdmitChildFONT BLOCKQUOTE+instance AdmitChildBASEFONT BLOCKQUOTE+instance AdmitChildBR BLOCKQUOTE+instance AdmitChildSCRIPT BLOCKQUOTE+instance AdmitChildMAP BLOCKQUOTE+instance AdmitChildQ BLOCKQUOTE+instance AdmitChildSUB BLOCKQUOTE+instance AdmitChildSUP BLOCKQUOTE+instance AdmitChildSPAN BLOCKQUOTE+instance AdmitChildBDO BLOCKQUOTE+instance AdmitChildIFRAME BLOCKQUOTE+instance AdmitChildINPUT BLOCKQUOTE+instance AdmitChildSELECT BLOCKQUOTE+instance AdmitChildTEXTAREA BLOCKQUOTE+instance AdmitChildLABEL BLOCKQUOTE+instance AdmitChildBUTTON BLOCKQUOTE+instance TAG Q+instance AdmitChildCDATA Q+instance AdmitChildTT Q+instance AdmitChildI Q+instance AdmitChildB Q+instance AdmitChildU Q+instance AdmitChildS Q+instance AdmitChildSTRIKE Q+instance AdmitChildBIG Q+instance AdmitChildSMALL Q+instance AdmitChildEM Q+instance AdmitChildSTRONG Q+instance AdmitChildDFN Q+instance AdmitChildCODE Q+instance AdmitChildSAMP Q+instance AdmitChildKBD Q+instance AdmitChildVAR Q+instance AdmitChildCITE Q+instance AdmitChildABBR Q+instance AdmitChildACRONYM Q+instance AdmitChildA Q+instance AdmitChildIMG Q+instance AdmitChildAPPLET Q+instance AdmitChildOBJECT Q+instance AdmitChildFONT Q+instance AdmitChildBASEFONT Q+instance AdmitChildBR Q+instance AdmitChildSCRIPT Q+instance AdmitChildMAP Q+instance AdmitChildQ Q+instance AdmitChildSUB Q+instance AdmitChildSUP Q+instance AdmitChildSPAN Q+instance AdmitChildBDO Q+instance AdmitChildIFRAME Q+instance AdmitChildINPUT Q+instance AdmitChildSELECT Q+instance AdmitChildTEXTAREA Q+instance AdmitChildLABEL Q+instance AdmitChildBUTTON Q+instance TAG PRE+instance AdmitChildCDATA PRE+instance AdmitChildTT PRE+instance AdmitChildI PRE+instance AdmitChildB PRE+instance AdmitChildU PRE+instance AdmitChildS PRE+instance AdmitChildSTRIKE PRE+instance AdmitChildEM PRE+instance AdmitChildSTRONG PRE+instance AdmitChildDFN PRE+instance AdmitChildCODE PRE+instance AdmitChildSAMP PRE+instance AdmitChildKBD PRE+instance AdmitChildVAR PRE+instance AdmitChildCITE PRE+instance AdmitChildABBR PRE+instance AdmitChildACRONYM PRE+instance AdmitChildA PRE+instance AdmitChildBR PRE+instance AdmitChildSCRIPT PRE+instance AdmitChildMAP PRE+instance AdmitChildQ PRE+instance AdmitChildSPAN PRE+instance AdmitChildBDO PRE+instance AdmitChildIFRAME PRE+instance AdmitChildINPUT PRE+instance AdmitChildSELECT PRE+instance AdmitChildTEXTAREA PRE+instance AdmitChildLABEL PRE+instance AdmitChildBUTTON PRE+instance TAG H1+instance AdmitChildCDATA H1+instance AdmitChildTT H1+instance AdmitChildI H1+instance AdmitChildB H1+instance AdmitChildU H1+instance AdmitChildS H1+instance AdmitChildSTRIKE H1+instance AdmitChildBIG H1+instance AdmitChildSMALL H1+instance AdmitChildEM H1+instance AdmitChildSTRONG H1+instance AdmitChildDFN H1+instance AdmitChildCODE H1+instance AdmitChildSAMP H1+instance AdmitChildKBD H1+instance AdmitChildVAR H1+instance AdmitChildCITE H1+instance AdmitChildABBR H1+instance AdmitChildACRONYM H1+instance AdmitChildA H1+instance AdmitChildIMG H1+instance AdmitChildAPPLET H1+instance AdmitChildOBJECT H1+instance AdmitChildFONT H1+instance AdmitChildBASEFONT H1+instance AdmitChildBR H1+instance AdmitChildSCRIPT H1+instance AdmitChildMAP H1+instance AdmitChildQ H1+instance AdmitChildSUB H1+instance AdmitChildSUP H1+instance AdmitChildSPAN H1+instance AdmitChildBDO H1+instance AdmitChildIFRAME H1+instance AdmitChildINPUT H1+instance AdmitChildSELECT H1+instance AdmitChildTEXTAREA H1+instance AdmitChildLABEL H1+instance AdmitChildBUTTON H1+instance TAG H2+instance AdmitChildCDATA H2+instance AdmitChildTT H2+instance AdmitChildI H2+instance AdmitChildB H2+instance AdmitChildU H2+instance AdmitChildS H2+instance AdmitChildSTRIKE H2+instance AdmitChildBIG H2+instance AdmitChildSMALL H2+instance AdmitChildEM H2+instance AdmitChildSTRONG H2+instance AdmitChildDFN H2+instance AdmitChildCODE H2+instance AdmitChildSAMP H2+instance AdmitChildKBD H2+instance AdmitChildVAR H2+instance AdmitChildCITE H2+instance AdmitChildABBR H2+instance AdmitChildACRONYM H2+instance AdmitChildA H2+instance AdmitChildIMG H2+instance AdmitChildAPPLET H2+instance AdmitChildOBJECT H2+instance AdmitChildFONT H2+instance AdmitChildBASEFONT H2+instance AdmitChildBR H2+instance AdmitChildSCRIPT H2+instance AdmitChildMAP H2+instance AdmitChildQ H2+instance AdmitChildSUB H2+instance AdmitChildSUP H2+instance AdmitChildSPAN H2+instance AdmitChildBDO H2+instance AdmitChildIFRAME H2+instance AdmitChildINPUT H2+instance AdmitChildSELECT H2+instance AdmitChildTEXTAREA H2+instance AdmitChildLABEL H2+instance AdmitChildBUTTON H2+instance TAG H3+instance AdmitChildCDATA H3+instance AdmitChildTT H3+instance AdmitChildI H3+instance AdmitChildB H3+instance AdmitChildU H3+instance AdmitChildS H3+instance AdmitChildSTRIKE H3+instance AdmitChildBIG H3+instance AdmitChildSMALL H3+instance AdmitChildEM H3+instance AdmitChildSTRONG H3+instance AdmitChildDFN H3+instance AdmitChildCODE H3+instance AdmitChildSAMP H3+instance AdmitChildKBD H3+instance AdmitChildVAR H3+instance AdmitChildCITE H3+instance AdmitChildABBR H3+instance AdmitChildACRONYM H3+instance AdmitChildA H3+instance AdmitChildIMG H3+instance AdmitChildAPPLET H3+instance AdmitChildOBJECT H3+instance AdmitChildFONT H3+instance AdmitChildBASEFONT H3+instance AdmitChildBR H3+instance AdmitChildSCRIPT H3+instance AdmitChildMAP H3+instance AdmitChildQ H3+instance AdmitChildSUB H3+instance AdmitChildSUP H3+instance AdmitChildSPAN H3+instance AdmitChildBDO H3+instance AdmitChildIFRAME H3+instance AdmitChildINPUT H3+instance AdmitChildSELECT H3+instance AdmitChildTEXTAREA H3+instance AdmitChildLABEL H3+instance AdmitChildBUTTON H3+instance TAG H4+instance AdmitChildCDATA H4+instance AdmitChildTT H4+instance AdmitChildI H4+instance AdmitChildB H4+instance AdmitChildU H4+instance AdmitChildS H4+instance AdmitChildSTRIKE H4+instance AdmitChildBIG H4+instance AdmitChildSMALL H4+instance AdmitChildEM H4+instance AdmitChildSTRONG H4+instance AdmitChildDFN H4+instance AdmitChildCODE H4+instance AdmitChildSAMP H4+instance AdmitChildKBD H4+instance AdmitChildVAR H4+instance AdmitChildCITE H4+instance AdmitChildABBR H4+instance AdmitChildACRONYM H4+instance AdmitChildA H4+instance AdmitChildIMG H4+instance AdmitChildAPPLET H4+instance AdmitChildOBJECT H4+instance AdmitChildFONT H4+instance AdmitChildBASEFONT H4+instance AdmitChildBR H4+instance AdmitChildSCRIPT H4+instance AdmitChildMAP H4+instance AdmitChildQ H4+instance AdmitChildSUB H4+instance AdmitChildSUP H4+instance AdmitChildSPAN H4+instance AdmitChildBDO H4+instance AdmitChildIFRAME H4+instance AdmitChildINPUT H4+instance AdmitChildSELECT H4+instance AdmitChildTEXTAREA H4+instance AdmitChildLABEL H4+instance AdmitChildBUTTON H4+instance TAG H5+instance AdmitChildCDATA H5+instance AdmitChildTT H5+instance AdmitChildI H5+instance AdmitChildB H5+instance AdmitChildU H5+instance AdmitChildS H5+instance AdmitChildSTRIKE H5+instance AdmitChildBIG H5+instance AdmitChildSMALL H5+instance AdmitChildEM H5+instance AdmitChildSTRONG H5+instance AdmitChildDFN H5+instance AdmitChildCODE H5+instance AdmitChildSAMP H5+instance AdmitChildKBD H5+instance AdmitChildVAR H5+instance AdmitChildCITE H5+instance AdmitChildABBR H5+instance AdmitChildACRONYM H5+instance AdmitChildA H5+instance AdmitChildIMG H5+instance AdmitChildAPPLET H5+instance AdmitChildOBJECT H5+instance AdmitChildFONT H5+instance AdmitChildBASEFONT H5+instance AdmitChildBR H5+instance AdmitChildSCRIPT H5+instance AdmitChildMAP H5+instance AdmitChildQ H5+instance AdmitChildSUB H5+instance AdmitChildSUP H5+instance AdmitChildSPAN H5+instance AdmitChildBDO H5+instance AdmitChildIFRAME H5+instance AdmitChildINPUT H5+instance AdmitChildSELECT H5+instance AdmitChildTEXTAREA H5+instance AdmitChildLABEL H5+instance AdmitChildBUTTON H5+instance TAG H6+instance AdmitChildCDATA H6+instance AdmitChildTT H6+instance AdmitChildI H6+instance AdmitChildB H6+instance AdmitChildU H6+instance AdmitChildS H6+instance AdmitChildSTRIKE H6+instance AdmitChildBIG H6+instance AdmitChildSMALL H6+instance AdmitChildEM H6+instance AdmitChildSTRONG H6+instance AdmitChildDFN H6+instance AdmitChildCODE H6+instance AdmitChildSAMP H6+instance AdmitChildKBD H6+instance AdmitChildVAR H6+instance AdmitChildCITE H6+instance AdmitChildABBR H6+instance AdmitChildACRONYM H6+instance AdmitChildA H6+instance AdmitChildIMG H6+instance AdmitChildAPPLET H6+instance AdmitChildOBJECT H6+instance AdmitChildFONT H6+instance AdmitChildBASEFONT H6+instance AdmitChildBR H6+instance AdmitChildSCRIPT H6+instance AdmitChildMAP H6+instance AdmitChildQ H6+instance AdmitChildSUB H6+instance AdmitChildSUP H6+instance AdmitChildSPAN H6+instance AdmitChildBDO H6+instance AdmitChildIFRAME H6+instance AdmitChildINPUT H6+instance AdmitChildSELECT H6+instance AdmitChildTEXTAREA H6+instance AdmitChildLABEL H6+instance AdmitChildBUTTON H6+instance TAG P+instance AdmitChildCDATA P+instance AdmitChildTT P+instance AdmitChildI P+instance AdmitChildB P+instance AdmitChildU P+instance AdmitChildS P+instance AdmitChildSTRIKE P+instance AdmitChildBIG P+instance AdmitChildSMALL P+instance AdmitChildEM P+instance AdmitChildSTRONG P+instance AdmitChildDFN P+instance AdmitChildCODE P+instance AdmitChildSAMP P+instance AdmitChildKBD P+instance AdmitChildVAR P+instance AdmitChildCITE P+instance AdmitChildABBR P+instance AdmitChildACRONYM P+instance AdmitChildA P+instance AdmitChildIMG P+instance AdmitChildAPPLET P+instance AdmitChildOBJECT P+instance AdmitChildFONT P+instance AdmitChildBASEFONT P+instance AdmitChildBR P+instance AdmitChildSCRIPT P+instance AdmitChildMAP P+instance AdmitChildQ P+instance AdmitChildSUB P+instance AdmitChildSUP P+instance AdmitChildSPAN P+instance AdmitChildBDO P+instance AdmitChildIFRAME P+instance AdmitChildINPUT P+instance AdmitChildSELECT P+instance AdmitChildTEXTAREA P+instance AdmitChildLABEL P+instance AdmitChildBUTTON P+instance TAG HR where make = make_empty+instance TAG APPLET+instance AdmitChildPARAM APPLET+instance AdmitChildP APPLET+instance AdmitChildH1 APPLET+instance AdmitChildH2 APPLET+instance AdmitChildH3 APPLET+instance AdmitChildH4 APPLET+instance AdmitChildH5 APPLET+instance AdmitChildH6 APPLET+instance AdmitChildUL APPLET+instance AdmitChildOL APPLET+instance AdmitChildDIR APPLET+instance AdmitChildMENU APPLET+instance AdmitChildPRE APPLET+instance AdmitChildDL APPLET+instance AdmitChildDIV APPLET+instance AdmitChildCENTER APPLET+instance AdmitChildNOSCRIPT APPLET+instance AdmitChildNOFRAMES APPLET+instance AdmitChildBLOCKQUOTE APPLET+instance AdmitChildFORM APPLET+instance AdmitChildISINDEX APPLET+instance AdmitChildHR APPLET+instance AdmitChildTABLE APPLET+instance AdmitChildFIELDSET APPLET+instance AdmitChildADDRESS APPLET+instance AdmitChildCDATA APPLET+instance AdmitChildTT APPLET+instance AdmitChildI APPLET+instance AdmitChildB APPLET+instance AdmitChildU APPLET+instance AdmitChildS APPLET+instance AdmitChildSTRIKE APPLET+instance AdmitChildBIG APPLET+instance AdmitChildSMALL APPLET+instance AdmitChildEM APPLET+instance AdmitChildSTRONG APPLET+instance AdmitChildDFN APPLET+instance AdmitChildCODE APPLET+instance AdmitChildSAMP APPLET+instance AdmitChildKBD APPLET+instance AdmitChildVAR APPLET+instance AdmitChildCITE APPLET+instance AdmitChildABBR APPLET+instance AdmitChildACRONYM APPLET+instance AdmitChildA APPLET+instance AdmitChildIMG APPLET+instance AdmitChildAPPLET APPLET+instance AdmitChildOBJECT APPLET+instance AdmitChildFONT APPLET+instance AdmitChildBASEFONT APPLET+instance AdmitChildBR APPLET+instance AdmitChildSCRIPT APPLET+instance AdmitChildMAP APPLET+instance AdmitChildQ APPLET+instance AdmitChildSUB APPLET+instance AdmitChildSUP APPLET+instance AdmitChildSPAN APPLET+instance AdmitChildBDO APPLET+instance AdmitChildIFRAME APPLET+instance AdmitChildINPUT APPLET+instance AdmitChildSELECT APPLET+instance AdmitChildTEXTAREA APPLET+instance AdmitChildLABEL APPLET+instance AdmitChildBUTTON APPLET+instance TAG PARAM where make = make_empty+instance TAG OBJECT+instance AdmitChildPARAM OBJECT+instance AdmitChildP OBJECT+instance AdmitChildH1 OBJECT+instance AdmitChildH2 OBJECT+instance AdmitChildH3 OBJECT+instance AdmitChildH4 OBJECT+instance AdmitChildH5 OBJECT+instance AdmitChildH6 OBJECT+instance AdmitChildUL OBJECT+instance AdmitChildOL OBJECT+instance AdmitChildDIR OBJECT+instance AdmitChildMENU OBJECT+instance AdmitChildPRE OBJECT+instance AdmitChildDL OBJECT+instance AdmitChildDIV OBJECT+instance AdmitChildCENTER OBJECT+instance AdmitChildNOSCRIPT OBJECT+instance AdmitChildNOFRAMES OBJECT+instance AdmitChildBLOCKQUOTE OBJECT+instance AdmitChildFORM OBJECT+instance AdmitChildISINDEX OBJECT+instance AdmitChildHR OBJECT+instance AdmitChildTABLE OBJECT+instance AdmitChildFIELDSET OBJECT+instance AdmitChildADDRESS OBJECT+instance AdmitChildCDATA OBJECT+instance AdmitChildTT OBJECT+instance AdmitChildI OBJECT+instance AdmitChildB OBJECT+instance AdmitChildU OBJECT+instance AdmitChildS OBJECT+instance AdmitChildSTRIKE OBJECT+instance AdmitChildBIG OBJECT+instance AdmitChildSMALL OBJECT+instance AdmitChildEM OBJECT+instance AdmitChildSTRONG OBJECT+instance AdmitChildDFN OBJECT+instance AdmitChildCODE OBJECT+instance AdmitChildSAMP OBJECT+instance AdmitChildKBD OBJECT+instance AdmitChildVAR OBJECT+instance AdmitChildCITE OBJECT+instance AdmitChildABBR OBJECT+instance AdmitChildACRONYM OBJECT+instance AdmitChildA OBJECT+instance AdmitChildIMG OBJECT+instance AdmitChildAPPLET OBJECT+instance AdmitChildOBJECT OBJECT+instance AdmitChildFONT OBJECT+instance AdmitChildBASEFONT OBJECT+instance AdmitChildBR OBJECT+instance AdmitChildSCRIPT OBJECT+instance AdmitChildMAP OBJECT+instance AdmitChildQ OBJECT+instance AdmitChildSUB OBJECT+instance AdmitChildSUP OBJECT+instance AdmitChildSPAN OBJECT+instance AdmitChildBDO OBJECT+instance AdmitChildIFRAME OBJECT+instance AdmitChildINPUT OBJECT+instance AdmitChildSELECT OBJECT+instance AdmitChildTEXTAREA OBJECT+instance AdmitChildLABEL OBJECT+instance AdmitChildBUTTON OBJECT+instance TAG IMG where make = make_empty+instance TAG LINK where make = make_empty+instance TAG AREA where make = make_empty+instance TAG MAP+instance AdmitChildP MAP+instance AdmitChildH1 MAP+instance AdmitChildH2 MAP+instance AdmitChildH3 MAP+instance AdmitChildH4 MAP+instance AdmitChildH5 MAP+instance AdmitChildH6 MAP+instance AdmitChildUL MAP+instance AdmitChildOL MAP+instance AdmitChildDIR MAP+instance AdmitChildMENU MAP+instance AdmitChildPRE MAP+instance AdmitChildDL MAP+instance AdmitChildDIV MAP+instance AdmitChildCENTER MAP+instance AdmitChildNOSCRIPT MAP+instance AdmitChildNOFRAMES MAP+instance AdmitChildBLOCKQUOTE MAP+instance AdmitChildFORM MAP+instance AdmitChildISINDEX MAP+instance AdmitChildHR MAP+instance AdmitChildTABLE MAP+instance AdmitChildFIELDSET MAP+instance AdmitChildADDRESS MAP+instance AdmitChildAREA MAP+instance TAG A+instance AdmitChildCDATA A+instance AdmitChildTT A+instance AdmitChildI A+instance AdmitChildB A+instance AdmitChildU A+instance AdmitChildS A+instance AdmitChildSTRIKE A+instance AdmitChildBIG A+instance AdmitChildSMALL A+instance AdmitChildEM A+instance AdmitChildSTRONG A+instance AdmitChildDFN A+instance AdmitChildCODE A+instance AdmitChildSAMP A+instance AdmitChildKBD A+instance AdmitChildVAR A+instance AdmitChildCITE A+instance AdmitChildABBR A+instance AdmitChildACRONYM A+instance AdmitChildIMG A+instance AdmitChildAPPLET A+instance AdmitChildOBJECT A+instance AdmitChildFONT A+instance AdmitChildBASEFONT A+instance AdmitChildBR A+instance AdmitChildSCRIPT A+instance AdmitChildMAP A+instance AdmitChildQ A+instance AdmitChildSUB A+instance AdmitChildSUP A+instance AdmitChildSPAN A+instance AdmitChildBDO A+instance AdmitChildIFRAME A+instance AdmitChildINPUT A+instance AdmitChildSELECT A+instance AdmitChildTEXTAREA A+instance AdmitChildLABEL A+instance AdmitChildBUTTON A+instance TAG CENTER+instance AdmitChildP CENTER+instance AdmitChildH1 CENTER+instance AdmitChildH2 CENTER+instance AdmitChildH3 CENTER+instance AdmitChildH4 CENTER+instance AdmitChildH5 CENTER+instance AdmitChildH6 CENTER+instance AdmitChildUL CENTER+instance AdmitChildOL CENTER+instance AdmitChildDIR CENTER+instance AdmitChildMENU CENTER+instance AdmitChildPRE CENTER+instance AdmitChildDL CENTER+instance AdmitChildDIV CENTER+instance AdmitChildCENTER CENTER+instance AdmitChildNOSCRIPT CENTER+instance AdmitChildNOFRAMES CENTER+instance AdmitChildBLOCKQUOTE CENTER+instance AdmitChildFORM CENTER+instance AdmitChildISINDEX CENTER+instance AdmitChildHR CENTER+instance AdmitChildTABLE CENTER+instance AdmitChildFIELDSET CENTER+instance AdmitChildADDRESS CENTER+instance AdmitChildCDATA CENTER+instance AdmitChildTT CENTER+instance AdmitChildI CENTER+instance AdmitChildB CENTER+instance AdmitChildU CENTER+instance AdmitChildS CENTER+instance AdmitChildSTRIKE CENTER+instance AdmitChildBIG CENTER+instance AdmitChildSMALL CENTER+instance AdmitChildEM CENTER+instance AdmitChildSTRONG CENTER+instance AdmitChildDFN CENTER+instance AdmitChildCODE CENTER+instance AdmitChildSAMP CENTER+instance AdmitChildKBD CENTER+instance AdmitChildVAR CENTER+instance AdmitChildCITE CENTER+instance AdmitChildABBR CENTER+instance AdmitChildACRONYM CENTER+instance AdmitChildA CENTER+instance AdmitChildIMG CENTER+instance AdmitChildAPPLET CENTER+instance AdmitChildOBJECT CENTER+instance AdmitChildFONT CENTER+instance AdmitChildBASEFONT CENTER+instance AdmitChildBR CENTER+instance AdmitChildSCRIPT CENTER+instance AdmitChildMAP CENTER+instance AdmitChildQ CENTER+instance AdmitChildSUB CENTER+instance AdmitChildSUP CENTER+instance AdmitChildSPAN CENTER+instance AdmitChildBDO CENTER+instance AdmitChildIFRAME CENTER+instance AdmitChildINPUT CENTER+instance AdmitChildSELECT CENTER+instance AdmitChildTEXTAREA CENTER+instance AdmitChildLABEL CENTER+instance AdmitChildBUTTON CENTER+instance TAG DIV+instance AdmitChildP DIV+instance AdmitChildH1 DIV+instance AdmitChildH2 DIV+instance AdmitChildH3 DIV+instance AdmitChildH4 DIV+instance AdmitChildH5 DIV+instance AdmitChildH6 DIV+instance AdmitChildUL DIV+instance AdmitChildOL DIV+instance AdmitChildDIR DIV+instance AdmitChildMENU DIV+instance AdmitChildPRE DIV+instance AdmitChildDL DIV+instance AdmitChildDIV DIV+instance AdmitChildCENTER DIV+instance AdmitChildNOSCRIPT DIV+instance AdmitChildNOFRAMES DIV+instance AdmitChildBLOCKQUOTE DIV+instance AdmitChildFORM DIV+instance AdmitChildISINDEX DIV+instance AdmitChildHR DIV+instance AdmitChildTABLE DIV+instance AdmitChildFIELDSET DIV+instance AdmitChildADDRESS DIV+instance AdmitChildCDATA DIV+instance AdmitChildTT DIV+instance AdmitChildI DIV+instance AdmitChildB DIV+instance AdmitChildU DIV+instance AdmitChildS DIV+instance AdmitChildSTRIKE DIV+instance AdmitChildBIG DIV+instance AdmitChildSMALL DIV+instance AdmitChildEM DIV+instance AdmitChildSTRONG DIV+instance AdmitChildDFN DIV+instance AdmitChildCODE DIV+instance AdmitChildSAMP DIV+instance AdmitChildKBD DIV+instance AdmitChildVAR DIV+instance AdmitChildCITE DIV+instance AdmitChildABBR DIV+instance AdmitChildACRONYM DIV+instance AdmitChildA DIV+instance AdmitChildIMG DIV+instance AdmitChildAPPLET DIV+instance AdmitChildOBJECT DIV+instance AdmitChildFONT DIV+instance AdmitChildBASEFONT DIV+instance AdmitChildBR DIV+instance AdmitChildSCRIPT DIV+instance AdmitChildMAP DIV+instance AdmitChildQ DIV+instance AdmitChildSUB DIV+instance AdmitChildSUP DIV+instance AdmitChildSPAN DIV+instance AdmitChildBDO DIV+instance AdmitChildIFRAME DIV+instance AdmitChildINPUT DIV+instance AdmitChildSELECT DIV+instance AdmitChildTEXTAREA DIV+instance AdmitChildLABEL DIV+instance AdmitChildBUTTON DIV+instance TAG ADDRESS+instance AdmitChildCDATA ADDRESS+instance AdmitChildTT ADDRESS+instance AdmitChildI ADDRESS+instance AdmitChildB ADDRESS+instance AdmitChildU ADDRESS+instance AdmitChildS ADDRESS+instance AdmitChildSTRIKE ADDRESS+instance AdmitChildBIG ADDRESS+instance AdmitChildSMALL ADDRESS+instance AdmitChildEM ADDRESS+instance AdmitChildSTRONG ADDRESS+instance AdmitChildDFN ADDRESS+instance AdmitChildCODE ADDRESS+instance AdmitChildSAMP ADDRESS+instance AdmitChildKBD ADDRESS+instance AdmitChildVAR ADDRESS+instance AdmitChildCITE ADDRESS+instance AdmitChildABBR ADDRESS+instance AdmitChildACRONYM ADDRESS+instance AdmitChildA ADDRESS+instance AdmitChildIMG ADDRESS+instance AdmitChildAPPLET ADDRESS+instance AdmitChildOBJECT ADDRESS+instance AdmitChildFONT ADDRESS+instance AdmitChildBASEFONT ADDRESS+instance AdmitChildBR ADDRESS+instance AdmitChildSCRIPT ADDRESS+instance AdmitChildMAP ADDRESS+instance AdmitChildQ ADDRESS+instance AdmitChildSUB ADDRESS+instance AdmitChildSUP ADDRESS+instance AdmitChildSPAN ADDRESS+instance AdmitChildBDO ADDRESS+instance AdmitChildIFRAME ADDRESS+instance AdmitChildINPUT ADDRESS+instance AdmitChildSELECT ADDRESS+instance AdmitChildTEXTAREA ADDRESS+instance AdmitChildLABEL ADDRESS+instance AdmitChildBUTTON ADDRESS+instance AdmitChildP ADDRESS+instance TAG BODY+instance AdmitChildP BODY+instance AdmitChildH1 BODY+instance AdmitChildH2 BODY+instance AdmitChildH3 BODY+instance AdmitChildH4 BODY+instance AdmitChildH5 BODY+instance AdmitChildH6 BODY+instance AdmitChildUL BODY+instance AdmitChildOL BODY+instance AdmitChildDIR BODY+instance AdmitChildMENU BODY+instance AdmitChildPRE BODY+instance AdmitChildDL BODY+instance AdmitChildDIV BODY+instance AdmitChildCENTER BODY+instance AdmitChildNOSCRIPT BODY+instance AdmitChildNOFRAMES BODY+instance AdmitChildBLOCKQUOTE BODY+instance AdmitChildFORM BODY+instance AdmitChildISINDEX BODY+instance AdmitChildHR BODY+instance AdmitChildTABLE BODY+instance AdmitChildFIELDSET BODY+instance AdmitChildADDRESS BODY+instance AdmitChildCDATA BODY+instance AdmitChildTT BODY+instance AdmitChildI BODY+instance AdmitChildB BODY+instance AdmitChildU BODY+instance AdmitChildS BODY+instance AdmitChildSTRIKE BODY+instance AdmitChildBIG BODY+instance AdmitChildSMALL BODY+instance AdmitChildEM BODY+instance AdmitChildSTRONG BODY+instance AdmitChildDFN BODY+instance AdmitChildCODE BODY+instance AdmitChildSAMP BODY+instance AdmitChildKBD BODY+instance AdmitChildVAR BODY+instance AdmitChildCITE BODY+instance AdmitChildABBR BODY+instance AdmitChildACRONYM BODY+instance AdmitChildA BODY+instance AdmitChildIMG BODY+instance AdmitChildAPPLET BODY+instance AdmitChildOBJECT BODY+instance AdmitChildFONT BODY+instance AdmitChildBASEFONT BODY+instance AdmitChildBR BODY+instance AdmitChildSCRIPT BODY+instance AdmitChildMAP BODY+instance AdmitChildQ BODY+instance AdmitChildSUB BODY+instance AdmitChildSUP BODY+instance AdmitChildSPAN BODY+instance AdmitChildBDO BODY+instance AdmitChildIFRAME BODY+instance AdmitChildINPUT BODY+instance AdmitChildSELECT BODY+instance AdmitChildTEXTAREA BODY+instance AdmitChildLABEL BODY+instance AdmitChildBUTTON BODY+instance AdmitChildINS BODY+instance AdmitChildDEL BODY+instance TAG BR where make = make_empty+instance TAG FONT+instance AdmitChildCDATA FONT+instance AdmitChildTT FONT+instance AdmitChildI FONT+instance AdmitChildB FONT+instance AdmitChildU FONT+instance AdmitChildS FONT+instance AdmitChildSTRIKE FONT+instance AdmitChildBIG FONT+instance AdmitChildSMALL FONT+instance AdmitChildEM FONT+instance AdmitChildSTRONG FONT+instance AdmitChildDFN FONT+instance AdmitChildCODE FONT+instance AdmitChildSAMP FONT+instance AdmitChildKBD FONT+instance AdmitChildVAR FONT+instance AdmitChildCITE FONT+instance AdmitChildABBR FONT+instance AdmitChildACRONYM FONT+instance AdmitChildA FONT+instance AdmitChildIMG FONT+instance AdmitChildAPPLET FONT+instance AdmitChildOBJECT FONT+instance AdmitChildFONT FONT+instance AdmitChildBASEFONT FONT+instance AdmitChildBR FONT+instance AdmitChildSCRIPT FONT+instance AdmitChildMAP FONT+instance AdmitChildQ FONT+instance AdmitChildSUB FONT+instance AdmitChildSUP FONT+instance AdmitChildSPAN FONT+instance AdmitChildBDO FONT+instance AdmitChildIFRAME FONT+instance AdmitChildINPUT FONT+instance AdmitChildSELECT FONT+instance AdmitChildTEXTAREA FONT+instance AdmitChildLABEL FONT+instance AdmitChildBUTTON FONT+instance TAG BASEFONT where make = make_empty+instance TAG BDO+instance AdmitChildCDATA BDO+instance AdmitChildTT BDO+instance AdmitChildI BDO+instance AdmitChildB BDO+instance AdmitChildU BDO+instance AdmitChildS BDO+instance AdmitChildSTRIKE BDO+instance AdmitChildBIG BDO+instance AdmitChildSMALL BDO+instance AdmitChildEM BDO+instance AdmitChildSTRONG BDO+instance AdmitChildDFN BDO+instance AdmitChildCODE BDO+instance AdmitChildSAMP BDO+instance AdmitChildKBD BDO+instance AdmitChildVAR BDO+instance AdmitChildCITE BDO+instance AdmitChildABBR BDO+instance AdmitChildACRONYM BDO+instance AdmitChildA BDO+instance AdmitChildIMG BDO+instance AdmitChildAPPLET BDO+instance AdmitChildOBJECT BDO+instance AdmitChildFONT BDO+instance AdmitChildBASEFONT BDO+instance AdmitChildBR BDO+instance AdmitChildSCRIPT BDO+instance AdmitChildMAP BDO+instance AdmitChildQ BDO+instance AdmitChildSUB BDO+instance AdmitChildSUP BDO+instance AdmitChildSPAN BDO+instance AdmitChildBDO BDO+instance AdmitChildIFRAME BDO+instance AdmitChildINPUT BDO+instance AdmitChildSELECT BDO+instance AdmitChildTEXTAREA BDO+instance AdmitChildLABEL BDO+instance AdmitChildBUTTON BDO+instance TAG SPAN+instance AdmitChildCDATA SPAN+instance AdmitChildTT SPAN+instance AdmitChildI SPAN+instance AdmitChildB SPAN+instance AdmitChildU SPAN+instance AdmitChildS SPAN+instance AdmitChildSTRIKE SPAN+instance AdmitChildBIG SPAN+instance AdmitChildSMALL SPAN+instance AdmitChildEM SPAN+instance AdmitChildSTRONG SPAN+instance AdmitChildDFN SPAN+instance AdmitChildCODE SPAN+instance AdmitChildSAMP SPAN+instance AdmitChildKBD SPAN+instance AdmitChildVAR SPAN+instance AdmitChildCITE SPAN+instance AdmitChildABBR SPAN+instance AdmitChildACRONYM SPAN+instance AdmitChildA SPAN+instance AdmitChildIMG SPAN+instance AdmitChildAPPLET SPAN+instance AdmitChildOBJECT SPAN+instance AdmitChildFONT SPAN+instance AdmitChildBASEFONT SPAN+instance AdmitChildBR SPAN+instance AdmitChildSCRIPT SPAN+instance AdmitChildMAP SPAN+instance AdmitChildQ SPAN+instance AdmitChildSUB SPAN+instance AdmitChildSUP SPAN+instance AdmitChildSPAN SPAN+instance AdmitChildBDO SPAN+instance AdmitChildIFRAME SPAN+instance AdmitChildINPUT SPAN+instance AdmitChildSELECT SPAN+instance AdmitChildTEXTAREA SPAN+instance AdmitChildLABEL SPAN+instance AdmitChildBUTTON SPAN+instance TAG SUB+instance AdmitChildCDATA SUB+instance AdmitChildTT SUB+instance AdmitChildI SUB+instance AdmitChildB SUB+instance AdmitChildU SUB+instance AdmitChildS SUB+instance AdmitChildSTRIKE SUB+instance AdmitChildBIG SUB+instance AdmitChildSMALL SUB+instance AdmitChildEM SUB+instance AdmitChildSTRONG SUB+instance AdmitChildDFN SUB+instance AdmitChildCODE SUB+instance AdmitChildSAMP SUB+instance AdmitChildKBD SUB+instance AdmitChildVAR SUB+instance AdmitChildCITE SUB+instance AdmitChildABBR SUB+instance AdmitChildACRONYM SUB+instance AdmitChildA SUB+instance AdmitChildIMG SUB+instance AdmitChildAPPLET SUB+instance AdmitChildOBJECT SUB+instance AdmitChildFONT SUB+instance AdmitChildBASEFONT SUB+instance AdmitChildBR SUB+instance AdmitChildSCRIPT SUB+instance AdmitChildMAP SUB+instance AdmitChildQ SUB+instance AdmitChildSUB SUB+instance AdmitChildSUP SUB+instance AdmitChildSPAN SUB+instance AdmitChildBDO SUB+instance AdmitChildIFRAME SUB+instance AdmitChildINPUT SUB+instance AdmitChildSELECT SUB+instance AdmitChildTEXTAREA SUB+instance AdmitChildLABEL SUB+instance AdmitChildBUTTON SUB+instance TAG SUP+instance AdmitChildCDATA SUP+instance AdmitChildTT SUP+instance AdmitChildI SUP+instance AdmitChildB SUP+instance AdmitChildU SUP+instance AdmitChildS SUP+instance AdmitChildSTRIKE SUP+instance AdmitChildBIG SUP+instance AdmitChildSMALL SUP+instance AdmitChildEM SUP+instance AdmitChildSTRONG SUP+instance AdmitChildDFN SUP+instance AdmitChildCODE SUP+instance AdmitChildSAMP SUP+instance AdmitChildKBD SUP+instance AdmitChildVAR SUP+instance AdmitChildCITE SUP+instance AdmitChildABBR SUP+instance AdmitChildACRONYM SUP+instance AdmitChildA SUP+instance AdmitChildIMG SUP+instance AdmitChildAPPLET SUP+instance AdmitChildOBJECT SUP+instance AdmitChildFONT SUP+instance AdmitChildBASEFONT SUP+instance AdmitChildBR SUP+instance AdmitChildSCRIPT SUP+instance AdmitChildMAP SUP+instance AdmitChildQ SUP+instance AdmitChildSUB SUP+instance AdmitChildSUP SUP+instance AdmitChildSPAN SUP+instance AdmitChildBDO SUP+instance AdmitChildIFRAME SUP+instance AdmitChildINPUT SUP+instance AdmitChildSELECT SUP+instance AdmitChildTEXTAREA SUP+instance AdmitChildLABEL SUP+instance AdmitChildBUTTON SUP+instance TAG TT+instance AdmitChildCDATA TT+instance AdmitChildTT TT+instance AdmitChildI TT+instance AdmitChildB TT+instance AdmitChildU TT+instance AdmitChildS TT+instance AdmitChildSTRIKE TT+instance AdmitChildBIG TT+instance AdmitChildSMALL TT+instance AdmitChildEM TT+instance AdmitChildSTRONG TT+instance AdmitChildDFN TT+instance AdmitChildCODE TT+instance AdmitChildSAMP TT+instance AdmitChildKBD TT+instance AdmitChildVAR TT+instance AdmitChildCITE TT+instance AdmitChildABBR TT+instance AdmitChildACRONYM TT+instance AdmitChildA TT+instance AdmitChildIMG TT+instance AdmitChildAPPLET TT+instance AdmitChildOBJECT TT+instance AdmitChildFONT TT+instance AdmitChildBASEFONT TT+instance AdmitChildBR TT+instance AdmitChildSCRIPT TT+instance AdmitChildMAP TT+instance AdmitChildQ TT+instance AdmitChildSUB TT+instance AdmitChildSUP TT+instance AdmitChildSPAN TT+instance AdmitChildBDO TT+instance AdmitChildIFRAME TT+instance AdmitChildINPUT TT+instance AdmitChildSELECT TT+instance AdmitChildTEXTAREA TT+instance AdmitChildLABEL TT+instance AdmitChildBUTTON TT+instance TAG I+instance AdmitChildCDATA I+instance AdmitChildTT I+instance AdmitChildI I+instance AdmitChildB I+instance AdmitChildU I+instance AdmitChildS I+instance AdmitChildSTRIKE I+instance AdmitChildBIG I+instance AdmitChildSMALL I+instance AdmitChildEM I+instance AdmitChildSTRONG I+instance AdmitChildDFN I+instance AdmitChildCODE I+instance AdmitChildSAMP I+instance AdmitChildKBD I+instance AdmitChildVAR I+instance AdmitChildCITE I+instance AdmitChildABBR I+instance AdmitChildACRONYM I+instance AdmitChildA I+instance AdmitChildIMG I+instance AdmitChildAPPLET I+instance AdmitChildOBJECT I+instance AdmitChildFONT I+instance AdmitChildBASEFONT I+instance AdmitChildBR I+instance AdmitChildSCRIPT I+instance AdmitChildMAP I+instance AdmitChildQ I+instance AdmitChildSUB I+instance AdmitChildSUP I+instance AdmitChildSPAN I+instance AdmitChildBDO I+instance AdmitChildIFRAME I+instance AdmitChildINPUT I+instance AdmitChildSELECT I+instance AdmitChildTEXTAREA I+instance AdmitChildLABEL I+instance AdmitChildBUTTON I+instance TAG B+instance AdmitChildCDATA B+instance AdmitChildTT B+instance AdmitChildI B+instance AdmitChildB B+instance AdmitChildU B+instance AdmitChildS B+instance AdmitChildSTRIKE B+instance AdmitChildBIG B+instance AdmitChildSMALL B+instance AdmitChildEM B+instance AdmitChildSTRONG B+instance AdmitChildDFN B+instance AdmitChildCODE B+instance AdmitChildSAMP B+instance AdmitChildKBD B+instance AdmitChildVAR B+instance AdmitChildCITE B+instance AdmitChildABBR B+instance AdmitChildACRONYM B+instance AdmitChildA B+instance AdmitChildIMG B+instance AdmitChildAPPLET B+instance AdmitChildOBJECT B+instance AdmitChildFONT B+instance AdmitChildBASEFONT B+instance AdmitChildBR B+instance AdmitChildSCRIPT B+instance AdmitChildMAP B+instance AdmitChildQ B+instance AdmitChildSUB B+instance AdmitChildSUP B+instance AdmitChildSPAN B+instance AdmitChildBDO B+instance AdmitChildIFRAME B+instance AdmitChildINPUT B+instance AdmitChildSELECT B+instance AdmitChildTEXTAREA B+instance AdmitChildLABEL B+instance AdmitChildBUTTON B+instance TAG U+instance AdmitChildCDATA U+instance AdmitChildTT U+instance AdmitChildI U+instance AdmitChildB U+instance AdmitChildU U+instance AdmitChildS U+instance AdmitChildSTRIKE U+instance AdmitChildBIG U+instance AdmitChildSMALL U+instance AdmitChildEM U+instance AdmitChildSTRONG U+instance AdmitChildDFN U+instance AdmitChildCODE U+instance AdmitChildSAMP U+instance AdmitChildKBD U+instance AdmitChildVAR U+instance AdmitChildCITE U+instance AdmitChildABBR U+instance AdmitChildACRONYM U+instance AdmitChildA U+instance AdmitChildIMG U+instance AdmitChildAPPLET U+instance AdmitChildOBJECT U+instance AdmitChildFONT U+instance AdmitChildBASEFONT U+instance AdmitChildBR U+instance AdmitChildSCRIPT U+instance AdmitChildMAP U+instance AdmitChildQ U+instance AdmitChildSUB U+instance AdmitChildSUP U+instance AdmitChildSPAN U+instance AdmitChildBDO U+instance AdmitChildIFRAME U+instance AdmitChildINPUT U+instance AdmitChildSELECT U+instance AdmitChildTEXTAREA U+instance AdmitChildLABEL U+instance AdmitChildBUTTON U+instance TAG S+instance AdmitChildCDATA S+instance AdmitChildTT S+instance AdmitChildI S+instance AdmitChildB S+instance AdmitChildU S+instance AdmitChildS S+instance AdmitChildSTRIKE S+instance AdmitChildBIG S+instance AdmitChildSMALL S+instance AdmitChildEM S+instance AdmitChildSTRONG S+instance AdmitChildDFN S+instance AdmitChildCODE S+instance AdmitChildSAMP S+instance AdmitChildKBD S+instance AdmitChildVAR S+instance AdmitChildCITE S+instance AdmitChildABBR S+instance AdmitChildACRONYM S+instance AdmitChildA S+instance AdmitChildIMG S+instance AdmitChildAPPLET S+instance AdmitChildOBJECT S+instance AdmitChildFONT S+instance AdmitChildBASEFONT S+instance AdmitChildBR S+instance AdmitChildSCRIPT S+instance AdmitChildMAP S+instance AdmitChildQ S+instance AdmitChildSUB S+instance AdmitChildSUP S+instance AdmitChildSPAN S+instance AdmitChildBDO S+instance AdmitChildIFRAME S+instance AdmitChildINPUT S+instance AdmitChildSELECT S+instance AdmitChildTEXTAREA S+instance AdmitChildLABEL S+instance AdmitChildBUTTON S+instance TAG STRIKE+instance AdmitChildCDATA STRIKE+instance AdmitChildTT STRIKE+instance AdmitChildI STRIKE+instance AdmitChildB STRIKE+instance AdmitChildU STRIKE+instance AdmitChildS STRIKE+instance AdmitChildSTRIKE STRIKE+instance AdmitChildBIG STRIKE+instance AdmitChildSMALL STRIKE+instance AdmitChildEM STRIKE+instance AdmitChildSTRONG STRIKE+instance AdmitChildDFN STRIKE+instance AdmitChildCODE STRIKE+instance AdmitChildSAMP STRIKE+instance AdmitChildKBD STRIKE+instance AdmitChildVAR STRIKE+instance AdmitChildCITE STRIKE+instance AdmitChildABBR STRIKE+instance AdmitChildACRONYM STRIKE+instance AdmitChildA STRIKE+instance AdmitChildIMG STRIKE+instance AdmitChildAPPLET STRIKE+instance AdmitChildOBJECT STRIKE+instance AdmitChildFONT STRIKE+instance AdmitChildBASEFONT STRIKE+instance AdmitChildBR STRIKE+instance AdmitChildSCRIPT STRIKE+instance AdmitChildMAP STRIKE+instance AdmitChildQ STRIKE+instance AdmitChildSUB STRIKE+instance AdmitChildSUP STRIKE+instance AdmitChildSPAN STRIKE+instance AdmitChildBDO STRIKE+instance AdmitChildIFRAME STRIKE+instance AdmitChildINPUT STRIKE+instance AdmitChildSELECT STRIKE+instance AdmitChildTEXTAREA STRIKE+instance AdmitChildLABEL STRIKE+instance AdmitChildBUTTON STRIKE+instance TAG BIG+instance AdmitChildCDATA BIG+instance AdmitChildTT BIG+instance AdmitChildI BIG+instance AdmitChildB BIG+instance AdmitChildU BIG+instance AdmitChildS BIG+instance AdmitChildSTRIKE BIG+instance AdmitChildBIG BIG+instance AdmitChildSMALL BIG+instance AdmitChildEM BIG+instance AdmitChildSTRONG BIG+instance AdmitChildDFN BIG+instance AdmitChildCODE BIG+instance AdmitChildSAMP BIG+instance AdmitChildKBD BIG+instance AdmitChildVAR BIG+instance AdmitChildCITE BIG+instance AdmitChildABBR BIG+instance AdmitChildACRONYM BIG+instance AdmitChildA BIG+instance AdmitChildIMG BIG+instance AdmitChildAPPLET BIG+instance AdmitChildOBJECT BIG+instance AdmitChildFONT BIG+instance AdmitChildBASEFONT BIG+instance AdmitChildBR BIG+instance AdmitChildSCRIPT BIG+instance AdmitChildMAP BIG+instance AdmitChildQ BIG+instance AdmitChildSUB BIG+instance AdmitChildSUP BIG+instance AdmitChildSPAN BIG+instance AdmitChildBDO BIG+instance AdmitChildIFRAME BIG+instance AdmitChildINPUT BIG+instance AdmitChildSELECT BIG+instance AdmitChildTEXTAREA BIG+instance AdmitChildLABEL BIG+instance AdmitChildBUTTON BIG+instance TAG SMALL+instance AdmitChildCDATA SMALL+instance AdmitChildTT SMALL+instance AdmitChildI SMALL+instance AdmitChildB SMALL+instance AdmitChildU SMALL+instance AdmitChildS SMALL+instance AdmitChildSTRIKE SMALL+instance AdmitChildBIG SMALL+instance AdmitChildSMALL SMALL+instance AdmitChildEM SMALL+instance AdmitChildSTRONG SMALL+instance AdmitChildDFN SMALL+instance AdmitChildCODE SMALL+instance AdmitChildSAMP SMALL+instance AdmitChildKBD SMALL+instance AdmitChildVAR SMALL+instance AdmitChildCITE SMALL+instance AdmitChildABBR SMALL+instance AdmitChildACRONYM SMALL+instance AdmitChildA SMALL+instance AdmitChildIMG SMALL+instance AdmitChildAPPLET SMALL+instance AdmitChildOBJECT SMALL+instance AdmitChildFONT SMALL+instance AdmitChildBASEFONT SMALL+instance AdmitChildBR SMALL+instance AdmitChildSCRIPT SMALL+instance AdmitChildMAP SMALL+instance AdmitChildQ SMALL+instance AdmitChildSUB SMALL+instance AdmitChildSUP SMALL+instance AdmitChildSPAN SMALL+instance AdmitChildBDO SMALL+instance AdmitChildIFRAME SMALL+instance AdmitChildINPUT SMALL+instance AdmitChildSELECT SMALL+instance AdmitChildTEXTAREA SMALL+instance AdmitChildLABEL SMALL+instance AdmitChildBUTTON SMALL+instance TAG EM+instance AdmitChildCDATA EM+instance AdmitChildTT EM+instance AdmitChildI EM+instance AdmitChildB EM+instance AdmitChildU EM+instance AdmitChildS EM+instance AdmitChildSTRIKE EM+instance AdmitChildBIG EM+instance AdmitChildSMALL EM+instance AdmitChildEM EM+instance AdmitChildSTRONG EM+instance AdmitChildDFN EM+instance AdmitChildCODE EM+instance AdmitChildSAMP EM+instance AdmitChildKBD EM+instance AdmitChildVAR EM+instance AdmitChildCITE EM+instance AdmitChildABBR EM+instance AdmitChildACRONYM EM+instance AdmitChildA EM+instance AdmitChildIMG EM+instance AdmitChildAPPLET EM+instance AdmitChildOBJECT EM+instance AdmitChildFONT EM+instance AdmitChildBASEFONT EM+instance AdmitChildBR EM+instance AdmitChildSCRIPT EM+instance AdmitChildMAP EM+instance AdmitChildQ EM+instance AdmitChildSUB EM+instance AdmitChildSUP EM+instance AdmitChildSPAN EM+instance AdmitChildBDO EM+instance AdmitChildIFRAME EM+instance AdmitChildINPUT EM+instance AdmitChildSELECT EM+instance AdmitChildTEXTAREA EM+instance AdmitChildLABEL EM+instance AdmitChildBUTTON EM+instance TAG STRONG+instance AdmitChildCDATA STRONG+instance AdmitChildTT STRONG+instance AdmitChildI STRONG+instance AdmitChildB STRONG+instance AdmitChildU STRONG+instance AdmitChildS STRONG+instance AdmitChildSTRIKE STRONG+instance AdmitChildBIG STRONG+instance AdmitChildSMALL STRONG+instance AdmitChildEM STRONG+instance AdmitChildSTRONG STRONG+instance AdmitChildDFN STRONG+instance AdmitChildCODE STRONG+instance AdmitChildSAMP STRONG+instance AdmitChildKBD STRONG+instance AdmitChildVAR STRONG+instance AdmitChildCITE STRONG+instance AdmitChildABBR STRONG+instance AdmitChildACRONYM STRONG+instance AdmitChildA STRONG+instance AdmitChildIMG STRONG+instance AdmitChildAPPLET STRONG+instance AdmitChildOBJECT STRONG+instance AdmitChildFONT STRONG+instance AdmitChildBASEFONT STRONG+instance AdmitChildBR STRONG+instance AdmitChildSCRIPT STRONG+instance AdmitChildMAP STRONG+instance AdmitChildQ STRONG+instance AdmitChildSUB STRONG+instance AdmitChildSUP STRONG+instance AdmitChildSPAN STRONG+instance AdmitChildBDO STRONG+instance AdmitChildIFRAME STRONG+instance AdmitChildINPUT STRONG+instance AdmitChildSELECT STRONG+instance AdmitChildTEXTAREA STRONG+instance AdmitChildLABEL STRONG+instance AdmitChildBUTTON STRONG+instance TAG DFN+instance AdmitChildCDATA DFN+instance AdmitChildTT DFN+instance AdmitChildI DFN+instance AdmitChildB DFN+instance AdmitChildU DFN+instance AdmitChildS DFN+instance AdmitChildSTRIKE DFN+instance AdmitChildBIG DFN+instance AdmitChildSMALL DFN+instance AdmitChildEM DFN+instance AdmitChildSTRONG DFN+instance AdmitChildDFN DFN+instance AdmitChildCODE DFN+instance AdmitChildSAMP DFN+instance AdmitChildKBD DFN+instance AdmitChildVAR DFN+instance AdmitChildCITE DFN+instance AdmitChildABBR DFN+instance AdmitChildACRONYM DFN+instance AdmitChildA DFN+instance AdmitChildIMG DFN+instance AdmitChildAPPLET DFN+instance AdmitChildOBJECT DFN+instance AdmitChildFONT DFN+instance AdmitChildBASEFONT DFN+instance AdmitChildBR DFN+instance AdmitChildSCRIPT DFN+instance AdmitChildMAP DFN+instance AdmitChildQ DFN+instance AdmitChildSUB DFN+instance AdmitChildSUP DFN+instance AdmitChildSPAN DFN+instance AdmitChildBDO DFN+instance AdmitChildIFRAME DFN+instance AdmitChildINPUT DFN+instance AdmitChildSELECT DFN+instance AdmitChildTEXTAREA DFN+instance AdmitChildLABEL DFN+instance AdmitChildBUTTON DFN+instance TAG CODE+instance AdmitChildCDATA CODE+instance AdmitChildTT CODE+instance AdmitChildI CODE+instance AdmitChildB CODE+instance AdmitChildU CODE+instance AdmitChildS CODE+instance AdmitChildSTRIKE CODE+instance AdmitChildBIG CODE+instance AdmitChildSMALL CODE+instance AdmitChildEM CODE+instance AdmitChildSTRONG CODE+instance AdmitChildDFN CODE+instance AdmitChildCODE CODE+instance AdmitChildSAMP CODE+instance AdmitChildKBD CODE+instance AdmitChildVAR CODE+instance AdmitChildCITE CODE+instance AdmitChildABBR CODE+instance AdmitChildACRONYM CODE+instance AdmitChildA CODE+instance AdmitChildIMG CODE+instance AdmitChildAPPLET CODE+instance AdmitChildOBJECT CODE+instance AdmitChildFONT CODE+instance AdmitChildBASEFONT CODE+instance AdmitChildBR CODE+instance AdmitChildSCRIPT CODE+instance AdmitChildMAP CODE+instance AdmitChildQ CODE+instance AdmitChildSUB CODE+instance AdmitChildSUP CODE+instance AdmitChildSPAN CODE+instance AdmitChildBDO CODE+instance AdmitChildIFRAME CODE+instance AdmitChildINPUT CODE+instance AdmitChildSELECT CODE+instance AdmitChildTEXTAREA CODE+instance AdmitChildLABEL CODE+instance AdmitChildBUTTON CODE+instance TAG SAMP+instance AdmitChildCDATA SAMP+instance AdmitChildTT SAMP+instance AdmitChildI SAMP+instance AdmitChildB SAMP+instance AdmitChildU SAMP+instance AdmitChildS SAMP+instance AdmitChildSTRIKE SAMP+instance AdmitChildBIG SAMP+instance AdmitChildSMALL SAMP+instance AdmitChildEM SAMP+instance AdmitChildSTRONG SAMP+instance AdmitChildDFN SAMP+instance AdmitChildCODE SAMP+instance AdmitChildSAMP SAMP+instance AdmitChildKBD SAMP+instance AdmitChildVAR SAMP+instance AdmitChildCITE SAMP+instance AdmitChildABBR SAMP+instance AdmitChildACRONYM SAMP+instance AdmitChildA SAMP+instance AdmitChildIMG SAMP+instance AdmitChildAPPLET SAMP+instance AdmitChildOBJECT SAMP+instance AdmitChildFONT SAMP+instance AdmitChildBASEFONT SAMP+instance AdmitChildBR SAMP+instance AdmitChildSCRIPT SAMP+instance AdmitChildMAP SAMP+instance AdmitChildQ SAMP+instance AdmitChildSUB SAMP+instance AdmitChildSUP SAMP+instance AdmitChildSPAN SAMP+instance AdmitChildBDO SAMP+instance AdmitChildIFRAME SAMP+instance AdmitChildINPUT SAMP+instance AdmitChildSELECT SAMP+instance AdmitChildTEXTAREA SAMP+instance AdmitChildLABEL SAMP+instance AdmitChildBUTTON SAMP+instance TAG KBD+instance AdmitChildCDATA KBD+instance AdmitChildTT KBD+instance AdmitChildI KBD+instance AdmitChildB KBD+instance AdmitChildU KBD+instance AdmitChildS KBD+instance AdmitChildSTRIKE KBD+instance AdmitChildBIG KBD+instance AdmitChildSMALL KBD+instance AdmitChildEM KBD+instance AdmitChildSTRONG KBD+instance AdmitChildDFN KBD+instance AdmitChildCODE KBD+instance AdmitChildSAMP KBD+instance AdmitChildKBD KBD+instance AdmitChildVAR KBD+instance AdmitChildCITE KBD+instance AdmitChildABBR KBD+instance AdmitChildACRONYM KBD+instance AdmitChildA KBD+instance AdmitChildIMG KBD+instance AdmitChildAPPLET KBD+instance AdmitChildOBJECT KBD+instance AdmitChildFONT KBD+instance AdmitChildBASEFONT KBD+instance AdmitChildBR KBD+instance AdmitChildSCRIPT KBD+instance AdmitChildMAP KBD+instance AdmitChildQ KBD+instance AdmitChildSUB KBD+instance AdmitChildSUP KBD+instance AdmitChildSPAN KBD+instance AdmitChildBDO KBD+instance AdmitChildIFRAME KBD+instance AdmitChildINPUT KBD+instance AdmitChildSELECT KBD+instance AdmitChildTEXTAREA KBD+instance AdmitChildLABEL KBD+instance AdmitChildBUTTON KBD+instance TAG VAR+instance AdmitChildCDATA VAR+instance AdmitChildTT VAR+instance AdmitChildI VAR+instance AdmitChildB VAR+instance AdmitChildU VAR+instance AdmitChildS VAR+instance AdmitChildSTRIKE VAR+instance AdmitChildBIG VAR+instance AdmitChildSMALL VAR+instance AdmitChildEM VAR+instance AdmitChildSTRONG VAR+instance AdmitChildDFN VAR+instance AdmitChildCODE VAR+instance AdmitChildSAMP VAR+instance AdmitChildKBD VAR+instance AdmitChildVAR VAR+instance AdmitChildCITE VAR+instance AdmitChildABBR VAR+instance AdmitChildACRONYM VAR+instance AdmitChildA VAR+instance AdmitChildIMG VAR+instance AdmitChildAPPLET VAR+instance AdmitChildOBJECT VAR+instance AdmitChildFONT VAR+instance AdmitChildBASEFONT VAR+instance AdmitChildBR VAR+instance AdmitChildSCRIPT VAR+instance AdmitChildMAP VAR+instance AdmitChildQ VAR+instance AdmitChildSUB VAR+instance AdmitChildSUP VAR+instance AdmitChildSPAN VAR+instance AdmitChildBDO VAR+instance AdmitChildIFRAME VAR+instance AdmitChildINPUT VAR+instance AdmitChildSELECT VAR+instance AdmitChildTEXTAREA VAR+instance AdmitChildLABEL VAR+instance AdmitChildBUTTON VAR+instance TAG CITE+instance AdmitChildCDATA CITE+instance AdmitChildTT CITE+instance AdmitChildI CITE+instance AdmitChildB CITE+instance AdmitChildU CITE+instance AdmitChildS CITE+instance AdmitChildSTRIKE CITE+instance AdmitChildBIG CITE+instance AdmitChildSMALL CITE+instance AdmitChildEM CITE+instance AdmitChildSTRONG CITE+instance AdmitChildDFN CITE+instance AdmitChildCODE CITE+instance AdmitChildSAMP CITE+instance AdmitChildKBD CITE+instance AdmitChildVAR CITE+instance AdmitChildCITE CITE+instance AdmitChildABBR CITE+instance AdmitChildACRONYM CITE+instance AdmitChildA CITE+instance AdmitChildIMG CITE+instance AdmitChildAPPLET CITE+instance AdmitChildOBJECT CITE+instance AdmitChildFONT CITE+instance AdmitChildBASEFONT CITE+instance AdmitChildBR CITE+instance AdmitChildSCRIPT CITE+instance AdmitChildMAP CITE+instance AdmitChildQ CITE+instance AdmitChildSUB CITE+instance AdmitChildSUP CITE+instance AdmitChildSPAN CITE+instance AdmitChildBDO CITE+instance AdmitChildIFRAME CITE+instance AdmitChildINPUT CITE+instance AdmitChildSELECT CITE+instance AdmitChildTEXTAREA CITE+instance AdmitChildLABEL CITE+instance AdmitChildBUTTON CITE+instance TAG ABBR+instance AdmitChildCDATA ABBR+instance AdmitChildTT ABBR+instance AdmitChildI ABBR+instance AdmitChildB ABBR+instance AdmitChildU ABBR+instance AdmitChildS ABBR+instance AdmitChildSTRIKE ABBR+instance AdmitChildBIG ABBR+instance AdmitChildSMALL ABBR+instance AdmitChildEM ABBR+instance AdmitChildSTRONG ABBR+instance AdmitChildDFN ABBR+instance AdmitChildCODE ABBR+instance AdmitChildSAMP ABBR+instance AdmitChildKBD ABBR+instance AdmitChildVAR ABBR+instance AdmitChildCITE ABBR+instance AdmitChildABBR ABBR+instance AdmitChildACRONYM ABBR+instance AdmitChildA ABBR+instance AdmitChildIMG ABBR+instance AdmitChildAPPLET ABBR+instance AdmitChildOBJECT ABBR+instance AdmitChildFONT ABBR+instance AdmitChildBASEFONT ABBR+instance AdmitChildBR ABBR+instance AdmitChildSCRIPT ABBR+instance AdmitChildMAP ABBR+instance AdmitChildQ ABBR+instance AdmitChildSUB ABBR+instance AdmitChildSUP ABBR+instance AdmitChildSPAN ABBR+instance AdmitChildBDO ABBR+instance AdmitChildIFRAME ABBR+instance AdmitChildINPUT ABBR+instance AdmitChildSELECT ABBR+instance AdmitChildTEXTAREA ABBR+instance AdmitChildLABEL ABBR+instance AdmitChildBUTTON ABBR+instance TAG ACRONYM+instance AdmitChildCDATA ACRONYM+instance AdmitChildTT ACRONYM+instance AdmitChildI ACRONYM+instance AdmitChildB ACRONYM+instance AdmitChildU ACRONYM+instance AdmitChildS ACRONYM+instance AdmitChildSTRIKE ACRONYM+instance AdmitChildBIG ACRONYM+instance AdmitChildSMALL ACRONYM+instance AdmitChildEM ACRONYM+instance AdmitChildSTRONG ACRONYM+instance AdmitChildDFN ACRONYM+instance AdmitChildCODE ACRONYM+instance AdmitChildSAMP ACRONYM+instance AdmitChildKBD ACRONYM+instance AdmitChildVAR ACRONYM+instance AdmitChildCITE ACRONYM+instance AdmitChildABBR ACRONYM+instance AdmitChildACRONYM ACRONYM+instance AdmitChildA ACRONYM+instance AdmitChildIMG ACRONYM+instance AdmitChildAPPLET ACRONYM+instance AdmitChildOBJECT ACRONYM+instance AdmitChildFONT ACRONYM+instance AdmitChildBASEFONT ACRONYM+instance AdmitChildBR ACRONYM+instance AdmitChildSCRIPT ACRONYM+instance AdmitChildMAP ACRONYM+instance AdmitChildQ ACRONYM+instance AdmitChildSUB ACRONYM+instance AdmitChildSUP ACRONYM+instance AdmitChildSPAN ACRONYM+instance AdmitChildBDO ACRONYM+instance AdmitChildIFRAME ACRONYM+instance AdmitChildINPUT ACRONYM+instance AdmitChildSELECT ACRONYM+instance AdmitChildTEXTAREA ACRONYM+instance AdmitChildLABEL ACRONYM+instance AdmitChildBUTTON ACRONYM+data ALIGN_bottom = ALIGN_bottom+data ALIGN_center = ALIGN_center+data ALIGN_char = ALIGN_char+data ALIGN_justify = ALIGN_justify+data ALIGN_left = ALIGN_left+data ALIGN_middle = ALIGN_middle+data ALIGN_right = ALIGN_right+data ALIGN_top = ALIGN_top+data CHECKED_checked = CHECKED_checked+data CLEAR_all = CLEAR_all+data CLEAR_left = CLEAR_left+data CLEAR_none = CLEAR_none+data CLEAR_right = CLEAR_right+data COMPACT_compact = COMPACT_compact+data DECLARE_declare = DECLARE_declare+data DEFER_defer = DEFER_defer+data DIR_ltr = DIR_ltr+data DIR_rtl = DIR_rtl+data DISABLED_disabled = DISABLED_disabled+data FRAME_above = FRAME_above+data FRAME_below = FRAME_below+data FRAME_border = FRAME_border+data FRAME_box = FRAME_box+data FRAME_hsides = FRAME_hsides+data FRAME_lhs = FRAME_lhs+data FRAME_rhs = FRAME_rhs+data FRAME_void = FRAME_void+data FRAME_vsides = FRAME_vsides+data ISMAP_ismap = ISMAP_ismap+data METHOD_GET = METHOD_GET+data METHOD_POST = METHOD_POST+data MULTIPLE_multiple = MULTIPLE_multiple+data NOHREF_nohref = NOHREF_nohref+data NOSHADE_noshade = NOSHADE_noshade+data NOWRAP_nowrap = NOWRAP_nowrap+data READONLY_readonly = READONLY_readonly+data RULES_all = RULES_all+data RULES_cols = RULES_cols+data RULES_groups = RULES_groups+data RULES_none = RULES_none+data RULES_rows = RULES_rows+data SCOPE_col = SCOPE_col+data SCOPE_colgroup = SCOPE_colgroup+data SCOPE_row = SCOPE_row+data SCOPE_rowgroup = SCOPE_rowgroup+data SCROLLING_auto = SCROLLING_auto+data SCROLLING_no = SCROLLING_no+data SCROLLING_yes = SCROLLING_yes+data SELECTED_selected = SELECTED_selected+data SHAPE_circle = SHAPE_circle+data SHAPE_default' = SHAPE_default'+data SHAPE_poly = SHAPE_poly+data SHAPE_rect = SHAPE_rect+data TYPE_BUTTON = TYPE_BUTTON+data TYPE_CHECKBOX = TYPE_CHECKBOX+data TYPE_FILE = TYPE_FILE+data TYPE_HIDDEN = TYPE_HIDDEN+data TYPE_IMAGE = TYPE_IMAGE+data TYPE_PASSWORD = TYPE_PASSWORD+data TYPE_RADIO = TYPE_RADIO+data TYPE_RESET = TYPE_RESET+data TYPE_SUBMIT = TYPE_SUBMIT+data TYPE_TEXT = TYPE_TEXT+data TYPE_button = TYPE_button+data TYPE_circle = TYPE_circle+data TYPE_disc = TYPE_disc+data TYPE_reset = TYPE_reset+data TYPE_square = TYPE_square+data TYPE_submit = TYPE_submit+data VALIGN_baseline = VALIGN_baseline+data VALIGN_bottom = VALIGN_bottom+data VALIGN_middle = VALIGN_middle+data VALIGN_top = VALIGN_top+data VALUETYPE_DATA = VALUETYPE_DATA+data VALUETYPE_OBJECT = VALUETYPE_OBJECT+data VALUETYPE_REF = VALUETYPE_REF+instance ATTRIBUTE ABBR+instance ATTRIBUTE ACCEPT+instance ATTRIBUTE ACCEPT_CHARSET+instance ATTRIBUTE ACCESSKEY+instance ATTRIBUTE ACTION+instance ATTRIBUTE ALIGN+instance ATTRIBUTE ALINK+instance ATTRIBUTE ALT+instance ATTRIBUTE ARCHIVE+instance ATTRIBUTE AXIS+instance ATTRIBUTE BACKGROUND+instance ATTRIBUTE BGCOLOR+instance ATTRIBUTE BORDER+instance ATTRIBUTE CELLPADDING+instance ATTRIBUTE CELLSPACING+instance ATTRIBUTE CHAR+instance ATTRIBUTE CHAROFF+instance ATTRIBUTE CHARSET+instance ATTRIBUTE CHECKED+instance ATTRIBUTE CITE+instance ATTRIBUTE CLASS+instance ATTRIBUTE CLASSID+instance ATTRIBUTE CLEAR+instance ATTRIBUTE CODE+instance ATTRIBUTE CODEBASE+instance ATTRIBUTE CODETYPE+instance ATTRIBUTE COLOR+instance ATTRIBUTE COLS+instance ATTRIBUTE COLSPAN+instance ATTRIBUTE COMPACT+instance ATTRIBUTE CONTENT+instance ATTRIBUTE COORDS+instance ATTRIBUTE DATA+instance ATTRIBUTE DATAPAGESIZE+instance ATTRIBUTE DATETIME+instance ATTRIBUTE DECLARE+instance ATTRIBUTE DEFER+instance ATTRIBUTE DIR+instance ATTRIBUTE DISABLED+instance ATTRIBUTE ENCTYPE+instance ATTRIBUTE EVENT+instance ATTRIBUTE FACE+instance ATTRIBUTE FOR+instance ATTRIBUTE FRAME+instance ATTRIBUTE FRAMEBORDER+instance ATTRIBUTE HEADERS+instance ATTRIBUTE HEIGHT+instance ATTRIBUTE HREF+instance ATTRIBUTE HREFLANG+instance ATTRIBUTE HSPACE+instance ATTRIBUTE HTTP_EQUIV+instance ATTRIBUTE ID+instance ATTRIBUTE ISMAP+instance ATTRIBUTE LABEL+instance ATTRIBUTE LANG+instance ATTRIBUTE LANGUAGE+instance ATTRIBUTE LINK+instance ATTRIBUTE LONGDESC+instance ATTRIBUTE MARGINHEIGHT+instance ATTRIBUTE MARGINWIDTH+instance ATTRIBUTE MAXLENGTH+instance ATTRIBUTE MEDIA+instance ATTRIBUTE METHOD+instance ATTRIBUTE MULTIPLE+instance ATTRIBUTE NAME+instance ATTRIBUTE NOHREF+instance ATTRIBUTE NOSHADE+instance ATTRIBUTE NOWRAP+instance ATTRIBUTE OBJECT+instance ATTRIBUTE ONBLUR+instance ATTRIBUTE ONCHANGE+instance ATTRIBUTE ONCLICK+instance ATTRIBUTE ONDBLCLICK+instance ATTRIBUTE ONFOCUS+instance ATTRIBUTE ONKEYDOWN+instance ATTRIBUTE ONKEYPRESS+instance ATTRIBUTE ONKEYUP+instance ATTRIBUTE ONLOAD+instance ATTRIBUTE ONMOUSEDOWN+instance ATTRIBUTE ONMOUSEMOVE+instance ATTRIBUTE ONMOUSEOUT+instance ATTRIBUTE ONMOUSEOVER+instance ATTRIBUTE ONMOUSEUP+instance ATTRIBUTE ONRESET+instance ATTRIBUTE ONSELECT+instance ATTRIBUTE ONSUBMIT+instance ATTRIBUTE ONUNLOAD+instance ATTRIBUTE PROFILE+instance ATTRIBUTE PROMPT+instance ATTRIBUTE READONLY+instance ATTRIBUTE REL+instance ATTRIBUTE REV+instance ATTRIBUTE ROWS+instance ATTRIBUTE ROWSPAN+instance ATTRIBUTE RULES+instance ATTRIBUTE SCHEME+instance ATTRIBUTE SCOPE+instance ATTRIBUTE SCROLLING+instance ATTRIBUTE SELECTED+instance ATTRIBUTE SHAPE+instance ATTRIBUTE SIZE+instance ATTRIBUTE SPAN+instance ATTRIBUTE SRC+instance ATTRIBUTE STANDBY+instance ATTRIBUTE START+instance ATTRIBUTE STYLE+instance ATTRIBUTE SUMMARY+instance ATTRIBUTE TABINDEX+instance ATTRIBUTE TARGET+instance ATTRIBUTE TEXT+instance ATTRIBUTE TITLE+instance ATTRIBUTE TYPE+instance ATTRIBUTE USEMAP+instance ATTRIBUTE VALIGN+instance ATTRIBUTE VALUE+instance ATTRIBUTE VALUETYPE+instance ATTRIBUTE VERSION+instance ATTRIBUTE VLINK+instance ATTRIBUTE VSPACE+instance ATTRIBUTE WIDTH+instance AttrValueABBR Char+instance AttrValueABBR a => AttrValueABBR [a]+instance AttrValueACCEPT Char+instance AttrValueACCEPT a => AttrValueACCEPT [a]+instance AttrValueACCEPT_CHARSET Char+instance AttrValueACCEPT_CHARSET a => AttrValueACCEPT_CHARSET [a]+instance AttrValueACCESSKEY Char+instance AttrValueACCESSKEY a => AttrValueACCESSKEY [a]+instance AttrValueACTION Char+instance AttrValueACTION a => AttrValueACTION [a]+instance AttrValueALIGN ALIGN_bottom+instance AttrValueALIGN ALIGN_center+instance AttrValueALIGN ALIGN_char+instance AttrValueALIGN ALIGN_justify+instance AttrValueALIGN ALIGN_left+instance AttrValueALIGN ALIGN_middle+instance AttrValueALIGN ALIGN_right+instance AttrValueALIGN ALIGN_top+instance AttrValueALINK Char+instance AttrValueALINK a => AttrValueALINK [a]+instance AttrValueALT Char+instance AttrValueALT a => AttrValueALT [a]+instance AttrValueARCHIVE Char+instance AttrValueARCHIVE a => AttrValueARCHIVE [a]+instance AttrValueAXIS Char+instance AttrValueAXIS a => AttrValueAXIS [a]+instance AttrValueBACKGROUND Char+instance AttrValueBACKGROUND a => AttrValueBACKGROUND [a]+instance AttrValueBGCOLOR Char+instance AttrValueBGCOLOR a => AttrValueBGCOLOR [a]+instance AttrValueBORDER Char+instance AttrValueBORDER a => AttrValueBORDER [a]+instance AttrValueCELLPADDING Char+instance AttrValueCELLPADDING a => AttrValueCELLPADDING [a]+instance AttrValueCELLSPACING Char+instance AttrValueCELLSPACING a => AttrValueCELLSPACING [a]+instance AttrValueCHAR Char+instance AttrValueCHAR a => AttrValueCHAR [a]+instance AttrValueCHAROFF Char+instance AttrValueCHAROFF a => AttrValueCHAROFF [a]+instance AttrValueCHARSET Char+instance AttrValueCHARSET a => AttrValueCHARSET [a]+instance AttrValueCHECKED CHECKED_checked+instance AttrValueCITE Char+instance AttrValueCITE a => AttrValueCITE [a]+instance AttrValueCLASS Char+instance AttrValueCLASS a => AttrValueCLASS [a]+instance AttrValueCLASSID Char+instance AttrValueCLASSID a => AttrValueCLASSID [a]+instance AttrValueCLEAR CLEAR_all+instance AttrValueCLEAR CLEAR_left+instance AttrValueCLEAR CLEAR_none+instance AttrValueCLEAR CLEAR_right+instance AttrValueCODE Char+instance AttrValueCODE a => AttrValueCODE [a]+instance AttrValueCODEBASE Char+instance AttrValueCODEBASE a => AttrValueCODEBASE [a]+instance AttrValueCODETYPE Char+instance AttrValueCODETYPE a => AttrValueCODETYPE [a]+instance AttrValueCOLOR Char+instance AttrValueCOLOR a => AttrValueCOLOR [a]+instance AttrValueCOLS Int+instance AttrValueCOLSPAN Int+instance AttrValueCOMPACT COMPACT_compact+instance AttrValueCONTENT Char+instance AttrValueCONTENT a => AttrValueCONTENT [a]+instance AttrValueCOORDS Char+instance AttrValueCOORDS a => AttrValueCOORDS [a]+instance AttrValueDATA Char+instance AttrValueDATA a => AttrValueDATA [a]+instance AttrValueDATAPAGESIZE Char+instance AttrValueDATAPAGESIZE a => AttrValueDATAPAGESIZE [a]+instance AttrValueDATETIME Char+instance AttrValueDATETIME a => AttrValueDATETIME [a]+instance AttrValueDECLARE DECLARE_declare+instance AttrValueDEFER DEFER_defer+instance AttrValueDIR DIR_ltr+instance AttrValueDIR DIR_rtl+instance AttrValueDISABLED DISABLED_disabled+instance AttrValueENCTYPE Char+instance AttrValueENCTYPE a => AttrValueENCTYPE [a]+instance AttrValueEVENT Char+instance AttrValueEVENT a => AttrValueEVENT [a]+instance AttrValueFACE Char+instance AttrValueFACE a => AttrValueFACE [a]+instance AttrValueFOR Char+instance AttrValueFOR a => AttrValueFOR [a]+instance AttrValueFRAME FRAME_above+instance AttrValueFRAME FRAME_below+instance AttrValueFRAME FRAME_border+instance AttrValueFRAME FRAME_box+instance AttrValueFRAME FRAME_hsides+instance AttrValueFRAME FRAME_lhs+instance AttrValueFRAME FRAME_rhs+instance AttrValueFRAME FRAME_void+instance AttrValueFRAME FRAME_vsides+instance AttrValueFRAMEBORDER Int+instance AttrValueHEADERS Char+instance AttrValueHEADERS a => AttrValueHEADERS [a]+instance AttrValueHEIGHT Char+instance AttrValueHEIGHT a => AttrValueHEIGHT [a]+instance AttrValueHREF Char+instance AttrValueHREF a => AttrValueHREF [a]+instance AttrValueHREFLANG Char+instance AttrValueHREFLANG a => AttrValueHREFLANG [a]+instance AttrValueHSPACE Char+instance AttrValueHSPACE a => AttrValueHSPACE [a]+instance AttrValueHTTP_EQUIV Char+instance AttrValueHTTP_EQUIV a => AttrValueHTTP_EQUIV [a]+instance AttrValueID Char+instance AttrValueID a => AttrValueID [a]+instance AttrValueISMAP ISMAP_ismap+instance AttrValueLABEL Char+instance AttrValueLABEL a => AttrValueLABEL [a]+instance AttrValueLANG Char+instance AttrValueLANG a => AttrValueLANG [a]+instance AttrValueLANGUAGE Char+instance AttrValueLANGUAGE a => AttrValueLANGUAGE [a]+instance AttrValueLINK Char+instance AttrValueLINK a => AttrValueLINK [a]+instance AttrValueLONGDESC Char+instance AttrValueLONGDESC a => AttrValueLONGDESC [a]+instance AttrValueMARGINHEIGHT Char+instance AttrValueMARGINHEIGHT a => AttrValueMARGINHEIGHT [a]+instance AttrValueMARGINWIDTH Char+instance AttrValueMARGINWIDTH a => AttrValueMARGINWIDTH [a]+instance AttrValueMAXLENGTH Int+instance AttrValueMEDIA Char+instance AttrValueMEDIA a => AttrValueMEDIA [a]+instance AttrValueMETHOD METHOD_GET+instance AttrValueMETHOD METHOD_POST+instance AttrValueMULTIPLE MULTIPLE_multiple+instance AttrValueNAME Char+instance AttrValueNAME a => AttrValueNAME [a]+instance AttrValueNOHREF NOHREF_nohref+instance AttrValueNOSHADE NOSHADE_noshade+instance AttrValueNOWRAP NOWRAP_nowrap+instance AttrValueOBJECT Char+instance AttrValueOBJECT a => AttrValueOBJECT [a]+instance AttrValueONBLUR Char+instance AttrValueONBLUR a => AttrValueONBLUR [a]+instance AttrValueONCHANGE Char+instance AttrValueONCHANGE a => AttrValueONCHANGE [a]+instance AttrValueONCLICK Char+instance AttrValueONCLICK a => AttrValueONCLICK [a]+instance AttrValueONDBLCLICK Char+instance AttrValueONDBLCLICK a => AttrValueONDBLCLICK [a]+instance AttrValueONFOCUS Char+instance AttrValueONFOCUS a => AttrValueONFOCUS [a]+instance AttrValueONKEYDOWN Char+instance AttrValueONKEYDOWN a => AttrValueONKEYDOWN [a]+instance AttrValueONKEYPRESS Char+instance AttrValueONKEYPRESS a => AttrValueONKEYPRESS [a]+instance AttrValueONKEYUP Char+instance AttrValueONKEYUP a => AttrValueONKEYUP [a]+instance AttrValueONLOAD Char+instance AttrValueONLOAD a => AttrValueONLOAD [a]+instance AttrValueONMOUSEDOWN Char+instance AttrValueONMOUSEDOWN a => AttrValueONMOUSEDOWN [a]+instance AttrValueONMOUSEMOVE Char+instance AttrValueONMOUSEMOVE a => AttrValueONMOUSEMOVE [a]+instance AttrValueONMOUSEOUT Char+instance AttrValueONMOUSEOUT a => AttrValueONMOUSEOUT [a]+instance AttrValueONMOUSEOVER Char+instance AttrValueONMOUSEOVER a => AttrValueONMOUSEOVER [a]+instance AttrValueONMOUSEUP Char+instance AttrValueONMOUSEUP a => AttrValueONMOUSEUP [a]+instance AttrValueONRESET Char+instance AttrValueONRESET a => AttrValueONRESET [a]+instance AttrValueONSELECT Char+instance AttrValueONSELECT a => AttrValueONSELECT [a]+instance AttrValueONSUBMIT Char+instance AttrValueONSUBMIT a => AttrValueONSUBMIT [a]+instance AttrValueONUNLOAD Char+instance AttrValueONUNLOAD a => AttrValueONUNLOAD [a]+instance AttrValuePROFILE Char+instance AttrValuePROFILE a => AttrValuePROFILE [a]+instance AttrValuePROMPT Char+instance AttrValuePROMPT a => AttrValuePROMPT [a]+instance AttrValueREADONLY READONLY_readonly+instance AttrValueREL Char+instance AttrValueREL a => AttrValueREL [a]+instance AttrValueREV Char+instance AttrValueREV a => AttrValueREV [a]+instance AttrValueROWS Int+instance AttrValueROWSPAN Int+instance AttrValueRULES RULES_all+instance AttrValueRULES RULES_cols+instance AttrValueRULES RULES_groups+instance AttrValueRULES RULES_none+instance AttrValueRULES RULES_rows+instance AttrValueSCHEME Char+instance AttrValueSCHEME a => AttrValueSCHEME [a]+instance AttrValueSCOPE SCOPE_col+instance AttrValueSCOPE SCOPE_colgroup+instance AttrValueSCOPE SCOPE_row+instance AttrValueSCOPE SCOPE_rowgroup+instance AttrValueSCROLLING SCROLLING_auto+instance AttrValueSCROLLING SCROLLING_no+instance AttrValueSCROLLING SCROLLING_yes+instance AttrValueSELECTED SELECTED_selected+instance AttrValueSHAPE SHAPE_circle+instance AttrValueSHAPE SHAPE_default'+instance AttrValueSHAPE SHAPE_poly+instance AttrValueSHAPE SHAPE_rect+instance AttrValueSIZE Char+instance AttrValueSIZE Int+instance AttrValueSIZE a => AttrValueSIZE [a]+instance AttrValueSPAN Int+instance AttrValueSRC Char+instance AttrValueSRC a => AttrValueSRC [a]+instance AttrValueSTANDBY Char+instance AttrValueSTANDBY a => AttrValueSTANDBY [a]+instance AttrValueSTART Int+instance AttrValueSTYLE Char+instance AttrValueSTYLE a => AttrValueSTYLE [a]+instance AttrValueSUMMARY Char+instance AttrValueSUMMARY a => AttrValueSUMMARY [a]+instance AttrValueTABINDEX Int+instance AttrValueTARGET Char+instance AttrValueTARGET a => AttrValueTARGET [a]+instance AttrValueTEXT Char+instance AttrValueTEXT a => AttrValueTEXT [a]+instance AttrValueTITLE Char+instance AttrValueTITLE a => AttrValueTITLE [a]+instance AttrValueTYPE Char+instance AttrValueTYPE TYPE_BUTTON+instance AttrValueTYPE TYPE_CHECKBOX+instance AttrValueTYPE TYPE_FILE+instance AttrValueTYPE TYPE_HIDDEN+instance AttrValueTYPE TYPE_IMAGE+instance AttrValueTYPE TYPE_PASSWORD+instance AttrValueTYPE TYPE_RADIO+instance AttrValueTYPE TYPE_RESET+instance AttrValueTYPE TYPE_SUBMIT+instance AttrValueTYPE TYPE_TEXT+instance AttrValueTYPE TYPE_button+instance AttrValueTYPE TYPE_circle+instance AttrValueTYPE TYPE_disc+instance AttrValueTYPE TYPE_reset+instance AttrValueTYPE TYPE_square+instance AttrValueTYPE TYPE_submit+instance AttrValueTYPE a => AttrValueTYPE [a]+instance AttrValueUSEMAP Char+instance AttrValueUSEMAP a => AttrValueUSEMAP [a]+instance AttrValueVALIGN VALIGN_baseline+instance AttrValueVALIGN VALIGN_bottom+instance AttrValueVALIGN VALIGN_middle+instance AttrValueVALIGN VALIGN_top+instance AttrValueVALUE Char+instance AttrValueVALUE Int+instance AttrValueVALUE a => AttrValueVALUE [a]+instance AttrValueVALUETYPE VALUETYPE_DATA+instance AttrValueVALUETYPE VALUETYPE_OBJECT+instance AttrValueVALUETYPE VALUETYPE_REF+instance AttrValueVERSION Char+instance AttrValueVERSION a => AttrValueVERSION [a]+instance AttrValueVLINK Char+instance AttrValueVLINK a => AttrValueVLINK [a]+instance AttrValueVSPACE Char+instance AttrValueVSPACE a => AttrValueVSPACE [a]+instance AttrValueWIDTH Char+instance AttrValueWIDTH Int+instance AttrValueWIDTH a => AttrValueWIDTH [a]+instance Show ALIGN_bottom where show ALIGN_bottom = "bottom"+instance Show ALIGN_center where show ALIGN_center = "center"+instance Show ALIGN_char where show ALIGN_char = "char"+instance Show ALIGN_justify where show ALIGN_justify = "justify"+instance Show ALIGN_left where show ALIGN_left = "left"+instance Show ALIGN_middle where show ALIGN_middle = "middle"+instance Show ALIGN_right where show ALIGN_right = "right"+instance Show ALIGN_top where show ALIGN_top = "top"+instance Show CHECKED_checked where show CHECKED_checked = "checked"+instance Show CLEAR_all where show CLEAR_all = "all"+instance Show CLEAR_left where show CLEAR_left = "left"+instance Show CLEAR_none where show CLEAR_none = "none"+instance Show CLEAR_right where show CLEAR_right = "right"+instance Show COMPACT_compact where show COMPACT_compact = "compact"+instance Show DECLARE_declare where show DECLARE_declare = "declare"+instance Show DEFER_defer where show DEFER_defer = "defer"+instance Show DIR_ltr where show DIR_ltr = "ltr"+instance Show DIR_rtl where show DIR_rtl = "rtl"+instance Show DISABLED_disabled where show DISABLED_disabled = "disabled"+instance Show FRAME_above where show FRAME_above = "above"+instance Show FRAME_below where show FRAME_below = "below"+instance Show FRAME_border where show FRAME_border = "border"+instance Show FRAME_box where show FRAME_box = "box"+instance Show FRAME_hsides where show FRAME_hsides = "hsides"+instance Show FRAME_lhs where show FRAME_lhs = "lhs"+instance Show FRAME_rhs where show FRAME_rhs = "rhs"+instance Show FRAME_void where show FRAME_void = "void"+instance Show FRAME_vsides where show FRAME_vsides = "vsides"+instance Show ISMAP_ismap where show ISMAP_ismap = "ismap"+instance Show METHOD_GET where show METHOD_GET = "GET"+instance Show METHOD_POST where show METHOD_POST = "POST"+instance Show MULTIPLE_multiple where show MULTIPLE_multiple = "multiple"+instance Show NOHREF_nohref where show NOHREF_nohref = "nohref"+instance Show NOSHADE_noshade where show NOSHADE_noshade = "noshade"+instance Show NOWRAP_nowrap where show NOWRAP_nowrap = "nowrap"+instance Show READONLY_readonly where show READONLY_readonly = "readonly"+instance Show RULES_all where show RULES_all = "all"+instance Show RULES_cols where show RULES_cols = "cols"+instance Show RULES_groups where show RULES_groups = "groups"+instance Show RULES_none where show RULES_none = "none"+instance Show RULES_rows where show RULES_rows = "rows"+instance Show SCOPE_col where show SCOPE_col = "col"+instance Show SCOPE_colgroup where show SCOPE_colgroup = "colgroup"+instance Show SCOPE_row where show SCOPE_row = "row"+instance Show SCOPE_rowgroup where show SCOPE_rowgroup = "rowgroup"+instance Show SCROLLING_auto where show SCROLLING_auto = "auto"+instance Show SCROLLING_no where show SCROLLING_no = "no"+instance Show SCROLLING_yes where show SCROLLING_yes = "yes"+instance Show SELECTED_selected where show SELECTED_selected = "selected"+instance Show SHAPE_circle where show SHAPE_circle = "circle"+instance Show SHAPE_default' where show SHAPE_default' = "default"+instance Show SHAPE_poly where show SHAPE_poly = "poly"+instance Show SHAPE_rect where show SHAPE_rect = "rect"+instance Show TYPE_BUTTON where show TYPE_BUTTON = "BUTTON"+instance Show TYPE_CHECKBOX where show TYPE_CHECKBOX = "CHECKBOX"+instance Show TYPE_FILE where show TYPE_FILE = "FILE"+instance Show TYPE_HIDDEN where show TYPE_HIDDEN = "HIDDEN"+instance Show TYPE_IMAGE where show TYPE_IMAGE = "IMAGE"+instance Show TYPE_PASSWORD where show TYPE_PASSWORD = "PASSWORD"+instance Show TYPE_RADIO where show TYPE_RADIO = "RADIO"+instance Show TYPE_RESET where show TYPE_RESET = "RESET"+instance Show TYPE_SUBMIT where show TYPE_SUBMIT = "SUBMIT"+instance Show TYPE_TEXT where show TYPE_TEXT = "TEXT"+instance Show TYPE_button where show TYPE_button = "button"+instance Show TYPE_circle where show TYPE_circle = "circle"+instance Show TYPE_disc where show TYPE_disc = "disc"+instance Show TYPE_reset where show TYPE_reset = "reset"+instance Show TYPE_square where show TYPE_square = "square"+instance Show TYPE_submit where show TYPE_submit = "submit"+instance Show VALIGN_baseline where show VALIGN_baseline = "baseline"+instance Show VALIGN_bottom where show VALIGN_bottom = "bottom"+instance Show VALIGN_middle where show VALIGN_middle = "middle"+instance Show VALIGN_top where show VALIGN_top = "top"+instance Show VALUETYPE_DATA where show VALUETYPE_DATA = "DATA"+instance Show VALUETYPE_OBJECT where show VALUETYPE_OBJECT = "OBJECT"+instance Show VALUETYPE_REF where show VALUETYPE_REF = "REF"+instance AdmitAttrABBR TD+instance AdmitAttrABBR TH+instance AdmitAttrACCEPT INPUT+instance AdmitAttrACCEPT_CHARSET FORM+instance AdmitAttrACCESSKEY A+instance AdmitAttrACCESSKEY AREA+instance AdmitAttrACCESSKEY BUTTON+instance AdmitAttrACCESSKEY INPUT+instance AdmitAttrACCESSKEY LABEL+instance AdmitAttrACCESSKEY LEGEND+instance AdmitAttrACCESSKEY TEXTAREA+instance AdmitAttrACTION FORM+instance AdmitAttrALIGN APPLET+instance AdmitAttrALIGN CAPTION+instance AdmitAttrALIGN COL+instance AdmitAttrALIGN COLGROUP+instance AdmitAttrALIGN DIV+instance AdmitAttrALIGN H1+instance AdmitAttrALIGN H2+instance AdmitAttrALIGN H3+instance AdmitAttrALIGN H4+instance AdmitAttrALIGN H5+instance AdmitAttrALIGN H6+instance AdmitAttrALIGN HR+instance AdmitAttrALIGN IFRAME+instance AdmitAttrALIGN IMG+instance AdmitAttrALIGN INPUT+instance AdmitAttrALIGN LEGEND+instance AdmitAttrALIGN OBJECT+instance AdmitAttrALIGN P+instance AdmitAttrALIGN TABLE+instance AdmitAttrALIGN TBODY+instance AdmitAttrALIGN TD+instance AdmitAttrALIGN TFOOT+instance AdmitAttrALIGN TH+instance AdmitAttrALIGN THEAD+instance AdmitAttrALIGN TR+instance AdmitAttrALINK BODY+instance AdmitAttrALT APPLET+instance AdmitAttrALT AREA+instance AdmitAttrALT IMG+instance AdmitAttrALT INPUT+instance AdmitAttrARCHIVE APPLET+instance AdmitAttrARCHIVE OBJECT+instance AdmitAttrAXIS TD+instance AdmitAttrAXIS TH+instance AdmitAttrBACKGROUND BODY+instance AdmitAttrBGCOLOR BODY+instance AdmitAttrBGCOLOR TABLE+instance AdmitAttrBGCOLOR TD+instance AdmitAttrBGCOLOR TH+instance AdmitAttrBGCOLOR TR+instance AdmitAttrBORDER IMG+instance AdmitAttrBORDER OBJECT+instance AdmitAttrBORDER TABLE+instance AdmitAttrCELLPADDING TABLE+instance AdmitAttrCELLSPACING TABLE+instance AdmitAttrCHAR COL+instance AdmitAttrCHAR COLGROUP+instance AdmitAttrCHAR TBODY+instance AdmitAttrCHAR TD+instance AdmitAttrCHAR TFOOT+instance AdmitAttrCHAR TH+instance AdmitAttrCHAR THEAD+instance AdmitAttrCHAR TR+instance AdmitAttrCHAROFF COL+instance AdmitAttrCHAROFF COLGROUP+instance AdmitAttrCHAROFF TBODY+instance AdmitAttrCHAROFF TD+instance AdmitAttrCHAROFF TFOOT+instance AdmitAttrCHAROFF TH+instance AdmitAttrCHAROFF THEAD+instance AdmitAttrCHAROFF TR+instance AdmitAttrCHARSET A+instance AdmitAttrCHARSET LINK+instance AdmitAttrCHARSET SCRIPT+instance AdmitAttrCHECKED INPUT+instance AdmitAttrCITE BLOCKQUOTE+instance AdmitAttrCITE DEL+instance AdmitAttrCITE INS+instance AdmitAttrCITE Q+instance AdmitAttrCLASS A+instance AdmitAttrCLASS ABBR+instance AdmitAttrCLASS ACRONYM+instance AdmitAttrCLASS ADDRESS+instance AdmitAttrCLASS APPLET+instance AdmitAttrCLASS AREA+instance AdmitAttrCLASS B+instance AdmitAttrCLASS BDO+instance AdmitAttrCLASS BIG+instance AdmitAttrCLASS BLOCKQUOTE+instance AdmitAttrCLASS BODY+instance AdmitAttrCLASS BR+instance AdmitAttrCLASS BUTTON+instance AdmitAttrCLASS CAPTION+instance AdmitAttrCLASS CENTER+instance AdmitAttrCLASS CITE+instance AdmitAttrCLASS CODE+instance AdmitAttrCLASS COL+instance AdmitAttrCLASS COLGROUP+instance AdmitAttrCLASS DD+instance AdmitAttrCLASS DEL+instance AdmitAttrCLASS DFN+instance AdmitAttrCLASS DIR+instance AdmitAttrCLASS DIV+instance AdmitAttrCLASS DL+instance AdmitAttrCLASS DT+instance AdmitAttrCLASS EM+instance AdmitAttrCLASS FIELDSET+instance AdmitAttrCLASS FONT+instance AdmitAttrCLASS FORM+instance AdmitAttrCLASS H1+instance AdmitAttrCLASS H2+instance AdmitAttrCLASS H3+instance AdmitAttrCLASS H4+instance AdmitAttrCLASS H5+instance AdmitAttrCLASS H6+instance AdmitAttrCLASS HR+instance AdmitAttrCLASS I+instance AdmitAttrCLASS IFRAME+instance AdmitAttrCLASS IMG+instance AdmitAttrCLASS INPUT+instance AdmitAttrCLASS INS+instance AdmitAttrCLASS ISINDEX+instance AdmitAttrCLASS KBD+instance AdmitAttrCLASS LABEL+instance AdmitAttrCLASS LEGEND+instance AdmitAttrCLASS LI+instance AdmitAttrCLASS LINK+instance AdmitAttrCLASS MAP+instance AdmitAttrCLASS MENU+instance AdmitAttrCLASS NOFRAMES+instance AdmitAttrCLASS NOSCRIPT+instance AdmitAttrCLASS OBJECT+instance AdmitAttrCLASS OL+instance AdmitAttrCLASS OPTGROUP+instance AdmitAttrCLASS OPTION+instance AdmitAttrCLASS P+instance AdmitAttrCLASS PRE+instance AdmitAttrCLASS Q+instance AdmitAttrCLASS S+instance AdmitAttrCLASS SAMP+instance AdmitAttrCLASS SELECT+instance AdmitAttrCLASS SMALL+instance AdmitAttrCLASS SPAN+instance AdmitAttrCLASS STRIKE+instance AdmitAttrCLASS STRONG+instance AdmitAttrCLASS SUB+instance AdmitAttrCLASS SUP+instance AdmitAttrCLASS TABLE+instance AdmitAttrCLASS TBODY+instance AdmitAttrCLASS TD+instance AdmitAttrCLASS TEXTAREA+instance AdmitAttrCLASS TFOOT+instance AdmitAttrCLASS TH+instance AdmitAttrCLASS THEAD+instance AdmitAttrCLASS TR+instance AdmitAttrCLASS TT+instance AdmitAttrCLASS U+instance AdmitAttrCLASS UL+instance AdmitAttrCLASS VAR+instance AdmitAttrCLASSID OBJECT+instance AdmitAttrCLEAR BR+instance AdmitAttrCODE APPLET+instance AdmitAttrCODEBASE APPLET+instance AdmitAttrCODEBASE OBJECT+instance AdmitAttrCODETYPE OBJECT+instance AdmitAttrCOLOR BASEFONT+instance AdmitAttrCOLOR FONT+instance AdmitAttrCOLS TEXTAREA+instance AdmitAttrCOLSPAN TD+instance AdmitAttrCOLSPAN TH+instance AdmitAttrCOMPACT DIR+instance AdmitAttrCOMPACT DL+instance AdmitAttrCOMPACT MENU+instance AdmitAttrCOMPACT OL+instance AdmitAttrCOMPACT UL+instance AdmitAttrCONTENT META+instance AdmitAttrCOORDS A+instance AdmitAttrCOORDS AREA+instance AdmitAttrDATA OBJECT+instance AdmitAttrDATAPAGESIZE TABLE+instance AdmitAttrDATETIME DEL+instance AdmitAttrDATETIME INS+instance AdmitAttrDECLARE OBJECT+instance AdmitAttrDEFER SCRIPT+instance AdmitAttrDIR A+instance AdmitAttrDIR ABBR+instance AdmitAttrDIR ACRONYM+instance AdmitAttrDIR ADDRESS+instance AdmitAttrDIR AREA+instance AdmitAttrDIR B+instance AdmitAttrDIR BDO+instance AdmitAttrDIR BIG+instance AdmitAttrDIR BLOCKQUOTE+instance AdmitAttrDIR BODY+instance AdmitAttrDIR BUTTON+instance AdmitAttrDIR CAPTION+instance AdmitAttrDIR CENTER+instance AdmitAttrDIR CITE+instance AdmitAttrDIR CODE+instance AdmitAttrDIR COL+instance AdmitAttrDIR COLGROUP+instance AdmitAttrDIR DD+instance AdmitAttrDIR DEL+instance AdmitAttrDIR DFN+instance AdmitAttrDIR DIR+instance AdmitAttrDIR DIV+instance AdmitAttrDIR DL+instance AdmitAttrDIR DT+instance AdmitAttrDIR EM+instance AdmitAttrDIR FIELDSET+instance AdmitAttrDIR FONT+instance AdmitAttrDIR FORM+instance AdmitAttrDIR H1+instance AdmitAttrDIR H2+instance AdmitAttrDIR H3+instance AdmitAttrDIR H4+instance AdmitAttrDIR H5+instance AdmitAttrDIR H6+instance AdmitAttrDIR HEAD+instance AdmitAttrDIR HTML+instance AdmitAttrDIR I+instance AdmitAttrDIR IMG+instance AdmitAttrDIR INPUT+instance AdmitAttrDIR INS+instance AdmitAttrDIR ISINDEX+instance AdmitAttrDIR KBD+instance AdmitAttrDIR LABEL+instance AdmitAttrDIR LEGEND+instance AdmitAttrDIR LI+instance AdmitAttrDIR LINK+instance AdmitAttrDIR MAP+instance AdmitAttrDIR MENU+instance AdmitAttrDIR META+instance AdmitAttrDIR NOFRAMES+instance AdmitAttrDIR NOSCRIPT+instance AdmitAttrDIR OBJECT+instance AdmitAttrDIR OL+instance AdmitAttrDIR OPTGROUP+instance AdmitAttrDIR OPTION+instance AdmitAttrDIR P+instance AdmitAttrDIR PRE+instance AdmitAttrDIR Q+instance AdmitAttrDIR S+instance AdmitAttrDIR SAMP+instance AdmitAttrDIR SELECT+instance AdmitAttrDIR SMALL+instance AdmitAttrDIR SPAN+instance AdmitAttrDIR STRIKE+instance AdmitAttrDIR STRONG+instance AdmitAttrDIR STYLE+instance AdmitAttrDIR SUB+instance AdmitAttrDIR SUP+instance AdmitAttrDIR TABLE+instance AdmitAttrDIR TBODY+instance AdmitAttrDIR TD+instance AdmitAttrDIR TEXTAREA+instance AdmitAttrDIR TFOOT+instance AdmitAttrDIR TH+instance AdmitAttrDIR THEAD+instance AdmitAttrDIR TITLE+instance AdmitAttrDIR TR+instance AdmitAttrDIR TT+instance AdmitAttrDIR U+instance AdmitAttrDIR UL+instance AdmitAttrDIR VAR+instance AdmitAttrDISABLED BUTTON+instance AdmitAttrDISABLED INPUT+instance AdmitAttrDISABLED OPTGROUP+instance AdmitAttrDISABLED OPTION+instance AdmitAttrDISABLED SELECT+instance AdmitAttrDISABLED TEXTAREA+instance AdmitAttrENCTYPE FORM+instance AdmitAttrEVENT SCRIPT+instance AdmitAttrFACE BASEFONT+instance AdmitAttrFACE FONT+instance AdmitAttrFOR LABEL+instance AdmitAttrFOR SCRIPT+instance AdmitAttrFRAME TABLE+instance AdmitAttrFRAMEBORDER IFRAME+instance AdmitAttrHEADERS TD+instance AdmitAttrHEADERS TH+instance AdmitAttrHEIGHT APPLET+instance AdmitAttrHEIGHT IFRAME+instance AdmitAttrHEIGHT IMG+instance AdmitAttrHEIGHT OBJECT+instance AdmitAttrHEIGHT TD+instance AdmitAttrHEIGHT TH+instance AdmitAttrHREF A+instance AdmitAttrHREF AREA+instance AdmitAttrHREF BASE+instance AdmitAttrHREF LINK+instance AdmitAttrHREFLANG A+instance AdmitAttrHREFLANG LINK+instance AdmitAttrHSPACE APPLET+instance AdmitAttrHSPACE IMG+instance AdmitAttrHSPACE OBJECT+instance AdmitAttrHTTP_EQUIV META+instance AdmitAttrID A+instance AdmitAttrID ABBR+instance AdmitAttrID ACRONYM+instance AdmitAttrID ADDRESS+instance AdmitAttrID APPLET+instance AdmitAttrID AREA+instance AdmitAttrID B+instance AdmitAttrID BASEFONT+instance AdmitAttrID BDO+instance AdmitAttrID BIG+instance AdmitAttrID BLOCKQUOTE+instance AdmitAttrID BODY+instance AdmitAttrID BR+instance AdmitAttrID BUTTON+instance AdmitAttrID CAPTION+instance AdmitAttrID CENTER+instance AdmitAttrID CITE+instance AdmitAttrID CODE+instance AdmitAttrID COL+instance AdmitAttrID COLGROUP+instance AdmitAttrID DD+instance AdmitAttrID DEL+instance AdmitAttrID DFN+instance AdmitAttrID DIR+instance AdmitAttrID DIV+instance AdmitAttrID DL+instance AdmitAttrID DT+instance AdmitAttrID EM+instance AdmitAttrID FIELDSET+instance AdmitAttrID FONT+instance AdmitAttrID FORM+instance AdmitAttrID H1+instance AdmitAttrID H2+instance AdmitAttrID H3+instance AdmitAttrID H4+instance AdmitAttrID H5+instance AdmitAttrID H6+instance AdmitAttrID HR+instance AdmitAttrID I+instance AdmitAttrID IFRAME+instance AdmitAttrID IMG+instance AdmitAttrID INPUT+instance AdmitAttrID INS+instance AdmitAttrID ISINDEX+instance AdmitAttrID KBD+instance AdmitAttrID LABEL+instance AdmitAttrID LEGEND+instance AdmitAttrID LI+instance AdmitAttrID LINK+instance AdmitAttrID MAP+instance AdmitAttrID MENU+instance AdmitAttrID NOFRAMES+instance AdmitAttrID NOSCRIPT+instance AdmitAttrID OBJECT+instance AdmitAttrID OL+instance AdmitAttrID OPTGROUP+instance AdmitAttrID OPTION+instance AdmitAttrID P+instance AdmitAttrID PARAM+instance AdmitAttrID PRE+instance AdmitAttrID Q+instance AdmitAttrID S+instance AdmitAttrID SAMP+instance AdmitAttrID SELECT+instance AdmitAttrID SMALL+instance AdmitAttrID SPAN+instance AdmitAttrID STRIKE+instance AdmitAttrID STRONG+instance AdmitAttrID SUB+instance AdmitAttrID SUP+instance AdmitAttrID TABLE+instance AdmitAttrID TBODY+instance AdmitAttrID TD+instance AdmitAttrID TEXTAREA+instance AdmitAttrID TFOOT+instance AdmitAttrID TH+instance AdmitAttrID THEAD+instance AdmitAttrID TR+instance AdmitAttrID TT+instance AdmitAttrID U+instance AdmitAttrID UL+instance AdmitAttrID VAR+instance AdmitAttrISMAP IMG+instance AdmitAttrLABEL OPTGROUP+instance AdmitAttrLABEL OPTION+instance AdmitAttrLANG A+instance AdmitAttrLANG ABBR+instance AdmitAttrLANG ACRONYM+instance AdmitAttrLANG ADDRESS+instance AdmitAttrLANG AREA+instance AdmitAttrLANG B+instance AdmitAttrLANG BDO+instance AdmitAttrLANG BIG+instance AdmitAttrLANG BLOCKQUOTE+instance AdmitAttrLANG BODY+instance AdmitAttrLANG BUTTON+instance AdmitAttrLANG CAPTION+instance AdmitAttrLANG CENTER+instance AdmitAttrLANG CITE+instance AdmitAttrLANG CODE+instance AdmitAttrLANG COL+instance AdmitAttrLANG COLGROUP+instance AdmitAttrLANG DD+instance AdmitAttrLANG DEL+instance AdmitAttrLANG DFN+instance AdmitAttrLANG DIR+instance AdmitAttrLANG DIV+instance AdmitAttrLANG DL+instance AdmitAttrLANG DT+instance AdmitAttrLANG EM+instance AdmitAttrLANG FIELDSET+instance AdmitAttrLANG FONT+instance AdmitAttrLANG FORM+instance AdmitAttrLANG H1+instance AdmitAttrLANG H2+instance AdmitAttrLANG H3+instance AdmitAttrLANG H4+instance AdmitAttrLANG H5+instance AdmitAttrLANG H6+instance AdmitAttrLANG HEAD+instance AdmitAttrLANG HTML+instance AdmitAttrLANG I+instance AdmitAttrLANG IMG+instance AdmitAttrLANG INPUT+instance AdmitAttrLANG INS+instance AdmitAttrLANG ISINDEX+instance AdmitAttrLANG KBD+instance AdmitAttrLANG LABEL+instance AdmitAttrLANG LEGEND+instance AdmitAttrLANG LI+instance AdmitAttrLANG LINK+instance AdmitAttrLANG MAP+instance AdmitAttrLANG MENU+instance AdmitAttrLANG META+instance AdmitAttrLANG NOFRAMES+instance AdmitAttrLANG NOSCRIPT+instance AdmitAttrLANG OBJECT+instance AdmitAttrLANG OL+instance AdmitAttrLANG OPTGROUP+instance AdmitAttrLANG OPTION+instance AdmitAttrLANG P+instance AdmitAttrLANG PRE+instance AdmitAttrLANG Q+instance AdmitAttrLANG S+instance AdmitAttrLANG SAMP+instance AdmitAttrLANG SELECT+instance AdmitAttrLANG SMALL+instance AdmitAttrLANG SPAN+instance AdmitAttrLANG STRIKE+instance AdmitAttrLANG STRONG+instance AdmitAttrLANG STYLE+instance AdmitAttrLANG SUB+instance AdmitAttrLANG SUP+instance AdmitAttrLANG TABLE+instance AdmitAttrLANG TBODY+instance AdmitAttrLANG TD+instance AdmitAttrLANG TEXTAREA+instance AdmitAttrLANG TFOOT+instance AdmitAttrLANG TH+instance AdmitAttrLANG THEAD+instance AdmitAttrLANG TITLE+instance AdmitAttrLANG TR+instance AdmitAttrLANG TT+instance AdmitAttrLANG U+instance AdmitAttrLANG UL+instance AdmitAttrLANG VAR+instance AdmitAttrLANGUAGE SCRIPT+instance AdmitAttrLINK BODY+instance AdmitAttrLONGDESC IFRAME+instance AdmitAttrLONGDESC IMG+instance AdmitAttrMARGINHEIGHT IFRAME+instance AdmitAttrMARGINWIDTH IFRAME+instance AdmitAttrMAXLENGTH INPUT+instance AdmitAttrMEDIA LINK+instance AdmitAttrMEDIA STYLE+instance AdmitAttrMETHOD FORM+instance AdmitAttrMULTIPLE SELECT+instance AdmitAttrNAME A+instance AdmitAttrNAME APPLET+instance AdmitAttrNAME BUTTON+instance AdmitAttrNAME IFRAME+instance AdmitAttrNAME INPUT+instance AdmitAttrNAME MAP+instance AdmitAttrNAME META+instance AdmitAttrNAME OBJECT+instance AdmitAttrNAME PARAM+instance AdmitAttrNAME SELECT+instance AdmitAttrNAME TEXTAREA+instance AdmitAttrNOHREF AREA+instance AdmitAttrNOSHADE HR+instance AdmitAttrNOWRAP TD+instance AdmitAttrNOWRAP TH+instance AdmitAttrOBJECT APPLET+instance AdmitAttrONBLUR A+instance AdmitAttrONBLUR AREA+instance AdmitAttrONBLUR BUTTON+instance AdmitAttrONBLUR INPUT+instance AdmitAttrONBLUR LABEL+instance AdmitAttrONBLUR SELECT+instance AdmitAttrONBLUR TEXTAREA+instance AdmitAttrONCHANGE INPUT+instance AdmitAttrONCHANGE SELECT+instance AdmitAttrONCHANGE TEXTAREA+instance AdmitAttrONCLICK A+instance AdmitAttrONCLICK ABBR+instance AdmitAttrONCLICK ACRONYM+instance AdmitAttrONCLICK ADDRESS+instance AdmitAttrONCLICK AREA+instance AdmitAttrONCLICK B+instance AdmitAttrONCLICK BIG+instance AdmitAttrONCLICK BLOCKQUOTE+instance AdmitAttrONCLICK BODY+instance AdmitAttrONCLICK BUTTON+instance AdmitAttrONCLICK CAPTION+instance AdmitAttrONCLICK CENTER+instance AdmitAttrONCLICK CITE+instance AdmitAttrONCLICK CODE+instance AdmitAttrONCLICK COL+instance AdmitAttrONCLICK COLGROUP+instance AdmitAttrONCLICK DD+instance AdmitAttrONCLICK DEL+instance AdmitAttrONCLICK DFN+instance AdmitAttrONCLICK DIR+instance AdmitAttrONCLICK DIV+instance AdmitAttrONCLICK DL+instance AdmitAttrONCLICK DT+instance AdmitAttrONCLICK EM+instance AdmitAttrONCLICK FIELDSET+instance AdmitAttrONCLICK FORM+instance AdmitAttrONCLICK H1+instance AdmitAttrONCLICK H2+instance AdmitAttrONCLICK H3+instance AdmitAttrONCLICK H4+instance AdmitAttrONCLICK H5+instance AdmitAttrONCLICK H6+instance AdmitAttrONCLICK HR+instance AdmitAttrONCLICK I+instance AdmitAttrONCLICK IMG+instance AdmitAttrONCLICK INPUT+instance AdmitAttrONCLICK INS+instance AdmitAttrONCLICK KBD+instance AdmitAttrONCLICK LABEL+instance AdmitAttrONCLICK LEGEND+instance AdmitAttrONCLICK LI+instance AdmitAttrONCLICK LINK+instance AdmitAttrONCLICK MAP+instance AdmitAttrONCLICK MENU+instance AdmitAttrONCLICK NOFRAMES+instance AdmitAttrONCLICK NOSCRIPT+instance AdmitAttrONCLICK OBJECT+instance AdmitAttrONCLICK OL+instance AdmitAttrONCLICK OPTGROUP+instance AdmitAttrONCLICK OPTION+instance AdmitAttrONCLICK P+instance AdmitAttrONCLICK PRE+instance AdmitAttrONCLICK Q+instance AdmitAttrONCLICK S+instance AdmitAttrONCLICK SAMP+instance AdmitAttrONCLICK SELECT+instance AdmitAttrONCLICK SMALL+instance AdmitAttrONCLICK SPAN+instance AdmitAttrONCLICK STRIKE+instance AdmitAttrONCLICK STRONG+instance AdmitAttrONCLICK SUB+instance AdmitAttrONCLICK SUP+instance AdmitAttrONCLICK TABLE+instance AdmitAttrONCLICK TBODY+instance AdmitAttrONCLICK TD+instance AdmitAttrONCLICK TEXTAREA+instance AdmitAttrONCLICK TFOOT+instance AdmitAttrONCLICK TH+instance AdmitAttrONCLICK THEAD+instance AdmitAttrONCLICK TR+instance AdmitAttrONCLICK TT+instance AdmitAttrONCLICK U+instance AdmitAttrONCLICK UL+instance AdmitAttrONCLICK VAR+instance AdmitAttrONDBLCLICK A+instance AdmitAttrONDBLCLICK ABBR+instance AdmitAttrONDBLCLICK ACRONYM+instance AdmitAttrONDBLCLICK ADDRESS+instance AdmitAttrONDBLCLICK AREA+instance AdmitAttrONDBLCLICK B+instance AdmitAttrONDBLCLICK BIG+instance AdmitAttrONDBLCLICK BLOCKQUOTE+instance AdmitAttrONDBLCLICK BODY+instance AdmitAttrONDBLCLICK BUTTON+instance AdmitAttrONDBLCLICK CAPTION+instance AdmitAttrONDBLCLICK CENTER+instance AdmitAttrONDBLCLICK CITE+instance AdmitAttrONDBLCLICK CODE+instance AdmitAttrONDBLCLICK COL+instance AdmitAttrONDBLCLICK COLGROUP+instance AdmitAttrONDBLCLICK DD+instance AdmitAttrONDBLCLICK DEL+instance AdmitAttrONDBLCLICK DFN+instance AdmitAttrONDBLCLICK DIR+instance AdmitAttrONDBLCLICK DIV+instance AdmitAttrONDBLCLICK DL+instance AdmitAttrONDBLCLICK DT+instance AdmitAttrONDBLCLICK EM+instance AdmitAttrONDBLCLICK FIELDSET+instance AdmitAttrONDBLCLICK FORM+instance AdmitAttrONDBLCLICK H1+instance AdmitAttrONDBLCLICK H2+instance AdmitAttrONDBLCLICK H3+instance AdmitAttrONDBLCLICK H4+instance AdmitAttrONDBLCLICK H5+instance AdmitAttrONDBLCLICK H6+instance AdmitAttrONDBLCLICK HR+instance AdmitAttrONDBLCLICK I+instance AdmitAttrONDBLCLICK IMG+instance AdmitAttrONDBLCLICK INPUT+instance AdmitAttrONDBLCLICK INS+instance AdmitAttrONDBLCLICK KBD+instance AdmitAttrONDBLCLICK LABEL+instance AdmitAttrONDBLCLICK LEGEND+instance AdmitAttrONDBLCLICK LI+instance AdmitAttrONDBLCLICK LINK+instance AdmitAttrONDBLCLICK MAP+instance AdmitAttrONDBLCLICK MENU+instance AdmitAttrONDBLCLICK NOFRAMES+instance AdmitAttrONDBLCLICK NOSCRIPT+instance AdmitAttrONDBLCLICK OBJECT+instance AdmitAttrONDBLCLICK OL+instance AdmitAttrONDBLCLICK OPTGROUP+instance AdmitAttrONDBLCLICK OPTION+instance AdmitAttrONDBLCLICK P+instance AdmitAttrONDBLCLICK PRE+instance AdmitAttrONDBLCLICK Q+instance AdmitAttrONDBLCLICK S+instance AdmitAttrONDBLCLICK SAMP+instance AdmitAttrONDBLCLICK SELECT+instance AdmitAttrONDBLCLICK SMALL+instance AdmitAttrONDBLCLICK SPAN+instance AdmitAttrONDBLCLICK STRIKE+instance AdmitAttrONDBLCLICK STRONG+instance AdmitAttrONDBLCLICK SUB+instance AdmitAttrONDBLCLICK SUP+instance AdmitAttrONDBLCLICK TABLE+instance AdmitAttrONDBLCLICK TBODY+instance AdmitAttrONDBLCLICK TD+instance AdmitAttrONDBLCLICK TEXTAREA+instance AdmitAttrONDBLCLICK TFOOT+instance AdmitAttrONDBLCLICK TH+instance AdmitAttrONDBLCLICK THEAD+instance AdmitAttrONDBLCLICK TR+instance AdmitAttrONDBLCLICK TT+instance AdmitAttrONDBLCLICK U+instance AdmitAttrONDBLCLICK UL+instance AdmitAttrONDBLCLICK VAR+instance AdmitAttrONFOCUS A+instance AdmitAttrONFOCUS AREA+instance AdmitAttrONFOCUS BUTTON+instance AdmitAttrONFOCUS INPUT+instance AdmitAttrONFOCUS LABEL+instance AdmitAttrONFOCUS SELECT+instance AdmitAttrONFOCUS TEXTAREA+instance AdmitAttrONKEYDOWN A+instance AdmitAttrONKEYDOWN ABBR+instance AdmitAttrONKEYDOWN ACRONYM+instance AdmitAttrONKEYDOWN ADDRESS+instance AdmitAttrONKEYDOWN AREA+instance AdmitAttrONKEYDOWN B+instance AdmitAttrONKEYDOWN BIG+instance AdmitAttrONKEYDOWN BLOCKQUOTE+instance AdmitAttrONKEYDOWN BODY+instance AdmitAttrONKEYDOWN BUTTON+instance AdmitAttrONKEYDOWN CAPTION+instance AdmitAttrONKEYDOWN CENTER+instance AdmitAttrONKEYDOWN CITE+instance AdmitAttrONKEYDOWN CODE+instance AdmitAttrONKEYDOWN COL+instance AdmitAttrONKEYDOWN COLGROUP+instance AdmitAttrONKEYDOWN DD+instance AdmitAttrONKEYDOWN DEL+instance AdmitAttrONKEYDOWN DFN+instance AdmitAttrONKEYDOWN DIR+instance AdmitAttrONKEYDOWN DIV+instance AdmitAttrONKEYDOWN DL+instance AdmitAttrONKEYDOWN DT+instance AdmitAttrONKEYDOWN EM+instance AdmitAttrONKEYDOWN FIELDSET+instance AdmitAttrONKEYDOWN FORM+instance AdmitAttrONKEYDOWN H1+instance AdmitAttrONKEYDOWN H2+instance AdmitAttrONKEYDOWN H3+instance AdmitAttrONKEYDOWN H4+instance AdmitAttrONKEYDOWN H5+instance AdmitAttrONKEYDOWN H6+instance AdmitAttrONKEYDOWN HR+instance AdmitAttrONKEYDOWN I+instance AdmitAttrONKEYDOWN IMG+instance AdmitAttrONKEYDOWN INPUT+instance AdmitAttrONKEYDOWN INS+instance AdmitAttrONKEYDOWN KBD+instance AdmitAttrONKEYDOWN LABEL+instance AdmitAttrONKEYDOWN LEGEND+instance AdmitAttrONKEYDOWN LI+instance AdmitAttrONKEYDOWN LINK+instance AdmitAttrONKEYDOWN MAP+instance AdmitAttrONKEYDOWN MENU+instance AdmitAttrONKEYDOWN NOFRAMES+instance AdmitAttrONKEYDOWN NOSCRIPT+instance AdmitAttrONKEYDOWN OBJECT+instance AdmitAttrONKEYDOWN OL+instance AdmitAttrONKEYDOWN OPTGROUP+instance AdmitAttrONKEYDOWN OPTION+instance AdmitAttrONKEYDOWN P+instance AdmitAttrONKEYDOWN PRE+instance AdmitAttrONKEYDOWN Q+instance AdmitAttrONKEYDOWN S+instance AdmitAttrONKEYDOWN SAMP+instance AdmitAttrONKEYDOWN SELECT+instance AdmitAttrONKEYDOWN SMALL+instance AdmitAttrONKEYDOWN SPAN+instance AdmitAttrONKEYDOWN STRIKE+instance AdmitAttrONKEYDOWN STRONG+instance AdmitAttrONKEYDOWN SUB+instance AdmitAttrONKEYDOWN SUP+instance AdmitAttrONKEYDOWN TABLE+instance AdmitAttrONKEYDOWN TBODY+instance AdmitAttrONKEYDOWN TD+instance AdmitAttrONKEYDOWN TEXTAREA+instance AdmitAttrONKEYDOWN TFOOT+instance AdmitAttrONKEYDOWN TH+instance AdmitAttrONKEYDOWN THEAD+instance AdmitAttrONKEYDOWN TR+instance AdmitAttrONKEYDOWN TT+instance AdmitAttrONKEYDOWN U+instance AdmitAttrONKEYDOWN UL+instance AdmitAttrONKEYDOWN VAR+instance AdmitAttrONKEYPRESS A+instance AdmitAttrONKEYPRESS ABBR+instance AdmitAttrONKEYPRESS ACRONYM+instance AdmitAttrONKEYPRESS ADDRESS+instance AdmitAttrONKEYPRESS AREA+instance AdmitAttrONKEYPRESS B+instance AdmitAttrONKEYPRESS BIG+instance AdmitAttrONKEYPRESS BLOCKQUOTE+instance AdmitAttrONKEYPRESS BODY+instance AdmitAttrONKEYPRESS BUTTON+instance AdmitAttrONKEYPRESS CAPTION+instance AdmitAttrONKEYPRESS CENTER+instance AdmitAttrONKEYPRESS CITE+instance AdmitAttrONKEYPRESS CODE+instance AdmitAttrONKEYPRESS COL+instance AdmitAttrONKEYPRESS COLGROUP+instance AdmitAttrONKEYPRESS DD+instance AdmitAttrONKEYPRESS DEL+instance AdmitAttrONKEYPRESS DFN+instance AdmitAttrONKEYPRESS DIR+instance AdmitAttrONKEYPRESS DIV+instance AdmitAttrONKEYPRESS DL+instance AdmitAttrONKEYPRESS DT+instance AdmitAttrONKEYPRESS EM+instance AdmitAttrONKEYPRESS FIELDSET+instance AdmitAttrONKEYPRESS FORM+instance AdmitAttrONKEYPRESS H1+instance AdmitAttrONKEYPRESS H2+instance AdmitAttrONKEYPRESS H3+instance AdmitAttrONKEYPRESS H4+instance AdmitAttrONKEYPRESS H5+instance AdmitAttrONKEYPRESS H6+instance AdmitAttrONKEYPRESS HR+instance AdmitAttrONKEYPRESS I+instance AdmitAttrONKEYPRESS IMG+instance AdmitAttrONKEYPRESS INPUT+instance AdmitAttrONKEYPRESS INS+instance AdmitAttrONKEYPRESS KBD+instance AdmitAttrONKEYPRESS LABEL+instance AdmitAttrONKEYPRESS LEGEND+instance AdmitAttrONKEYPRESS LI+instance AdmitAttrONKEYPRESS LINK+instance AdmitAttrONKEYPRESS MAP+instance AdmitAttrONKEYPRESS MENU+instance AdmitAttrONKEYPRESS NOFRAMES+instance AdmitAttrONKEYPRESS NOSCRIPT+instance AdmitAttrONKEYPRESS OBJECT+instance AdmitAttrONKEYPRESS OL+instance AdmitAttrONKEYPRESS OPTGROUP+instance AdmitAttrONKEYPRESS OPTION+instance AdmitAttrONKEYPRESS P+instance AdmitAttrONKEYPRESS PRE+instance AdmitAttrONKEYPRESS Q+instance AdmitAttrONKEYPRESS S+instance AdmitAttrONKEYPRESS SAMP+instance AdmitAttrONKEYPRESS SELECT+instance AdmitAttrONKEYPRESS SMALL+instance AdmitAttrONKEYPRESS SPAN+instance AdmitAttrONKEYPRESS STRIKE+instance AdmitAttrONKEYPRESS STRONG+instance AdmitAttrONKEYPRESS SUB+instance AdmitAttrONKEYPRESS SUP+instance AdmitAttrONKEYPRESS TABLE+instance AdmitAttrONKEYPRESS TBODY+instance AdmitAttrONKEYPRESS TD+instance AdmitAttrONKEYPRESS TEXTAREA+instance AdmitAttrONKEYPRESS TFOOT+instance AdmitAttrONKEYPRESS TH+instance AdmitAttrONKEYPRESS THEAD+instance AdmitAttrONKEYPRESS TR+instance AdmitAttrONKEYPRESS TT+instance AdmitAttrONKEYPRESS U+instance AdmitAttrONKEYPRESS UL+instance AdmitAttrONKEYPRESS VAR+instance AdmitAttrONKEYUP A+instance AdmitAttrONKEYUP ABBR+instance AdmitAttrONKEYUP ACRONYM+instance AdmitAttrONKEYUP ADDRESS+instance AdmitAttrONKEYUP AREA+instance AdmitAttrONKEYUP B+instance AdmitAttrONKEYUP BIG+instance AdmitAttrONKEYUP BLOCKQUOTE+instance AdmitAttrONKEYUP BODY+instance AdmitAttrONKEYUP BUTTON+instance AdmitAttrONKEYUP CAPTION+instance AdmitAttrONKEYUP CENTER+instance AdmitAttrONKEYUP CITE+instance AdmitAttrONKEYUP CODE+instance AdmitAttrONKEYUP COL+instance AdmitAttrONKEYUP COLGROUP+instance AdmitAttrONKEYUP DD+instance AdmitAttrONKEYUP DEL+instance AdmitAttrONKEYUP DFN+instance AdmitAttrONKEYUP DIR+instance AdmitAttrONKEYUP DIV+instance AdmitAttrONKEYUP DL+instance AdmitAttrONKEYUP DT+instance AdmitAttrONKEYUP EM+instance AdmitAttrONKEYUP FIELDSET+instance AdmitAttrONKEYUP FORM+instance AdmitAttrONKEYUP H1+instance AdmitAttrONKEYUP H2+instance AdmitAttrONKEYUP H3+instance AdmitAttrONKEYUP H4+instance AdmitAttrONKEYUP H5+instance AdmitAttrONKEYUP H6+instance AdmitAttrONKEYUP HR+instance AdmitAttrONKEYUP I+instance AdmitAttrONKEYUP IMG+instance AdmitAttrONKEYUP INPUT+instance AdmitAttrONKEYUP INS+instance AdmitAttrONKEYUP KBD+instance AdmitAttrONKEYUP LABEL+instance AdmitAttrONKEYUP LEGEND+instance AdmitAttrONKEYUP LI+instance AdmitAttrONKEYUP LINK+instance AdmitAttrONKEYUP MAP+instance AdmitAttrONKEYUP MENU+instance AdmitAttrONKEYUP NOFRAMES+instance AdmitAttrONKEYUP NOSCRIPT+instance AdmitAttrONKEYUP OBJECT+instance AdmitAttrONKEYUP OL+instance AdmitAttrONKEYUP OPTGROUP+instance AdmitAttrONKEYUP OPTION+instance AdmitAttrONKEYUP P+instance AdmitAttrONKEYUP PRE+instance AdmitAttrONKEYUP Q+instance AdmitAttrONKEYUP S+instance AdmitAttrONKEYUP SAMP+instance AdmitAttrONKEYUP SELECT+instance AdmitAttrONKEYUP SMALL+instance AdmitAttrONKEYUP SPAN+instance AdmitAttrONKEYUP STRIKE+instance AdmitAttrONKEYUP STRONG+instance AdmitAttrONKEYUP SUB+instance AdmitAttrONKEYUP SUP+instance AdmitAttrONKEYUP TABLE+instance AdmitAttrONKEYUP TBODY+instance AdmitAttrONKEYUP TD+instance AdmitAttrONKEYUP TEXTAREA+instance AdmitAttrONKEYUP TFOOT+instance AdmitAttrONKEYUP TH+instance AdmitAttrONKEYUP THEAD+instance AdmitAttrONKEYUP TR+instance AdmitAttrONKEYUP TT+instance AdmitAttrONKEYUP U+instance AdmitAttrONKEYUP UL+instance AdmitAttrONKEYUP VAR+instance AdmitAttrONLOAD BODY+instance AdmitAttrONMOUSEDOWN A+instance AdmitAttrONMOUSEDOWN ABBR+instance AdmitAttrONMOUSEDOWN ACRONYM+instance AdmitAttrONMOUSEDOWN ADDRESS+instance AdmitAttrONMOUSEDOWN AREA+instance AdmitAttrONMOUSEDOWN B+instance AdmitAttrONMOUSEDOWN BIG+instance AdmitAttrONMOUSEDOWN BLOCKQUOTE+instance AdmitAttrONMOUSEDOWN BODY+instance AdmitAttrONMOUSEDOWN BUTTON+instance AdmitAttrONMOUSEDOWN CAPTION+instance AdmitAttrONMOUSEDOWN CENTER+instance AdmitAttrONMOUSEDOWN CITE+instance AdmitAttrONMOUSEDOWN CODE+instance AdmitAttrONMOUSEDOWN COL+instance AdmitAttrONMOUSEDOWN COLGROUP+instance AdmitAttrONMOUSEDOWN DD+instance AdmitAttrONMOUSEDOWN DEL+instance AdmitAttrONMOUSEDOWN DFN+instance AdmitAttrONMOUSEDOWN DIR+instance AdmitAttrONMOUSEDOWN DIV+instance AdmitAttrONMOUSEDOWN DL+instance AdmitAttrONMOUSEDOWN DT+instance AdmitAttrONMOUSEDOWN EM+instance AdmitAttrONMOUSEDOWN FIELDSET+instance AdmitAttrONMOUSEDOWN FORM+instance AdmitAttrONMOUSEDOWN H1+instance AdmitAttrONMOUSEDOWN H2+instance AdmitAttrONMOUSEDOWN H3+instance AdmitAttrONMOUSEDOWN H4+instance AdmitAttrONMOUSEDOWN H5+instance AdmitAttrONMOUSEDOWN H6+instance AdmitAttrONMOUSEDOWN HR+instance AdmitAttrONMOUSEDOWN I+instance AdmitAttrONMOUSEDOWN IMG+instance AdmitAttrONMOUSEDOWN INPUT+instance AdmitAttrONMOUSEDOWN INS+instance AdmitAttrONMOUSEDOWN KBD+instance AdmitAttrONMOUSEDOWN LABEL+instance AdmitAttrONMOUSEDOWN LEGEND+instance AdmitAttrONMOUSEDOWN LI+instance AdmitAttrONMOUSEDOWN LINK+instance AdmitAttrONMOUSEDOWN MAP+instance AdmitAttrONMOUSEDOWN MENU+instance AdmitAttrONMOUSEDOWN NOFRAMES+instance AdmitAttrONMOUSEDOWN NOSCRIPT+instance AdmitAttrONMOUSEDOWN OBJECT+instance AdmitAttrONMOUSEDOWN OL+instance AdmitAttrONMOUSEDOWN OPTGROUP+instance AdmitAttrONMOUSEDOWN OPTION+instance AdmitAttrONMOUSEDOWN P+instance AdmitAttrONMOUSEDOWN PRE+instance AdmitAttrONMOUSEDOWN Q+instance AdmitAttrONMOUSEDOWN S+instance AdmitAttrONMOUSEDOWN SAMP+instance AdmitAttrONMOUSEDOWN SELECT+instance AdmitAttrONMOUSEDOWN SMALL+instance AdmitAttrONMOUSEDOWN SPAN+instance AdmitAttrONMOUSEDOWN STRIKE+instance AdmitAttrONMOUSEDOWN STRONG+instance AdmitAttrONMOUSEDOWN SUB+instance AdmitAttrONMOUSEDOWN SUP+instance AdmitAttrONMOUSEDOWN TABLE+instance AdmitAttrONMOUSEDOWN TBODY+instance AdmitAttrONMOUSEDOWN TD+instance AdmitAttrONMOUSEDOWN TEXTAREA+instance AdmitAttrONMOUSEDOWN TFOOT+instance AdmitAttrONMOUSEDOWN TH+instance AdmitAttrONMOUSEDOWN THEAD+instance AdmitAttrONMOUSEDOWN TR+instance AdmitAttrONMOUSEDOWN TT+instance AdmitAttrONMOUSEDOWN U+instance AdmitAttrONMOUSEDOWN UL+instance AdmitAttrONMOUSEDOWN VAR+instance AdmitAttrONMOUSEMOVE A+instance AdmitAttrONMOUSEMOVE ABBR+instance AdmitAttrONMOUSEMOVE ACRONYM+instance AdmitAttrONMOUSEMOVE ADDRESS+instance AdmitAttrONMOUSEMOVE AREA+instance AdmitAttrONMOUSEMOVE B+instance AdmitAttrONMOUSEMOVE BIG+instance AdmitAttrONMOUSEMOVE BLOCKQUOTE+instance AdmitAttrONMOUSEMOVE BODY+instance AdmitAttrONMOUSEMOVE BUTTON+instance AdmitAttrONMOUSEMOVE CAPTION+instance AdmitAttrONMOUSEMOVE CENTER+instance AdmitAttrONMOUSEMOVE CITE+instance AdmitAttrONMOUSEMOVE CODE+instance AdmitAttrONMOUSEMOVE COL+instance AdmitAttrONMOUSEMOVE COLGROUP+instance AdmitAttrONMOUSEMOVE DD+instance AdmitAttrONMOUSEMOVE DEL+instance AdmitAttrONMOUSEMOVE DFN+instance AdmitAttrONMOUSEMOVE DIR+instance AdmitAttrONMOUSEMOVE DIV+instance AdmitAttrONMOUSEMOVE DL+instance AdmitAttrONMOUSEMOVE DT+instance AdmitAttrONMOUSEMOVE EM+instance AdmitAttrONMOUSEMOVE FIELDSET+instance AdmitAttrONMOUSEMOVE FORM+instance AdmitAttrONMOUSEMOVE H1+instance AdmitAttrONMOUSEMOVE H2+instance AdmitAttrONMOUSEMOVE H3+instance AdmitAttrONMOUSEMOVE H4+instance AdmitAttrONMOUSEMOVE H5+instance AdmitAttrONMOUSEMOVE H6+instance AdmitAttrONMOUSEMOVE HR+instance AdmitAttrONMOUSEMOVE I+instance AdmitAttrONMOUSEMOVE IMG+instance AdmitAttrONMOUSEMOVE INPUT+instance AdmitAttrONMOUSEMOVE INS+instance AdmitAttrONMOUSEMOVE KBD+instance AdmitAttrONMOUSEMOVE LABEL+instance AdmitAttrONMOUSEMOVE LEGEND+instance AdmitAttrONMOUSEMOVE LI+instance AdmitAttrONMOUSEMOVE LINK+instance AdmitAttrONMOUSEMOVE MAP+instance AdmitAttrONMOUSEMOVE MENU+instance AdmitAttrONMOUSEMOVE NOFRAMES+instance AdmitAttrONMOUSEMOVE NOSCRIPT+instance AdmitAttrONMOUSEMOVE OBJECT+instance AdmitAttrONMOUSEMOVE OL+instance AdmitAttrONMOUSEMOVE OPTGROUP+instance AdmitAttrONMOUSEMOVE OPTION+instance AdmitAttrONMOUSEMOVE P+instance AdmitAttrONMOUSEMOVE PRE+instance AdmitAttrONMOUSEMOVE Q+instance AdmitAttrONMOUSEMOVE S+instance AdmitAttrONMOUSEMOVE SAMP+instance AdmitAttrONMOUSEMOVE SELECT+instance AdmitAttrONMOUSEMOVE SMALL+instance AdmitAttrONMOUSEMOVE SPAN+instance AdmitAttrONMOUSEMOVE STRIKE+instance AdmitAttrONMOUSEMOVE STRONG+instance AdmitAttrONMOUSEMOVE SUB+instance AdmitAttrONMOUSEMOVE SUP+instance AdmitAttrONMOUSEMOVE TABLE+instance AdmitAttrONMOUSEMOVE TBODY+instance AdmitAttrONMOUSEMOVE TD+instance AdmitAttrONMOUSEMOVE TEXTAREA+instance AdmitAttrONMOUSEMOVE TFOOT+instance AdmitAttrONMOUSEMOVE TH+instance AdmitAttrONMOUSEMOVE THEAD+instance AdmitAttrONMOUSEMOVE TR+instance AdmitAttrONMOUSEMOVE TT+instance AdmitAttrONMOUSEMOVE U+instance AdmitAttrONMOUSEMOVE UL+instance AdmitAttrONMOUSEMOVE VAR+instance AdmitAttrONMOUSEOUT A+instance AdmitAttrONMOUSEOUT ABBR+instance AdmitAttrONMOUSEOUT ACRONYM+instance AdmitAttrONMOUSEOUT ADDRESS+instance AdmitAttrONMOUSEOUT AREA+instance AdmitAttrONMOUSEOUT B+instance AdmitAttrONMOUSEOUT BIG+instance AdmitAttrONMOUSEOUT BLOCKQUOTE+instance AdmitAttrONMOUSEOUT BODY+instance AdmitAttrONMOUSEOUT BUTTON+instance AdmitAttrONMOUSEOUT CAPTION+instance AdmitAttrONMOUSEOUT CENTER+instance AdmitAttrONMOUSEOUT CITE+instance AdmitAttrONMOUSEOUT CODE+instance AdmitAttrONMOUSEOUT COL+instance AdmitAttrONMOUSEOUT COLGROUP+instance AdmitAttrONMOUSEOUT DD+instance AdmitAttrONMOUSEOUT DEL+instance AdmitAttrONMOUSEOUT DFN+instance AdmitAttrONMOUSEOUT DIR+instance AdmitAttrONMOUSEOUT DIV+instance AdmitAttrONMOUSEOUT DL+instance AdmitAttrONMOUSEOUT DT+instance AdmitAttrONMOUSEOUT EM+instance AdmitAttrONMOUSEOUT FIELDSET+instance AdmitAttrONMOUSEOUT FORM+instance AdmitAttrONMOUSEOUT H1+instance AdmitAttrONMOUSEOUT H2+instance AdmitAttrONMOUSEOUT H3+instance AdmitAttrONMOUSEOUT H4+instance AdmitAttrONMOUSEOUT H5+instance AdmitAttrONMOUSEOUT H6+instance AdmitAttrONMOUSEOUT HR+instance AdmitAttrONMOUSEOUT I+instance AdmitAttrONMOUSEOUT IMG+instance AdmitAttrONMOUSEOUT INPUT+instance AdmitAttrONMOUSEOUT INS+instance AdmitAttrONMOUSEOUT KBD+instance AdmitAttrONMOUSEOUT LABEL+instance AdmitAttrONMOUSEOUT LEGEND+instance AdmitAttrONMOUSEOUT LI+instance AdmitAttrONMOUSEOUT LINK+instance AdmitAttrONMOUSEOUT MAP+instance AdmitAttrONMOUSEOUT MENU+instance AdmitAttrONMOUSEOUT NOFRAMES+instance AdmitAttrONMOUSEOUT NOSCRIPT+instance AdmitAttrONMOUSEOUT OBJECT+instance AdmitAttrONMOUSEOUT OL+instance AdmitAttrONMOUSEOUT OPTGROUP+instance AdmitAttrONMOUSEOUT OPTION+instance AdmitAttrONMOUSEOUT P+instance AdmitAttrONMOUSEOUT PRE+instance AdmitAttrONMOUSEOUT Q+instance AdmitAttrONMOUSEOUT S+instance AdmitAttrONMOUSEOUT SAMP+instance AdmitAttrONMOUSEOUT SELECT+instance AdmitAttrONMOUSEOUT SMALL+instance AdmitAttrONMOUSEOUT SPAN+instance AdmitAttrONMOUSEOUT STRIKE+instance AdmitAttrONMOUSEOUT STRONG+instance AdmitAttrONMOUSEOUT SUB+instance AdmitAttrONMOUSEOUT SUP+instance AdmitAttrONMOUSEOUT TABLE+instance AdmitAttrONMOUSEOUT TBODY+instance AdmitAttrONMOUSEOUT TD+instance AdmitAttrONMOUSEOUT TEXTAREA+instance AdmitAttrONMOUSEOUT TFOOT+instance AdmitAttrONMOUSEOUT TH+instance AdmitAttrONMOUSEOUT THEAD+instance AdmitAttrONMOUSEOUT TR+instance AdmitAttrONMOUSEOUT TT+instance AdmitAttrONMOUSEOUT U+instance AdmitAttrONMOUSEOUT UL+instance AdmitAttrONMOUSEOUT VAR+instance AdmitAttrONMOUSEOVER A+instance AdmitAttrONMOUSEOVER ABBR+instance AdmitAttrONMOUSEOVER ACRONYM+instance AdmitAttrONMOUSEOVER ADDRESS+instance AdmitAttrONMOUSEOVER AREA+instance AdmitAttrONMOUSEOVER B+instance AdmitAttrONMOUSEOVER BIG+instance AdmitAttrONMOUSEOVER BLOCKQUOTE+instance AdmitAttrONMOUSEOVER BODY+instance AdmitAttrONMOUSEOVER BUTTON+instance AdmitAttrONMOUSEOVER CAPTION+instance AdmitAttrONMOUSEOVER CENTER+instance AdmitAttrONMOUSEOVER CITE+instance AdmitAttrONMOUSEOVER CODE+instance AdmitAttrONMOUSEOVER COL+instance AdmitAttrONMOUSEOVER COLGROUP+instance AdmitAttrONMOUSEOVER DD+instance AdmitAttrONMOUSEOVER DEL+instance AdmitAttrONMOUSEOVER DFN+instance AdmitAttrONMOUSEOVER DIR+instance AdmitAttrONMOUSEOVER DIV+instance AdmitAttrONMOUSEOVER DL+instance AdmitAttrONMOUSEOVER DT+instance AdmitAttrONMOUSEOVER EM+instance AdmitAttrONMOUSEOVER FIELDSET+instance AdmitAttrONMOUSEOVER FORM+instance AdmitAttrONMOUSEOVER H1+instance AdmitAttrONMOUSEOVER H2+instance AdmitAttrONMOUSEOVER H3+instance AdmitAttrONMOUSEOVER H4+instance AdmitAttrONMOUSEOVER H5+instance AdmitAttrONMOUSEOVER H6+instance AdmitAttrONMOUSEOVER HR+instance AdmitAttrONMOUSEOVER I+instance AdmitAttrONMOUSEOVER IMG+instance AdmitAttrONMOUSEOVER INPUT+instance AdmitAttrONMOUSEOVER INS+instance AdmitAttrONMOUSEOVER KBD+instance AdmitAttrONMOUSEOVER LABEL+instance AdmitAttrONMOUSEOVER LEGEND+instance AdmitAttrONMOUSEOVER LI+instance AdmitAttrONMOUSEOVER LINK+instance AdmitAttrONMOUSEOVER MAP+instance AdmitAttrONMOUSEOVER MENU+instance AdmitAttrONMOUSEOVER NOFRAMES+instance AdmitAttrONMOUSEOVER NOSCRIPT+instance AdmitAttrONMOUSEOVER OBJECT+instance AdmitAttrONMOUSEOVER OL+instance AdmitAttrONMOUSEOVER OPTGROUP+instance AdmitAttrONMOUSEOVER OPTION+instance AdmitAttrONMOUSEOVER P+instance AdmitAttrONMOUSEOVER PRE+instance AdmitAttrONMOUSEOVER Q+instance AdmitAttrONMOUSEOVER S+instance AdmitAttrONMOUSEOVER SAMP+instance AdmitAttrONMOUSEOVER SELECT+instance AdmitAttrONMOUSEOVER SMALL+instance AdmitAttrONMOUSEOVER SPAN+instance AdmitAttrONMOUSEOVER STRIKE+instance AdmitAttrONMOUSEOVER STRONG+instance AdmitAttrONMOUSEOVER SUB+instance AdmitAttrONMOUSEOVER SUP+instance AdmitAttrONMOUSEOVER TABLE+instance AdmitAttrONMOUSEOVER TBODY+instance AdmitAttrONMOUSEOVER TD+instance AdmitAttrONMOUSEOVER TEXTAREA+instance AdmitAttrONMOUSEOVER TFOOT+instance AdmitAttrONMOUSEOVER TH+instance AdmitAttrONMOUSEOVER THEAD+instance AdmitAttrONMOUSEOVER TR+instance AdmitAttrONMOUSEOVER TT+instance AdmitAttrONMOUSEOVER U+instance AdmitAttrONMOUSEOVER UL+instance AdmitAttrONMOUSEOVER VAR+instance AdmitAttrONMOUSEUP A+instance AdmitAttrONMOUSEUP ABBR+instance AdmitAttrONMOUSEUP ACRONYM+instance AdmitAttrONMOUSEUP ADDRESS+instance AdmitAttrONMOUSEUP AREA+instance AdmitAttrONMOUSEUP B+instance AdmitAttrONMOUSEUP BIG+instance AdmitAttrONMOUSEUP BLOCKQUOTE+instance AdmitAttrONMOUSEUP BODY+instance AdmitAttrONMOUSEUP BUTTON+instance AdmitAttrONMOUSEUP CAPTION+instance AdmitAttrONMOUSEUP CENTER+instance AdmitAttrONMOUSEUP CITE+instance AdmitAttrONMOUSEUP CODE+instance AdmitAttrONMOUSEUP COL+instance AdmitAttrONMOUSEUP COLGROUP+instance AdmitAttrONMOUSEUP DD+instance AdmitAttrONMOUSEUP DEL+instance AdmitAttrONMOUSEUP DFN+instance AdmitAttrONMOUSEUP DIR+instance AdmitAttrONMOUSEUP DIV+instance AdmitAttrONMOUSEUP DL+instance AdmitAttrONMOUSEUP DT+instance AdmitAttrONMOUSEUP EM+instance AdmitAttrONMOUSEUP FIELDSET+instance AdmitAttrONMOUSEUP FORM+instance AdmitAttrONMOUSEUP H1+instance AdmitAttrONMOUSEUP H2+instance AdmitAttrONMOUSEUP H3+instance AdmitAttrONMOUSEUP H4+instance AdmitAttrONMOUSEUP H5+instance AdmitAttrONMOUSEUP H6+instance AdmitAttrONMOUSEUP HR+instance AdmitAttrONMOUSEUP I+instance AdmitAttrONMOUSEUP IMG+instance AdmitAttrONMOUSEUP INPUT+instance AdmitAttrONMOUSEUP INS+instance AdmitAttrONMOUSEUP KBD+instance AdmitAttrONMOUSEUP LABEL+instance AdmitAttrONMOUSEUP LEGEND+instance AdmitAttrONMOUSEUP LI+instance AdmitAttrONMOUSEUP LINK+instance AdmitAttrONMOUSEUP MAP+instance AdmitAttrONMOUSEUP MENU+instance AdmitAttrONMOUSEUP NOFRAMES+instance AdmitAttrONMOUSEUP NOSCRIPT+instance AdmitAttrONMOUSEUP OBJECT+instance AdmitAttrONMOUSEUP OL+instance AdmitAttrONMOUSEUP OPTGROUP+instance AdmitAttrONMOUSEUP OPTION+instance AdmitAttrONMOUSEUP P+instance AdmitAttrONMOUSEUP PRE+instance AdmitAttrONMOUSEUP Q+instance AdmitAttrONMOUSEUP S+instance AdmitAttrONMOUSEUP SAMP+instance AdmitAttrONMOUSEUP SELECT+instance AdmitAttrONMOUSEUP SMALL+instance AdmitAttrONMOUSEUP SPAN+instance AdmitAttrONMOUSEUP STRIKE+instance AdmitAttrONMOUSEUP STRONG+instance AdmitAttrONMOUSEUP SUB+instance AdmitAttrONMOUSEUP SUP+instance AdmitAttrONMOUSEUP TABLE+instance AdmitAttrONMOUSEUP TBODY+instance AdmitAttrONMOUSEUP TD+instance AdmitAttrONMOUSEUP TEXTAREA+instance AdmitAttrONMOUSEUP TFOOT+instance AdmitAttrONMOUSEUP TH+instance AdmitAttrONMOUSEUP THEAD+instance AdmitAttrONMOUSEUP TR+instance AdmitAttrONMOUSEUP TT+instance AdmitAttrONMOUSEUP U+instance AdmitAttrONMOUSEUP UL+instance AdmitAttrONMOUSEUP VAR+instance AdmitAttrONRESET FORM+instance AdmitAttrONSELECT INPUT+instance AdmitAttrONSELECT TEXTAREA+instance AdmitAttrONSUBMIT FORM+instance AdmitAttrONUNLOAD BODY+instance AdmitAttrPROFILE HEAD+instance AdmitAttrPROMPT ISINDEX+instance AdmitAttrREADONLY INPUT+instance AdmitAttrREADONLY TEXTAREA+instance AdmitAttrREL A+instance AdmitAttrREL LINK+instance AdmitAttrREV A+instance AdmitAttrREV LINK+instance AdmitAttrROWS TEXTAREA+instance AdmitAttrROWSPAN TD+instance AdmitAttrROWSPAN TH+instance AdmitAttrRULES TABLE+instance AdmitAttrSCHEME META+instance AdmitAttrSCOPE TD+instance AdmitAttrSCOPE TH+instance AdmitAttrSCROLLING IFRAME+instance AdmitAttrSELECTED OPTION+instance AdmitAttrSHAPE A+instance AdmitAttrSHAPE AREA+instance AdmitAttrSIZE BASEFONT+instance AdmitAttrSIZE FONT+instance AdmitAttrSIZE HR+instance AdmitAttrSIZE INPUT+instance AdmitAttrSIZE SELECT+instance AdmitAttrSPAN COL+instance AdmitAttrSPAN COLGROUP+instance AdmitAttrSRC IFRAME+instance AdmitAttrSRC IMG+instance AdmitAttrSRC INPUT+instance AdmitAttrSRC SCRIPT+instance AdmitAttrSTANDBY OBJECT+instance AdmitAttrSTART OL+instance AdmitAttrSTYLE A+instance AdmitAttrSTYLE ABBR+instance AdmitAttrSTYLE ACRONYM+instance AdmitAttrSTYLE ADDRESS+instance AdmitAttrSTYLE APPLET+instance AdmitAttrSTYLE AREA+instance AdmitAttrSTYLE B+instance AdmitAttrSTYLE BDO+instance AdmitAttrSTYLE BIG+instance AdmitAttrSTYLE BLOCKQUOTE+instance AdmitAttrSTYLE BODY+instance AdmitAttrSTYLE BR+instance AdmitAttrSTYLE BUTTON+instance AdmitAttrSTYLE CAPTION+instance AdmitAttrSTYLE CENTER+instance AdmitAttrSTYLE CITE+instance AdmitAttrSTYLE CODE+instance AdmitAttrSTYLE COL+instance AdmitAttrSTYLE COLGROUP+instance AdmitAttrSTYLE DD+instance AdmitAttrSTYLE DEL+instance AdmitAttrSTYLE DFN+instance AdmitAttrSTYLE DIR+instance AdmitAttrSTYLE DIV+instance AdmitAttrSTYLE DL+instance AdmitAttrSTYLE DT+instance AdmitAttrSTYLE EM+instance AdmitAttrSTYLE FIELDSET+instance AdmitAttrSTYLE FONT+instance AdmitAttrSTYLE FORM+instance AdmitAttrSTYLE H1+instance AdmitAttrSTYLE H2+instance AdmitAttrSTYLE H3+instance AdmitAttrSTYLE H4+instance AdmitAttrSTYLE H5+instance AdmitAttrSTYLE H6+instance AdmitAttrSTYLE HR+instance AdmitAttrSTYLE I+instance AdmitAttrSTYLE IFRAME+instance AdmitAttrSTYLE IMG+instance AdmitAttrSTYLE INPUT+instance AdmitAttrSTYLE INS+instance AdmitAttrSTYLE ISINDEX+instance AdmitAttrSTYLE KBD+instance AdmitAttrSTYLE LABEL+instance AdmitAttrSTYLE LEGEND+instance AdmitAttrSTYLE LI+instance AdmitAttrSTYLE LINK+instance AdmitAttrSTYLE MAP+instance AdmitAttrSTYLE MENU+instance AdmitAttrSTYLE NOFRAMES+instance AdmitAttrSTYLE NOSCRIPT+instance AdmitAttrSTYLE OBJECT+instance AdmitAttrSTYLE OL+instance AdmitAttrSTYLE OPTGROUP+instance AdmitAttrSTYLE OPTION+instance AdmitAttrSTYLE P+instance AdmitAttrSTYLE PRE+instance AdmitAttrSTYLE Q+instance AdmitAttrSTYLE S+instance AdmitAttrSTYLE SAMP+instance AdmitAttrSTYLE SELECT+instance AdmitAttrSTYLE SMALL+instance AdmitAttrSTYLE SPAN+instance AdmitAttrSTYLE STRIKE+instance AdmitAttrSTYLE STRONG+instance AdmitAttrSTYLE SUB+instance AdmitAttrSTYLE SUP+instance AdmitAttrSTYLE TABLE+instance AdmitAttrSTYLE TBODY+instance AdmitAttrSTYLE TD+instance AdmitAttrSTYLE TEXTAREA+instance AdmitAttrSTYLE TFOOT+instance AdmitAttrSTYLE TH+instance AdmitAttrSTYLE THEAD+instance AdmitAttrSTYLE TR+instance AdmitAttrSTYLE TT+instance AdmitAttrSTYLE U+instance AdmitAttrSTYLE UL+instance AdmitAttrSTYLE VAR+instance AdmitAttrSUMMARY TABLE+instance AdmitAttrTABINDEX A+instance AdmitAttrTABINDEX AREA+instance AdmitAttrTABINDEX BUTTON+instance AdmitAttrTABINDEX INPUT+instance AdmitAttrTABINDEX OBJECT+instance AdmitAttrTABINDEX SELECT+instance AdmitAttrTABINDEX TEXTAREA+instance AdmitAttrTARGET A+instance AdmitAttrTARGET AREA+instance AdmitAttrTARGET BASE+instance AdmitAttrTARGET FORM+instance AdmitAttrTARGET LINK+instance AdmitAttrTEXT BODY+instance AdmitAttrTITLE A+instance AdmitAttrTITLE ABBR+instance AdmitAttrTITLE ACRONYM+instance AdmitAttrTITLE ADDRESS+instance AdmitAttrTITLE APPLET+instance AdmitAttrTITLE AREA+instance AdmitAttrTITLE B+instance AdmitAttrTITLE BDO+instance AdmitAttrTITLE BIG+instance AdmitAttrTITLE BLOCKQUOTE+instance AdmitAttrTITLE BODY+instance AdmitAttrTITLE BR+instance AdmitAttrTITLE BUTTON+instance AdmitAttrTITLE CAPTION+instance AdmitAttrTITLE CENTER+instance AdmitAttrTITLE CITE+instance AdmitAttrTITLE CODE+instance AdmitAttrTITLE COL+instance AdmitAttrTITLE COLGROUP+instance AdmitAttrTITLE DD+instance AdmitAttrTITLE DEL+instance AdmitAttrTITLE DFN+instance AdmitAttrTITLE DIR+instance AdmitAttrTITLE DIV+instance AdmitAttrTITLE DL+instance AdmitAttrTITLE DT+instance AdmitAttrTITLE EM+instance AdmitAttrTITLE FIELDSET+instance AdmitAttrTITLE FONT+instance AdmitAttrTITLE FORM+instance AdmitAttrTITLE H1+instance AdmitAttrTITLE H2+instance AdmitAttrTITLE H3+instance AdmitAttrTITLE H4+instance AdmitAttrTITLE H5+instance AdmitAttrTITLE H6+instance AdmitAttrTITLE HR+instance AdmitAttrTITLE I+instance AdmitAttrTITLE IFRAME+instance AdmitAttrTITLE IMG+instance AdmitAttrTITLE INPUT+instance AdmitAttrTITLE INS+instance AdmitAttrTITLE ISINDEX+instance AdmitAttrTITLE KBD+instance AdmitAttrTITLE LABEL+instance AdmitAttrTITLE LEGEND+instance AdmitAttrTITLE LI+instance AdmitAttrTITLE LINK+instance AdmitAttrTITLE MAP+instance AdmitAttrTITLE MENU+instance AdmitAttrTITLE NOFRAMES+instance AdmitAttrTITLE NOSCRIPT+instance AdmitAttrTITLE OBJECT+instance AdmitAttrTITLE OL+instance AdmitAttrTITLE OPTGROUP+instance AdmitAttrTITLE OPTION+instance AdmitAttrTITLE P+instance AdmitAttrTITLE PRE+instance AdmitAttrTITLE Q+instance AdmitAttrTITLE S+instance AdmitAttrTITLE SAMP+instance AdmitAttrTITLE SELECT+instance AdmitAttrTITLE SMALL+instance AdmitAttrTITLE SPAN+instance AdmitAttrTITLE STRIKE+instance AdmitAttrTITLE STRONG+instance AdmitAttrTITLE STYLE+instance AdmitAttrTITLE SUB+instance AdmitAttrTITLE SUP+instance AdmitAttrTITLE TABLE+instance AdmitAttrTITLE TBODY+instance AdmitAttrTITLE TD+instance AdmitAttrTITLE TEXTAREA+instance AdmitAttrTITLE TFOOT+instance AdmitAttrTITLE TH+instance AdmitAttrTITLE THEAD+instance AdmitAttrTITLE TR+instance AdmitAttrTITLE TT+instance AdmitAttrTITLE U+instance AdmitAttrTITLE UL+instance AdmitAttrTITLE VAR+instance AdmitAttrTYPE A+instance AdmitAttrTYPE BUTTON+instance AdmitAttrTYPE INPUT+instance AdmitAttrTYPE LI+instance AdmitAttrTYPE LINK+instance AdmitAttrTYPE OBJECT+instance AdmitAttrTYPE OL+instance AdmitAttrTYPE PARAM+instance AdmitAttrTYPE SCRIPT+instance AdmitAttrTYPE STYLE+instance AdmitAttrTYPE UL+instance AdmitAttrUSEMAP IMG+instance AdmitAttrUSEMAP INPUT+instance AdmitAttrUSEMAP OBJECT+instance AdmitAttrVALIGN COL+instance AdmitAttrVALIGN COLGROUP+instance AdmitAttrVALIGN TBODY+instance AdmitAttrVALIGN TD+instance AdmitAttrVALIGN TFOOT+instance AdmitAttrVALIGN TH+instance AdmitAttrVALIGN THEAD+instance AdmitAttrVALIGN TR+instance AdmitAttrVALUE BUTTON+instance AdmitAttrVALUE INPUT+instance AdmitAttrVALUE LI+instance AdmitAttrVALUE OPTION+instance AdmitAttrVALUE PARAM+instance AdmitAttrVALUETYPE PARAM+instance AdmitAttrVERSION HTML+instance AdmitAttrVLINK BODY+instance AdmitAttrVSPACE APPLET+instance AdmitAttrVSPACE IMG+instance AdmitAttrVSPACE OBJECT+instance AdmitAttrWIDTH APPLET+instance AdmitAttrWIDTH COL+instance AdmitAttrWIDTH COLGROUP+instance AdmitAttrWIDTH HR+instance AdmitAttrWIDTH IFRAME+instance AdmitAttrWIDTH IMG+instance AdmitAttrWIDTH OBJECT+instance AdmitAttrWIDTH PRE+instance AdmitAttrWIDTH TABLE+instance AdmitAttrWIDTH TD+instance AdmitAttrWIDTH TH
+ WASH/HTML/HTMLTemplates.hs view
@@ -0,0 +1,516 @@+module WASH.HTML.HTMLTemplates where++import WASH.HTML.HTMLBase+import WASH.Utility.SHA1+import WASH.Utility.JavaScript+import qualified WASH.Utility.Base32 as Base32++import Monad (unless)+import List ((\\))++data ST s a = ST { unST :: s -> (a, s) }+instance Monad (ST s) where+ return x = ST (\s -> (x, s))+ m >>= f = ST (\s -> let (x', s') = unST m s+ in unST (f x') s')++runST :: s -> ST s a -> a+runST s m = fst (unST m s)++getST :: ST s s+getST = ST (\s -> (s, s))++setST :: s -> ST s ()+setST s = ST (const ((), s))++data Names = Names { ntable :: [(String, Int)], nseen :: [Int] }++----------------------------------------------------------------------+-- template generation+----------------------------------------------------------------------+showTemplatified :: ELEMENT_ -> ShowS+showTemplatified = showTemplate . analyze++showTemplate :: (Template, Mt) -> ShowS+showTemplate (tis, mt) =+ let ts = closed mt+ ndefs = length ts + at = actuals mt+ st = buildStringTableArgs at+ cst = cleanupStringTable ndefs st+ shownargs = runST (Names { ntable = cst, nseen = [] })+ (showActualArgs at)+ in+ showDefinitions ndefs ts .+ showString "<script name=\"BODY\">\n" .+ -- showStringTable cst .+ showString "S(" . shownargs . showString ",document)" .+ showString "\n</script>\n"++showDefinitions n [] =+ let scriptName = "STRINGBASE"+ in+ showString "<script name=\"" . showString scriptName . showString "\">\n" .+ showString "function S (template, out) {\n" .+ showString " var ty = typeof template;\n" .+ showString " if (ty == \"string\") out.write (template);\n" .+ showString " else if (ty == \"object\")\n" .+ showString " for (var i = 0; i<template.length; i++)\n" .+ showString " S (template[i], out);\n" .+ showString "}\n" .+ showString "</script>\n"+ +showDefinitions n ((scriptName, (nr, nformals, t1)) :ts) =+ showString "<script name=\"" . showString scriptName . showString "\">\n" .+ (if nformals==0 then showString "var " else showString "function ") . showsIdent n . + (if nformals==0 then showString "=" else showString "(" . showFormals nformals . showString ")" .+ showString "{return") .+ showString "[" .+ showBody t1 .+ showString "]" .+ (if nformals==0 then id else showString "}\n") .+ showString "</script>\n" .+ showDefinitions (n-1) ts++showsIdent n = showString (identlist !! n)++charlist = (['A'..'Z'] ++ ['a'..'z'])+alphanumlist = ['0'..'9'] ++ charlist++identlist = ([ [c] | c <- charlist ]+ ++ [ [c,d] | c <- charlist, d <- alphanumlist ])+ \\ ["S","o","v"]++ +showBody [] = + id+showBody [ti] =+ showStatement ti+showBody (ti:tis) =+ showBody tis .+ showString "," .+ showStatement ti++showStatement (TOut str) =+ showString (jsShow str)+showStatement (TVar n) =+ showsIdent n+showStatement (TCall fname args) =+ error "this should not happen"++showFormals 0 =+ id+showFormals n =+ (if n>1 then showFormals (n-1) . showString "," else id) .+ showsIdent n++showActual (TOut str) =+ do names <- getST+ let cst = ntable names+ seen = nseen names+ case lookup str cst of+ Nothing ->+ return $ showString (jsShow str)+ Just strident ->+ if strident `elem` seen+ then return $ showsIdent strident+ else+ do setST (names { nseen = strident : seen })+ return $+ (showsIdent strident . showChar '=' . showString (jsShow str))+showActual (TVar n) =+ error "this should not happen"+showActual (TCall fname []) =+ return $ showsIdent fname+showActual (TCall fname args) =+ do saa <- showActualArgs args+ return (showsIdent fname . showString "(" .+ saa .+ showString ")")++showActualArgs [] = + return id+showActualArgs [arg] =+ showActualArg arg+showActualArgs (arg: args) =+ do x1 <- showActualArgs args+ x2 <- showActualArg arg+ return (x1 . showString "," . x2)++showActualArg [x] =+ showActual x+showActualArg xs = + do hxs <- h xs+ return (showString "[" . hxs . showString "]")+ where + h [] = return id+ h [x] = showActual x+ h (x:xs) = do sax <- showActual x+ hxs <- h xs+ return (sax . showChar ',' . hxs)++showStringTable =+ foldr g id+ where+ g (str, n) showrest =+ showString "var " . showsIdent n . showString "=" . showString (jsShow str) .+ showString ";\n" . showrest++cleanupStringTable ndefs st =+ zip [str | (str, n) <- st, n > 3 || length str > 2 && n > 1]+ [(ndefs+1) ..]+unite st1 st2 =+ foldr g st1 st2+ where g p@(str,i) st1 =+ case lookup str st1 of+ Nothing -> p:st1+ Just j -> (str, i+j):[ p | (p@(str',_)) <- st1, str' /= str ]+buildStringTableArgs = + foldr unite [] . map buildStringTableArg+buildStringTableArg =+ foldr unite [] . map buildStringTableActual+buildStringTableActual (TOut str) =+ [(str, 1)]+buildStringTableActual (TVar n) =+ error "this should not happen"+buildStringTableActual (TCall fname args) =+ buildStringTableArgs args+ +----------------------------------------------------------------------+-- template analysis+----------------------------------------------------------------------++analyze :: ELEMENT_ -> (Template, Mt)+analyze e = unM (collect e STATIC []) mt0++data Mt = Mt+ { open :: Templates+ , closed :: [(String, (Int, Int, Template))]+ , dynamics :: [Templates]+ , actuals :: Templates+ , count :: Int+ }+ deriving Show++mt0 = Mt { open = []+ , closed = []+ , dynamics = []+ , actuals = []+ , count = 0+ }++type Templates = [Template]++type Template = [TemplateItem]++data TemplateItem+ = TOut String+ | TVar Int+ | TCall Int [Template]+ deriving Show++tout :: String -> [TemplateItem] -> [TemplateItem]+tout s (TOut s' : rest) = (TOut (s'++s) : rest) +tout s tis = TOut s : tis++data M a = M { unM :: Mt -> (a, Mt) }++instance Monad M where+ return a = M (\t -> (a, t))+ m >>= f = M (\t -> let (a,t') = unM m t in unM (f a) t')++pushOpen :: Template -> M ()+pushOpen t = M (\mt -> ((), mt { open = t : open mt+ , dynamics = actuals mt : dynamics mt + , actuals = []+ } ))+popOpen :: M Template+popOpen = M (\mt -> (head (open mt), mt { open = tail (open mt)+ , actuals = head (dynamics mt)+ , dynamics = tail (dynamics mt)+ }))++pushClosed :: Template -> M Int+pushClosed tis = + M (\mt -> + let defs = closed mt + name = Base32.encode (sha1 (show tis)) + in+ case lookup name defs of+ Nothing ->+ let next = length (closed mt) + 1 in+ (next, mt { closed = (name, (next, length (actuals mt), tis)) : defs })+ Just (last, nargs, _) ->+ (last, mt))++pushActuals :: Template -> M Int+pushActuals tis = + M (\mt -> (length (actuals mt) + 1, mt { actuals = tis : actuals mt }))++getActuals :: M Templates+getActuals = M (\mt -> (actuals mt, mt))++get :: (Mt -> x) -> M x+get f = M (\mt -> (f mt, mt))++mergeActuals :: Template -> M ()+mergeActuals tis =+ M (\mt -> + let act0 : acts = actuals mt in+ ((), mt { actuals = (act0 ++ tis) : actuals mt }))++maybePushActuals :: Template -> Template -> M Template+maybePushActuals cur tis =+ case cur of+ TVar _ : _ ->+ do mergeActuals tis+ return cur+ _ ->+ do vname <- pushActuals tis+ return (TVar vname : cur)++-- |collect takes an element, a list of open templates, a list of finished+-- templates, and returns a pair (open templates, finished templates).+collect :: ELEMENT_ -> BT -> Template -> M Template+collect (EMPTY_ bt tag atts) cbt cur =+ let t1 = TOut ('<' : tag)+ t2 = tout "/>"+ in+ case bt of + TOPLEVEL -> + do pushOpen cur+ ts <- collectAttrs atts STATIC [t1]+ fname <- pushClosed (t2 ts)+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]+ DYNAMIC ->+ case cbt of+ STATIC ->+ do ts <- collectAttrs atts DYNAMIC [t1]+ maybePushActuals cur (t2 ts)+ DYNAMIC ->+ do ts <- collectAttrs atts DYNAMIC (t1 : cur)+ return (t2 ts)+ STATIC ->+ case cbt of+ STATIC ->+ do ts <- collectAttrs atts STATIC (t1 : cur)+ return (t2 ts)+ DYNAMIC ->+ do pushOpen cur+ ts <- collectAttrs atts STATIC [t1]+ fname <- pushClosed (t2 ts)+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]++collect (ELEMENT_ bt tag atts elems) cbt cur =+ let t1 = TOut ('<' : tag)+ t1' = tout ('<' : tag)+ t2 = tout ">"+ t3 = tout ("</" ++ tag ++ ">")+ in+ case bt of + TOPLEVEL -> + do pushOpen cur+ ts1 <- collectAttrs atts STATIC [t1]+ ts2 <- collectElems elems STATIC (t2 ts1)+ fname <- pushClosed (t3 ts2)+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]+ DYNAMIC ->+ case cbt of+ STATIC ->+ do ts1 <- collectAttrs atts DYNAMIC [t1]+ ts2 <- collectElems elems DYNAMIC (t2 ts1)+ maybePushActuals cur (t3 ts2)+ DYNAMIC ->+ do ts1 <- collectAttrs atts DYNAMIC (t1' cur)+ ts2 <- collectElems elems DYNAMIC (t2 ts1)+ return (t3 ts2)+ STATIC ->+ case cbt of+ STATIC ->+ do ts1 <- collectAttrs atts STATIC (t1' cur)+ ts2 <- collectElems elems STATIC (t2 ts1)+ return (t3 ts2)+ DYNAMIC ->+ do pushOpen cur+ ts1 <- collectAttrs atts STATIC [t1]+ ts2 <- collectElems elems STATIC (t2 ts1)+ fname <- pushClosed (t3 ts2)+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]++collect (DOCTYPE_ bt strs elems) cbt cur =+ let t1 = TOut ("<!DOCTYPE" +++ (foldr (\str f -> showChar ' ' . showString str . f) id strs .+ showString ">")+ "<!-- generated by WASH/HTML 0.11\n-->")+ in+ case bt of + TOPLEVEL -> + do pushOpen cur+ ts2 <- collectElems elems STATIC [t1]+ fname <- pushClosed ts2+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]+ DYNAMIC ->+ case cbt of+ STATIC ->+ do ts2 <- collectElems elems DYNAMIC [t1]+ maybePushActuals cur ts2+ DYNAMIC ->+ do collectElems elems DYNAMIC (t1 : cur)+ STATIC ->+ case cbt of+ STATIC ->+ do collectElems elems STATIC (t1 : cur)+ DYNAMIC ->+ do pushOpen cur+ ts2 <- collectElems elems STATIC [t1]+ fname <- pushClosed ts2+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]++collect (CDATA_ bt str) cbt cur =+ let t0 = TOut str+ t0' = tout str in+ case bt of + TOPLEVEL -> + do pushOpen cur+ fname <- pushClosed [t0]+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]+ DYNAMIC ->+ case cbt of+ STATIC ->+ do maybePushActuals cur [t0]+ DYNAMIC ->+ do return [t0]+ STATIC ->+ case cbt of+ STATIC ->+ do return (t0' cur)+ DYNAMIC ->+ do pushOpen cur+ fname <- pushClosed [t0]+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]++collect (COMMENT_ bt str) cbt cur =+ let t0 = TOut str+ t0' = tout str in+ case bt of + TOPLEVEL -> + do pushOpen cur+ fname <- pushClosed [t0]+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]+ DYNAMIC ->+ case cbt of+ STATIC ->+ do maybePushActuals cur [t0]+ DYNAMIC ->+ do return [t0]+ STATIC ->+ case cbt of+ STATIC ->+ do return (t0' cur)+ DYNAMIC ->+ do pushOpen cur+ fname <- pushClosed [t0]+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]++collectElems [] cbt cur =+ return cur+collectElems (at:ats) cbt cur =+ do ts <- collectElems ats cbt cur+ collect at cbt ts++collectAttrs [] cbt cur =+ return cur+collectAttrs (at:ats) cbt cur =+ do ts <- collectAttr at cbt cur+ collectAttrs ats cbt ts++collectAttr+ ATTR_ { attr_BT = bt+ , attr_value_BT = vbt+ , attr_name = aname+ , attr_value = aval+ } + cbt+ cur = let { t1 = TOut (' ' : aname ++ "=\"") ; t2 = TOut "\"";+ t1' = tout (' ' : aname ++ "=\"") ; t2' = tout "\""; } in+ case bt of+ TOPLEVEL ->+ do pushOpen cur+ ts <- collectAttrValue aval vbt STATIC [t1]+ fname <- pushClosed (t2' ts)+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]+ DYNAMIC ->+ case cbt of+ STATIC ->+ do ts <- collectAttrValue aval vbt DYNAMIC [t1]+ maybePushActuals cur (t2' ts)+ DYNAMIC ->+ do ts <- collectAttrValue aval vbt DYNAMIC (t1' cur)+ return (t2' ts)+ STATIC ->+ case cbt of+ STATIC ->+ do ts <- collectAttrValue aval vbt STATIC (t1' cur)+ return (t2' ts)+ DYNAMIC ->+ do pushOpen cur+ ts <- collectAttrValue aval vbt STATIC [t1]+ fname <- pushClosed (t2' ts)+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]++collectAttrValue aval bt cbt cur =+ let encVal = (htmlAttr aval "")+ t0 = TOut encVal+ t0' = tout encVal in+ case bt of+ TOPLEVEL ->+ do pushOpen cur+ fname <- pushClosed [t0]+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]+ DYNAMIC ->+ case cbt of+ STATIC ->+ do maybePushActuals cur [t0]+ DYNAMIC ->+ do return [t0]+ STATIC ->+ case cbt of+ STATIC ->+ do return (t0' cur)+ DYNAMIC ->+ do pushOpen cur+ fname <- pushClosed [t0]+ parms <- get actuals+ cur' <- popOpen+ maybePushActuals cur' [TCall fname parms]+++-- Local Variables: +-- haskell-prog-switches: ("/home/thiemann/src/haskell/Utility/sha1lib.o")+-- End:
+ WASH/HTML/HTMLTypedBase.hs view
@@ -0,0 +1,109 @@+{-# OPTIONS -fglasgow-exts #-}+-- © 2001 Peter Thiemann+module WASH.HTML.HTMLTypedBase+ (module WASH.HTML.HTMLBase, module WASH.HTML.HTMLTypedBase) + where++import Char+import WASH.HTML.HTMLBase++-- typed layer+-- attributes++data ATTRIBUTE a => ATTR a = -- a phantom type+ ATTR { unATTR :: ATTR_ }++class Show a => ATTRIBUTE a where+ show_name :: a -> String+-- + show_name = map toLower . show++-- attribute values++class (ATTRIBUTE a, Show v) => AttrValue a v++mkUAttr :: ATTRIBUTE a => a -> String -> ATTR a+mkUAttr a vstr = ATTR (attr_ (show_name a) vstr)++mkAttr :: (AttrValue a v) => a -> v -> ATTR a+mkAttr a v = + mkUAttr a (av raw)+ where raw = show v+ av (str@('\"':_)) = let str1 = read str :: String in str1+ av str = str++attr a v into = add_attr into (mkAttr a v)++uattr a vstr into = add_attr into (mkUAttr a vstr)++-- elements++data TAG t => ELT t =+ ELT { unELT :: ELEMENT_ }++class Show t => TAG t where+ make :: t -> ELT t+ show_tag :: t -> String+--+ make = make_standard+ show_tag = map toLower . show++make_standard t = ELT (element_ (show_tag t) [] [])+make_empty t = ELT (empty_ (show_tag t) [])++--+class (TAG s, TAG t) => AddTo s t++add :: (AddTo s t) => ELT s -> ELT t -> ELT s+add (ELT e_) (ELT e'_) =+ ELT (add_ e_ e'_)++add' :: (AddTo s t) => ELT t -> ELT s -> ELT s+add' = flip add++class (TAG t) => AddAttr t a++add_attr :: (AddAttr t a) => ELT t -> ATTR a -> ELT t+add_attr (ELT e_) (ATTR att) =+ ELT (add_attr_ e_ att)++attr' :: (AddAttr t a) => ATTR a -> ELT t -> ELT t+attr' = flip add_attr+ +-- --================= FUNCTIONS =================----++-- --show functions------------------++show_html (ELT e_) = show e_++-- creating text elements++text, rawtext, formattedtext :: (AddTo a CDATA) => String -> ELT a -> ELT a+text str = add' (ELT (cdata_ [] str) :: ELT CDATA)+rawtext str = add' (ELT (cdata_ [CDATA_ENCODED] str) :: ELT CDATA)+formattedtext str = add' (ELT (cdata_ [CDATA_FORMATTED] str) :: ELT CDATA)++data CDATA = CDATA deriving Show+instance TAG CDATA++-- creating comment elements++comment :: String -> ELT a -> ELT a+comment str (ELT e_) = ELT (add_ e_ (comment_ str))++-- creating the main document++data DOCUMENT = DOCUMENT deriving Show+instance TAG DOCUMENT where+ make DOCUMENT = + ELT (doctype_+ ["HTML"+ ,"PUBLIC"+ ,"\"-//W3C//DTD HTML 4.01//EN\""+ ,"\"http://www.w3.org/TR/html4/strict.dtd\""]+ [])++-- instance AddTo DOCUMENT HTML -- must be in HTMLPrelude++show_document :: ELT DOCUMENT -> String+show_document = show_html
+ WASH/HTML/HTMLTypedBase98.hs view
@@ -0,0 +1,110 @@+-- © 2002 Peter Thiemann+module WASH.HTML.HTMLTypedBase98 + (module WASH.HTML.HTMLBase, module WASH.HTML.HTMLTypedBase98)+ where++import Char+import WASH.HTML.HTMLBase++-- typed layer+-- attributes++data ATTRIBUTE a => ATTR a = -- a phantom type+ ATTR { unATTR :: ATTR_ }++class Show a => ATTRIBUTE a where+ show_name :: a -> String+-- + show_name = map toLower . show++-- attribute values++-- class (ATTRIBUTE a, Show v) => AttrValue a v++mkUAttr :: ATTRIBUTE a => a -> String -> ATTR a+mkUAttr a vstr = ATTR (attr_ (show_name a) vstr)++-- mkAttr :: (AttrValue a v) => a -> v -> ATTR a+-- mkAttr a v = +-- mkUAttr a (av raw)+-- where raw = show v++av (str@('\"':_)) = let str1 = read str :: String in str1+av str = str++-- attr a v into = add_attr into (mkAttr a v)++uattr a vstr into = add_attr into (mkUAttr a vstr)++-- elements++data TAG t => ELT t =+ ELT { unELT :: ELEMENT_ }++class Show t => TAG t where+ make :: t -> ELT t+ show_tag :: t -> String+--+ make = make_standard+ show_tag = map toLower . show++make_standard t = ELT (element_ (show_tag t) [] [])+make_empty t = ELT (empty_ (show_tag t) [])++--+-- class (TAG s, TAG t) => AddTo s t++-- add :: (AddTo s t) => ELT s -> ELT t -> ELT s+add (ELT e_) (ELT e'_) =+ ELT (add_ e_ e'_)++-- add' :: (AddTo s t) => ELT t -> ELT s -> ELT s+add' = flip add++-- class (TAG t) => AddAttr t a++-- add_attr :: (AddAttr t a) => ELT t -> ATTR a -> ELT t+add_attr (ELT e_) (ATTR att) =+ ELT (add_attr_ e_ att)++-- attr' :: (AddAttr t a) => ATTR a -> ELT t -> ELT t+attr' = flip add_attr++-- --================= FUNCTIONS =================----++-- --show functions------------------++show_html (ELT e_) = show e_++-- creating text elements++class AdmitChildCDATA a where+ text, rawtext, formattedtext :: String -> ELT a -> ELT a+ text str = add' (ELT (cdata_ [] str) :: ELT CDATA)+ rawtext str = add' (ELT (cdata_ [CDATA_ENCODED] str) :: ELT CDATA)+ formattedtext str = add' (ELT (cdata_ [CDATA_FORMATTED] str) :: ELT CDATA)++data CDATA = CDATA deriving Show+instance TAG CDATA++-- creating comment elements++comment :: String -> ELT a -> ELT a+comment str (ELT e_) = ELT (add_ e_ (comment_ str))++-- creating the main document++data DOCUMENT = DOCUMENT deriving Show+instance TAG DOCUMENT where+ make DOCUMENT = + ELT (doctype_+ ["HTML"+ ,"PUBLIC"+ ,"\"-//W3C//DTD HTML 4.01//EN\""+ ,"\"http://www.w3.org/TR/html4/strict.dtd\""]+ [])++-- instance AddTo DOCUMENT HTML -- must be in HTMLPrelude++show_document :: ELT DOCUMENT -> String+show_document = show_html
+ WASH/Mail/ContentDisposition.hs view
@@ -0,0 +1,38 @@+module WASH.Mail.ContentDisposition where++import WASH.Mail.RFC2822+ +data ContentDisposition =+ None+ | Inline { parameters :: [ContentDispositionParm] }+ | Attachment { parameters :: [ContentDispositionParm] }++data ContentDispositionParm =+ FileNameParm String+ | CreationDateParm DateTime2822+ | ModificationDateParm DateTime2822+ | ReadDateParm DateTime2822+ | SizeParm Int++hasContentDisposition None = False+hasContentDisposition _ = True++toString (None) =+ ""+toString (Inline { parameters = cdps }) =+ "inline" ++ cdpsToString cdps+toString (Attachment { parameters = cdps }) =+ "attachment" ++ cdpsToString cdps++cdpsToString = concatMap cdpToString+cdpToString (FileNameParm file) =+ "; filename=\""++file++"\""+cdpToString (CreationDateParm dt) =+ "; creation-date=\""++shows dt "\""+cdpToString (ModificationDateParm dt) =+ "; modification-date=\""++shows dt "\""+cdpToString (ReadDateParm dt) =+ "; read-date=\""++shows dt "\""+cdpToString (SizeParm n) =+ "; size="++show n+
+ WASH/Mail/Email.hs view
@@ -0,0 +1,110 @@+-- © 2001, 2002 Peter Thiemann+module WASH.Mail.Email (+ sendmail, inventMessageId, exitcodeToSYSEXIT, SYSEXIT(..),+ module WASH.Mail.MIME, module WASH.Mail.HeaderField) where++-- from standard library+import IO+import System++-- from utility+import WASH.Utility.Auxiliary+import WASH.Utility.Unique++-- from package+import WASH.Mail.EmailConfig+import WASH.Mail.HeaderField+import WASH.Mail.MIME++-- |from sysexit.h+data SYSEXIT =+ EX_OK -- 0 /* successful termination */+ | EX_USAGE -- 64 /* command line usage error */+ | EX_DATAERR -- 65 /* data format error */+ | EX_NOINPUT -- 66 /* cannot open input */+ | EX_NOUSER -- 67 /* addressee unknown */+ | EX_NOHOST -- 68 /* host name unknown */+ | EX_UNAVAILABLE -- 69 /* service unavailable */+ | EX_SOFTWARE -- 70 /* internal software error */+ | EX_OSERR -- 71 /* system error (e.g., can't fork) */+ | EX_OSFILE -- 72 /* critical OS file missing */+ | EX_CANTCREAT -- 73 /* can't create (user) output file */+ | EX_IOERR -- 74 /* input/output error */+ | EX_TEMPFAIL -- 75 /* temp failure; user is invited to retry */+ | EX_PROTOCOL -- 76 /* remote error in protocol */+ | EX_NOPERM -- 77 /* permission denied */+ | EX_CONFIG -- 78 /* configuration error */+ | EX_UNKNOWN Int++exitcodeToSYSEXIT :: ExitCode -> SYSEXIT+exitcodeToSYSEXIT exitcode =+ case exitcode of+ ExitSuccess -> EX_OK+ ExitFailure 64 -> EX_USAGE+ ExitFailure 65 -> EX_DATAERR+ ExitFailure 66 -> EX_NOINPUT+ ExitFailure 67 -> EX_NOUSER+ ExitFailure 68 -> EX_NOHOST+ ExitFailure 69 -> EX_UNAVAILABLE+ ExitFailure 70 -> EX_SOFTWARE+ ExitFailure 71 -> EX_OSERR+ ExitFailure 72 -> EX_OSFILE+ ExitFailure 73 -> EX_CANTCREAT+ ExitFailure 74 -> EX_IOERR+ ExitFailure 75 -> EX_TEMPFAIL+ ExitFailure 76 -> EX_PROTOCOL+ ExitFailure 77 -> EX_NOPERM+ ExitFailure 78 -> EX_CONFIG+ ExitFailure sc -> EX_UNKNOWN sc++instance Show SYSEXIT where+ showsPrec i se = case se of+ EX_OK -> showString "successful termination"+ EX_USAGE -> showString "command line usage error"+ EX_DATAERR -> showString "data format error"+ EX_NOINPUT -> showString "cannot open input"+ EX_NOUSER -> showString "addressee unknown"+ EX_NOHOST -> showString "host name unknown"+ EX_UNAVAILABLE -> showString "service unavailable"+ EX_SOFTWARE -> showString "internal software error"+ EX_OSERR -> showString "system error (e.g., can't fork)"+ EX_OSFILE -> showString "critical OS file missing"+ EX_CANTCREAT -> showString "can't create (user) output file"+ EX_IOERR -> showString "input/output error"+ EX_TEMPFAIL -> showString "temp failure; user is invited to retry"+ EX_PROTOCOL -> showString "remote error in protocol"+ EX_NOPERM -> showString "permission denied"+ EX_CONFIG -> showString "configuration error"+ EX_UNKNOWN sc -> showString "unknown return code: " . shows sc++-- facilities for sending email++sendmailFlags = + ["-i" -- ignore dots alone on a line+ ,"-t" -- read message for recipients+ ,"--" -- end of flag arguments+ ] -- , "-v" for verbose mode++sendmail :: Mail -> IO ExitCode+sendmail mail =+ do filename <- inventBoundary+ let tempfilename = emailTmpDir ++ filename+ tempfilename2 = emailTmpDir ++ "T" ++ filename+ h <- openFile tempfilename WriteMode+ hSend smtpSendControl{ sendH = h } mail+ hClose h+ exitcode <- system (sendmailProgram ++ pFlags sendmailFlags ++ " < " ++ tempfilename ++ " > " ++ tempfilename2)+ system ("rm " ++ tempfilename)+ system ("rm " ++ tempfilename2)+ return exitcode++pFlags [] = ""+pFlags (flag:flags) = ' ' : flag ++ pFlags flags++inventMessageId :: IO Header+inventMessageId =+ do randomKey <- inventStdKey+ hostname <- protectedGetEnv "SERVER_NAME" "localhost"+ let messageId = "<" ++ randomKey ++ ".Email@" ++ hostname ++ ">"+ return (Header ("Message-Id", messageId))+
+ WASH/Mail/EmailConfig.hs view
@@ -0,0 +1,13 @@+module WASH.Mail.EmailConfig where++tmpDir, varDir, emailTmpDir, sendmailProgram :: String++-- |temporary storage+tmpDir = "/tmp/"+-- |persistent, mutable storage+varDir = "/tmp/"++-- |temporary email files+emailTmpDir = tmpDir+-- |path of sendmail program+sendmailProgram = "/usr/sbin/sendmail"
+ WASH/Mail/HeaderField.hs view
@@ -0,0 +1,53 @@+module WASH.Mail.HeaderField where++import WASH.Utility.RFC2047++-- +newtype Header = Header (String, String)+newtype KV = KV (String, String)+newtype MediaType = MediaType (String, String)+-- ++instance Show Header where+ show (Header (key, value)) = + if null value then "" else+ key ++ ':' : ' ' : encodeValue value ++ "\r\n"++instance Show KV where+ show (KV (key, value)) =+ key ++ '=' : value++instance Show MediaType where+ show (MediaType (ty, subty)) =+ ty ++ '/' : subty++-- ++mimeHeader = + Header ("MIME-Version", "1.0")++identHeader =+ Header ("X-Mailer", "WASH/Mail 0.1")++makeContentType mtype subtype parameters = + Header ("Content-Type", mtype ++ "/" ++ subtype ++ p parameters)+ where p = concat . map p1+ p1 parameter = ';' : show parameter++makeContentTransferEncoding enc =+ Header ("Content-Transfer-Encoding", enc)++makeContentDisposition name =+ Header ("Content-Disposition", name)++makeX what recipients = + Header (what, l recipients)+ where l [] = []+ l [xs] = xs+ l (xs:xss) = xs ++ ", " ++ l xss++makeTO = makeX "To"+makeCC = makeX "Cc"+makeBCC = makeX "Bcc"+makeSubject s = makeX "Subject" [s]+
+ WASH/Mail/MIME.hs view
@@ -0,0 +1,192 @@+-- © 2001, 2002 Peter Thiemann+module WASH.Mail.MIME where+-- RFC 2045+-- RFC 2046++import Char+import IO+import Monad+import Random++import qualified WASH.Utility.Base64 as Base64+import qualified WASH.Mail.ContentDisposition as CD+import qualified WASH.Utility.QuotedPrintable as QuotedPrintable+import WASH.Mail.HeaderField+import qualified WASH.Utility.RFC2279 as RFC2279 -- UTF-8+++-- --------------------------------------------------------------------++textDOC subty docLines =+ DOC { mediatype= "text",+ subtype= subty,+ textLines= docLines,+ parameters= [],+ filename= "", -- obsolete+ contentDisposition = CD.Inline [],+ messageData="",+ parts=[]+ }++binaryDOC ty subty bindata =+ DOC { mediatype= ty,+ subtype= subty,+ messageData= bindata,+ textLines= [],+ parameters= [],+ filename= "", -- obsolete+ contentDisposition = CD.Attachment [],+ parts=[]+ }+ +multipartDOC subty subdocs =+ DOC { mediatype= "multipart",+ subtype= subty,+ messageData= "",+ textLines= [],+ parameters= [],+ filename= "", -- obsolete+ contentDisposition = CD.None,+ parts= subdocs+ }++data DOC =+ DOC {+ mediatype :: String, -- type+ subtype :: String, -- subtype+ parameters :: [KV], -- ^ parameters of the media type+ filename :: String, -- ^ suggested filename, OBSOLETE+ contentDisposition :: CD.ContentDisposition, -- ^ sets Content-Disposition, e.g. for suggesting a filename+ -- depending on mediatype only one of the following is relevant:+ messageData :: String, -- ^ data, only relevant for binary data+ textLines :: [String], -- ^ lines, only relevant for text mediatypes+ parts :: [DOC] -- ^ data, only relevant for multipart mediatypes+ }++recommend_cte h doc = + case mediatype doc of+ "text" -> + case sendMode h of+ SevenBit -> "quoted-printable"+ EightBit -> "8bit"+ "multipart" -> "7bit"+ _ ->+ case sendMode h of + SevenBit -> "base64"+ EightBit -> "8bit"++inventBoundary =+ inventKey 10 (init Base64.alphabet_list)+ where+ inventKey len chars =+ do g <- getStdGen+ let candidate = take len $ map (chars !!) $ randomRs (0, length chars - 1) g+ return ("=_" ++ candidate ++ "=_")+ -- see RFC 2045, 6.7 for reasoning about this choice of boundary string++data SendMode =+ EightBit | SevenBit+data SendControl = + SendControl {+ sendH :: Handle,+ sendMode :: SendMode+ }++smtpSendControl = + SendControl { sendH = stdout, sendMode = SevenBit }++httpSendControl =+ SendControl { sendH = stdout, sendMode = EightBit }++instance Send DOC where+ hSend h doc =+ let cte = recommend_cte h doc in+ do boundary <- inventBoundary+ let extraParameter + | mediatype doc == "multipart" = [KV ("boundary", '\"':boundary++"\"")]+ | mediatype doc == "text" = [KV ("charset", "utf-8")]+ | otherwise = []+ hSend h (makeContentType (mediatype doc)+ (subtype doc) + (extraParameter ++ parameters doc))+ hSend h (makeContentTransferEncoding cte)+ when (CD.hasContentDisposition $ contentDisposition doc) $+ hSend h (makeContentDisposition (CD.toString (contentDisposition doc)))+ -- hSend h (makeContentDisposition (filename doc))+ hSend h CRLF+ case mediatype doc of + "text" -> hSendText h doc+ "multipart" -> hSendMultipart h boundary doc+ _ -> hSendBinary h doc++hSendText h doc =+ case sendMode h of+ EightBit -> + hPutStr hdl str+ SevenBit ->+ hPutStr hdl (QuotedPrintable.encode str)+ where hdl = sendH h+ str = RFC2279.encode $ flat (textLines doc)+ flat [] = []+ flat (xs:xss) = xs ++ "\r\n" ++ flat xss++hSendBinary h doc =+ case sendMode h of+ SevenBit ->+ hPutStr (sendH h) (Base64.encode (messageData doc))+ EightBit ->+ hPutStr (sendH h) (messageData doc)++hSendMultipart h boundary doc =+ do -- may send a preamble for non-MIME-able MUAs at this point+ sendParts (parts doc)+ where hdl = sendH h+ sendParts [] = + do hPutStr hdl "--"+ hPutStr hdl boundary+ hPutStr hdl "--"+ hSend h CRLF+ sendParts (doc:docs) =+ do hPutStr hdl "--"+ hPutStr hdl boundary+ hSend h CRLF+ hSend h doc+ sendParts docs++data CRLF = CRLF++instance Send CRLF where+ hSend h CRLF = hPutStr (sendH h) "\n"++data Mail =+ Mail {+ to :: [String],+ subject :: String,+ cc :: [String],+ bcc :: [String],+ headers :: [Header],+ contents :: DOC+ }++simpleMail recipients subj doc =+ Mail { to= recipients, subject= subj, cc=[], bcc=[], headers=[], contents=doc }++class Send m where+ send :: m -> IO ()+ hSend :: SendControl -> m -> IO ()+ send = hSend smtpSendControl++instance Send Header where+ hSend h header = hPutStr (sendH h) (show header)++instance Send Mail where+ hSend h mail =+ do hSend h (makeTO (to mail))+ hSend h (makeSubject (subject mail))+ hSend h (makeCC (cc mail))+ hSend h (makeBCC (bcc mail))+ hSend h mimeHeader+ hSend h identHeader+ sequence (map (hSend h) (headers mail))+ hSend h (contents mail)+
+ WASH/Mail/MailParser.hs view
@@ -0,0 +1,217 @@+module WASH.Mail.MailParser where++-- see RFC 2822+-- TODO: check against their definition of token+import Char+import List+import Maybe+-- +import Text.ParserCombinators.Parsec+-- +import qualified WASH.Utility.Base64 as Base64+import qualified WASH.Utility.QuotedPrintable as QuotedPrintable+import WASH.Utility.RFC2047 as RFC2047 (p_token)+import WASH.Mail.RFC2822+import WASH.Mail.Message+import WASH.Mail.HeaderField++parseMessageFromFile fname =+ parseFromFile message fname++parseMessageFromString str =+ parse message "MailParser" str++parseDateTimeFromString str =+ parse parseDateTime "DateTimeParser" (' ':str)++data RawMessage =+ RawMessage+ { rawHeaders :: [Header]+ , rawLines :: [String]+ }+ deriving Show++lexeme p = do x <- p; many ws1; return x+literalString = do char '\"'+ str <- many (noneOf "\"\\" <|> quoted_pair)+ char '\"'+ return str++no_ws_ctl_chars = map chr ([1..8] ++ [11,12] ++ [14..31] ++ [127])+no_ws_ctl = oneOf no_ws_ctl_chars++text_chars = map chr ([1..9] ++ [11,12] ++ [14..127])+p_text = oneOf text_chars++quoted_pair = do char '\\'+ p_text++-- RFC 2045, 5.1 says: +-- "The type, subtype, and parameter names are not case sensitive."++p_parameter =+ do lexeme $ char ';'+ p_name <- lexeme $ p_token+ lexeme $ char '='+ p_value <- literalString <|> p_token+ return (map toLower p_name, p_value)++p_contentType = + do many ws1+ c_type <- p_token+ lexeme $ char '/'+ c_subtype <- lexeme $ p_token+ c_parameters <- many p_parameter+ return $ ContentType (map toLower c_type) (map toLower c_subtype) c_parameters++-- RFC 2045, 6.1+-- "these values are not case sensitive"++p_contentTransferEncoding =+ do many ws1+ c_cte <- RFC2047.p_token+ return $ ContentTransferEncoding (map toLower c_cte)++p_contentDisposition =+ do many ws1+ c_cd <- RFC2047.p_token+ c_parameters <- many p_parameter+ return $ ContentDisposition (map toLower c_cd) c_parameters++p_contentID = + do many ws1+ c_cid <- RFC2047.p_token+ return $ ContentID c_cid++p_contentDescription =+ do many ws1+ c_desc <- many lineChar+ return $ ContentDescription c_desc++header = do name <- many1 headerNameChar+ char ':'+ line <- do many ws1; lineString+ crLf+ extraLines <- many extraHeaderLine+ return (Header (map toLower name, concat (line:extraLines)))++extraHeaderLine = do sp <- ws1+ line <- lineString+ crLf+ return (sp:line)++lineString = many (noneOf "\n\r")++headerBodySep = do crLf; return ()++body = many (do line <- many lineChar; crLf; return line)++message =+ do hs <- many header+ headerBodySep+ b <- body+ return (RawMessage hs b)++lookupHeader name msg =+ lookupInHeaders name (getHeaders msg)+lookupRawHeader name raw =+ lookupInHeaders name (rawHeaders raw)+lookupInHeaders name headers = g headers+ where g [] = Nothing+ g (Header (name', text):_) | name == name' = Just text+ g (_:rest) = g rest++parseHeader raw name deflt parser =+ fromMaybe deflt $+ do str <- lookupRawHeader name raw+ case parse parser name str of+ Right v -> return v+ Left _ -> Nothing++digestMessage :: RawMessage -> Message+digestMessage =+ digestMessage' (ContentType "text" "plain" [( "charset", "us-ascii")])++digestMessage' :: ContentType -> RawMessage -> Message+digestMessage' defcty raw =+ let cty = parseHeader raw+ "content-type" defcty p_contentType+ cte = parseHeader raw+ "content-transfer-encoding" (ContentTransferEncoding "7bit") p_contentTransferEncoding+ cdn = parseHeader raw+ "content-disposition" (ContentDisposition "inline" []) p_contentDisposition+ cid = parseHeader raw+ "content-id" (ContentID "(none)") p_contentID+ cdc = parseHeader raw+ "content-description" (ContentDescription "(none)") p_contentDescription+ defaultMessage =+ Singlepart+ { getHeaders = rawHeaders raw+ , getLines = rawLines raw+ , getDecoded = decode cte (unlines (rawLines raw))+ , getContentType= cty+ , getContentTransferEncoding= cte+ , getContentDisposition= cdn+ }+ in+ case cty of+ ContentType "multipart" c_subtype c_parameters ->+ case lookup "boundary" c_parameters of+ Just boundary ->+ let defcte + | c_subtype == "digest" = + ContentType "message" "rfc822" []+ | otherwise = + ContentType "text" "plain" [("charset", "us-ascii")] in+ Multipart+ { getHeaders = rawHeaders raw+ , getLines = rawLines raw+ , getParts = map (digestMessage' defcte)+ (splitBody boundary (rawLines raw))+ , getContentType= cty+ , getContentTransferEncoding= cte+ , getContentDisposition= cdn+ }+ _ ->+ defaultMessage+ _ ->+ defaultMessage++splitBody boundary lines =+ g False lines (showChar '\n') []+ where + finish shower showers =+ reverse (map (\shower -> parseSuccessfully message "body part" (shower ""))+ (shower:showers))+ g afterPreamble [] shower showers =+ finish shower showers+ g afterPreamble (xs : rest) shower showers =+ if innerboundary `isPrefixOf` xs + then if finalboundary `isPrefixOf` xs + then if afterPreamble + then finish shower showers+ else finish (showChar '\n') []+ else if afterPreamble+ then g afterPreamble rest id (shower : showers)+ else g True rest (showChar '\n') []+ else+ g afterPreamble rest (shower . showString xs . showString "\n") showers+ innerboundary = '-':'-':boundary+ finalboundary = innerboundary ++ "--"++decode (ContentTransferEncoding "quoted-printable") rawlines =+ QuotedPrintable.decode rawlines+decode (ContentTransferEncoding "base64") rawlines =+ Base64.decode rawlines+-- "7bit", "8bit", "binary", and everything else+decode (ContentTransferEncoding _) rawlines =+ rawlines+++parseSuccessfully p n inp =+ case parse p n inp of+ Left pError ->+ error (show pError)+ Right x ->+ x+
+ WASH/Mail/Message.hs view
@@ -0,0 +1,78 @@+module WASH.Mail.Message where++import WASH.Mail.HeaderField++data Message =+ Singlepart + { getHeaders :: [Header]+ , getLines :: [String]+ , getDecoded :: [Char]+ , getContentType :: ContentType+ , getContentTransferEncoding :: ContentTransferEncoding+ , getContentDisposition :: ContentDisposition+ }+ | Multipart+ { getHeaders :: [Header]+ , getLines :: [String]+ , getParts :: [Message]+ , getContentType :: ContentType+ , getContentTransferEncoding :: ContentTransferEncoding+ , getContentDisposition :: ContentDisposition+ }+ deriving Show++isSinglePart (Singlepart {}) = True+isSinglePart _ = False++isMultiPart (Multipart {}) = True+isMultiPart _ = False++showHeader (Header (n, v)) = n ++ ": " ++ v++showParameters c_parameters =+ foldr (\(n,v) f -> showString " ;" .+ showString n .+ showString "=\"" .+ showString v .+ showChar '\"' . f) id c_parameters++data ContentType = + ContentType String -- type+ String -- subtype+ [(String, String)] -- parameters+instance Show ContentType where+ showsPrec i (ContentType c_type c_subtype c_parameters) =+ showString "Content-Type: " .+ showString c_type .+ showChar '/' .+ showString c_subtype .+ showParameters c_parameters+ +data ContentTransferEncoding =+ ContentTransferEncoding String+instance Show ContentTransferEncoding where+ showsPrec i (ContentTransferEncoding cte) =+ showString "Content-Transfer-Encoding: " .+ showString cte++data ContentDisposition =+ ContentDisposition String [(String, String)]+instance Show ContentDisposition where+ showsPrec i (ContentDisposition cdn c_parameters) =+ showString "Content-Disposition: " .+ showString cdn .+ showParameters c_parameters++data ContentID =+ ContentID String+instance Show ContentID where+ showsPrec i (ContentID cid) =+ showString "Content-ID: " .+ showString cid++data ContentDescription =+ ContentDescription String+instance Show ContentDescription where+ showsPrec i (ContentDescription txt) =+ showString "Content-Description: " .+ showString txt
+ WASH/Mail/RFC2822.hs view
@@ -0,0 +1,196 @@+module WASH.Mail.RFC2822 where++import Char+-- +import Text.ParserCombinators.Parsec++crLf = try (string "\n\r" <|> string "\r\n") <|> string "\n" <|> string "\r"++fws =+ do many1 ws1+ option "" (do crLf+ many1 ws1)+ <|> + do crLf+ many1 ws1++ws1 = oneOf " \t"+lineChar = noneOf "\n\r"+headerNameChar = noneOf "\n\r:"++-- |parse contents of Date field according to RFC2822+data DateTime2822 =+ DateTime2822 (Maybe DayOfWeek) Date2822 Time2822+instance Show DateTime2822 where+ showsPrec i (DateTime2822 mDayOfWeek date2822 time2822) =+ (case mDayOfWeek of+ Just dayOfWeek ->+ showsDayOfWeek dayOfWeek . showString ", "+ Nothing ->+ id) .+ shows date2822 .+ showChar ' ' .+ shows time2822++parseDateTime =+ do mdow <- option Nothing (try $ do fws+ dow <- parseDayOfWeek+ char ','+ return (Just dow))+ date <- parseDate+ fws+ time <- parseTime+ return (DateTime2822 mdow date time)++type DayOfWeek = Int+showsDayOfWeek 1 = showString "Mon"+showsDayOfWeek 2 = showString "Tue"+showsDayOfWeek 3 = showString "Wed"+showsDayOfWeek 4 = showString "Thu"+showsDayOfWeek 5 = showString "Fri"+showsDayOfWeek 6 = showString "Sat"+showsDayOfWeek 7 = showString "Sun"+parseDayOfWeek =+ (try (string "Mon") >> return (1 :: DayOfWeek))+ <|> (try (string "Tue") >> return 2)+ <|> (try (string "Wed") >> return 3)+ <|> (try (string "Thu") >> return 4)+ <|> (try (string "Fri") >> return 5)+ <|> (try (string "Sat") >> return 6)+ <|> (try (string "Sun") >> return 7)+ +data Date2822 =+ Date2822 Int Int Int++instance Show Date2822 where+ showsPrec i (Date2822 d m y) =+ showsDay d .+ showChar ' ' .+ showsMonth m .+ showChar ' ' .+ showsYear y++parseDate =+ do d <- parseDay+ m <- parseMonth+ y <- parseYear+ return (Date2822 d m y)++showsDay i = shows i+parseDay =+ do fws+ d1 <- digit+ md2 <- option Nothing (digit >>= (return . Just))+ case md2 of+ Nothing ->+ return (digitToInt d1)+ Just d2 ->+ return (digitToInt d2 + 10 * digitToInt d1)++monthList = + ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]+parseMonthName =+ foldr1 (<|>) (zipWith g monthList [1::Int ..])+ where + g mname mnr = try (string mname) >> return mnr++showsMonth m =+ showString (monthList !! (m-1))+parseMonth =+ do fws+ m <- parseMonthName+ fws+ return m++showsYear y =+ showString (drop 1 (show (10000 + y)))+parseYear =+ do y1 <- digit+ y2 <- digit+ my3 <- option Nothing (digit >>= (return . Just))+ my4 <- option Nothing (digit >>= (return . Just))+ case (my3, my4) of+ (Just y3, Just y4) ->+ return (1000 * digitToInt y1 + 100 * digitToInt y2 + + 10 * digitToInt y3 + digitToInt y4)+ -- interpretation of obs-year from RFC2822, 4.3+ (Just y3, Nothing) ->+ return (1900 + 100 * digitToInt y1 + 10 * digitToInt y2 + digitToInt y3)+ (Nothing, Nothing) ->+ let rawVal = 10 * digitToInt y1 + digitToInt y2 in+ if rawVal < 50 + then return (2000 + rawVal)+ else return (1900 + rawVal)+ _ ->+ fail "parseYear"+data Time2822 =+ Time2822 TimeOfDay2822 Zone2822+instance Show Time2822 where+ showsPrec i (Time2822 timeOfDay2822 zone2822) =+ shows timeOfDay2822 .+ showChar ' ' .+ shows zone2822++parseTime =+ do tod <- parseTimeOfDay+ fws+ zone <- parseZone+ return (Time2822 tod zone)++data TimeOfDay2822 =+ TimeOfDay2822 Int Int Int+instance Show TimeOfDay2822 where+ showsPrec i (TimeOfDay2822 hh mm ss) =+ showString (drop 1 $ show (100+hh)) .+ showChar ':' .+ showString (drop 1 $ show (100+mm)) .+ showChar ':' .+ showString (drop 1 $ show (100+ss))++parseTimeOfDay =+ do hh <- parseTwoDigits+ char ':'+ mm <- parseTwoDigits+ ss <- option 0 (try $ do char ':'+ parseTwoDigits)+ return (TimeOfDay2822 hh mm ss)++zoneInfoList =+ [( "UT", (Zone2822 '+' 0 0))+ ,( "GMT", (Zone2822 '+' 0 0))+ ,( "EDT", (Zone2822 '-' 4 0))+ ,( "EST", (Zone2822 '-' 5 0))+ ,( "CDT", (Zone2822 '-' 5 0))+ ,( "CST", (Zone2822 '-' 6 0))+ ,( "MDT", (Zone2822 '-' 6 0))+ ,( "MST", (Zone2822 '-' 7 0))+ ,( "PDT", (Zone2822 '-' 7 0))+ ,( "PST", (Zone2822 '-' 8 0))+ ]++parseZoneInfo =+ foldr1 (<|>) (map g zoneInfoList)+ where + g (zname, zinfo) = try (string zname) >> return zinfo++data Zone2822 =+ Zone2822 Char Int Int+instance Show Zone2822 where+ showsPrec i (Zone2822 sign hh mm) =+ showChar sign .+ showString (drop 1 $ show (100+hh)) .+ showString (drop 1 $ show (100+mm))+ +parseZone =+ do sign <- oneOf "+-"+ hh <- parseTwoDigits+ mm <- parseTwoDigits+ return (Zone2822 sign hh mm)+ <|> parseZoneInfo+ -- anything else should be mapped to (Zone2822 '-' 0 0)++parseTwoDigits =+ do d1 <- digit+ d2 <- digit+ return (10 * digitToInt d1 + digitToInt d2)+
+ WASH/Utility/Auxiliary.hs view
@@ -0,0 +1,49 @@+module WASH.Utility.Auxiliary where++import IO+import System+import Directory+import WASH.Utility.FileNames+import qualified WASH.Utility.Shell as Shell++protectedGetEnv :: String -> String -> IO String+protectedGetEnv var deflt =+ catch (getEnv var) (const $ return deflt)++readFileNonExistent :: FilePath -> String -> IO String+readFileNonExistent fileName def =+ do existent <- doesFileExist fileName+ if existent then readFile fileName else return def++readFileStrictly :: FilePath -> IO String+readFileStrictly filePath =+ do h <- openFile filePath ReadMode+ contents <- hGetContents h+ hClose (g contents h)+ return contents+ where+ g [] h = h+ g (_:rest) h = g rest h++assertDirectoryExists :: FilePath -> IO () -> IO ()+assertDirectoryExists dirname existsAction =+ catch (createDirectory dirname)+ (\ ioe -> + if isAlreadyExistsError ioe then existsAction+ else if isDoesNotExistError ioe then+ do assertDirectoryExists (dropLastComponent dirname) (return ())+ assertDirectoryExists dirname existsAction+ else do hPutStrLn stderr ("assertDirectoryExists " ++ show dirname)+ ioError ioe)++writeDebugFile :: String -> String -> IO ()+writeDebugFile filename str =+ do writeFile filename str+ system ("chmod 666 " ++ Shell.quote filename)+ return ()++appendDebugFile :: String -> String -> IO ()+appendDebugFile filename str =+ do appendFile filename ('\n':str)+ system ("chmod 666 " ++ Shell.quote filename)+ return ()
+ WASH/Utility/Base32.hs view
@@ -0,0 +1,96 @@+-- Base32 standard:+-- http://www.ietf.org/rfc/rfc3548.txt+-- Author: Niklas Deutschmann++module WASH.Utility.Base32 (encode, decode) where++import Bits+import Char+import List++encode :: String -> String+encode = encBase32++decode :: String -> String+decode = decBase32++-- Partitions a list into groups of length n.+makeGroups :: Int -> [a] -> [[a]]+makeGroups 0 lst = error "makeGroups: Invalid group length"+makeGroups n [] = []+makeGroups n lst = take n lst : makeGroups n (drop n lst)++-- Converts an array of characters to a large number, generalized for+-- characters of any number of bits and any alphabet.+-- charLength: Number of bits in a character+-- ordFunc: Function that is used for mapping characters to numbers.+makeBits charLength ordFunc str = foldr (+) 0 bitValues+ where + bitValues = zipWith (\a b -> intVal a `shiftL` b) (reverse str) [0,charLength..]+ intVal a = toInteger (ordFunc a)+ +makeBitsASCII = makeBits 8 ord+makeBitsBase32 = makeBits 5 b32Ord++-- Converts an array of characters into a m-bit number, where m is+-- is smallest multiple of n that is greater or equal to the +-- (length of str) * chrSize.+-- Extension of "makeBits".+makeMultipleOfNBits bitFunc charSize n str + | len `mod` n == 0 = bitFunc str+ | otherwise = (bitFunc str) `shiftL` (remBitCount len)+ where + remBitCount m = (0 - (m `mod` n) + n) `mod` n+ len = length str * charSize;++makeMultipleOfNBitsASCII = makeMultipleOfNBits (makeBits 8 ord) 8 +makeMultipleOfNBitsBase32 = makeMultipleOfNBits (makeBits 5 b32Ord) 5++-- The Base32 alphabet+-- Int -> Base32 character+b32Chr n = b32tab !! (fromEnum n)+ where+ b32tab = ['A'..'Z'] ++ ['2'..'7']++-- Base32 character -> Int+b32Ord c + | c >= 'A' && c <= 'Z' = ord(c) - 65+ | c >= '2' && c <= '7' = ord(c) - 24+ | otherwise = error "b32Ord: No Base character"+ +-- Encodes one block (1-5 ASCII Characters)+encBase32Block str + | len == 0 = ""+ | len == 1 = concat (b32Map [5,0]) ++ "======"+ | len == 2 = concat (b32Map [15,10..0]) ++ "===="+ | len == 3 = concat (b32Map [20,15..0]) ++ "==="+ | len == 4 = concat (b32Map [30,25..0]) ++ "="+ | len == 5 = concat (b32Map [35,30..0])+ | otherwise = error "encBase32Block: Invalid block length"+ where + b32Map = map (\x -> [b32Chr(bitStr `shiftR` x .&. 31)])+ bitStr = makeMultipleOfNBitsASCII 5 str+ len = length str++-- Decodes one block (2,4,5,7 or 8 Base32 character + '=' padding character)+decBase32Block str+ | len == 0 = ""+ | len == 2 = concat . (shiftAndMap [0] 2) . makeBitsBase32 $ code+ | len == 4 = concat . (shiftAndMap [8,0] 4) . makeBitsBase32 $ code+ | len == 5 = concat . (shiftAndMap [16,8,0] 1) . makeBitsBase32 $ code+ | len == 7 = concat . (shiftAndMap [24,16..0] 3) . makeBitsBase32 $ code+ | len == 8 = concat . (shiftAndMap [32,24..0] 0) . makeBitsBase32 $ code+ | otherwise = error "decBase32Block: Invalid block length"+ where+ shiftAndMap sf n = (asciiMap sf) . (`shiftR` n)+ asciiMap sf c = map (\x -> [chr . fromEnum $ (c `shiftR` x .&. 255)]) sf+ len = length code+ code = filter (/= '=') str+ +encBase32 :: String -> String+encBase32 = concat . map encBase32Block . makeGroups 5++decBase32 :: String -> String+decBase32 = concat . map decBase32Block . makeGroups 8++
+ WASH/Utility/Base64.hs view
@@ -0,0 +1,124 @@+-- © 2002 Peter Thiemann+-- |Implements RFC 2045 MIME coding.+module WASH.Utility.Base64+ (encode, encode', decode, decode'+ ,alphabet_list+ )+ where++import Array+import Char++--+-- |Yields encoded input cropped to lines of less than 76 characters. Directly+-- usable as email body.+encode :: String -> String+encode = encode_base64+-- |yields continuous stream of bytes.+encode' :: String -> String+encode' = encode_base64'+-- |Directly applicable to email body.+decode :: String -> String+decode = decode_base64+-- |Only applicable to stream of Base64 characters.+decode' :: String -> String+decode' = decode_base64'+-- |Applicable to list of lines.+decode_lines :: [String] -> String+decode_lines = decode_base64_lines++-- --------------------------------------------------------------------+-- |Base64 alphabet in encoding order.+alphabet_list :: String+alphabet_list =+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"++encode_base64_alphabet_index =+ zip [0 .. (63::Int)] alphabet_list++decode_base64_alphabet_index =+ zip alphabet_list [0 .. (63::Int)]++encode_base64_alphabet =+ array (0 :: Int, 63 :: Int) encode_base64_alphabet_index++decode_base64_alphabet =+ array (' ','z') decode_base64_alphabet_index++base64_character =+ array (chr 0, chr 255) [(c, c `elem` alphabet_list || c == '=') | c <- [chr 0 .. chr 255]]++encode_base64 = linebreak 76 . encode_base64'++linebreak m xs = lb m xs+ where+ lb n [] = "\r\n"+ lb 0 xs = '\r':'\n': lb m xs+ lb n (x:xs) = x: lb (n-1) xs++encode_base64' [] = []++encode_base64' [ch] = + encode_base64_alphabet!b1 : + encode_base64_alphabet!b2 :+ "=="+ where (b1, b2, _, _) = encode_base64_group (ch, chr 0, chr 0)++encode_base64' [ch1, ch2] =+ encode_base64_alphabet!b1 : + encode_base64_alphabet!b2 :+ encode_base64_alphabet!b3 :+ "="+ where (b1, b2, b3, _) = encode_base64_group (ch1, ch2, chr 0)++encode_base64' (ch1: ch2: ch3: rest) =+ encode_base64_alphabet!b1 : + encode_base64_alphabet!b2 :+ encode_base64_alphabet!b3 :+ encode_base64_alphabet!b4 :+ encode_base64' rest+ where (b1, b2, b3, b4) = encode_base64_group (ch1, ch2, ch3)++-- 111111 112222 222233 333333+encode_base64_group (ch1, ch2, ch3) = (b1, b2, b3, b4)+ where o1 = ord ch1+ o2 = ord ch2+ o3 = ord ch3+ b1 = o1 `div` 4+ b2 = (o1 `mod` 4) * 16 + o2 `div` 16+ b3 = (o2 `mod` 16) * 4 + o3 `div` 64+ b4 = o3 `mod` 64++decode_base64_group (b1, b2, b3, b4) = (ch1, ch2, ch3)+ where ch1 = chr (b1 * 4 + b2 `div` 16)+ ch2 = chr (b2 `mod` 16 * 16 + b3 `div` 4)+ ch3 = chr (b3 `mod` 4 * 64 + b4)++decode_base64' [] = []++decode_base64' [cin1, cin2, '=', '='] = [cout1]+ where (cout1, _, _) = + decode_base64_group (decode_base64_alphabet!cin1+ ,decode_base64_alphabet!cin2+ ,0+ ,0)++decode_base64' [cin1, cin2, cin3, '='] = [cout1, cout2]+ where (cout1, cout2, _) = + decode_base64_group (decode_base64_alphabet!cin1+ ,decode_base64_alphabet!cin2+ ,decode_base64_alphabet!cin3+ ,0)++decode_base64' (cin1: cin2: cin3: cin4: rest) = + cout1: cout2: cout3: decode_base64' rest+ where (cout1, cout2, cout3) = + decode_base64_group (decode_base64_alphabet!cin1+ ,decode_base64_alphabet!cin2+ ,decode_base64_alphabet!cin3+ ,decode_base64_alphabet!cin4)++decode_base64 = decode_base64' . filter (base64_character!)++decode_base64_lines = decode_base64' . concat+
+ WASH/Utility/BulkIO.hs view
@@ -0,0 +1,33 @@+module WASH.Utility.BulkIO where++import IO++import Ptr+import CString+import CTypes+import Foreign.Marshal.Alloc (mallocBytes, free)+import System.IO (hGetBuf, hPutBuf)+ +rawGetBytes :: Handle -> Int -> IO String+rawGetBytes h n =+ do buf <- mallocBytes n :: IO (Ptr CChar)+ count <- hGetBuf h buf n+ str <- peekCStringLen (buf, count)+ free buf+ return str++bufferSize = 4096 :: Int++-- buffers could be shared at the price of MVars, which are not portable+rawHandleCopy :: Handle -> Handle -> IO ()+rawHandleCopy hin hout =+ do buf <- mallocBytes bufferSize+ let copy =+ hGetBuf hin buf bufferSize >>= \count ->+ if count == 0 + then return ()+ else do+ hPutBuf hout buf count+ copy+ copy+ free buf
+ WASH/Utility/FileNames.hs view
@@ -0,0 +1,49 @@+-- © 2002-2005 Peter Thiemann+-- |Collection of function for manipulating file names.+module WASH.Utility.FileNames where++longestSuffix :: (a -> Bool) -> [a] -> [a]+longestSuffix p xs =+ let f [] suffix = suffix+ f (x : xs) suffix = f xs (if p x then xs else suffix)+ in f xs xs+++-- |longest suffix of path that does not contain '/'+filePart :: String -> String+filePart =+ longestSuffix (=='/')++-- |longest suffix of path that does not contain '.'+extName :: String -> String+extName =+ longestSuffix (=='.')++-- |longest prefix so that the rest contains '.'; entire string if no '.' present+baseName :: String -> String+baseName filename =+ let f "" = ""+ f ('.':rest) = g rest rest+ f (x:rest) = x:f rest+ g "" lst = ""+ g ('.':rest) lst = '.':f lst+ g (x:rest) lst = g rest lst+ in f filename++-- |splits input at each '/'+fileToPath :: String -> [String]+fileToPath filename =+ let f acc path "" = reverse (reverse acc: path)+ f acc path ('/':xs) = f "" (reverse acc: path) xs+ f acc path (x:xs) = f (x:acc) path xs+ in f "" [] filename++-- |drop the last component of a file path+dropLastComponent :: String -> String+dropLastComponent path =+ let f "" = ""+ f rpath = g rpath+ g ('/':rest) = g rest+ g "" = "/"+ g rpath = dropWhile (/='/') rpath+ in reverse (f (reverse path))
+ WASH/Utility/Hex.hs view
@@ -0,0 +1,49 @@+-- © 2001, 2003 Peter Thiemann+module WASH.Utility.Hex where++import Array+import Char++hexdigit :: Int -> Char+hexdigit i = hexdigits ! i++hexdigits' = "0123456789ABCDEF"+alternative_digits = "abcdef"+alternative_indices :: [(Int, Char)]+alternative_indices = zip [10..15] alternative_digits+hexdigits'_indices :: [(Int, Char)]+hexdigits'_indices = [(i, hexdigits'!!i) | i <- [0..15]]++hexdigits = array (0, 15) hexdigits'_indices++fromHexdigits =+ array (chr 0, chr 127) + (map (\ (x,y) -> (y, x)) (hexdigits'_indices ++ alternative_indices))++isHexdigitArray =+ array (chr 0, chr 127)+ (map (\ c -> (c, isHexdigit c)) [chr 0 .. chr 127])+ where+ isHexdigit :: Char -> Bool+ isHexdigit x = + (x >= '0' && x <= '9') || + (x >= 'a' && x <= 'f') ||+ (x >= 'A' && x <= 'F')++isHexdigit :: Char -> Bool+isHexdigit x = + x <= chr 127 && isHexdigitArray ! x++showHex2 :: Int -> String+showHex2 ox = showsHex 2 ox ""++showsHex :: Int -> Int -> ShowS+showsHex 0 x = id+showsHex i x = let (d,m) = x `divMod` 16 in showsHex (i-1) d . showChar (hexdigits ! m)++hexDigitVal :: Char -> Int+hexDigitVal x | isHexdigit x = fromHexdigits ! x+ | otherwise = 0++allDigits = hexdigits' ++ alternative_digits+
+ WASH/Utility/ISO8601.hs view
@@ -0,0 +1,758 @@+-- © 2002 Peter Thiemann+module WASH.Utility.ISO8601 where++import Char+import Monad+import Time++import System.IO.Unsafe++import WASH.Utility.IntToString+import WASH.Utility.SimpleParser++secondsToString seconds =+ intToString 20 seconds++isoDateToString isoDate = + let seconds = unsafePerformIO $ isoDateToSeconds isoDate + in secondsToString seconds++isoDateAndTimeToString isoDateAndTime =+ let seconds = unsafePerformIO $ isoDateAndTimeToSeconds isoDateAndTime + in secondsToString seconds++applyToCalT :: (CalendarTime -> a) -> IO a+applyToCalT g =+ do clkT <- getClockTime+ calT <- toCalendarTime clkT+ return $ g calT++isoDateAndTimeToSeconds :: ISODateAndTime -> IO Integer+isoDateAndTimeToSeconds isoDateAndTime =+ applyToCalT $ toSeconds isoDateAndTime++isoTimeToSeconds :: ISOTime -> IO Integer+isoTimeToSeconds isoTime =+ applyToCalT $ toSeconds isoTime+ +isoDateToSeconds :: ISODate -> IO Integer+isoDateToSeconds isoDate =+ applyToCalT $ toSeconds isoDate++class ToSeconds iso where+ -- |returns number of seconds since reference point+ toSeconds :: iso -> CalendarTime -> Integer+ toRawSeconds :: iso -> CalendarTime -> Integer+ --+ toRawSeconds = toSeconds++instance ToSeconds ISODateAndTime where+ toSeconds isoDateAndTime@(ISODateAndTime isoDate isoTime) calT =+ let rawseconds = toRawSeconds isoDateAndTime calT in+ case addLeapSeconds leapSeconds rawseconds of+ NotLeapSecond seconds -> seconds+ LeapSecond seconds -> seconds + leapSecondCorrection isoTime++ toRawSeconds (ISODateAndTime isoDate isoTime) calT =+ toRawSeconds isoDate calT + toRawSeconds isoTime calT++-- |problem: 19720630T235960 and 19720701T000000 are both mapped to the same+-- number, 78796800, and then addLeapSeconds adds one yielding 78796801. While+-- this is correct for 19720701T000000, 19720630T235960 must be+-- 78796800. Implemented solution: if the current second specification is 0 and+-- the time to convert is the leap second, then add 1.+leapSecondCorrection (ISOTime isoHourSpec isoMinuteSpec isoSecondSpec isoTimeZoneSpec) =+ case isoSecondSpec of+ Second ss -> if ss == 0 then 1 else 0+ NoSecond -> 1++instance ToSeconds ISODate where+ toSeconds isoDate calT =+ case addLeapSeconds leapSeconds (toRawSeconds isoDate calT) of+ NotLeapSecond seconds -> seconds+ LeapSecond seconds -> seconds + 1 -- we always mean 00:00:00+ + toRawSeconds (ISODate isoYearSpec isoDayOfYearSpec) calT =+ let year = isoYearSpecToYear isoYearSpec calT + in+ secondsPerDay * fromIntegral (yearsToDays year) ++ isoDaysOfYearToSeconds year isoDayOfYearSpec calT++isoDaysOfYearToSeconds year NoDayOfYear calT =+ 0+isoDaysOfYearToSeconds year (MonthDay isoMonthSpec isoDayOfMonthSpec) calT =+ let month = isoMonthSpecToMonth isoMonthSpec calT+ dayOfMonth = isoDayOfMonthSpecToDayOfMonth isoDayOfMonthSpec calT+ in+ fromIntegral(dayOfMonth - 1 + daysUptoMonth year month) * secondsPerDay+isoDaysOfYearToSeconds year (DayOfYear ddd) calT =+ fromIntegral ddd * secondsPerDay+isoDaysOfYearToSeconds year (WeekAndDay (Week ww) NoDayOfWeek) calT =+ fromIntegral (7 * (ww - 1)) * secondsPerDay+isoDaysOfYearToSeconds year (WeekAndDay (Week ww) (DayOfWeek d)) calT =+ let weekdayOfJan1 = yearsToWeekDay year in+ fromIntegral (7 * (ww - 1) + d - weekdayOfJan1) * secondsPerDay+isoDaysOfYearToSeconds year (WeekAndDay ImplicitWeek (DayOfWeek d)) calT =+ let weekdayOfJan1 = yearsToWeekDay year + ww = (ctYDay calT + weekdayOfJan1 + 5) `div` 7 + in+ fromIntegral (7 * (ww - 1) + d - weekdayOfJan1) * secondsPerDay+isoDaysOfYearToSeconds year (WeekAndDay _ _) calT =+ error "Sorry, this combination of week and day does not make sense!"++isoMonthSpecToMonth ImplicitMonth calT =+ fromEnum (ctMonth calT) + 1+isoMonthSpecToMonth (Month mm) calT =+ mm++isoDayOfMonthSpecToDayOfMonth NoDayOfMonth calT =+ 1+isoDayOfMonthSpecToDayOfMonth (DayOfMonth dd) calT =+ dd++daysUptoMonth year month = + let daysPerMonth = [31, 28 + leapDays year, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] in+ sum (take (month-1) daysPerMonth)++isoYearSpecToYear ImplicitYear calT = + (ctYear calT)+isoYearSpecToYear (ImplicitCentury yy) calT =+ (100 * (ctYear calT `div` 100) + yy)+isoYearSpecToYear (Century cc) calT =+ (100 * cc)+isoYearSpecToYear (ImplicitDecade y) calT =+ (10 * (ctYear calT `div` 10) + y)+isoYearSpecToYear (Year ccyy) calT =+ ccyy++leapDays year =+ if leapYear year then 1 else 0++leapYear year =+ year `mod` 4 == 0 && (year `mod` 100 /= 0 || year `mod` 400 == 0)++yearsToDays ccyy =+ let nrOfYears = ccyy - 1970+ leapYears = [ year | year <- [1970 .. ccyy-1] , leapYear year ]+ nrOfLeapDays = length leapYears+ in + 365 * nrOfYears + nrOfLeapDays++-- |compute weekday of Jan 1+yearsToWeekDay ccyy =+ let nrOfDays = yearsToDays ccyy+ jan_1_1970 = 4 -- Thursday+ in 1 + (nrOfDays + 6) `mod` 7++-- |in seconds from epoch; needs to be updated when time leaps again+leapSeconds :: [Integer]+leapSeconds = + [ -- Leap 1972 Jun 30 23:59:60 + S+ 00000000000078796800,+ -- Leap 1972 Dec 31 23:59:60 + S+ 00000000000094694400 + 1,+ -- Leap 1973 Dec 31 23:59:60 + S+ 00000000000126230400 + 2,+ -- Leap 1974 Dec 31 23:59:60 + S+ 00000000000157766400 + 3,+ -- Leap 1975 Dec 31 23:59:60 + S+ 00000000000189302400 + 4,+ -- Leap 1976 Dec 31 23:59:60 + S+ 00000000000220924800 + 5,+ -- Leap 1977 Dec 31 23:59:60 + S+ 00000000000252460800 + 6,+ -- Leap 1978 Dec 31 23:59:60 + S+ 00000000000283996800 + 7,+ -- Leap 1979 Dec 31 23:59:60 + S+ 00000000000315532800 + 8,+ -- Leap 1981 Jun 30 23:59:60 + S+ 00000000000362793600 + 9,+ -- Leap 1982 Jun 30 23:59:60 + S+ 00000000000394329600 + 10,+ -- Leap 1983 Jun 30 23:59:60 + S+ 00000000000425865600 + 11,+ -- Leap 1985 Jun 30 23:59:60 + S+ 00000000000489024000 + 12,+ -- Leap 1987 Dec 31 23:59:60 + S+ 00000000000567993600 + 13,+ -- Leap 1989 Dec 31 23:59:60 + S+ 00000000000631152000 + 14,+ -- Leap 1990 Dec 31 23:59:60 + S+ 00000000000662688000 + 15,+ -- Leap 1992 Jun 30 23:59:60 + S+ 00000000000709948800 + 16,+ -- Leap 1993 Jun 30 23:59:60 + S+ 00000000000741484800 + 17,+ -- Leap 1994 Jun 30 23:59:60 + S+ 00000000000773020800 + 18,+ -- Leap 1995 Dec 31 23:59:60 + S+ 00000000000820454400 + 19,+ -- Leap 1997 Jun 30 23:59:60 + S+ 00000000000867715200 + 20,+ -- Leap 1998 Dec 31 23:59:60 + S+ 00000000000915148800 + 21+ ]++data LeapSeconds = LeapSecond Integer | NotLeapSecond Integer+ deriving Show++addLeapSeconds [] seconds = NotLeapSecond seconds+addLeapSeconds (ls: rest) seconds =+ if ls > seconds then NotLeapSecond seconds else+ if ls == seconds then LeapSecond seconds else+ addLeapSeconds rest (seconds+1)+ +secondsPerMinute = 60+secondsPerHour = 60 * secondsPerMinute+secondsPerDay = 24 * secondsPerHour+secondsPerYear = 365 * secondsPerDay++instance ToSeconds ISOTime where+ -- seconds to 0:00 UTC+ -- may become negative to indicate previous day!+ toSeconds (ISOTime isoHourSpec isoMinuteSpec isoSecondSpec isoTimeZoneSpec) calT =+ toSeconds isoHourSpec calT ++ toSeconds isoMinuteSpec calT ++ toSeconds isoSecondSpec calT ++ toSeconds isoTimeZoneSpec calT+ +instance ToSeconds ISOHourSpec where+ toSeconds ImplicitHour calT = fromIntegral (3600 * ctHour calT - ctTZ calT)+ toSeconds (Hour hh) calT = fromIntegral (3600 * hh - ctTZ calT)++instance ToSeconds ISOMinuteSpec where+ toSeconds ImplicitMinute calT = fromIntegral (60 * ctMin calT)+ toSeconds (Minute mm) calT = fromIntegral (60 * mm)+ toSeconds NoMinute calT = 0++instance ToSeconds ISOSecondSpec where+ toSeconds (Second ss) calT = fromIntegral ss+ toSeconds NoSecond calT = 0++instance ToSeconds ISOTimeZoneSpec where+ toSeconds LocalTime calT = 0+ toSeconds UTCTime calT = fromIntegral (ctTZ calT)+ toSeconds (PlusTime (Hour hh) isoMinuteSpec) calT = + fromIntegral (ctTZ calT - (3600 * hh + 60 * minutes isoMinuteSpec))+ toSeconds (MinusTime (Hour hh) isoMinuteSpec) calT =+ fromIntegral (ctTZ calT + (3600 * hh + 60 * minutes isoMinuteSpec))++minutes ImplicitMinute = 0+minutes (Minute mm) = mm+minutes NoMinute = 0++isoDateToClockTime :: ISODate -> ClockTime+isoDateToClockTime isoDate =+ let seconds = unsafePerformIO $ isoDateToSeconds isoDate + in secondsToClockTime seconds++isoDateAndTimeToClockTime :: ISODateAndTime -> ClockTime+isoDateAndTimeToClockTime isoDateAndTime =+ let seconds = unsafePerformIO $ isoDateAndTimeToSeconds isoDateAndTime + in secondsToClockTime seconds++secondsToClockTime seconds =+ let tdiff = TimeDiff { tdYear =0,+ tdMonth =0,+ tdDay =0,+ tdHour =0,+ tdMin =0,+ tdSec = fromIntegral seconds,+ tdPicosec =0+ }+ in addToClockTime tdiff epochClkT+ +epochClkT = toClockTime epoch+epoch = CalendarTime { ctYear = 1970,+ ctMonth = January,+ ctDay = 1,+ ctHour = 0,+ ctMin = 0,+ ctSec = 0,+ ctPicosec= 0,+ ctWDay = Thursday, -- ignored+ ctYDay = 0, -- ignored+ ctTZName = "UTC", -- ignored+ ctTZ = 0,+ ctIsDST = False -- ignored+ }++ +-- |data type for representing ISO time+data ISODateAndTime =+ ISODateAndTime ISODate ISOTime+ deriving Show++data ISODate =+ ISODate ISOYearSpec ISODayOfYearSpec+ deriving Show++data ISOYearSpec+ = ImplicitYear | ImplicitCentury Int | Century Int | ImplicitDecade Int | Year Int+ deriving Show+data ISODayOfYearSpec+ = NoDayOfYear+ | MonthDay ISOMonthSpec ISODayOfMonthSpec+ | DayOfYear Int+ | WeekAndDay ISOWeekSpec ISODayOfWeekSpec+ deriving Show+data ISOMonthSpec+ = ImplicitMonth | Month Int+ deriving Show+data ISODayOfMonthSpec+ = NoDayOfMonth | DayOfMonth Int+ deriving Show+data ISOWeekSpec+ = ImplicitWeek | AnyWeek | Week Int+ deriving Show+data ISODayOfWeekSpec+ = NoDayOfWeek | DayOfWeek Int+ deriving Show+data ISOTime+ = ISOTime ISOHourSpec ISOMinuteSpec ISOSecondSpec ISOTimeZoneSpec+ deriving Show+data ISOHourSpec+ = ImplicitHour | Hour Int+ deriving Show+data ISOMinuteSpec+ = ImplicitMinute | Minute Int | NoMinute+ deriving Show+data ISOSecondSpec+ = Second Int | NoSecond+ deriving Show+data ISOTimeZoneSpec+ = LocalTime | UTCTime | PlusTime ISOHourSpec ISOMinuteSpec | MinusTime ISOHourSpec ISOMinuteSpec+ deriving Show++updateTZ (ISOTime isoHourSpec isoMinuteSpec isoSecondSpec _) isoTimeZoneSpec =+ ISOTime isoHourSpec isoMinuteSpec isoSecondSpec isoTimeZoneSpec++digitval = digitToInt++skipHyphen = char '-' >> return ()+skipColon = char ':' >> return ()+skipSolidus = char '/' >> return ()+skipMinus = char '-' >> return ()+skipPlus = char '+' >> return ()+skipP = oneOf "pP" >> return ()+skipT = oneOf "tT" >> return ()+skipW = oneOf "wW" >> return ()+skipZ = oneOf "zZ" >> return ()++parseDateFromString :: String -> Maybe ISODate+parseDateFromString = parseFromString parseDate+parseTimeFromString :: String -> Maybe ISOTime+parseTimeFromString = parseFromString parseTime+parseDateAndTimeFromString :: String -> Maybe ISODateAndTime+parseDateAndTimeFromString = parseFromString parseDateAndTime++-- |external entry point+parseDate = + parseBasicOrExtended parseDateInternal++parseTime =+ parseBasicOrExtended parseTimeInternal++parseDateAndTime =+ parseBasicOrExtended parseTimeAndDateInternal++parseBasicOrExtended parser = + parser True <|> parser False++parseTimeAndDateInternal extended =+ do isodate <- parseDateInternal extended+ isotime <- option (ISOTime (Hour 0) NoMinute NoSecond UTCTime) + (skipT >> parseTimeInternal extended)+ return $ ISODateAndTime isodate isotime++-- I was pretty much fed up with the irregular format of ISO 8601. After a few+-- tries, I decided that the simplest approach was to just list all the+-- alternatives from the standard.++-- |argument determines whether extended format is parsed+parseDateInternal False =+ -- 5.2.1.1, complete representation, basic format: CCYYMMDD+ (try $ do ccyy <- parseFourDigits+ mm <- parseTwoDigits+ dd <- parseTwoDigits+ return $ ISODate (Year ccyy) $ MonthDay (Month mm) (DayOfMonth dd))+ <|>+ -- !!! CHECK THIS !!!+ -- 5.2.1.2.a, a specific month, basic format: CCYY-MM+ (try $ do ccyy <- parseFourDigits+ skipHyphen+ mm <- parseTwoDigits+ return $ ISODate (Year ccyy) $ MonthDay (Month mm) NoDayOfMonth)+ <|>+ -- 5.2.1.2.b, a specific year, basic format: CCYY+ (try $ do ccyy <- parseFourDigits+ return $ ISODate (Year ccyy) NoDayOfYear)+ <|>+ -- 5.2.1.2.c, a specific century, basic format: CC+ (try $ do cc <- parseTwoDigits+ return $ ISODate (Century cc) NoDayOfYear)+ <|>+ -- 5.2.1.3.a, truncated representation, specific date in current century, basic format: YYMMDD+ (try $ do yy <- parseTwoDigits+ mm <- parseTwoDigits+ dd <- parseTwoDigits+ return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) (DayOfMonth dd))+ <|>+ -- 5.2.1.3.b, truncated representation, specific year and month in current century, basic format: -YYMM+ (try $ do skipHyphen+ yy <- parseTwoDigits+ mm <- parseTwoDigits+ return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) NoDayOfMonth)+ <|>+ -- 5.2.1.3.c, truncated representation, specific year in current century, basic format: -YY+ (try $ do skipHyphen+ yy <- parseTwoDigits+ return $ ISODate (ImplicitCentury yy) NoDayOfYear)+ <|>+ -- 5.2.1.3.d, truncated representation, specific day of a month, basic format: --MMDD+ (try $ do skipHyphen+ skipHyphen+ mm <- parseTwoDigits+ dd <- parseTwoDigits+ return $ ISODate ImplicitYear $ MonthDay (Month mm) (DayOfMonth dd))+ <|>+ -- 5.2.1.3.e, truncated representation, specific month, basic format: --MM+ (try $ do skipHyphen+ skipHyphen+ mm <- parseTwoDigits+ return $ ISODate ImplicitYear $ MonthDay (Month mm) NoDayOfMonth)+ <|>+ -- 5.2.1.3.f, truncated representation, specific day, basic format: ---DD+ (try $ do skipHyphen+ skipHyphen+ skipHyphen+ dd <- parseTwoDigits+ return $ ISODate ImplicitYear $ MonthDay ImplicitMonth (DayOfMonth dd))+ <|>+ -- 5.2.2 Ordinal date+ -- 5.2.2.1, complete representation, basic format: CCYYDDD+ (try $ do ccyy <- parseFourDigits+ ddd <- parseOrdinalDay+ return $ ISODate (Year ccyy) $ DayOfYear ddd)+ <|>+ -- 5.2.2.2.a, truncated representation, specific year and day in current century, basic format: YYDDD+ (try $ do yy <- parseTwoDigits+ ddd <- parseOrdinalDay+ return $ ISODate (ImplicitCentury yy) $ DayOfYear ddd)+ <|>+ -- 5.2.2.2.b, truncated representation, specific day only, basic format: -DDD+ (try $ do skipHyphen+ ddd <- parseOrdinalDay+ return $ ISODate ImplicitYear $ DayOfYear ddd)+ <|>+ -- 5.2.3 date by calendar week and day number+ -- 5.2.3.1, complete representation, basic format: CCYYWwwD+ (try $ do ccyy <- parseFourDigits+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ d <- parseWeekDay+ return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) (DayOfWeek d))+ <|>+ -- 5.2.3.2, reduced prec representation, basic format: CCYYWww+ (try $ do ccyy <- parseFourDigits+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) NoDayOfWeek)+ <|>+ -- 5.2.3.3.a, truncated representation, current century, basic format: YYWwwD+ (try $ do yy <- parseTwoDigits+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ d <- parseWeekDay+ return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) (DayOfWeek d))+ <|>+ -- 5.2.3.3.b, truncated representation, current century, year and week only, basic format: YYWww+ (try $ do yy <- parseTwoDigits+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) NoDayOfWeek)+ <|>+ -- 5.2.3.3.c, truncated representation, current decade, week, and day, basic format: -YWwwD+ (try $ do skipHyphen+ y <- parseOneDigit+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ d <- parseWeekDay+ return $ ISODate (ImplicitDecade y) $ WeekAndDay (Week ww) (DayOfWeek d))+ <|>+ -- 5.2.3.3.d, truncated representation, current year, week, and day, basic format: -WwwD+ (try $ do skipHyphen+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ d <- parseWeekDay+ return $ ISODate ImplicitYear $ WeekAndDay (Week ww) (DayOfWeek d))+ <|>+ -- 5.2.3.3.e, truncated representation, current year, week only, basic format: -Www+ (try $ do skipHyphen+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ return $ ISODate ImplicitYear $ WeekAndDay (Week ww) NoDayOfWeek)+ <|>+ -- 5.2.3.3.f, truncated representation, day only of current week, basic format: -W-D+ (try $ do skipHyphen+ skipW+ skipHyphen+ d <- parseWeekDay+ return $ ISODate ImplicitYear $ WeekAndDay ImplicitWeek (DayOfWeek d))+ <|>+ -- 5.2.3.3.g, truncated representation, day only of any week, basic format: ---D+ (try $ do skipHyphen+ skipHyphen+ skipHyphen+ d <- parseWeekDay+ return $ ISODate ImplicitYear $ WeekAndDay AnyWeek (DayOfWeek d))+++-- ----------------------------------------------------------------------+-- extended formats +parseDateInternal True =+ -- 5.2.1.1, complete representation, extended format CCYY-MM-DD+ (try $ do ccyy <- parseFourDigits+ skipHyphen+ mm <- parseTwoDigits+ skipHyphen+ dd <- parseTwoDigits+ return $ ISODate (Year ccyy) $ MonthDay (Month mm) (DayOfMonth dd))+ <|>+ -- 5.2.1.3.a, truncated representation, extended format: YY-MM-DD+ (try $ do yy <- parseTwoDigits+ skipHyphen+ mm <- parseTwoDigits+ skipHyphen+ dd <- parseTwoDigits+ return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) (DayOfMonth dd))+ <|>+ -- 5.2.1.3.b, truncated representation, specific year and month in current century, extended format: -YY-MM+ (try $ do skipHyphen+ yy <- parseTwoDigits+ skipHyphen+ mm <- parseTwoDigits+ return $ ISODate (ImplicitCentury yy) $ MonthDay (Month mm) NoDayOfMonth)+ <|>+ -- 5.2.1.3.d, truncated representation, specific day of a month, extended format: --MM-DD+ (try $ do skipHyphen+ skipHyphen+ mm <- parseTwoDigits+ skipHyphen+ dd <- parseTwoDigits+ return $ ISODate ImplicitYear $ MonthDay (Month mm) (DayOfMonth dd))+ <|>+ -- 5.2.2 Ordinal date+ -- 5.2.2.1, complete representation, extended format: CCYY-DDD+ (try $ do ccyy <- parseFourDigits+ skipHyphen+ ddd <- parseOrdinalDay+ return $ ISODate (Year ccyy) $ DayOfYear ddd)+ <|>+ -- 5.2.2.2.a, truncated representation, specific year and day in current century, extended format: YY-DDD+ (try $ do yy <- parseTwoDigits+ skipHyphen+ ddd <- parseOrdinalDay+ return $ ISODate (ImplicitCentury yy) $ DayOfYear ddd)+ <|>+ -- 5.2.3 date by calendar week and day number+ -- 5.2.3.1, complete representation, extended format: CCYY-Www-D+ (try $ do ccyy <- parseFourDigits+ skipHyphen+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ skipHyphen+ d <- parseWeekDay+ return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) (DayOfWeek d))+ <|>+ -- 5.2.3.2, reduced prec representation, extended format: CCYY-Www+ (try $ do ccyy <- parseFourDigits+ skipHyphen+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ return $ ISODate (Year ccyy) $ WeekAndDay (Week ww) NoDayOfWeek)+ <|>+ -- 5.2.3.3.a, truncated representation, current century, extended format: YY-Www-D+ (try $ do yy <- parseTwoDigits+ skipHyphen+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ skipHyphen+ d <- parseWeekDay+ return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) (DayOfWeek d))+ <|>+ -- 5.2.3.3.b, truncated representation, current century, year and week only, extended format: YY-Www+ (try $ do yy <- parseTwoDigits+ skipHyphen+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ return $ ISODate (ImplicitCentury yy) $ WeekAndDay (Week ww) NoDayOfWeek)+ <|>+ -- 5.2.3.3.c, truncated representation, current decade, week, and day, extended format: -Y-Www-D+ (try $ do skipHyphen+ y <- parseOneDigit+ skipHyphen+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ skipHyphen+ d <- parseWeekDay+ return $ ISODate (ImplicitDecade y) $ WeekAndDay (Week ww) (DayOfWeek d))+ <|>+ -- !!! CHECK THIS+ -- 5.2.3.3.d, truncated representation, current year, week, and day, extended format: -Www-D+ (try $ do skipHyphen+ skipW+ ww <- parseTwoDigits+ checkWeeks ww+ skipHyphen+ d <- parseWeekDay+ return $ ISODate ImplicitYear $ WeekAndDay (Week ww) (DayOfWeek d))++-- |time parsers+parseTimeInternal extended =+ do localtime <- parseLocalTimeInternal extended+ tzsuffix <- option LocalTime $ parseTZsuffix extended+ return $ updateTZ localtime tzsuffix++parseTZsuffix extended =+ (do skipZ + return UTCTime)+ <|>+ (do skipPlus+ (hours, minutes) <- parseHoursMinutes extended+ return $ PlusTime hours minutes)+ <|>+ (do skipMinus+ (hours, minutes) <- parseHoursMinutes extended+ return $ MinusTime hours minutes)++parseHoursMinutes False =+ do hh <- parseTwoDigits+ mm <- option NoMinute $ (liftM Minute) parseTwoDigits+ return (Hour hh, mm)++parseHoursMinutes True =+ do hh <- parseTwoDigits+ mm <- option NoMinute $ (liftM Minute) (skipColon >> parseTwoDigits)+ return (Hour hh, mm)++parseLocalTimeInternal False =+ -- 5.3.1.1, local time, basic format: hhmmss+ (try $ do hh <- parseTwoDigits+ mm <- parseTwoDigits+ ss <- parseTwoDigits+ checkHours hh+ checkMinutes mm+ checkSeconds ss+ return $ ISOTime (Hour hh) (Minute mm) (Second ss) LocalTime)+ <|>+ -- 5.3.1.2, local time, reduced precision, basic format: hhmm ; hh+ (try $ do hh <- parseTwoDigits+ mm <- parseTwoDigits+ checkHours hh+ checkMinutes mm+ return $ ISOTime (Hour hh) (Minute mm) NoSecond LocalTime)+ <|>+ (try $ do hh <- parseTwoDigits+ checkHours hh+ return $ ISOTime (Hour hh) NoMinute NoSecond LocalTime)+ <|>+ -- 5.3.1.4.a, local time, truncated, basic format: -mmss+ (try $ do skipHyphen+ mm <- parseTwoDigits+ ss <- parseTwoDigits+ checkMinutes mm+ checkSeconds ss+ return $ ISOTime ImplicitHour (Minute mm) (Second ss) LocalTime)+ <|>+ -- 5.3.1.4.b, local time, truncated, basic format: -mm+ (try $ do skipHyphen+ mm <- parseTwoDigits+ checkMinutes mm+ return $ ISOTime ImplicitHour (Minute mm) NoSecond LocalTime)+ <|>+ -- 5.3.1.4.c, local time, truncated, basic format: --ss+ (try $ do skipHyphen+ skipHyphen+ ss <- parseTwoDigits+ checkSeconds ss+ return $ ISOTime ImplicitHour ImplicitMinute (Second ss) LocalTime)+ ++parseLocalTimeInternal True =+ -- 5.3.1.1, local time, extended format: hh:mm:ss+ (try $ do hh <- parseTwoDigits+ skipColon+ mm <- parseTwoDigits+ skipColon+ ss <- parseTwoDigits+ checkHours hh+ checkMinutes mm+ checkSeconds ss+ return $ ISOTime (Hour hh) (Minute mm) (Second ss) LocalTime)+ <|>+ -- 5.3.1.2, local time, reduced precision, extended format: hh:mm+ (try $ do hh <- parseTwoDigits+ skipColon+ mm <- parseTwoDigits+ checkHours hh+ checkMinutes mm+ return $ ISOTime (Hour hh) (Minute mm) NoSecond LocalTime)+ <|>+ -- 5.3.1.4.a, local time, truncated, extended format: -mm:ss+ (try $ do skipHyphen+ mm <- parseTwoDigits+ skipColon+ ss <- parseTwoDigits+ checkMinutes mm+ checkSeconds ss+ return $ ISOTime ImplicitHour (Minute mm) (Second ss) LocalTime)++-- make ISOTime, ISODate, ISODateAndTime instances of Read+instance Read ISOTime where+ readsPrec i = parserToRead parseTime++instance Read ISODate where+ readsPrec i = parserToRead parseDate++instance Read ISODateAndTime where+ readsPrec i = parserToRead parseDateAndTime+-- auxiliary parsers++checkSeconds ss = if ss > 60 then fail "more than 60 seconds" else return ()+checkMinutes mm = if mm > 59 then fail "more than 59 minutes" else return ()+checkHours hh = if hh > 24 then fail "more than 24 hours" else return ()+checkDays ddd = if ddd < 1 || ddd > 366 then fail "illegal ordinal day" else return ()+checkWeeks ww = if ww < 1 || ww > 53 then fail "illegal week nr" else return ()++parseWeekDay = do d0 <- oneOf "1234567"+ return (digitval d0)++parseOneDigit = do d0 <- digit+ return (digitval d0)+parseTwoDigits = do d1 <- digit+ vv <- parseOneDigit+ return (10 * digitval d1 + vv)+parseThreeDigits = do d2 <- digit+ vv <- parseTwoDigits+ let vvv = 100 * digitval d2 + vv+ return vvv+parseOrdinalDay = do vvv <- parseThreeDigits+ checkDays vvv+ return vvv+parseFourDigits = do d3 <- digit+ vvv <- parseThreeDigits+ return (1000 * digitval d3 + vvv)+
+ WASH/Utility/IntToString.hs view
@@ -0,0 +1,10 @@+-- © 2002 Peter Thiemann+module WASH.Utility.IntToString where++import Char++intToString ndigits i =+ let g x = h $ divMod x 10+ h (q,r) = chr (ord '0' + fromInteger r) : g q+ in+ reverse $ take ndigits $ g i
+ WASH/Utility/JavaScript.hs view
@@ -0,0 +1,27 @@+-- © 2003 Peter Thiemann+module WASH.Utility.JavaScript where++import Char++import WASH.Utility.Hex++jsShow :: String -> String+jsShow xs = '\'' : g xs+ where+ g "" = "'"+ g (x:xs) = + case x of+ '\'' -> h x xs+ '\"' -> h x xs+ '<' -> h x xs+ '>' -> h x xs+ '&' -> h x xs+ x | isPrint x -> x : g xs+ | otherwise -> h x xs+ h x xs =+ let ox = ord x in+ if ox < 256 then+ '\\' : 'x' : showsHex 2 ox (g xs)+ else+ '\\' : 'u' : showsHex 4 ox (g xs)+
+ WASH/Utility/Locking.hs view
@@ -0,0 +1,41 @@+-- © 2003 Peter Thiemann+{-|+Implements Locking via directory creation, which seems to be the only portable+way to do it through Haskell's standard IO library.+-}+module WASH.Utility.Locking (obtainLock, releaseLock) where++import WASH.Utility.Auxiliary+import Directory+import IO+import System+import Time++obtainLock :: FilePath -> IO ()+releaseLock :: FilePath -> IO ()++lockPath name = name ++ ".lockdir"++obtainLock name =+ assertDirectoryExists (lockPath name)+ (system "sleep 1" >> obtainLockLoop name)++releaseLock name =+ removeDirectory (lockPath name)++obtainLockLoop name =+ let lp = lockPath name in+ do b <- doesDirectoryExist lp+ if b then do -- check if lock is stale+ mtime <- getModificationTime lp+ ftime <- getModificationTime name+ ctime <- getClockTime+ let td = diffClockTimes ctime mtime+ tf = diffClockTimes ctime ftime+ if tdSec td > 60 && tdSec tf > 60+ then do removeDirectory lp+ obtainLock name+ else do system "sleep 1"+ obtainLockLoop name+ + else obtainLock name
+ WASH/Utility/QuotedPrintable.hs view
@@ -0,0 +1,50 @@+-- © 2003 Peter Thiemann+module WASH.Utility.QuotedPrintable + (encode, encode', decode+ -- deprecated: encode_quoted, encode_quoted', decode_quoted+ ) where++import Char+import WASH.Utility.Hex++encode, encode', decode :: String -> String+encode = encode_quoted+encode' = encode_quoted'+decode = decode_quoted+++encode_hexadecimal c = '=' : showHex2 c++quoted_printable x = + ox >= 33 && ox <= 126 && ox /= 61+ where ox = ord x++end_of_line [] = True+end_of_line ('\r':'\n':_) = True+end_of_line _ = False++encode_quoted' (x:xs) | x `elem` "\t " = + if end_of_line xs then encode_hexadecimal (ord x) ++ encode_quoted' xs+ else x : encode_quoted' xs+encode_quoted' (x:xs) | quoted_printable x = x : encode_quoted' xs+encode_quoted' ('\r':'\n':xs) = '\r':'\n': encode_quoted' xs+encode_quoted' (x:xs) = encode_hexadecimal (ord x) ++ encode_quoted' xs+encode_quoted' [] = ""++encode_quoted = softLineBreak 76 . encode_quoted'++softLineBreak n [] = "\r\n"+softLineBreak 0 xs | not (end_of_line xs) = '=':'\r':'\n': softLineBreak 76 xs+softLineBreak n ('\r':'\n':xs) = '\r':'\n': softLineBreak 76 xs+softLineBreak n (xs@('=':_)) | n < 4 = '=':'\r':'\n': softLineBreak 76 xs+softLineBreak n (x:xs) = x : softLineBreak (n-1) xs++decode_quoted [] = []+decode_quoted ('=':'\r':'\n':xs) =+ decode_quoted xs+decode_quoted ('=':'\n':xs) =+ decode_quoted xs+decode_quoted ('=':upper:lower:xs) | isHexdigit upper && isHexdigit lower = + chr (16 * hexDigitVal upper + hexDigitVal lower) : decode_quoted xs+decode_quoted (x:xs) = + x : decode_quoted xs
+ WASH/Utility/RFC2047.hs view
@@ -0,0 +1,72 @@+-- © 2003 Peter Thiemann+module WASH.Utility.RFC2047 where+-- decoding of header fields+import Char+import List++import qualified WASH.Utility.Base64 as Base64+import qualified WASH.Utility.QuotedPrintable as QuotedPrintable+import WASH.Utility.Hex+import Text.ParserCombinators.Parsec++lineString =+ do initial <- many (noneOf "\n\r=")+ rest <- option "" (do xs <- try encoded_words <|> string "=" + ys <- lineString+ return (xs ++ ys))+ return (initial ++ rest)++especials = "()<>@,;:\\\"/[]?.="+tokenchar = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" \\ especials+p_token = many1 (oneOf tokenchar)+p_encoded_text = many1 $ oneOf "!\"#$%&'()*+,-./0123456789:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"+allchar = "\NUL\SOH\STX\ETX\EOT\ENQ\ACK\a\b\t\n\v\f\r\SO\SI\DLE\DC1\DC2\DC3\DC4\NAK\SYN\ETB\CAN\EM\SUB\ESC\FS\GS\RS\US !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\DEL"++-- supress linear white space between adjacent encoded_word+encoded_words =+ do ew <- encoded_word+ ws <- many space+ option (ew++ws) (encoded_words >>= \ews -> return (ew++ews))++encoded_word =+ do string "=?"+ charset <- p_token+ char '?'+ encoding <- p_token+ char '?'+ encoded_text <- p_encoded_text+ string "?="+ return $ decode charset (map toUpper encoding) encoded_text++decode charset "B" encoded_text =+ Base64.decode' encoded_text+decode charset "Q" encoded_text =+ decode_quoted encoded_text+decode charset encoding encoded_text =+ error ("Unknown encoding: " ++ encoding)+ +decode_quoted [] = []+decode_quoted ('=':upper:lower:xs) = + chr (16 * hexDigitVal upper + hexDigitVal lower) : decode_quoted xs+decode_quoted ('_':xs) = + ' ' : decode_quoted xs+decode_quoted (x:xs) = + x : decode_quoted xs++-- --------------------------------------------------------------------+-- RFC 2047: encoding of header fields++encodeWord w =+ "=?" ++ charset ++ "?" ++ encoding ++ "?" ++ QuotedPrintable.encode' w ++ "?="+ where encoding = "q"+ charset = "iso-8859-1"++encodeValue v = + case span (not . flip elem " ()<>@.!,") v of+ ([], []) -> []+ (word, []) -> maybeEncode word+ (word, x:rest) -> maybeEncode word ++ x : encodeValue rest++maybeEncode word | all p word = word+ | otherwise = encodeWord word+ where p x = let ox = ord x in ox >= 33 && ox <= 126
+ WASH/Utility/RFC2279.hs view
@@ -0,0 +1,110 @@+-- © 2003 Peter Thiemann+{-|+ Implements UTF-8 encoding++ UCS-4 range (hex.) UTF-8 octet sequence (binary)+ 0000 0000-0000 007F 0xxxxxxx+ 0000 0080-0000 07FF 110xxxxx 10xxxxxx+ 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx+ 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx+ 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx+ 0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx+-}+module WASH.Utility.RFC2279 (encode, decode) where++import Char+++-- |maps Unicode string to list of octets+encode :: String -> String++-- |maps list of octets in UTF-8 encoding to Unicode string+decode :: String -> String++factors = iterate (* 0x40) 1+f1 = factors !! 1+f2 = factors !! 2+f3 = factors !! 3+f4 = factors !! 4+f5 = factors !! 5++encode [] = []+encode (x:xs) = + let r0 = ord x in+ if r0 < 0x80 then+ x : encode xs+ else if r0 < 0x800 then+ let c1 = 0xC0 + r0 `div` f1+ c2 = 0x80 + r0 `mod` f1+ in chr c1 : chr c2 : encode xs+ else if r0 < 0x10000 then+ let c1 = 0xE0 + r0 `div` f2+ r1 = r0 `mod` f2+ c2 = 0x80 + r1 `div` f1+ c3 = 0x80 + r1 `mod` f1+ in chr c1 : chr c2 : chr c3 : encode xs+ else if r0 < 0x200000 then+ let c1 = 0xF0 + r0 `div` f3+ r1 = r0 `mod` f3+ c2 = 0x80 + r1 `div` f2+ r2 = r1 `mod` f2+ c3 = 0x80 + r2 `div` f1+ c4 = 0x80 + r2 `mod` f1+ in chr c1 : chr c2 : chr c3 : chr c4 : encode xs+ else if r0 < 0x4000000 then+ let c1 = 0xF8 + r0 `div` f4+ r1 = r0 `mod` f4+ c2 = 0x80 + r1 `div` f3+ r2 = r1 `mod` f3+ c3 = 0x80 + r2 `div` f2+ r3 = r2 `mod` f2+ c4 = 0x80 + r3 `div` f1+ c5 = 0x80 + r3 `mod` f1+ in chr c1 : chr c2 : chr c3 : chr c4 : chr c5 : encode xs+ else + let c1 = 0xFC + r0 `div` f5+ r1 = r0 `mod` f5+ c2 = 0x80 + r1 `div` f4+ r2 = r1 `mod` f4+ c3 = 0x80 + r2 `div` f3+ r3 = r2 `mod` f3+ c4 = 0x80 + r3 `div` f2+ r4 = r3 `mod` f2+ c5 = 0x80 + r4 `div` f1+ c6 = 0x80 + r4 `mod` f1+ in chr c1 : chr c2 : chr c3 : chr c4 : chr c5 : chr c6 : encode xs+++decode [] = []+decode (x : xs) =+ let ordx = ord x in + if ordx < 0x80 then+ x : decode xs+ else if ordx < 0xC0 then+ error "UTF-8 decoding out of sync"+ else if ordx < 0xE0 then+ decoden 1 (ordx - 0xC0) xs+ else if ordx < 0xF0 then+ decoden 2 (ordx - 0xE0) xs+ else if ordx < 0xF8 then+ decoden 3 (ordx - 0xF0) xs+ else if ordx < 0xFC then+ decoden 4 (ordx - 0xF8) xs+ else if ordx < 0xFE then+ decoden 5 (ordx - 0xFC) xs+ else+ error "UTF-8 decoding found illegal start octet"+ +decoden :: Int -> Int -> String -> String+decoden 0 v xs =+ chr v : decode xs+decoden n v (x : xs) =+ let ordx = ord x+ v' = f1 * v + ordx - 0x80+ in + if ordx >= 0x80 && ordx < 0xC0 then+ decoden (n-1) v' xs+ else + error "UTF-8 decoding found illegal continuation octet"++
+ WASH/Utility/RFC2397.hs view
@@ -0,0 +1,65 @@+-- © 2002-2005 Peter Thiemann+module WASH.Utility.RFC2397 where++import WASH.Utility.URLCoding as URLCoding+import WASH.Utility.Base64 as Base64++data ENC = BASE64 | URL+ deriving Eq++-- |maps (mediatype, contents) to data URL+encode :: (String, String) -> String+encode (mediatype, thedata) =+ "data:" ++ mediatype ++ ";base64," ++ Base64.encode' thedata++-- |maps data URL to @Just (mediatype, contents)@ or @Nothing@ in case of a+-- syntax error.+decode :: String -> Maybe (String, String)+decode url = + let (scheme, rest) = break (==':') url in+ case rest of+ ':' : contents | scheme == "data" -> + decodeContents contents+ _ -> Nothing++decodeContents xs =+ let (prefix, restdata) = break (==',') xs in+ case restdata of+ ',' : thedata ->+ decodePrefix prefix thedata+ _ -> Nothing+ +decodePrefix prefix thedata =+ let fragments = breakList (==';') prefix + enc = case reverse fragments of+ ("base64":_) -> BASE64+ _ -> URL+ mediapart | enc == BASE64 = init fragments+ | otherwise = fragments+ in+ case mediapart of+ (xs:_) ->+ case break (=='/') xs of+ (_, []) -> + decodeData ("text/plain" : mediapart) enc thedata+ _ ->+ decodeData mediapart enc thedata+ _ -> decodeData ["text/plain", "charset=US-ASCII"] enc thedata++decodeData mediatype enc thedata =+ Just ( unparse mediatype+ , case enc of+ URL -> URLCoding.decode thedata+ BASE64 -> Base64.decode thedata+ )++breakList :: (x -> Bool) -> [x] -> [[x]]+breakList p xs =+ let (pre, post) = break p xs in+ case post of+ [] -> [pre]+ y:ys -> pre : breakList p ys++unparse [] = ""+unparse [xs] = xs+unparse (xs:xss) = xs ++ ';' : unparse xss
+ WASH/Utility/SHA1.hs view
@@ -0,0 +1,119 @@+-- exchanged C-wrapper with Ian Lynagh's code+-- from http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/sha1/+-- under permission of license BSD++module WASH.Utility.SHA1 (sha1, sha1_size) where++import Char+import Bits+import Word++type ABCDE = (Word32, Word32, Word32, Word32, Word32)+type XYZ = (Word32, Word32, Word32)+type Rotation = Int++sha1 :: String -> String+sha1 s = s5+ where s1_2 = sha1_step_1_2_pad_length s+ abcde = sha1_step_3_init+ abcde' = sha1_step_4_main abcde s1_2+ s5 = sha1_step_5_display abcde'++sha1_size :: (Integral a) => a -> String -> String+sha1_size l s = s5+ where s1_2 = s ++ sha1_step_1_2_work (fromIntegral ((toInteger l) `mod` (2^64))) ""+ abcde = sha1_step_3_init+ abcde' = sha1_step_4_main abcde s1_2+ s5 = sha1_step_5_display abcde'++sha1_step_1_2_pad_length :: String -> String+sha1_step_1_2_pad_length s = sha1_step_1_2_work 0 s++sha1_step_1_2_work :: Integer -> String -> String+sha1_step_1_2_work c64 "" = padding ++ len+ where padding = '\128':replicate' (shiftR (fromIntegral $ (440 - c64) `mod` 512) 3) '\000'+ len = map chr $ size_split 8 c64+sha1_step_1_2_work c64 (c:cs) = c:sha1_step_1_2_work ((c64 + 8) `mod` (2^64)) cs++replicate' :: Word16 -> a -> [a]+replicate' 0 _ = []+replicate' n x = x:replicate' (n-1) x++size_split :: Int -> Integer -> [Int]+size_split 0 _ = []+size_split p n = size_split (p-1) n' ++ [fromIntegral d]+ where (n', d) = divMod n 256++sha1_step_3_init :: ABCDE+sha1_step_3_init = (0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0)++{- +[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]++wm3 = [13,14,15]+wm8 = [8,9,10,11,12,13,14,15]+wm14 = [2,3,4,5,6,7,8,9,10,11,12,13,14,15]+wm16 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]+-}++sha1_step_4_main :: ABCDE -> String -> ABCDE+sha1_step_4_main abcde "" = {- abcde -} abcde+sha1_step_4_main abcde0 s = sha1_step_4_main abcde5 s'+ where (s64, s') = takeDrop 64 s+ s16 = get_word_32s s64+ s80 = s16 ++ sha1_add_ws 16 (drop 13 s16, drop 8 s16, drop 2 s16, s16)+ (s20_0, s60) = takeDrop 20 s80+ (s20_1, s40) = takeDrop 20 s60+ (s20_2, s20_3) = takeDrop 20 s40+ abcde1 = foldl (doit f1 0x5a827999) abcde0 s20_0+ abcde2 = foldl (doit f2 0x6ed9eba1) abcde1 s20_1+ abcde3 = foldl (doit f3 0x8f1bbcdc) abcde2 s20_2+ abcde4 = foldl (doit f2 0xca62c1d6) abcde3 s20_3+ f1 (x, y, z) = (x .&. y) .|. ((complement x) .&. z)+ f2 (x, y, z) = x `xor` y `xor` z+ f3 (x, y, z) = (x .&. y) .|. (x .&. z) .|. (y .&. z)+ (a, b, c, d, e ) = abcde0+ (a', b', c', d', e') = abcde4+ abcde5 = (a + a', b + b', c + c', d + d', e + e')++doit :: (XYZ -> Word32) -> Word32 -> ABCDE -> Word32 -> ABCDE+doit f k (a, b, c, d, e) w = (a', a, rotL b 30, c, d)+ where a' = rotL a 5 + f(b, c, d) + e + w + k++sha1_add_ws :: Int -> ([Word32], [Word32], [Word32], [Word32]) -> [Word32]+sha1_add_ws 80 _ = []+sha1_add_ws n (w1:w1s, w2:w2s, w3:w3s, w4:w4s)+ = w:sha1_add_ws (n + 1) (w1s ++ [w], w2s ++ [w], w3s ++ [w], w4s ++ [w])+ where w = rotL (foldr1 xor [w1, w2, w3, w4]) 1++get_word_32s :: String -> [Word32]+get_word_32s "" = []+get_word_32s ss = this:rest+ where (s, ss') = takeDrop 4 ss+ this = sum $ zipWith shiftL (map (fromIntegral.ord) s) [24, 16, 8, 0]+ rest = get_word_32s ss'++takeDrop :: Int -> [a] -> ([a], [a])+takeDrop _ [] = ([], [])+takeDrop 0 xs = ([], xs)+takeDrop n (x:xs) = (x:ys, zs)+ where (ys, zs) = takeDrop (n-1) xs++sha1_step_5_display :: ABCDE -> String+sha1_step_5_display (a, b, c, d, e)+ = foldr (\x y -> display_32bits_as_hex x ++ y) "" [a, b, c, d, e]++display_32bits_as_hex :: Word32 -> String+display_32bits_as_hex x0 = map getc [y8,y7,y6,y5,y4,y3,y2,y1]+ where (x1, y1) = divMod x0 16+ (x2, y2) = divMod x1 16+ (x3, y3) = divMod x2 16+ (x4, y4) = divMod x3 16+ (x5, y5) = divMod x4 16+ (x6, y6) = divMod x5 16+ (y8, y7) = divMod x6 16+ getc n = (['0'..'9'] ++ ['a'..'f']) !! (fromIntegral n)++rotL :: Word32 -> Rotation -> Word32+rotL a s = shiftL a s .|. shiftL a (s-32)+
+ WASH/Utility/Shell.hs view
@@ -0,0 +1,20 @@+-- © 2002 Peter Thiemann+-- |Defines functions for shell quotation.+module WASH.Utility.Shell where++import Char++-- |Shell meta characters are /! & ; \` \' \" | * ? ~ \< \> ^ ( ) [ ] true $ n r/+metaCharacters :: String+metaCharacters = " !&;`\'\"|*?~<>^()[]$\\%{}"++-- |Quotes all shell meta characters and removes non printable ones.+quote :: String -> String+quote "" = ""+quote (x:xs) | isPrint x =+ if x `elem` metaCharacters + then '\\' : x : quote xs+ else x : quote xs+ | otherwise = + quote xs+
+ WASH/Utility/SimpleParser.hs view
@@ -0,0 +1,60 @@+-- © 2002 Peter Thiemann+module WASH.Utility.SimpleParser where++import Char++-- very simple parser combinators: Parsec is too sophisticated!+newtype Parser a b = Parser (a -> [(b, a)])+unParser (Parser g) = g+instance Monad (Parser a) where+ return x = Parser (\ w -> [(x, w)])+ m >>= f = let g = unParser m in+ Parser (\ w -> [ (y, w'') | (x, w') <- g w, (y, w'') <- unParser (f x) w'])+ fail str = Parser (\ w -> [])++satisfy p = Parser (\ w -> [(x, w') | x:w' <- [w], p x])++print = satisfy isPrint+alphaNum = satisfy isAlphaNum+alpha = satisfy isAlpha+ascii = satisfy isAscii+digit = satisfy isDigit+char c = satisfy (==c)+string s = foldr (\ x p -> do { c <- char x; cs <- p; return (c:cs); }) (return "") s+oneOf cs = satisfy (`elem` cs)+noneOf cs = satisfy (not . (`elem` cs))++eof = Parser (\ w -> if null w then [((),[])] else [])+try parser = parser+p1 <|> p2 = let g1 = unParser p1+ g2 = unParser p2+ in Parser (\w -> g1 w ++ g2 w)++option :: x -> Parser a x -> Parser a x+option x parser = parser <|> return x++many1 p = + do x <- p+ xs <- many p+ return (x : xs)++many p = + option [] (many1 p)++manyn n p =+ if n <= 0 + then return []+ else do x <- p+ xs <- manyn (n-1) p+ return (x : xs)+++parseFromString :: Parser String x -> String -> Maybe x+parseFromString parser str =+ let g = unParser (parser >>= (\x -> eof >> return x)) in+ case g str of+ (x, ""): _ -> Just x+ _ -> Nothing++parserToRead :: Parser String x -> ReadS x+parserToRead parser = unParser parser
+ WASH/Utility/URLCoding.hs view
@@ -0,0 +1,38 @@+-- © 2001, 2002, 2006 Peter Thiemann+-- |Implements coding of non-alphanumeric characters in URLs and CGI-requests.+module WASH.Utility.URLCoding (encode, decode) where++import Char+import WASH.Utility.Hex++-- |Perform URI encoding of a list of bytes. See +-- <http://www.w3.org/International/O-URL-code.html>+-- To encode a list of characters, the string first has to be UTF-8 encoded!+encode :: String -> String+encode = urlEncode++-- |Perform URI decoding to a list of bytes.+decode :: String -> String+decode = urlDecode++-- implementations++urlEncode :: String -> String+urlEncode xs =+ urlEncode' xs ""+urlEncode' "" = id+urlEncode' (x:xs) = + (if isAlphaNum x + then showChar x+ else showChar '%' .+ showsHex 2 (ord x)) . urlEncode' xs++urlDecode :: String -> String+urlDecode "" = ""+urlDecode ('+':xs) =+ ' ' : urlDecode xs+urlDecode ('%':upper:lower:xs) =+ chr (16 * hexDigitVal upper + hexDigitVal lower) : urlDecode xs+urlDecode (x:xs) = + x : urlDecode xs+
+ WASH/Utility/Unique.hs view
@@ -0,0 +1,67 @@+-- © 2001 Peter Thiemann+module WASH.Utility.Unique (inventStdKey, inventKey, inventFilePath) where++import Random+import IO+import Directory+import WASH.Utility.Auxiliary+import List+import Monad+import WASH.Utility.Locking++registryDir = "/tmp/Unique/"++-- |Creates a random string of 20 letters and digits.+inventStdKey :: IO String+inventStdKey = inventKey 20 stdKeyChars++stdKeyChars = ['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9']++-- |Creates a unique string from a given length and alphabet.+inventKey :: Int -> String -> IO String+inventKey len chars =+ do g <- newStdGen+ let candidate = take len $ map (chars !!) $ randomRs (0, length chars - 1) g+ dirname = registryDir ++ candidate+ catch (do createDirectory dirname+ return candidate)+ (\ ioe -> + if isAlreadyExistsError ioe then+ -- might want to check here for timeout+ inventKey len chars+ else if isDoesNotExistError ioe then+ do assertDirectoryExists registryDir (return ())+ setPermissions registryDir (Permissions True True True True)+ inventKey len chars+ else do hPutStrLn stderr ("inventKey could not create " ++ show dirname)+ ioError ioe)++-- |Create a unique temporary file name+inventFilePath :: IO String+inventFilePath =+ do key <- inventStdKey+ return (registryDir ++ key ++ "/f")++-- obsolete. registryFile is a bottleneck.++registryFile = registryDir ++ "REGISTRY"++inventKey' :: Int -> String -> IO String+inventKey' len chars =+ do g <- newStdGen+ let candidate = take len $ map (chars !!) $ randomRs (0, length chars - 1) g+ obtainLock registryFile+ registry <- readRegistry+ let passwords = lines registry+ if candidate `elem` passwords + then do releaseLock registryFile+ inventKey' len chars+ else do appendFile registryFile (candidate ++ "\n")+ releaseLock registryFile+ return candidate++readRegistry :: IO String+readRegistry =+ let registryPath = init registryDir in+ do assertDirectoryExists registryPath (return ())+ readFileNonExistent registryFile ""
+ WashNGo.cabal view
@@ -0,0 +1,124 @@+Name: WashNGo+Version: 2.12+License: BSD3+License-File: LICENSE+Build-Type : Simple++Author: Peter Thiemann <thiemann@informatik.uni-freiburg.de>+maintainer: Marc Weber <marco-oweber@gmx.de>+-- note: CC both: Peter Thiemann and Marc Weber++Copyright: Copyright 2001-2006, Peter Thiemann+Homepage: http://www.informatik.uni-freiburg.de/~thiemann/haskell/WASH/+Category: Web+Stability: Beta+Synopsis: WASH is a family of embedded domain specific languages (EDSL) for programming Web applications in Haskell.+Cabal-Version: >= 1.2++-- source-repository head+-- type: darcs+-- location: http://code.haskell.org/WASH/++Library+ Build-Depends: base < 5, regex-compat, haskell98, parsec+ Extensions: ForeignFunctionInterface+ build-depends: containers+ Exposed-Modules:+ WASH.CGI.AbstractSelector+ WASH.CGI.BaseCombinators+ WASH.CGI.CGI+ WASH.CGI.CGIConfig+ WASH.CGI.CGIGraphics+ WASH.CGI.CGIHistory+ WASH.CGI.CGIInternals+ WASH.CGI.CGIMonad+ WASH.CGI.CGIOutput+ WASH.CGI.CGITypes+ WASH.CGI.CGIXX+ WASH.CGI.ContentType+ WASH.CGI.Cookie+ WASH.CGI.CookieIO+ WASH.CGI.Debug+ WASH.CGI.EventHandlers+ WASH.CGI.Fields+ WASH.CGI.Frames+ WASH.CGI.GuaranteedCGI+ WASH.CGI.HTMLMail+ WASH.CGI.HTMLWrapper+ WASH.CGI.HTTP+ WASH.CGI.Images+ WASH.CGI.InputHandle+ WASH.CGI.MakeTypedName+ WASH.CGI.LogEntry+ WASH.CGI.PPM+ WASH.CGI.Persistent2+ WASH.CGI.RawCGITypes+ WASH.CGI.RawCGI+ WASH.CGI.RawCGIInternal+ WASH.CGI.StateItem+ WASH.CGI.Style+ WASH.CGI.Submit98+ WASH.CGI.SubmitXX+ WASH.CGI.TCGI+ WASH.CGI.Transaction+ WASH.CGI.TransactionUtil+ WASH.CGI.Types+ WASH.HTML.HTMLBase+ WASH.HTML.HTMLMonad+ WASH.HTML.HTMLMonadAttrs+ WASH.HTML.HTMLMonad98+ WASH.HTML.HTMLMonadBase+ WASH.HTML.HTMLPrelude+ WASH.HTML.HTMLPrelude98+ WASH.HTML.HTMLTypedBase+ WASH.HTML.HTMLTypedBase98+ WASH.HTML.HTMLTemplates+ WASH.Mail.ContentDisposition+ WASH.Mail.Email+ WASH.Mail.EmailConfig+ WASH.Mail.HeaderField+ WASH.Mail.MIME+ WASH.Mail.MailParser+ WASH.Mail.Message+ WASH.Mail.RFC2822+ WASH.Utility.Auxiliary+ WASH.Utility.Base32+ WASH.Utility.Base64+ WASH.Utility.BulkIO+ WASH.Utility.FileNames+ WASH.Utility.Hex+ WASH.Utility.ISO8601+ WASH.Utility.IntToString+ WASH.Utility.JavaScript+ WASH.Utility.Locking+ WASH.Utility.QuotedPrintable+ WASH.Utility.RFC2047+ WASH.Utility.RFC2279+ WASH.Utility.RFC2397+ WASH.Utility.SHA1+ WASH.Utility.SimpleParser+ WASH.Utility.Shell+ WASH.Utility.URLCoding+ WASH.Utility.Unique++Executable wash2hs+ Main-Is: WASHMain.hs+ Other-Modules:+ WASHFlags+ WASHUtil+ WASHOut+ WASHFlags+ WASHData+ WASHClean+ WASHExpression+ WASHMain+ WASHParser+ WASHGenerator++ Hs-Source-Dirs: washparser/hs+++Executable washc+ Main-Is: WASHC.hs+ Hs-Source-Dirs: washc/hs+ Build-Depends: ghc-paths, process, directory
+ washc/hs/WASHC.hs view
@@ -0,0 +1,40 @@+module Main where+import System.IO+import System.Process+import System.Environment+import GHC.Paths+import System.Exit+import System.Directory++-- in the past this was a shell script+-- I didn't know how to get the installation path from Cabal - so I rewrite it+-- as Haskell application++main = do+ -- custom addiotional arguments:+ args <- getArgs+++ case args of+ [] -> do+ n <- getProgName+ putStrLn $ "usage: " ++ n ++ " --make Main.hs"+ putStrLn $ "where Main.hs is a file such as the first hello world example found on "+ putStrLn $ "http://haskell.org/haskellwiki/WASH"++ _ -> do++ mwash2hs <- findExecutable "wash2hs"++ case mwash2hs of++ Nothing -> error "wash2hs not found in PATH"++ Just wash2hs -> do+ n <- getProgName+ let allArgs = ["-pgmF", wash2hs, "-F", "-package", "WashNGo" {- TODO: add version ? -}]+ ++ args++ p <- runProcess GHC.Paths.ghc allArgs Nothing Nothing Nothing Nothing Nothing+ ec <- waitForProcess p+ exitWith ec
+ washparser/hs/WASHClean.hs view
@@ -0,0 +1,58 @@+module WASHClean where++import Char++import WASHData++data CM a = CM ([String] -> a)+instance Monad CM where -- Reader monad+ return x = CM (const x)+ m >>= f = CM (\strs ->+ case m of+ CM mfun -> + case f (mfun strs) of+ CM ffun ->+ ffun strs)++class Clean n where+ clean :: n -> CM n++cleanCodeFragList :: [CodeFrag] -> [CodeFrag]+cleanCodeFragList = map g+ where g (EFrag el) = EFrag (cleanElement el)+ g (CFrag cs) = CFrag (cleanContentList cs)+ g cf = cf++cleanElement :: Element -> Element+cleanElement e@Element{elemName = en, elemContent = ec} =+ if en == "pre"+ then e+ else let ec' = cleanContentList ec in+ e{elemContent = ec'}++cleanContentList :: [Content] -> [Content]+cleanContentList = remove . map g . combine+ where g c = case c of CElement{celem = el} -> CElement{celem = cleanElement el}+ CText{ctext = et} -> CText{ctext = et { textString = cleanText (textString et) }}+ CCode{ccode = ec} -> CCode{ccode = cleanCodeFragList ec}+ _ -> c+ combine (CText {ctext = t1} : CText {ctext = t2} : rest ) = + combine (CText {ctext = Text {textString = textString t1++ textString t2, textMode = textMode t1}} : rest)+ combine (x : xs) = x : combine xs+ combine [] = []+ remove (CText{ctext = tt} : rest) | textString tt == " " = remove rest+ -- remove (CText{ctext = tt} : rest@(CElement{} : _)) = CText{ctext = dropRight tt} : remove rest+ -- remove (e@CElement{} : (CText{ctext = tt} : rest)) = e : remove (CText{ctext = dropLeft tt} : rest)+ remove (x : rest) = x : remove rest+ remove [] = []++cleanText "" = ""+cleanText xs@[x] | isSpace x = " "+ | otherwise = xs+cleanText (x : ys@(y : _)) | isSpace x = if isSpace y + then cleanText ys+ else ' ' : cleanText ys+ | otherwise = x : cleanText ys++dropRight tt = tt { textString = reverse (dropWhile isSpace (reverse (textString tt))) }+dropLeft tt = tt { textString = dropWhile isSpace (textString tt) }
+ washparser/hs/WASHData.hs view
@@ -0,0 +1,74 @@+module WASHData -- derived from HSPData+ ( File (..)+ , Mode (..)+ , Element (..)+ , Text (..)+ , Content (..)+ , CodeFrag (..)+ , Attribute (..)+ , AttrValue (..)+ )+where {+++-- Data type.++data File = File { + fcode :: [CodeFrag],+ topElem :: Element+ } deriving Show;++data Mode = V | S | F + deriving (Eq,Show);++data Element = Element + { elemMode :: Mode+ , elemName :: String+ , elemAttrs :: [Attribute]+ , elemContent :: [Content]+ , elemEmptyTag :: Bool }+ deriving Show;++data Text = Text + { textMode :: Mode+ , textString :: String+ }+ deriving Show;++data Content + = CElement { celem :: Element }+ | CText { ctext :: Text }+ | CReference { creference :: Text }+ | CPI { cpi :: String }+ | CComment { ccomment :: String }+ | CCode { ccode :: [CodeFrag] }+ deriving Show;+ +data CodeFrag + = HFrag String+ | EFrag Element+ | HSFrag String+ | CFrag [Content]+ | AFrag [Attribute]+ | VFrag String+ deriving Show;++data Attribute+ = Attribute+ { attrMode :: Mode+ , attrName :: String+ , attrValue :: AttrValue }+ | AttrPattern+ { attrPattern :: String }+ deriving Show;++data AttrValue+ = AText String+ | ACode String+ deriving Show;++data Reference = Reference String deriving Show;+ +++}
+ washparser/hs/WASHExpression.hs view
@@ -0,0 +1,418 @@+module WASHExpression where++import List+import Monad++import WASHFlags+import qualified WASHUtil+import WASHData+import WASHOut++code :: FLAGS -> [CodeFrag] -> ShowS+code flags [] = id+code flags (x:xs) = code' flags x . code flags xs++code' :: FLAGS -> CodeFrag -> ShowS+code' flags (HFrag h) = + showString h+code' flags (EFrag e) =+ runOut $ element flags e+code' flags (CFrag cnts) =+ showChar '(' .+ runOut (contents flags [] cnts) .+ showChar ')'+code' flags (AFrag attrs) =+ showChar '(' .+ WASHUtil.itemList (attribute flags) "CGI.empty" " >> " attrs .+ showChar ')'+code' flags (VFrag var) = + id+code' flags _ = error "Unknown type: code"++outMode :: Mode -> Out ()+outMode = outShowS . showMode++showMode :: Mode -> ShowS+showMode V = id+showMode S = showString "_T"+showMode F = showString "_S"++element :: FLAGS -> Element -> Out [String]+element flags el@(Element mode nm ats cnt et) =+ case break (==':') nm of+ (ns, ':' : elnm) ->+ ns_element flags ns elnm el + ("input", "") ->+ input_element flags mode nm ats cnt et+ ("textarea", "") ->+ textarea_element flags mode nm ats cnt et+ _ ->+ do outChar '('+ outString "CGI."+ outString nm+ when (generateBT flags) $ outMode mode+ outChar '('+ outShowS $ attributes flags ats+ rvs <- contents flags [] cnt+ outString "))"+ return rvs++textarea_element flags mode nm ats cnt et =+ let at_name = getAttribute ats "name"+ preset = getTextualContentAsStringExpression cnt+ processedAttributes = ["name"]+ cleanedAttributes = removeAttributes (`elem` processedAttributes) ats+ in+ do outString "(CGI."+ outString "makeTextarea"+ -- attention: the preset text is raw so it may contain character references!+ outString preset+ outChar '('+ outShowS $ attributes flags cleanedAttributes+ outString "empty))"+ return [at_name]++input_element flags mode nm ats cnt et =+ let at_type = getAttribute ats "type"+ at_name = getAttribute ats "name"+ parms = getAttribute ats "WASH:parms"+ callback = getAttribute ats "WASH:callback"+ call = getAttribute ats "WASH:call"+ preset = getTextualContent cnt+ processedAttributes = ["type", "name", "WASH:parms", "WASH:callback", "WASH:call"]+ cleanedAttributes = removeAttributes (`elem` processedAttributes) ats+ do_element elnm =+ do outChar '('+ outString "CGI."+ outString elnm+ outChar '('+ outShowS $ attributes flags cleanedAttributes+ outString "empty))"+ return [at_name]+ in+ case at_type of+ "text" ->+ do_element "inputField"+ "password" ->+ do_element "passwordInputField"+ "checkbox" ->+ do_element "checkboxInputField"+ -- "radio" -> -- use the RB abstraction+ "submit" ->+ let Just (funpart, args) = + parse_WASH_call call `mplus`+ parse_WASH_callback callback parms+ largs = length args+ in+ do outString "(CGI."+ outString at_type+ foldr (\arg out -> do outString " (CGI.F2 ("+ outString arg+ outString ") "+ out+ outString ")")+ (outString " CGI.F0") + args+ outString "(\\"+ convertArgs largs+ outString " -> "+ outChar '('+ outString funpart -- funpart :: (arg1, ..., argn) -> CGI ()+ outChar ')'+ unless (null args) $ convertRess '(' largs+ outChar ')'+ outChar '('+ outShowS $ attributes flags cleanedAttributes+ outString "empty))"+ return []+ "reset" ->+ do_element "resetField"+ "file" ->+ do_element "fileInputField"+ -- "hidden" -> -- useless in WASH+ -- "image" -> -- ???+ -- "button" -> -- ???++convertArgs 0 =+ outString " CGI.F0"+convertArgs n =+ do outString "(CGI.F2 xxxx____"+ outString (show n)+ convertArgs (n-1)+ outString ")"++convertRess c 0 =+ outChar ')'+convertRess c n =+ do outString (c:"CGI.value xxxx____")+ outString (show n)+ convertRess ',' (n-1)++parse_WASH_callback cb parms =+ Just (cb, parse_WASH_call_args [] parms)++parse_WASH_call str =+ case break (=='(') str of+ (funpart, '(':rest1 ) ->+ Just (funpart, parse_WASH_call_args [] rest1)+ ("", "") ->+ Nothing+ (funpart, "") ->+ Just (funpart, [])+ _ -> Nothing++parse_WASH_call_args acc str =+ case break (`elem` ",)") str of+ (arg, ',': rest) ->+ parse_WASH_call_args (arg:acc) rest+ (arg, ')': rest) ->+ reverse (arg:acc)+ ("", "") ->+ reverse (acc)+ (arg, "") ->+ reverse (arg:acc)++ns_element flags "WASH" elnm (Element mode _ ats cnt et) =+ let var = getAttribute ats "WASH:name"+ chk = getAttribute ats "WASH:check"+ parms = getAttribute ats "WASH:parms"+ callback = getAttribute ats "WASH:callback"+ preset = getTextualContent cnt+ in+ if elnm `elem` [ "submit", "submitLink"] then+ let args = words parms in+ do outString "(CGI."+ outString elnm+ if null args+ then outChar '0'+ else do outString ("(CGI.F" ++ show (length args))+ mapM (\arg -> outString (' ' : arg)) args+ outChar ')'+ outChar '('+ outString callback+ outChar ')'+ outChar '('+ outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+ outString "empty))"+ return []+ else if elnm `elem` [ "inputField", "textInputField"+ , "passwordInputField", "checkboxInputField"+ , "fileInputField"] then+ do outChar '('+ outString "CGI."+ outString elnm+ outChar '('+ outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+ outString "empty))"+ return [var]+ else if elnm `elem` [ "checkedTextInputField", "checkedFileInputField"] then+ do outChar '('+ outString "CGI."+ outString elnm+ outChar '('+ outString chk+ outChar ')'+ outChar '('+ outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+ outString "empty))"+ return [var]+ else if elnm `elem` ["makeTextarea"] then+ do outString "(CGI."+ outString elnm+ -- attention: the preset text is raw so it may contain character references!+ outString (show preset)+ outChar '('+ outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+ outString "empty))"+ return [var]+ else if elnm `elem` ["makeButton"] then+ do outString "(CGI."+ outString elnm+ outChar '('+ outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+ rvs <- contents flags [] cnt+ outString "))"+ return (var:rvs)+ else if elnm `elem` ["makeForm"] then+ do outString "(CGI."+ outString elnm+ outChar '('+ outShowS $ attributes flags (removeAttributes (isPrefixOf "WASH:") ats)+ rvs <- contents flags [] cnt+ outString "))"+ return rvs+ else+ error ("WASH element "++elnm++" not defined, yet")+ns_element flags ns elnm (Element mode nm ats cnt et) =+ do outChar '('+ outString "CGI.mkElement"+ when (generateBT flags) $ outMode mode+ outString (show nm)+ outChar '('+ outShowS $ attributes flags ats+ rvs <- contents flags [] cnt+ outString "))"+ return rvs++outRVS :: [String] -> Out ()+outRVS [] = outString "()"+outRVS (x:xs) =+ do outChar '('+ outString x+ mapM_ g xs+ outChar ')'+ where g x = do { outChar ','; outString x; }++outRVSpat :: [String] -> Out ()+outRVSpat [] = outString "(_)"+outRVSpat xs = outRVS xs++contents :: FLAGS -> [String] -> [Content] -> Out [String]+contents flags inRVS cts =+ case cts of+ [] ->+ do outString "return"+ outRVS inRVS+ return inRVS+ ct:cts ->+ do rvs <- content flags ct+ case rvs of+ [] ->+ case (cts, inRVS) of+ ([],[]) ->+ return []+ _ ->+ do outString " >> "+ contents flags inRVS cts+ _ ->+ case (cts, inRVS) of+ ([],[]) ->+ return rvs+ _ ->+ do outString " >>= \\ "+ outRVSpat rvs+ outString " -> "+ contents flags (rvs ++ inRVS) cts++content :: FLAGS -> Content -> Out [String]+content flags (CElement elem) = + element flags elem+content flags (CText txt) =+ do text flags txt+ return []+content flags (CCode (VFrag var:c)) =+ do outShowS $ (showChar '(' . code flags c . showChar ')')+ return [var]+content flags (CCode c) =+ do outShowS $ (showChar '(' . code flags c . showChar ')')+ return []+content flags (CComment cc) =+ do outShowS $ (showString "return (const () " . shows cc . showChar ')')+ return []+content flags (CReference txt) =+ do text flags txt+ return []+content flags c = + error $ "Unknown type: content -- " ++ (show c)++text :: FLAGS -> Text -> Out [String]+text flags txt =+ do outString "CGI.rawtext"+ when (generateBT flags) $ outMode (textMode txt)+ outChar ' '+ outs (textString txt)+ return []++attributes :: FLAGS -> [Attribute] -> ShowS+attributes flags atts = + f atts+ where+ f [] = id+ f (att:atts) = + attribute flags att .+ showString " >> " .+ f atts++attribute :: FLAGS -> Attribute -> ShowS+attribute flags (Attribute m n v) = + showString "(CGI.attr" .+ (if generateBT flags then (attrvalueBT m v) else id) .+ showChar ' ' .+ shows n . + showString " " .+ attrvalue v .+ showString ")"+attribute flags (AttrPattern pat) =+ showString "( " .+ showString pat .+ showString " )"+attribute flags a = error $ "Unknown type: attribute -- " ++ (show a)++attrvalue :: AttrValue -> ShowS+attrvalue (AText t) = + shows t+attrvalue (ACode c) =+ showString "( " .+ showString c .+ showString " )"+attrvalue a = error $ "Unknown type: attrvalue -- " ++ (show a)++raw_attrvalue :: AttrValue -> String+raw_attrvalue (AText t) = t+raw_attrvalue (ACode c) = c+raw_attrvalue a = error $ "Unknown type: raw_attrvalue -- " ++ show a++attrvalueBT :: Mode -> AttrValue -> ShowS+attrvalueBT V _ = id+attrvalueBT m (AText _) = showMode m . showChar 'S'+attrvalueBT m (ACode _) = showMode m . showChar 'D'+attrvalueBT m a = error $ "Unknown type: attrvalueBT -- " ++ (show a)++getAttribute :: [Attribute] -> String -> String+getAttribute [] atname = ""+getAttribute (Attribute m n v : rest) atname + | n == atname = raw_attrvalue v+ | otherwise = getAttribute rest atname+getAttribute (_ : rest) atname =+ getAttribute rest atname++removeAttributes :: (String -> Bool) -> [Attribute] -> [Attribute]+removeAttributes p = + filter g+ where+ g (Attribute m n v) = not (p n)+ g (AttrPattern _) = True++getTextualContent :: [Content] -> String+getTextualContent = concatMap g+ where+ g (CElement _) = "" + g (CText txt) = textString txt+ g (CCode _) = ""+ g (CComment _) = ""+ g (CReference txt) = textString txt++getTextualContentAsStringExpression :: [Content] -> String+getTextualContentAsStringExpression = + wrap . foldrx h z . map g+ where+ foldrx a b [] = b+ foldrx a b xs = foldr1 a xs+ z = "\"\""+ h e1 e2 = e1 ++ " ++ " ++ e2+ g (CElement _) = z+ g (CText txt) = show (textString txt)+ g (CCode ccode) = getCodeFragsAsStringExpression ccode+ g (CComment _) = z+ g (CReference txt) = show (textString txt)+ wrap s = '(' : s ++ ")"++getCodeFragsAsStringExpression =+ concatMap g+ where+ g (HFrag str) = str+ g (EFrag element) = ""+ g (HSFrag str) = str+ g (CFrag conts) = ""+ g (AFrag attrs) = ""+ g (VFrag str) = str
+ washparser/hs/WASHFlags.hs view
@@ -0,0 +1,7 @@+module WASHFlags where+-- +flags0 = FLAGS { generateBT = False }++data FLAGS = FLAGS { generateBT :: Bool }++
+ washparser/hs/WASHGenerator.hs view
@@ -0,0 +1,57 @@+module WASHGenerator (preprocess, preprocessPIPE) where {++import List;+import IO;++import WASHData ;+import Text.ParserCombinators.Parsec hiding (try) ;+import qualified WASHParser ;+import qualified WASHExpression ;+import qualified WASHClean ;+import WASHFlags ;++-- import Trace;++preprocess :: FLAGS -> String -> String -> String -> IO ();+preprocess flags srcName dstName globalDefs =+ bracket (openFile srcName ReadMode)+ (\ srcHandle -> hClose srcHandle)+ (\ srcHandle -> + bracket (openFile dstName WriteMode)+ (\ dstHandle -> hClose dstHandle)+ (\ dstHandle -> + preprocessPIPE flags srcName srcHandle dstHandle globalDefs));+++preprocessPIPE :: FLAGS -> String -> Handle -> Handle -> String -> IO ();+preprocessPIPE flags srcName srcHandle dstHandle globalDefs = do {+ input <- hGetContents srcHandle;+ let { parsing = parse WASHParser.washfile srcName input };+ case parsing of {+ Left error -> ioError $ userError $ show error;+ Right washfile ->+ hPutStrLn dstHandle (postprocess $ file flags globalDefs washfile "");+ };+};++file :: FLAGS -> String -> [CodeFrag] -> ShowS ;+file flags globalDefs fcode = + WASHExpression.code flags (WASHClean.cleanCodeFragList fcode) .+ showString globalDefs .+ showString "\n"+ ;++imports :: [String] -> String ;+imports is = concat $ map (\m -> "import " ++ m ++ ";\n") is ;++postprocess :: String -> String ;+postprocess = unlines . postprocess' . lines ;++postprocess' :: [String] -> [String] ;+postprocess' [] = [] ;+postprocess' xs'@(x:xs) = + if "import" `isPrefixOf` x+ then "import qualified WASH.CGI.CGI as CGI" : xs'+ else x : postprocess' xs ;++}
+ washparser/hs/WASHMain.hs view
@@ -0,0 +1,43 @@+module Main where++-- ghc --make WASHMain -package text -o WASHMain++import Directory+import IO+import List+import System+import WASHGenerator+import WASHFlags++main =+ do args <- getArgs+ runPreprocessor flags0 args++runPreprocessor flags [washfile] =+ do fileExists <- doesFileExist washfile+ if ".wash" `isSuffixOf` washfile + then+ preprocess flags washfile (take (length washfile - 5) washfile ++ ".hs") ""+ else if fileExists+ then+ bracket (openFile washfile ReadMode)+ hClose+ (\ inhandle -> preprocessPIPE flags washfile inhandle stdout "")+ else+ preprocess flags+ (washfile ++ ".wash")+ (washfile ++ ".hs")+ ""+runPreprocessor flags [washfile, hsfile] =+ preprocess flags (washfile) (hsfile) ""+runPreprocessor flags [originalFile, washfile, hsfile] =+ preprocess flags (washfile) (hsfile) ""+runPreprocessor flags [] =+ preprocessPIPE flags "<stdin>" stdin stdout ""+runPreprocessor flags args =+ do progName <- getProgName+ hPutStrLn stderr ("Usage: " ++ progName ++ " washfile [hsfile]")+ hPutStrLn stderr (" or: " ++ progName ++ " originalFile infile outfile")+ hPutStrLn stderr (" or: " ++ progName)+ hPutStrLn stderr (" to run as pipe processor")+ hPutStrLn stderr ("Actual arguments: " ++ show args)
+ washparser/hs/WASHOut.hs view
@@ -0,0 +1,30 @@+module WASHOut where++-- output monad++data Out a = Out a ShowS++instance Monad Out where+ return a = Out a id+ m >>= f = case m of+ Out x shw1 ->+ case f x of+ Out y shw2 ->+ Out y (shw1 . shw2)++runOut :: Out a -> ShowS+runOut (Out a shw) = shw++wrapper = (Out () .)++outString :: String -> Out ()+outString = wrapper showString++outChar :: Char -> Out ()+outChar = wrapper showChar++outs :: Show a => a -> Out ()+outs = wrapper shows++outShowS :: ShowS -> Out ()+outShowS = Out ()
+ washparser/hs/WASHParser.hs view
@@ -0,0 +1,624 @@+module WASHParser ( xmlfile, washfile ) where {++import Char ;+import Text.ParserCombinators.Parsec hiding (letter) ;+import WASHData;+import WASHUtil;+++notImplemented what = char '\xff' >> return undefined + <?> (what ++ " isn't implemented yet");++f <$> p = do { x <- p; return $ f x; };++testParser p s = + case parse (do { x <- p; eof; return x; }) "bla" s of {+ Left x -> print x;+ Right y -> print y;+ };++washfile :: Parser [CodeFrag] ;+washfile = + do code <- hBody+ eof+ return $ code+ ;++setMode :: Bool -> Mode ;+setMode toplevel = if toplevel then S else F ;++-- The numbers given for each parser identify the section and+-- grammar production within the XML 1.0 definition (W3C +-- REC-xml-19980210).+++-- 2.1 / 1+xmlfile :: Parser File;+xmlfile = do { + prolog;+ code <- option [] (do {+ hs <- haskell;+ s0;+ return hs+ });+ elem <- element True;+ many misc;+ eof;+ return $ File { fcode = code, topElem = elem };+};+++-- 2.2 / 2+char' = (char '\t' <|> char '\n' <|> char '\r' <|> + satisfy (>= ' ')) <?> "character";+++-- 2.3 / 3+s = (try $ many1 (char ' ' <|> char '\t' <|> + char '\r' <|> char '\n')) <?> "whitespace";+s0 = option "" s;+{-+s0 = (try $ many (char ' ' <|> char '\t' <|> + char '\r' <|> char '\n')) <?> "optional whitespace";+-}++-- 2.3 / 4+nameChar = letter <|> digit <|> char '.' <|> char '-' <|> + char '_' <|> char ':' <|> combiningChar <|> extender;+++-- 2.3 / 5+name :: Parser String;+name = do {+ c <- letter <|> char '_' <|> char ':';+ cs <- many nameChar;+ return $ c:cs;+} <?> "name";+++-- 2.3 / 6+names :: Parser [String];+names = sepBy1 name s;+++-- 2.3 / 7+nmtoken :: Parser String;+nmtoken = many1 nameChar <?> "nmtoken";+++-- 2.3 / 8+nmtokens :: Parser [String];+nmtokens = sepBy1 name s;+++-- 2.3 / 10+attValue :: Parser AttrValue;+attValue = (((AText . concat) <$> (+ between (char '\"') (char '\"') (many (p '\"')) + <|> between (char '\'') (char '\'') (many (p '\'')) ))+ <|> ACode <$> haskellAttr) <?> "attvalue"+where {+ p end = (\x -> [x]) <$> satisfy (f end) <|> reference;+ f end = \c -> c /= '<' && c /= '&' && c /= end;+};++-- 2.3 / 11+systemLiteral = do{+ char '\'';+ sl <- many (satisfy (\c -> c /= '\''));+ char '\'';+ return sl;+} <|> do{+ char '\"';+ sl <- many (satisfy (\c -> c /= '\"'));+ char '\"';+ return sl;+};++-- 2.3 / 12+pubidLiteral = do {+ char '\'';+ sl <- many (pubidChar False);+ char '\'';+ return sl;+} <|> do{+ char '\"';+ sl <- many (pubidChar True);+ char '\"';+ return sl;+};++-- 2.3 / 13+pubidChar w = satisfy (\c -> c >= 'A' && c <= 'Z' + || c >= 'a' && c <= 'z'+ || c >= '0' && c <= '9'+ || c `elem` " \n\r-()+,./:=?;!*#@$_%"+ || w && c == '\'');++-- 2.4 / 14+charData :: Bool -> Parser Text;+charData toplevel =+ do { s <- many1 charData'; return $ Text (setMode toplevel) $ concat s; }+ <?> "#PCDATA";++charData' :: Parser String;+charData' = do {+ c <- satisfy f;+ return [c];+} <|> do {+ string "]]";+ c <- satisfy (\c -> f c && c /= '>');+ return $ ']':']':[c];+}+where { + f c = c /= '<' && c /= '&' && c /= ']';+};+++-- 2.5 / 15+comment :: Parser String;+comment = do {+ try $ string "<!--";+ comment';+} <?> "comment";++comment' = + (do {+ c <- charInComment;+ cs <- comment';+ return $ c:cs; + }) <|>+ (do { + char '-';+ (do {+ try $ string "->";+ return "";+ }) <|>+ (do {+ c <- charInComment;+ cs <- comment';+ return $ c:cs;+ });+ });++charInComment = + (char '\t' <|> char '\n' <|> char '\r' <|> + satisfy (\c -> c >= ' ' && c /= '-')) <?> "character";+++-- 2.6 / 16+pI = notImplemented "processing instruction" >> return "";+++-- 2.7 / 18+cdSect = notImplemented "cdsect" >> return "";+++-- 2.8 / 22+prolog = do {+ option ("UTF-8", False) xmlDecl;+ many misc;+ option [[]] (docTypeDecl >> many misc);+ return ();+};+++-- 2.8 / 23+xmlDecl = do {+ try $ string "<?xml" ;+ versionInfo ;+ enc <- option [] encodingDecl ;+ sdd <- option False sDDecl ;+ s0;+ string "?>" ;+ return (enc, sdd)+};++-- 2.7 / 24+versionInfo = do {+ s ;+ string "version";+ eq ;+ ( do {char '\"'; versionNum; char '\"' } <|>+ do {char '\''; versionNum; char '\'' } );+};++-- 2.8 / 25+eq = do { s0; char '='; s0; };++-- 2.8 / 26+versionNum = string "1.0" ;++-- 2.8 / 27+misc = comment <|> pI <|> s;+++-- 2.8 / 28+-- [28] doctypedecl ::=+-- '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'+docTypeDecl = do{+ try $ string "<!DOCTYPE";+ s;+ name;+ option [] (do {s; externalID;});+ s0;+ option [] (do {char '[';intSubset; char ']'; s0; });+ char '>';+};++-- 2.8 / 28b+-- [28b] intSubset ::= (markupdecl | DeclSep)*+intSubset = notImplemented "intSubset";++-- 2.9 / 32+sDDecl = do {+ s;+ string "standalone";+ eq;+ ( do {char '\"'; x <- yesNo; char '\"'; return x; } <|>+ do {char '\''; x <- yesNo; char '\''; return x; } ) ;+};++yesNo = do {string "yes"; return True;} <|> do {string "no" ; return False;};++-- 3 / 39, 3.1 / 40, 3.1 / 42, 3.1 / 44+element :: Bool -> Parser Element;+element toplevel = do {+ name <- try $ do { char '<'; name };+ attrs <- attributes False;+ (do {+ char '>';+ content <- content False;+ try $ do { string "</"; string name; s0; char '>'; };+ return $ Element (setMode toplevel) name attrs content False;+ }) <|>+ (do {+ try $ string "/>";+ return $ Element (setMode toplevel) name attrs [] True;+ })+} <|> do {+ try $ do { string "<%@" };+ s;+ string "include";+ s;+ AText filename <- attValue;+ s;+ subs <- substitutions;+ string "%>";+ let { str = openFile filename; } ;+ return $ + case parse xmlfile filename str of {+ Left err ->+ Element (setMode toplevel) "include-failed" + [Attribute (setMode toplevel) "file" (AText filename)]+ [CText (Text (setMode toplevel) (show err))]+ True;+ Right file ->+ topElem file;+ }+} <?> "element";++attributes :: Bool -> Parser [Attribute];+attributes toplevel = do { s; attributes' toplevel; } <|> return [];++attributes' :: Bool -> Parser [Attribute];+attributes' toplevel = do { a <- attribute toplevel;+ as <- attributes toplevel;+ return (a:as);+ }+ <|> return [];++-- 3.1 / 41+attribute :: Bool -> Parser Attribute;+attribute toplevel = try (+ do { string "<%" ;+ pat <- hCode ;+ string "%>" ;+ return $ AttrPattern pat ;+ }+<|> + do {+ name <- name;+ eq;+ value <- attValue;+ return $ Attribute (setMode toplevel) name value;+ }+) <?> "attribute";+++-- 3.1 / 43+content :: Bool -> Parser [Content];+content toplevel = many (+ (element toplevel >>= (return . CElement))+ <|> (charData toplevel >>= (return . CText))+ <|> (haskellText>>= (return . CCode))+ <|> (haskell >>= (return . CCode))+ <|> (reference >>= (return . CReference . Text (setMode toplevel)))+ <|> (cdSect >> (return undefined))+ <|> (pI >>= (return . CPI))+ <|> (comment >>= (return . CComment))+);+++-- 4.1 / 66, 4.1 / 68+reference = do {+ char '&';+ r <- (do { + char '#';+ r <- many1 digit <|> + do { char 'x'; r <- many1 hexDigit; return $ 'x':r; };+ return $ '#':r;+ }) <|> name;+ char ';';+ return $ "&" ++ r ++ ";";+} <?> "reference";++-- 4.2.2 / 75+-- [75] ExternalID ::= 'SYSTEM' S SystemLiteral+-- | 'PUBLIC' S PubidLiteral S SystemLiteral+externalID = do{+ string "SYSTEM";+ s;+ systemLiteral;+} <|>+do {+ string "PUBLIC";+ s;+ pubidLiteral;+ s;+ systemLiteral;+};++-- 4.3 / 80+encodingDecl = do {+ s;+ string "encoding";+ eq;+ ( do {char '\"'; x <- encName; char '\"'; return x;} <|>+ do {char '\''; x <- encName; char '\''; return x;});+};++-- 4.3 / 81+-- [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*+encName = do {+ c <- satisfy (\c -> c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') ;+ cs <- many (satisfy (\c -> c >= 'A' && c <= 'Z' + || c >= 'a' && c <= 'z'+ || c >= '0' && c <= '9'+ || c `elem` "._-"));+ return (c:cs)+};++-- B / 84+letter = baseChar <|> ideographic;++-- B / 85+baseChar = + satisfy (\c -> + (c >= '\x41' && c <= '\x5a') || + (c >= '\x61' && c <= '\x7a') || + (c >= '\xc0' && c <= '\xd6') || + (c >= '\xd8' && c <= '\xf6') || + (c >= '\xf8' && c <= '\xff')); -- and some Unicode characters++-- B / 86+ideographic = notImplemented "ideographic";++-- B / 87+combiningChar = notImplemented "combiningChar";++-- B / 88+--digit = digit; -- and some Unicode characters++-- B / 89+extender = char '\xb7'; -- and some Unicode characters+++haskell :: Parser [CodeFrag];+haskell = do {+ try $ string "<%";+ frags <- hStmt <|> hBody;+ try $ string "%>";+ return frags;+};++-- Haskell comment to end of line+-- see chapter 2.2 of report+hLineComment = do {+ ds <- try $ do { char '-';+ ds <- many1 (char '-');+ notFollowedBy (oneOf hAscSymbolString);+ return ('-':ds);+ };+ rest <- many (noneOf "\r\n\f");+ nl <- hNewline;+ return (ds ++ rest ++ nl);+};++hAscSymbolString = "!#$%&*+./<=>?@\\^|~";++hNewline = + try (string "\r\n")+ <|> string "\r"+ <|> string "\n"+ <|> string "\f"+;++hNestedComment = do {+ let {stuff = "{-";};+ try (string stuff);+ hCommentContinuation stuff;+};++hCommentContinuation stuff = do {+ b <- many (noneOf "-{");+ let {moreStuff = stuff ++ b;};+ hCommentMinus moreStuff <|> hTryNestedComment moreStuff ;+};++hTryNestedComment stuff = do {+ nestedStuff <- hNestedComment;+ hCommentContinuation (stuff ++ nestedStuff);+} <|> do {+ char '{';+ hCommentContinuation (stuff ++ "{");+};++hCommentMinus stuff = do {+ char '-';+ let {moreStuff = stuff ++ "-";};+ hCommentClosing moreStuff <|> hCommentContinuation moreStuff;+};++hCommentClosing stuff = do {+ char '}';+ return (stuff++"}");+};++hIdentChar = letter <|> digit <|> char '\'' <|> char '_';++hStmt :: Parser [CodeFrag];+hStmt = do {+ var <- try $ do { s0 ;+ v0 <- letter ;+ vr <- many hIdentChar ;+ s0 ;+ string "<-" ;+ return (v0:vr)+ };+ body <- hBody ;+ return (VFrag var : body)+};++hBody :: Parser [CodeFrag];+hBody = many (+ (hCode >>= (return . HFrag))+ <|> (element True >>= (return . EFrag))+ <|> (nakedAttributes >>= (return . AFrag))+ <|> (nakedContent >>= (return . CFrag))+ );++nakedAttributes = do {+ s0 ;+ try $ string "<[" ;+ s0 ;+ attrs <- attributes' True ;+ try $ string "]>" ;+ return attrs;+};++nakedContent = do {+ try $ string "<#>" ;+ cnts <- content True ;+ try $ string "</#>";+ return cnts;+};++haskellAttr :: Parser String;+haskellAttr = haskellUnnested "<%";++haskellText :: Parser [CodeFrag];+haskellText = do {+ str <- haskellUnnested "<%=";+ return [HFrag "showText(", HFrag str, HFrag ")"]+};++haskellUnnested :: String -> Parser String;+haskellUnnested start = do {+ try $ string start;+ code <- hCode;+ try $ string "%>";+ return code;+} <?> "haskell code";++hCode = try $ do { sp <- getPosition;+ str <- hcode' '%' (not . (`elem` "#[%"));+ return (reindent sp str);+ };+hPatt = try $ hcode' '#' (const True);++reindent :: SourcePos -> String -> String;+reindent sp = + showString "\n{-# LINE " .+ shows (sourceLine sp) .+ showChar ' ' .+ shows (sourceName sp) .+ showString " #-}" .+ reindent' (sourceColumn sp - 1) ;+reindent' 0 = showChar '\n' ;+reindent' n = reindent' (n-1) . showChar ' ' ;++hSinglePatt = try $ do {+ s0 ;+ char '[' ;+ id <- name ;+ char ']' ;+ s0 ;+ return id ;+} ;+ ++hcode' escChar patC = + let stopChars = escChar : "<\"'{-" in+ do { + t <- many1 $ ( hcNorm stopChars+ <|> hcString+ <|> hcChar+ <|> hcLineComment+ <|> hcNestedComment+ <|> hcIsTag patC+ <|> hcIsEnd escChar ) ;+ return $ concat t+};++hcNorm stopChars = try . many1 $ noneOf stopChars;++hcLineComment =+ hLineComment <|> many1 (char '-');++hcNestedComment =+ hNestedComment <|> string "{";++-- only an approximation...+hcChar = do {+ char '\'' ;+ (try $ do { c <- noneOf "'\\" ;+ char '\'' ;+ return ['\'', c, '\''] ;+ }) <|> (try $ do {char '\\' ;+ x <- satisfy (not . isSpace) ;+ rest <- many (noneOf "'") ;+ char '\'' ;+ return ("'\\" ++ (x:rest) ++ "\'") ;})+ <|> return "\'";+};++hcString = try $ do {+ char '\"' ;+ strs <- many ((many1 $ noneOf "\"\\")+ <|> (char '\\' >> (+ (do x <- satisfy (not . isSpace)+ return ['\\',x])+ <|> (do xs <- many1 $ satisfy isSpace+ char '\\'+ return ('\\' : xs ++ "\\"))))) ;+ char '\"' ;+ return ('\"' : concat strs ++ "\"")+};++hcIsTag patC = try $ do { + char '<' ;+ t <- satisfy (\c -> (not.isAlpha $ c) && patC c) ;+ return ('<':t:[]) ;+};++hcIsEnd escChar = try $ do { + char escChar ;+ t <- satisfy (/='>') ;+ return (escChar:t:[]) ;+};++-- experimental+substitutions = return [];++}
+ washparser/hs/WASHUtil.hs view
@@ -0,0 +1,82 @@+module WASHUtil + ( normalize + , outList + , itemList + , openFile + ) where { + +import System.IO.Unsafe ; +import WASHData ; + +itemList :: (item -> ShowS) -> String -> String -> [item] -> ShowS ; +itemList showsItem empty glue items = + f items + where { f [] = showString empty ; + f [item] = showsItem item ; + f (item:items) = showsItem item . showString glue . f items ; + }; + + +normalize :: [Content] -> [Content] ; +normalize xs = shortContent.dropEmpty $ xs ; + +dropEmpty :: [Content] -> [Content] ; +dropEmpty [] = [] ; +dropEmpty (c:cs) = if isWhite c + then dropEmpty cs + else c:(dropEmpty cs); + +isWhite :: Content -> Bool ; +isWhite (CText txt) = and $ map isWhite' (textString txt) + where { isWhite' c = c == ' ' + || c == '\n' + || c == '\t' + || c == '\r' ; + } ; +isWhite _ = False; + +hasText :: Content -> Bool; +hasText (CText {}) = True ; +hasText (CReference {}) = True ; +hasText _ = False ; + +textOf :: Content -> Text; +textOf (CText t) = t; +textOf (CReference t) = t; +textOf c = error ("textOf " ++ show c); + +joinable :: Text -> Text -> Bool; +joinable t1 t2 = g (textMode t1) (textMode t2) + where { g S F = True; + g S S = False; + g F F = True; + g V V = True; + g _ _ = False; + }; + +joinText :: Text -> Text -> Text; +joinText t1 t2 = Text (textMode t1) (textString t1 ++ textString t2); + +shortContent :: [Content] -> [Content] ; +shortContent [] = [] ; +shortContent (CPI pi:cs) = shortContent cs ; +shortContent (CComment c:cs) = shortContent cs ; +shortContent (c1:c2:cs) | hasText c1 && hasText c2 = + let { t1 = textOf c1 ; t2 = textOf c2 } in + if joinable t1 t2 then shortContent (CText (joinText t1 t2):cs) + else c1:shortContent (c2:cs); +shortContent (c:cs) = c:shortContent cs ; + +outList :: [String] -> String ; +outList xs = "[" ++ (outList' $ filter (/= []) xs) ++ "]" ; + +outList' ([]) = "" ; +outList' (x:y:[]) = x ++ ", " ++ y ; +outList' (x:y:xs) = x ++ ", " ++ outList' (y:xs) ; +outList' (x:[]) = x ; +outList' _ = error "ERROR: in processing showList" ; + +openFile :: String -> String ; +openFile fname = unsafePerformIO (readFile fname) ; + +}