/*
 * 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.
 */
/*
 <template>
   <div style='left:{{left}};top:{{top}};width:{{width}};height:{{height}};background-color:red'>
     <div style='width:100;height:200'>
     </div>
   </div>
 </template>

 */

define('@weex-component/59f2ac24414dd31be265c3f06c218e2f', function(require, exports, module) {
       
       ;
       module.exports = {
       data: function() {
       return {}
       }
       }
       
       
       ;
       module.exports.style = {}
       
       ;
       module.exports.template = {
       "type": "div",
       "style": {
       "left": function() {
       return this.left
       },
       "top": function() {
       return this.top
       },
       "width": function() {
       return this.width
       },
       "height": function() {
       return this.height
       },
       "backgroundColor": "#FF0000"
       },
       "children": [{
                    "type": "div",
                    "style": {
                    "width": 100,
                    "height": 200
                    }
                    }]
       }
       
       ;
       })

// require module
bootstrap('@weex-component/59f2ac24414dd31be265c3f06c218e2f', {
          "transformerVersion": "0.3.1"
          })
