<!DOCTYPE html>
<!--
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
-->

<html>
<head>
<meta name="viewport" content="user-scalable=no, width=device-width, height=device-height">
<title>weinre non-minified demo</title>
<link rel="stylesheet" href="weinre-demo.css">
<script>try {window.WeinreServerId = location.hash.split("#")[1]} catch(e) {window.WeinreServerId = "anonymous"}</script>
<script src="/target/target-script.js"></script>
<script src="weinre-demo.js"></script>
</head>

<body onload="onLoad()">
<input id="button-start-stuff" type="button" value="start stuff">

<h1>this is a green h1</h1>
<h1 class="blue">this is a blue h1</h1>
<h1 style="color:red">this is a red h1</h1>
<p>Some text, <i>some italic text</i>, and <b>some bold text</b>.

<hr>
<p><input id="button-clear-output" type="button" value="clear output">
<div id="output"></div>
</body>

</html>
